diff --git a/packages/bridge-ui-v2/package.json b/packages/bridge-ui-v2/package.json index 62a42a0ec2..e0c726bb7e 100644 --- a/packages/bridge-ui-v2/package.json +++ b/packages/bridge-ui-v2/package.json @@ -25,7 +25,7 @@ "@sveltejs/adapter-static": "^2.0.2", "@sveltejs/kit": "^1.22.3", "@types/debug": "^4.1.7", - "@typescript-eslint/eslint-plugin": "^5.45.0", + "@typescript-eslint/eslint-plugin": "^6.5.0", "@typescript-eslint/parser": "^5.45.0", "@vitest/coverage-v8": "^0.33.0", "@wagmi/cli": "^1.0.1", diff --git a/packages/bridge-ui-v2/src/styles/components.css b/packages/bridge-ui-v2/src/styles/components.css index f4dc880cd9..a26170b861 100644 --- a/packages/bridge-ui-v2/src/styles/components.css +++ b/packages/bridge-ui-v2/src/styles/components.css @@ -167,11 +167,13 @@ hover:background-color: var(--interactive-dark-tertiary-hover, #5D636F); } - .glassy-gradient-card { - /* Trying to be consistent with design */ - /* grey-500/10 => grey-800/20 */ + .glassy-gradient-card::before { background: linear-gradient(226deg, rgba(93, 99, 111, 0.1) 1.26%, rgba(25, 30, 40, 0.2) 100%); - backdrop-filter: blur(10px); + content: ''; + backdrop-filter: blur(2px); + position: absolute; + inset: 0%; + z-index: -1; } input { diff --git a/packages/bridge-ui/package.json b/packages/bridge-ui/package.json index e02b55dec3..fe8c3ff0ab 100644 --- a/packages/bridge-ui/package.json +++ b/packages/bridge-ui/package.json @@ -31,7 +31,7 @@ "@types/jest": "^27.5.2", "@types/mixpanel": "^2.14.3", "@types/sanitize-html": "^2.6.2", - "@typescript-eslint/eslint-plugin": "^5.16.0", + "@typescript-eslint/eslint-plugin": "^6.5.0", "@typescript-eslint/parser": "^5.16.0", "@wagmi/cli": "^1.0.1", "@zerodevx/svelte-toast": "^0.6.3", diff --git a/packages/pos-dashboard/package.json b/packages/pos-dashboard/package.json index 62ef6f1e95..39cd383f76 100644 --- a/packages/pos-dashboard/package.json +++ b/packages/pos-dashboard/package.json @@ -29,7 +29,7 @@ "@types/jest": "^27.0.2", "@types/mixpanel": "^2.14.3", "@types/sanitize-html": "^2.6.2", - "@typescript-eslint/eslint-plugin": "^5.16.0", + "@typescript-eslint/eslint-plugin": "^6.5.0", "@typescript-eslint/parser": "^5.16.0", "@wagmi/cli": "^1.0.1", "@zerodevx/svelte-toast": "^0.6.3", diff --git a/packages/protocol/contracts/L1/TaikoData.sol b/packages/protocol/contracts/L1/TaikoData.sol index f2953bbef5..c9d0328f60 100644 --- a/packages/protocol/contracts/L1/TaikoData.sol +++ b/packages/protocol/contracts/L1/TaikoData.sol @@ -142,11 +142,11 @@ library TaikoData { struct Block { bytes32 metaHash; // slot 1 address prover; // slot 2 - uint64 proposedAt; - uint16 nextTransitionId; - uint16 verifiedTransitionId; - uint64 blockId; // slot 3 uint96 proofBond; + uint64 blockId; // slot 3 + uint64 proposedAt; + uint32 nextTransitionId; + uint32 verifiedTransitionId; uint16 proofWindow; } @@ -187,9 +187,9 @@ library TaikoData { // Ring buffer for proposed blocks and a some recent verified blocks. mapping(uint64 blockId_mode_blockRingBufferSize => Block) blocks; mapping( - uint64 blockId => mapping(bytes32 parentHash => uint16 transitionId) + uint64 blockId => mapping(bytes32 parentHash => uint32 transitionId) ) transitionIds; - mapping(uint64 blockId => mapping(uint16 transitionId => Transition)) + mapping(uint64 blockId => mapping(uint32 transitionId => Transition)) transitions; mapping(bytes32 txListHash => TxListInfo) txListInfo; mapping(uint256 depositId_mode_ethDepositRingBufferSize => uint256) diff --git a/packages/protocol/contracts/L1/TaikoToken.sol b/packages/protocol/contracts/L1/TaikoToken.sol index f1e7592061..82248509d1 100644 --- a/packages/protocol/contracts/L1/TaikoToken.sol +++ b/packages/protocol/contracts/L1/TaikoToken.sol @@ -25,8 +25,8 @@ import { PausableUpgradeable } from import { Proxied } from "../common/Proxied.sol"; /// @title TaikoToken -/// @notice The TaikoToken (TKO) is used for proposing blocks and also for -/// staking in the Taiko protocol. It is an ERC20 token with 8 decimal places of +/// @notice The TaikoToken (TKO), in the protocol is used for prover collateral +/// in the form of bonds. It is an ERC20 token with 18 decimal places of /// precision. contract TaikoToken is EssentialContract, @@ -109,7 +109,7 @@ contract TaikoToken is uint256 amount ) public - onlyFromNamed("erc20_vault") + onlyFromNamed2("erc20_vault", "taiko") { _burn(from, amount); } diff --git a/packages/protocol/contracts/L1/libs/LibDepositing.sol b/packages/protocol/contracts/L1/libs/LibDepositing.sol index 0c2c97f998..daf7b07380 100644 --- a/packages/protocol/contracts/L1/libs/LibDepositing.sol +++ b/packages/protocol/contracts/L1/libs/LibDepositing.sol @@ -61,6 +61,9 @@ library LibDepositing { }) ); + // Unchecked is safe: + // - uint64 can store up to ~1.8 * 1e19, which can represent 584K years + // if we are depositing at every second unchecked { state.slotA.numEthDeposits++; } @@ -106,6 +109,12 @@ library LibDepositing { }); uint96 _fee = deposits[i].amount > fee ? fee : deposits[i].amount; + + // Unchecked is safe: + // - _fee cannot be bigger than deposits[i].amount + // - all values are in the same range (uint96) except loop + // counter, which obviously cannot be bigger than uint95 + // otherwise the function would be gassing out. unchecked { deposits[i].amount -= _fee; totalFee += _fee; @@ -118,6 +127,10 @@ library LibDepositing { state.ethDeposits[state.slotA.numEthDeposits % config.ethDepositRingBufferSize] = _encodeEthDeposit(feeRecipient, totalFee); + + // Unchecked is safe: + // - uint64 can store up to ~1.8 * 1e19, which can represent 584K + // years if we are depositing at every second unchecked { state.slotA.numEthDeposits++; } @@ -138,6 +151,13 @@ library LibDepositing { view returns (bool) { + // Unchecked is safe: + // - both numEthDeposits and state.slotA.nextEthDepositToProcess are + // indexes. One is tracking all deposits (numEthDeposits: unprocessed) + // and the next to be processed, so nextEthDepositToProcess cannot be + // bigger than numEthDeposits + // - ethDepositRingBufferSize cannot be 0 by default (validity checked + // in LibVerifying) unchecked { return amount >= config.ethDepositMinAmount && amount <= config.ethDepositMaxAmount diff --git a/packages/protocol/contracts/L1/libs/LibProposing.sol b/packages/protocol/contracts/L1/libs/LibProposing.sol index 49b6069919..b99886954b 100644 --- a/packages/protocol/contracts/L1/libs/LibProposing.sol +++ b/packages/protocol/contracts/L1/libs/LibProposing.sol @@ -83,6 +83,7 @@ library LibProposing { TaikoToken tt = TaikoToken(resolver.resolve("taiko_token", false)); if (state.taikoTokenBalances[assignment.prover] >= config.proofBond) { + // Safe, see the above constraint unchecked { state.taikoTokenBalances[assignment.prover] -= config.proofBond; } @@ -127,6 +128,11 @@ library LibProposing { uint256 reward; if (config.proposerRewardPerSecond > 0 && config.proposerRewardMax > 0) { + // Unchecked is safe: + // - block.timestamp is always greater than block.proposedAt + // (proposed in the past) + // - 1x state.taikoTokenBalances[addr] uint256 could theoretically + // store the whole token supply unchecked { uint256 blockTime = block.timestamp - state.blocks[(b.numBlocks - 1) % config.blockRingBufferSize] @@ -152,6 +158,10 @@ library LibProposing { } // Init the metadata + // Unchecked is safe: + // - equation is done among same variable types + // - incrementation (state.slotB.numBlocks++) is fine for 584K years if + // we propose at every second unchecked { meta.id = b.numBlocks; meta.timestamp = uint64(block.timestamp); @@ -175,13 +185,14 @@ library LibProposing { // Init the block TaikoData.Block storage blk = state.blocks[b.numBlocks % config.blockRingBufferSize]; + blk.metaHash = LibUtils.hashMetadata(meta); blk.prover = assignment.prover; + blk.proofBond = config.proofBond; + blk.blockId = meta.id; blk.proposedAt = meta.timestamp; blk.nextTransitionId = 1; blk.verifiedTransitionId = 0; - blk.blockId = meta.id; - blk.proofBond = config.proofBond; blk.proofWindow = config.proofWindow; emit BlockProposed({ diff --git a/packages/protocol/contracts/L1/libs/LibProving.sol b/packages/protocol/contracts/L1/libs/LibProving.sol index 24321cbd98..7658ec0bee 100644 --- a/packages/protocol/contracts/L1/libs/LibProving.sol +++ b/packages/protocol/contracts/L1/libs/LibProving.sol @@ -84,12 +84,15 @@ library LibProving { } TaikoData.Transition storage tz; - uint16 tid = + uint32 tid = LibUtils.getTransitionId(state, blk, blockId, evidence.parentHash); if (tid == 0) { tid = blk.nextTransitionId; + // Unchecked is safe: + // - Not realistic 2**32 different fork choice per block will be + // proven and none of them is valid unchecked { ++blk.nextTransitionId; } @@ -152,7 +155,7 @@ library LibProving { state.blocks[blockId % config.blockRingBufferSize]; if (blk.blockId != blockId) revert L1_BLOCK_ID_MISMATCH(); - uint16 tid = LibUtils.getTransitionId(state, blk, blockId, parentHash); + uint32 tid = LibUtils.getTransitionId(state, blk, blockId, parentHash); if (tid == 0) revert L1_TRANSITION_NOT_FOUND(); tz = state.transitions[blockId][tid]; @@ -164,6 +167,13 @@ library LibProving { returns (bytes32 instance) { if (evidence.prover == LibUtils.ORACLE_PROVER) return 0; - else return keccak256(abi.encode(evidence)); + else return keccak256(abi.encode( + evidence.metaHash, + evidence.parentHash, + evidence.blockHash, + evidence.signalRoot, + evidence.graffiti, + evidence.prover + )); } } diff --git a/packages/protocol/contracts/L1/libs/LibTaikoToken.sol b/packages/protocol/contracts/L1/libs/LibTaikoToken.sol index 487b30de6b..047136d804 100644 --- a/packages/protocol/contracts/L1/libs/LibTaikoToken.sol +++ b/packages/protocol/contracts/L1/libs/LibTaikoToken.sol @@ -25,7 +25,7 @@ library LibTaikoToken { { uint256 balance = state.taikoTokenBalances[msg.sender]; if (balance < amount) revert L1_INSUFFICIENT_TOKEN(); - + // Unchecked is safe per above check unchecked { state.taikoTokenBalances[msg.sender] -= amount; } diff --git a/packages/protocol/contracts/L1/libs/LibUtils.sol b/packages/protocol/contracts/L1/libs/LibUtils.sol index abd509a3d9..c573228fd8 100644 --- a/packages/protocol/contracts/L1/libs/LibUtils.sol +++ b/packages/protocol/contracts/L1/libs/LibUtils.sol @@ -40,7 +40,7 @@ library LibUtils { ) internal view - returns (uint16 tid) + returns (uint32 tid) { if (state.transitions[blk.blockId][1].key == parentHash) { tid = 1; diff --git a/packages/protocol/contracts/L1/libs/LibVerifying.sol b/packages/protocol/contracts/L1/libs/LibVerifying.sol index 411e1be452..11f453ce8a 100644 --- a/packages/protocol/contracts/L1/libs/LibVerifying.sol +++ b/packages/protocol/contracts/L1/libs/LibVerifying.sol @@ -62,6 +62,10 @@ library LibVerifying { >= type(uint96).max / config.ethDepositMaxCountPerBlock ) revert L1_INVALID_CONFIG(); + // Unchecked is safe: + // - assignment is within ranges + // - block.timestamp will still be within uint64 range for the next + // 500K+ years. unchecked { uint64 timeNow = uint64(block.timestamp); @@ -105,7 +109,7 @@ library LibVerifying { state.blocks[blockId % config.blockRingBufferSize]; if (blk.blockId != blockId) revert L1_BLOCK_ID_MISMATCH(); - uint16 tid = blk.verifiedTransitionId; + uint32 tid = blk.verifiedTransitionId; if (tid == 0) revert L1_UNEXPECTED_TRANSITION_ID(); bytes32 blockHash = state.transitions[blockId][tid].blockHash; @@ -114,6 +118,11 @@ library LibVerifying { TaikoData.Transition memory tz; uint64 processed; + + // Unchecked is safe: + // - assignment is within ranges + // - blockId and processed values incremented will still be OK in the + // next 584K years if we verifying one block per every second unchecked { ++blockId; diff --git a/packages/protocol/contracts/L2/TaikoL2.sol b/packages/protocol/contracts/L2/TaikoL2.sol index 8bacf134d9..1193e77793 100644 --- a/packages/protocol/contracts/L2/TaikoL2.sol +++ b/packages/protocol/contracts/L2/TaikoL2.sol @@ -277,6 +277,8 @@ contract TaikoL2 is EssentialContract, TaikoL2Signer, ICrossChainSync { returns (bytes32 prevPIH, bytes32 currPIH) { bytes32[256] memory inputs; + + // Unchecked is safe because it cannot overflow. unchecked { // Put the previous 255 blockhashes (excluding the parent's) into a // ring buffer. @@ -307,6 +309,10 @@ contract TaikoL2 is EssentialContract, TaikoL2Signer, ICrossChainSync { view returns (uint256 _basefee, uint64 _gasExcess) { + // Unchecked is safe because: + // - gasExcess is capped at uint64 max ever, so multiplying with a + // uint32 value is safe + // - 'excess' is bigger than 'issued' unchecked { uint256 issued = timeSinceParent * config.gasIssuedPerSecond; uint256 excess = (uint256(gasExcess) + parentGasUsed).max(issued); diff --git a/packages/protocol/contracts/actors_privileges_deployments.md b/packages/protocol/contracts/actors_privileges_deployments.md new file mode 100644 index 0000000000..18f954d319 --- /dev/null +++ b/packages/protocol/contracts/actors_privileges_deployments.md @@ -0,0 +1,67 @@ +# Actors, Privileges, and Upgradeable Procedures Documentation + +## Introduction + +This document provides a comprehensive overview of the actors involved in the smart contract system and outlines their respective privileges and roles. +Different `roles` (we call them `domain`) are granted via `AddressManager` contract's `setAddress()` function. Idea is very similar Optimism's `AddressManager` except that we use the `chainId + domainName` as the key for a given address. We need so, because for bridging purposes, the destination chain's bridge address needs to be inculded signaling the messgae hash is tamper-proof. +Every contract which needs some role-based authentication, needs to inherit from `AddressResolver` contract, which will serve as a 'middleman/lookup' by querying the `AddressManager` per given address is allowed to act on behalf of that domain or not. + +## 1. Domains (≈role per chainId) + +In the context of the smart contract system, various actors play distinct roles. Each actor is associated with specific responsibilities and privileges within the system. When there is a modifier called `onlyFromNamed` or `onlyFromNamed2`, it means we are checking access through the before mentioned contracts (`AddressResolver` and `AddressManager`), and one function maximum allows up to 2 domains (right now, but it might change when e.g.`DAO` is set up) can be given access. + +### 1.1 Taiko + +- **Role**: This domain role is given to TaikoL1 smart contract. +- **Privileges**: + - Possibility to mint/burn the taiko token + - Possibility to mint/burn erc20 tokens (I think we should remove this privilege) + +### 1.2 Bridge + +- **Role**: This domain role is given to Bridge smart contracts (both chains). +- **Privileges**: + - The right to trigger transfering/minting the tokens (on destination chain) (be it ERC20, ERC721, ERC1155) from the vault contracts + - The right to trigger releasing the custodied assets on the source chain (if bridging is not successful) + +### 1.3 ERCXXX_Vault + +- **Role**: This role is givne to respective token vault contracts (ERC20, ERC721, ERC1155) +- **Privileges**: + - Part of token briding, the possibility to burn and mint the respective standard tokens (no autotelic minting/burning) + +## 2. Different access modifiers + +Beside the `onlyFromNamed` or `onlyFromNamed2` modifiers, we have others such as: + +### 2.1 onlyOwner + +- **Description**: Only owner can be granted access. +- **Associated contracts**: TaikoToken, AddressManager, EtherVault + +### 2.2 onlyAuthorized + +- **Description**: Only authorized (by owner) can be granted access - the address shall be a smart contract. (`Bridge` in our case) +- **Associated Actors**: EtherVault + +## 3. Upgradeable Procedures + +The smart contract system incorporates upgradeable procedures to ensure flexibility and security. These procedures adhere to the following principles: + +### 3.1 Deployment Scripts + +- Deployment scripts are visible in the `packages/protocol/scripts` folder, encompassing both deployment and upgrade scripts for easy reference and replication. + +### 3.2 Transparent Upgradeability + +- Upgradeability is based on the Transparent Upgradeability Proxy by OpenZeppelin, ensuring that contract upgrades are secure and transparent to all stakeholders. + +### 3.3 Ownership Transition + +- Currently, on testnets, some privileges (like `onlyOwner`) are assigned to externally owned accounts (EOAs) for easier testing. However, it is essential to note that `TimeLockController` contracts will be the owners at a later stage. + +## Conclusion + +Clear documentation of actors and their privileges, combined with robust upgradeable procedures, is essential for smart contract systems, especially for based rollups. This documentation ensures that all stakeholders understand their roles and responsibilities within the system and guarantees its adaptability and security over time. + +Please ensure that this document is kept up to date as changes are made to the smart contract system and its actors or privileges. diff --git a/packages/protocol/contracts/libs/Lib1559Math.sol b/packages/protocol/contracts/libs/Lib1559Math.sol index 0ac8b76f01..99c09bc4a8 100644 --- a/packages/protocol/contracts/libs/Lib1559Math.sol +++ b/packages/protocol/contracts/libs/Lib1559Math.sol @@ -13,6 +13,11 @@ import { SafeCastUpgradeable } from /// @title Lib1559Math /// @dev This library provides utilities related to the L2 EIP-1559 /// implementation. +/// See formulas described in the whitepaper +/// https://taikoxyz.github.io/taiko-mono/taiko-whitepaper.pdf +/// From section: "9.6. Rate Limiting using EIP-1559." +/// Additional info about the arithmetic formula: +/// https://github.com/taikoxyz/taiko-mono/blob/main/packages/protocol/docs/L2EIP1559.md library Lib1559Math { using SafeCastUpgradeable for uint256; diff --git a/packages/protocol/incident_response_plan.md b/packages/protocol/incident_response_plan.md new file mode 100644 index 0000000000..7a5a742fc6 --- /dev/null +++ b/packages/protocol/incident_response_plan.md @@ -0,0 +1,57 @@ +# Incident Response Plan + +This document outlines the incident response plan for our smart contract system, addressing both ChainOps and SmartContract-related incidents. It provides a list of potential incidents and instructions on how to handle them effectively. + +## ChainOps-Related Incidents + +### 1. Congested Network + +**Description**: A congested network can lead to (slow transaction confirmations, higher gas fees, slashing provers) impacting the performance of the rollup. + +**Response**: + +1. Check Grafana Alerts: Monitor the Grafana dashboard at [Grafana Dashboard](https://grafana.test.taiko.xyz/) for alerts related to network congestion. +2. Engineer on Duty: The engineer on duty should be alerted automatically through the monitoring system. +3. Mitigation: If network congestion is detected, consider adjusting gas prices or scheduling transactions during off-peak times. + +### 2. Chain Head Number Stop Increasing + +**Description**: When the chain head stops, it indicates a potential issue with the operation of the network. + +**Response**: + +1. Grafana Alerts: Monitor Grafana for alerts regarding the chain head number. +2. Engineer on Duty: The engineer on duty should receive automatic alerts. +3. Investigation: Investigate the root cause by analyzing blockchain data and logs. +4. Collaboration: Collaborate with blockchain network administrators if necessary for a solution. + +### 3. Latest Verified Block Number Stop Increasing + +**Description**: A halt in the increase of the latest verified block number may indicate a problem with the operation of the network. + +**Response**: + +1. Grafana Alerts: Keep an eye on Grafana alerts regarding the latest verified block number. +2. Engineer on Duty: The engineer on duty should be automatically notified. +3. Troubleshooting: Investigate the node's syncing process and take corrective actions to ensure it resumes. + +## SmartContract-Related Incidents + +### 1. Unforeseeable Smart Contract Issue + +**Description**: Unforeseeable issues with the smart contracts may arise, which were not identified during the audit. + +**Response**: + +1. Incident Report: Create a detailed incident report, including the symptoms, affected contracts, and any relevant transaction or event data. +2. Escalation: Notify the development and audit teams for immediate attention. +3. Isolation: If necessary, isolate the affected smart contracts or functions to prevent further damage. +4. Analysis: Collaborate with the audit team to analyze and diagnose the issue. +5. Resolution: Implement necessary fixes, upgrades, or rollbacks as per the audit team's recommendations. +6. Communication: Keep stakeholders informed throughout the incident resolution process. + +## Conclusion + +This incident response plan ensures that potential incidents, whether related to ChainOps or SmartContracts, are promptly detected and addressed. The plan relies on monitoring tools like Grafana and the availability of an engineer on duty. In the case of unforeseeable smart contract issues, a systematic incident resolution process is in place to minimize the impact on the system's functionality and security. + +Regular testing and review of this plan are recommended to ensure its effectiveness in responding to incidents as the system evolves. diff --git a/packages/protocol/package.json b/packages/protocol/package.json index 16886b38fd..eeb86dce31 100644 --- a/packages/protocol/package.json +++ b/packages/protocol/package.json @@ -51,7 +51,7 @@ "@types/glob": "^8.1.0", "@types/mocha": "^9.1.1", "@types/node": "^12.20.55", - "@typescript-eslint/eslint-plugin": "^4.33.0", + "@typescript-eslint/eslint-plugin": "^6.5.0", "@typescript-eslint/parser": "^4.33.0", "chai": "^4.3.7", "chalk": "4.1.2", diff --git a/packages/protocol/script/upgrade/SetAddressManager.s.sol b/packages/protocol/script/upgrade/SetAddressManager.s.sol new file mode 100644 index 0000000000..924943c4e3 --- /dev/null +++ b/packages/protocol/script/upgrade/SetAddressManager.s.sol @@ -0,0 +1,42 @@ +// SPDX-License-Identifier: MIT +// _____ _ _ _ _ +// |_ _|_ _(_) |_____ | | __ _| |__ ___ +// | |/ _` | | / / _ \ | |__/ _` | '_ (_-< +// |_|\__,_|_|_\_\___/ |____\__,_|_.__/__/ + +pragma solidity ^0.8.20; + +import "forge-std/Script.sol"; +import "forge-std/console2.sol"; +import "@openzeppelin/contracts-upgradeable/utils/math/SafeCastUpgradeable.sol"; +import "./UpgradeScript.s.sol"; + +interface IEssentialContract { + function setAddressManager(address newAddressManager) external; +} +/// @notice Each contract (which inherits EssentialContract) is having a +/// setAddressManager() setter. In such case AddressManager needs to get +/// changed, we need a quick way to update it. +/// +/// Invokaction example: +/// forge script SetAddressManager --sig "run(address,address)"
+///
+ +contract SetAddressManager is UpgradeScript { + function run( + address essentialContract, + address newAddressManager + ) + external + setUp + { + IEssentialContract(essentialContract).setAddressManager( + newAddressManager + ); + console2.log( + essentialContract, + " contract set a new AddressManagerAddress:", + address(newAddressManager) + ); + } +} diff --git a/packages/protocol/script/upgrade/TransferOwnership.s.sol b/packages/protocol/script/upgrade/TransferOwnership.s.sol new file mode 100644 index 0000000000..b8398947f5 --- /dev/null +++ b/packages/protocol/script/upgrade/TransferOwnership.s.sol @@ -0,0 +1,45 @@ +// SPDX-License-Identifier: MIT +// _____ _ _ _ _ +// |_ _|_ _(_) |_____ | | __ _| |__ ___ +// | |/ _` | | / / _ \ | |__/ _` | '_ (_-< +// |_|\__,_|_|_\_\___/ |____\__,_|_.__/__/ + +pragma solidity ^0.8.20; + +import "forge-std/Script.sol"; +import "forge-std/console2.sol"; +import "@openzeppelin/contracts-upgradeable/utils/math/SafeCastUpgradeable.sol"; +import "./UpgradeScript.s.sol"; + +interface IOwnable { + function transferOwnership(address newOwner) external; +} +/// @notice As "single" owner is not desirable for protocols we need to +/// transfer ownership. BUT! Transferring ownership to a multisig also +/// does not help too much if the protocol wants to give some time for +/// the users to exit before an upgrade is effective. So implementing a +/// delay (L2Beat prefers 7 days) is essential. +/// So the usual approach is the following: +/// 1. Transfer ownership to TimeLockController contract which enforces the +/// delay +/// 2. The ownership of the TimeLockController contract shall be a multisig/DAO + +/// Invokaction example: +/// forge script TransferOwnership --sig "run(address,address)"
+///
+contract TransferOwnership is UpgradeScript { + function run( + address contractAddr, + address timeLockContract + ) + external + setUp + { + IOwnable(contractAddr).transferOwnership(timeLockContract); + console2.log( + contractAddr, + " contract has a new owner:", + address(timeLockContract) + ); + } +} diff --git a/packages/protocol/test/L1/TaikoL1.sim.sol b/packages/protocol/test/L1/TaikoL1.sim.sol deleted file mode 100644 index 7076ce7ad5..0000000000 --- a/packages/protocol/test/L1/TaikoL1.sim.sol +++ /dev/null @@ -1,775 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.20; - -import { Test } from "forge-std/Test.sol"; -import { console2 } from "forge-std/console2.sol"; -import { TaikoData } from "../../contracts/L1/TaikoData.sol"; -import { TaikoL1 } from "../../contracts/L1/TaikoL1.sol"; -import { Strings } from "@openzeppelin/contracts/utils/Strings.sol"; -import { TaikoL1TestBase } from "./TaikoL1TestBase.sol"; - -/// @dev Warning: this test will take 7-10 minutes and require 1GB memory. -/// `pnpm sim` -contract TaikoL1_b is TaikoL1 { - function getConfig() - public - pure - override - returns (TaikoData.Config memory config) - { - config = TaikoL1.getConfig(); - - config.blockTxListExpiry = 0; - config.blockMaxProposals = 1100; - config.blockRingBufferSize = 1200; - config.blockMaxVerificationsPerTx = 10; - config.proofRegularCooldown = 5 minutes; - config.proofOracleCooldown = 3 minutes; - config.skipProverAssignmentVerificaiton = true; - config.proofBond = 1e18; // 1 Taiko token - config.proposerRewardPerSecond = 1e15; // 0.001 Taiko token - } -} - -contract Verifier { - fallback(bytes calldata) external returns (bytes memory) { - return bytes.concat(keccak256("taiko")); - } -} - -contract TaikoL1Simulation is TaikoL1TestBase { - // Need to bring variable declaration here - to avoid stack too deep - // Initial salt for semi-random generation - uint256 salt = 2_195_684_615_435_261_315_311; - // Can play to adjust - uint256 blocksToSimulate = 4000; - // RandomNumber - pseudo random but fine - uint256 newRandomWithoutSalt; - - ////////////////////////////////////////// - // TUNABLE PARAMS // - ////////////////////////////////////////// - // This means block proposals will be averaged out (long term if random - // function is random enough) to 18s - // It is fine it simulates that we do not necessarily put Taiko block at - // every 12s, but on average around every x1.5 of ETH block - // Meaninig we have less blocks / sec. (We should test what happens if - // quicker!) - uint256 nextBlockTime = 8 seconds; - uint256 minDiffToBlockPropTime = 8 seconds; - - // This means block provings will be averaged out (long term if random - // function is random enough) to 200s - uint256 startBlockProposeTime = 70 seconds; - uint256 upperDevToBlockProveTime = 40 seconds; - uint256 secondsToSimulate = blocksToSimulate * 18; //Because of the expected - // average blocktimestamp - we can tweak it obv. - ////////////////////////////////////////// - // TUNABLE PARAMS END // - ////////////////////////////////////////// - uint256 maxTime = 0; - uint256 totalDiffsProp = 0; - uint256 totalDiffsProve = 0; - uint256 lastTimestampProp = 0; - uint256 lastTimestampProve = 0; - // Need to map a second to a proofTIme, and might be possible that multiple - // proofs coming in the same block - mapping(uint256 proofTimeSecond => uint256[] arrivalIdxOfBlockIds) private - _proofTimeToBlockIndexes; - // Pre-calculate propose and prove timestamp - uint64[] blocksProposedTimestamp = new uint64[](blocksToSimulate); - - bytes32 parentHash = GENESIS_BLOCK_HASH; - - bytes32[] parentHashes = new bytes32[](blocksToSimulate); - bytes32[] blockHashes = new bytes32[](blocksToSimulate); - bytes32[] signalRoots = new bytes32[](blocksToSimulate); - uint32[] gasLimits = new uint32[](blocksToSimulate); - - function deployTaikoL1() internal override returns (TaikoL1 taikoL1) { - taikoL1 = new TaikoL1_b(); - } - - function setUp() public override { - TaikoL1TestBase.setUp(); - registerAddress(L1.getVerifierName(100), address(new Verifier())); - } - - // A real world scenario - function testGeneratingManyRandomBlocksNonConsecutive() external { - uint256 time = block.timestamp; - - assertEq(time, 1); - - giveEthAndTko(Bob, 1e9 ether, 10_000 ether); - - TaikoData.BlockMetadata[] memory metas = new TaikoData.BlockMetadata[]( - blocksToSimulate - ); - - // Determine every timestamp of the block we want to simulate - console2.log("BlockId, ProofTime"); - for (uint256 i = 0; i < blocksToSimulate; i++) { - newRandomWithoutSalt = uint256( - keccak256( - abi.encodePacked( - block.prevrandao, - msg.sender, - block.timestamp, - i, - newRandomWithoutSalt, - salt - ) - ) - ); - blocksProposedTimestamp[i] = uint64( - pickRandomNumber( - newRandomWithoutSalt, - nextBlockTime, - (minDiffToBlockPropTime + 1) - ) - ); - nextBlockTime = blocksProposedTimestamp[i] + minDiffToBlockPropTime; - - // Avg. calculation - if (lastTimestampProp > 0) { - totalDiffsProp += blocksProposedTimestamp[i] - lastTimestampProp; - } - - lastTimestampProp = blocksProposedTimestamp[i]; - // We need this info to extract / export !! - //console2.log("Time of PROPOSAL is:", blocksProposedTimestamp[i]); - salt = uint256( - keccak256( - abi.encodePacked( - nextBlockTime, salt, i, newRandomWithoutSalt - ) - ) - ); - - uint64 proofTimePerBlockI = uint64( - pickRandomNumber( - newRandomWithoutSalt, - (nextBlockTime + startBlockProposeTime), - (upperDevToBlockProveTime + 1) - ) - ); - - if (proofTimePerBlockI > maxTime) { - maxTime = proofTimePerBlockI; - } - - if (lastTimestampProve > 0) { - totalDiffsProve += proofTimePerBlockI - lastTimestampProp; - } - lastTimestampProve = proofTimePerBlockI; - // It is possible that proof for block N+1 comes before N, so we - // need to keep track of that. Because - // the proofs per block is related to propose of that same block - // (index). - _proofTimeToBlockIndexes[proofTimePerBlockI].push(i); - - // We need this info to extract / export !! - console2.log(i + 1, ";", proofTimePerBlockI - lastTimestampProp); - salt = - uint256(keccak256(abi.encodePacked(proofTimePerBlockI, salt))); - } - - uint256 proposedIndex; - - console2.log("Last second:", maxTime); - console2.log( - "Average proposal time: ", totalDiffsProp / blocksToSimulate - ); - console2.log("Average proof time: ", totalDiffsProve / blocksToSimulate); - printVariableHeaders(); - //It is a divider / marker for the parser - console2.log("!-----------------------------"); - printVariables(); - // This is a way we can de-couple proposing from proving - for ( - uint256 secondsElapsed = 0; - secondsElapsed <= maxTime; - secondsElapsed++ - ) { - newRandomWithoutSalt = uint256( - keccak256( - abi.encodePacked( - newRandomWithoutSalt, - block.prevrandao, - secondsElapsed, - msg.sender, - block.timestamp, - salt - ) - ) - ); - - // We are proposing here - if ( - secondsElapsed == blocksProposedTimestamp[proposedIndex] - && proposedIndex < blocksToSimulate - ) { - //console2.log("FOR CYCLE: Time of PROPOSAL is:", - // blocksProposedTimestamp[proposedIndex]); - uint32 gasLimit = uint32( - pickRandomNumber( - newRandomWithoutSalt, 100e3, (3_000_000 - 100_000 + 1) - ) - ); // 100K to 30M - salt = uint256(keccak256(abi.encodePacked(gasLimit, salt))); - - if (proposedIndex == 0) { - parentHashes[proposedIndex] = GENESIS_BLOCK_HASH; - } else { - parentHashes[proposedIndex] = blockHashes[proposedIndex - 1]; - } - - salt = uint256(keccak256(abi.encodePacked(salt))); - - uint24 txListSize = uint24( - pickRandomNumber( - newRandomWithoutSalt, 1, conf.blockMaxTxListBytes - ) //Actually (conf.blockMaxTxListBytes-1)+1 but that's the - // same - ); - salt = uint256(keccak256(abi.encodePacked(txListSize, salt))); - - blockHashes[proposedIndex] = bytes32( - pickRandomNumber(newRandomWithoutSalt, 0, type(uint256).max) - ); - salt = uint256( - keccak256( - abi.encodePacked(blockHashes[proposedIndex], salt) - ) - ); - - signalRoots[proposedIndex] = bytes32( - pickRandomNumber(newRandomWithoutSalt, 0, type(uint256).max) - ); - salt = uint256( - keccak256( - abi.encodePacked(signalRoots[proposedIndex], salt) - ) - ); - - metas[proposedIndex] = - proposeBlock(Alice, Bob, gasLimit, txListSize); - - if (proposedIndex < blocksToSimulate - 1) proposedIndex++; - - printVariables(); - } - - // We are proving here - if (_proofTimeToBlockIndexes[secondsElapsed].length > 0) { - //console2.log("Duplicates check"); - for ( - uint256 i; - i < _proofTimeToBlockIndexes[secondsElapsed].length; - i++ - ) { - uint256 blockId = - _proofTimeToBlockIndexes[secondsElapsed][i]; - - proveBlock( - Bob, - Bob, - metas[blockId], - parentHashes[blockId], - blockHashes[blockId], - signalRoots[blockId] - ); - } - } - - // Increment time with 1 seconds - vm.warp(block.timestamp + 1); - //Log every 12 sec - if (block.timestamp % 12 == 0) { - printVariables(); - } - } - console2.log("-----------------------------!"); - } - - // 90% slow proofs (around 30 mins or so) and 10% (around 1-5 mins ) - function test_90percent_slow_10percent_quick() external { - uint256 time = block.timestamp; - - uint256 startBlockProposeTime_quick = 60 seconds; // For the 10% where - // it is 'quick' - uint256 upperDevToBlockProveTime_quick = 240 seconds; // For the 10% - // where it is quick - - assertEq(time, 1); - - giveEthAndTko(Bob, 1e6 ether, 10_000 ether); - - TaikoData.BlockMetadata[] memory metas = new TaikoData.BlockMetadata[]( - blocksToSimulate - ); - - // Determine every timestamp of the block we want to simulate - console2.log("BlockId, ProofTime"); - for (uint256 i = 0; i < blocksToSimulate; i++) { - newRandomWithoutSalt = uint256( - keccak256( - abi.encodePacked( - block.prevrandao, - msg.sender, - block.timestamp, - i, - newRandomWithoutSalt, - salt - ) - ) - ); - blocksProposedTimestamp[i] = uint64( - pickRandomNumber( - newRandomWithoutSalt, - nextBlockTime, - (minDiffToBlockPropTime + 1) - ) - ); - nextBlockTime = blocksProposedTimestamp[i] + minDiffToBlockPropTime; - - // Avg. calculation - if (lastTimestampProp > 0) { - totalDiffsProp += blocksProposedTimestamp[i] - lastTimestampProp; - } - - lastTimestampProp = blocksProposedTimestamp[i]; - // We need this info to extract / export !! - //console2.log("Time of PROPOSAL is:", blocksProposedTimestamp[i]); - salt = uint256( - keccak256( - abi.encodePacked( - nextBlockTime, salt, i, newRandomWithoutSalt - ) - ) - ); - uint64 proofTimePerBlockI; - if (i % 10 == 0) { - // A very quick proof this case - proofTimePerBlockI = uint64( - pickRandomNumber( - newRandomWithoutSalt, - (nextBlockTime + startBlockProposeTime_quick), - (upperDevToBlockProveTime_quick + 1) - ) - ); - - if (proofTimePerBlockI > maxTime) { - maxTime = proofTimePerBlockI; - } - } else { - proofTimePerBlockI = uint64( - pickRandomNumber( - newRandomWithoutSalt, - (nextBlockTime + startBlockProposeTime), - (upperDevToBlockProveTime + 1) - ) - ); - - if (proofTimePerBlockI > maxTime) { - maxTime = proofTimePerBlockI; - } - } - - if (lastTimestampProve > 0) { - totalDiffsProve += proofTimePerBlockI - lastTimestampProp; - } - lastTimestampProve = proofTimePerBlockI; - // It is possible that proof for block N+1 comes before N, so we - // need to keep track of that. Because - // the proofs per block is related to propose of that same block - // (index). - _proofTimeToBlockIndexes[proofTimePerBlockI].push(i); - - // We need this info to extract / export !! - console2.log(i + 1, ";", proofTimePerBlockI - lastTimestampProp); - salt = - uint256(keccak256(abi.encodePacked(proofTimePerBlockI, salt))); - } - - uint256 proposedIndex; - - console2.log("Last second:", maxTime); - console2.log( - "Average proposal time: ", totalDiffsProp / blocksToSimulate - ); - console2.log("Average proof time: ", totalDiffsProve / blocksToSimulate); - printVariableHeaders(); - //It is a divider / marker for the parser - console2.log("!-----------------------------"); - printVariables(); - // This is a way we can de-couple proposing from proving - for ( - uint256 secondsElapsed = 0; - secondsElapsed <= maxTime; - secondsElapsed++ - ) { - newRandomWithoutSalt = uint256( - keccak256( - abi.encodePacked( - newRandomWithoutSalt, - block.prevrandao, - secondsElapsed, - msg.sender, - block.timestamp, - salt - ) - ) - ); - - // We are proposing here - if ( - secondsElapsed == blocksProposedTimestamp[proposedIndex] - && proposedIndex < blocksToSimulate - ) { - //console2.log("FOR CYCLE: Time of PROPOSAL is:", - // blocksProposedTimestamp[proposedIndex]); - uint32 gasLimit = uint32( - pickRandomNumber( - newRandomWithoutSalt, 100e3, (3_000_000 - 100_000 + 1) - ) - ); // 100K to 30M - salt = uint256(keccak256(abi.encodePacked(gasLimit, salt))); - - if (proposedIndex == 0) { - parentHashes[proposedIndex] = GENESIS_BLOCK_HASH; - } else { - parentHashes[proposedIndex] = blockHashes[proposedIndex - 1]; - } - - salt = uint256(keccak256(abi.encodePacked(salt))); - - uint24 txListSize = uint24( - pickRandomNumber( - newRandomWithoutSalt, 1, conf.blockMaxTxListBytes - ) //Actually (conf.blockMaxTxListBytes-1)+1 but that's the - // same - ); - salt = uint256(keccak256(abi.encodePacked(txListSize, salt))); - - blockHashes[proposedIndex] = bytes32( - pickRandomNumber(newRandomWithoutSalt, 0, type(uint256).max) - ); - salt = uint256( - keccak256( - abi.encodePacked(blockHashes[proposedIndex], salt) - ) - ); - - signalRoots[proposedIndex] = bytes32( - pickRandomNumber(newRandomWithoutSalt, 0, type(uint256).max) - ); - salt = uint256( - keccak256( - abi.encodePacked(signalRoots[proposedIndex], salt) - ) - ); - - metas[proposedIndex] = - proposeBlock(Alice, Bob, gasLimit, txListSize); - - if (proposedIndex < blocksToSimulate - 1) proposedIndex++; - - printVariables(); - } - - // We are proving here - if (_proofTimeToBlockIndexes[secondsElapsed].length > 0) { - //console2.log("Duplicates check"); - for ( - uint256 i; - i < _proofTimeToBlockIndexes[secondsElapsed].length; - i++ - ) { - uint256 blockId = - _proofTimeToBlockIndexes[secondsElapsed][i]; - - proveBlock( - Bob, - Bob, - metas[blockId], - parentHashes[blockId], - blockHashes[blockId], - signalRoots[blockId] - ); - } - } - - // Increment time with 1 seconds - vm.warp(block.timestamp + 1); - //Log every 12 sec - if (block.timestamp % 12 == 0) { - printVariables(); - } - } - console2.log("-----------------------------!"); - } - - // 90% slow proofs (around 30 mins or so) and 10% (around 1-5 mins ) - function test_90percent_quick_10percent_slow() external { - uint256 time = block.timestamp; - uint256 startBlockProposeTime_quick = 60 seconds; // For the 10% where - // it is 'quick' - uint256 upperDevToBlockProveTime_quick = 240 seconds; // For the 10% - // where it is quick - - assertEq(time, 1); - - giveEthAndTko(Bob, 1e6 ether, 10_000 ether); - - TaikoData.BlockMetadata[] memory metas = new TaikoData.BlockMetadata[]( - blocksToSimulate - ); - - // Determine every timestamp of the block we want to simulate - console2.log("BlockId, ProofTime"); - for (uint256 i = 0; i < blocksToSimulate; i++) { - newRandomWithoutSalt = uint256( - keccak256( - abi.encodePacked( - block.prevrandao, - msg.sender, - block.timestamp, - i, - newRandomWithoutSalt, - salt - ) - ) - ); - blocksProposedTimestamp[i] = uint64( - pickRandomNumber( - newRandomWithoutSalt, - nextBlockTime, - (minDiffToBlockPropTime + 1) - ) - ); - nextBlockTime = blocksProposedTimestamp[i] + minDiffToBlockPropTime; - - // Avg. calculation - if (lastTimestampProp > 0) { - totalDiffsProp += blocksProposedTimestamp[i] - lastTimestampProp; - } - - lastTimestampProp = blocksProposedTimestamp[i]; - // We need this info to extract / export !! - //console2.log("Time of PROPOSAL is:", blocksProposedTimestamp[i]); - salt = uint256( - keccak256( - abi.encodePacked( - nextBlockTime, salt, i, newRandomWithoutSalt - ) - ) - ); - - uint64 proofTimePerBlockI; - if (i % 10 == 0) { - // 10% 'slow proofs' - proofTimePerBlockI = uint64( - pickRandomNumber( - newRandomWithoutSalt, - (nextBlockTime + startBlockProposeTime), - (upperDevToBlockProveTime + 1) - ) - ); - - if (proofTimePerBlockI > maxTime) { - maxTime = proofTimePerBlockI; - } - } else { - // A very quick proof this case - proofTimePerBlockI = uint64( - pickRandomNumber( - newRandomWithoutSalt, - (nextBlockTime + startBlockProposeTime_quick), - (upperDevToBlockProveTime_quick + 1) - ) - ); - - if (proofTimePerBlockI > maxTime) { - maxTime = proofTimePerBlockI; - } - } - - if (proofTimePerBlockI > maxTime) { - maxTime = proofTimePerBlockI; - } - - if (lastTimestampProve > 0) { - totalDiffsProve += proofTimePerBlockI - lastTimestampProp; - } - lastTimestampProve = proofTimePerBlockI; - // It is possible that proof for block N+1 comes before N, so we - // need to keep track of that. Because - // the proofs per block is related to propose of that same block - // (index). - _proofTimeToBlockIndexes[proofTimePerBlockI].push(i); - - // We need this info to extract / export !! - console2.log(i + 1, ";", proofTimePerBlockI - lastTimestampProp); - salt = - uint256(keccak256(abi.encodePacked(proofTimePerBlockI, salt))); - } - - uint256 proposedIndex; - - console2.log("Last second:", maxTime); - console2.log( - "Average proposal time: ", totalDiffsProp / blocksToSimulate - ); - console2.log("Average proof time: ", totalDiffsProve / blocksToSimulate); - printVariableHeaders(); - //It is a divider / marker for the parser - console2.log("!-----------------------------"); - printVariables(); - // This is a way we can de-couple proposing from proving - for ( - uint256 secondsElapsed = 0; - secondsElapsed <= maxTime; - secondsElapsed++ - ) { - newRandomWithoutSalt = uint256( - keccak256( - abi.encodePacked( - newRandomWithoutSalt, - block.prevrandao, - secondsElapsed, - msg.sender, - block.timestamp, - salt - ) - ) - ); - - // We are proposing here - if ( - secondsElapsed == blocksProposedTimestamp[proposedIndex] - && proposedIndex < blocksToSimulate - ) { - //console2.log("FOR CYCLE: Time of PROPOSAL is:", - // blocksProposedTimestamp[proposedIndex]); - uint32 gasLimit = uint32( - pickRandomNumber( - newRandomWithoutSalt, 100e3, (3_000_000 - 100_000 + 1) - ) - ); // 100K to 30M - salt = uint256(keccak256(abi.encodePacked(gasLimit, salt))); - - if (proposedIndex == 0) { - parentHashes[proposedIndex] = GENESIS_BLOCK_HASH; - } else { - parentHashes[proposedIndex] = blockHashes[proposedIndex - 1]; - } - - salt = uint256(keccak256(abi.encodePacked(salt))); - - uint24 txListSize = uint24( - pickRandomNumber( - newRandomWithoutSalt, 1, conf.blockMaxTxListBytes - ) //Actually (conf.blockMaxTxListBytes-1)+1 but that's the - // same - ); - salt = uint256(keccak256(abi.encodePacked(txListSize, salt))); - - blockHashes[proposedIndex] = bytes32( - pickRandomNumber(newRandomWithoutSalt, 0, type(uint256).max) - ); - salt = uint256( - keccak256( - abi.encodePacked(blockHashes[proposedIndex], salt) - ) - ); - - signalRoots[proposedIndex] = bytes32( - pickRandomNumber(newRandomWithoutSalt, 0, type(uint256).max) - ); - salt = uint256( - keccak256( - abi.encodePacked(signalRoots[proposedIndex], salt) - ) - ); - - metas[proposedIndex] = - proposeBlock(Alice, Bob, gasLimit, txListSize); - - if (proposedIndex < blocksToSimulate - 1) proposedIndex++; - - printVariables(); - } - - // We are proving here - if (_proofTimeToBlockIndexes[secondsElapsed].length > 0) { - //console2.log("Duplicates check"); - for ( - uint256 i; - i < _proofTimeToBlockIndexes[secondsElapsed].length; - i++ - ) { - uint256 blockId = - _proofTimeToBlockIndexes[secondsElapsed][i]; - - proveBlock( - Bob, - Bob, - metas[blockId], - parentHashes[blockId], - blockHashes[blockId], - signalRoots[blockId] - ); - } - } - - // Increment time with 1 seconds - vm.warp(block.timestamp + 1); - //Log every 12 sec - if (block.timestamp % 12 == 0) { - printVariables(); - } - } - console2.log("-----------------------------!"); - } - - function printVariableHeaders() internal view { - string memory str = string.concat( - "\nlogCount,", - "time,", - "lastVerifiedBlockId,", - "numBlocks,", - "numAuctions," - ); - console2.log(str); - } - - function printVariables() internal { - TaikoData.StateVariables memory vars = L1.getStateVariables(); - string memory str = string.concat( - Strings.toString(logCount++), - ";", - Strings.toString(block.timestamp), - ";", - Strings.toString(vars.lastVerifiedBlockId), - ";", - Strings.toString(vars.numBlocks) - ); - console2.log(str); - } - - // Semi-random number generator - function pickRandomNumber( - uint256 randomNum, - uint256 lowerLimit, - uint256 diffBtwLowerAndUpperLimit - ) - internal - view - returns (uint256) - { - randomNum = uint256(keccak256(abi.encodePacked(randomNum, salt))); - return (lowerLimit + (randomNum % diffBtwLowerAndUpperLimit)); - } -} diff --git a/packages/protocol/test/L1/TaikoL1TestBase.sol b/packages/protocol/test/L1/TaikoL1TestBase.sol index 988b6d18b8..0a1ff63749 100644 --- a/packages/protocol/test/L1/TaikoL1TestBase.sol +++ b/packages/protocol/test/L1/TaikoL1TestBase.sol @@ -86,6 +86,9 @@ abstract contract TaikoL1TestBase is TestBase { ); // Set protocol broker + registerAddress("taiko", address(this)); + tko.mint(address(this), 1e9 ether); + registerAddress("taiko", address(L1)); L1.init(address(addressManager), GENESIS_BLOCK_HASH); diff --git a/packages/protocol/test/L1/TaikoToken.t.sol b/packages/protocol/test/L1/TaikoToken.t.sol new file mode 100644 index 0000000000..2af49e681b --- /dev/null +++ b/packages/protocol/test/L1/TaikoToken.t.sol @@ -0,0 +1,263 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.20; + +import { TestBase } from "../TestBase.sol"; +import { AddressManager } from "../../contracts/common/AddressManager.sol"; +import { AddressResolver } from "../../contracts/common/AddressResolver.sol"; +import { TaikoToken } from "../../contracts/L1/TaikoToken.sol"; +import { TransparentUpgradeableProxy } from + "@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol"; + +contract TaikoTokenTest is TestBase { + bytes32 GENESIS_BLOCK_HASH; + + address public tokenOwner; + address public taikoL1; + + AddressManager public addressManager; + TransparentUpgradeableProxy public tokenProxy; + TaikoToken public tko; + TaikoToken public tkoUpgradedImpl; + + function setUp() public { + GENESIS_BLOCK_HASH = getRandomBytes32(); + + tokenOwner = getRandomAddress(); + taikoL1 = getRandomAddress(); + + addressManager = new AddressManager(); + addressManager.init(); + _registerAddress("taiko", taikoL1); + + tko = new TaikoToken(); + + address[] memory premintRecipients = new address[](2); + premintRecipients[0] = Yasmine; + premintRecipients[1] = Zachary; + + uint256[] memory premintAmounts = new uint256[](2); + premintAmounts[0] = 5 ether; + premintAmounts[1] = 5 ether; + + tokenProxy = _deployViaProxy( + address(tko), + bytes.concat( + tko.init.selector, + abi.encode( + address(addressManager), + "Taiko Token", + "TKO", + premintRecipients, + premintAmounts + ) + ) + ); + + tko = TaikoToken(address(tokenProxy)); + } + + function test_TaikoToken_proper_premint() public { + assertEq(tko.balanceOf(Yasmine), 5 ether); + + assertEq(tko.balanceOf(Zachary), 5 ether); + } + + function test_TaikoToken_upgrade() public { + tkoUpgradedImpl = new TaikoToken(); + + vm.prank(tokenOwner); + tokenProxy.upgradeTo(address(tkoUpgradedImpl)); + + // Check if balance is still same + assertEq(tko.balanceOf(Yasmine), 5 ether); + assertEq(tko.balanceOf(Zachary), 5 ether); + } + + function test_TaikoToken_upgrade_without_admin_rights() public { + tkoUpgradedImpl = new TaikoToken(); + + vm.expectRevert(); + tokenProxy.upgradeTo(address(tkoUpgradedImpl)); + } + + function test_TaikoToken_mint() public { + assertEq(tko.balanceOf(Emma), 0 ether); + + uint256 amountToMint = 1 ether; + vm.prank(taikoL1); + tko.mint(Emma, amountToMint); + assertEq(tko.balanceOf(Emma), amountToMint); + } + + function test_TaikoToken_mint_invalid_address() public { + vm.prank(taikoL1); + vm.expectRevert("ERC20: mint to the zero address"); + tko.mint(address(0), 1 ether); + } + + function test_TaikoToken_mint_not_taiko_l1() public { + vm.expectRevert(AddressResolver.RESOLVER_DENIED.selector); + tko.mint(Emma, 1 ether); + } + + function test_TaikoToken_burn() public { + uint256 amountToMint = 1 ether; + vm.prank(taikoL1); + tko.mint(Emma, amountToMint); + assertEq(tko.balanceOf(Emma), amountToMint); + + vm.prank(taikoL1); + tko.burn(Emma, amountToMint); + assertEq(tko.balanceOf(Emma), 0); + } + + function test_TaikoToken_burn_not_taiko_l1() public { + vm.expectRevert(AddressResolver.RESOLVER_DENIED.selector); + tko.burn(address(0), 1 ether); + } + + function test_TaikoToken_burn_amount_exceeded() public { + uint256 amountToMint = 1 ether; + vm.prank(taikoL1); + tko.mint(Emma, amountToMint); + assertEq(tko.balanceOf(Emma), amountToMint); + } + + function test_TaikoToken_transfer() public { + uint256 amountToMint = 1 ether; + vm.prank(taikoL1); + tko.mint(Emma, amountToMint); + assertEq(tko.balanceOf(Emma), amountToMint); + + vm.prank(Emma); + tko.transfer(David, amountToMint); + + assertEq(tko.balanceOf(Emma), 0); + assertEq(tko.balanceOf(David), amountToMint); + } + + function test_TaikoToken_transfer_invalid_address() public { + uint256 amountToMint = 1 ether; + vm.prank(taikoL1); + tko.mint(Emma, amountToMint); + assertEq(tko.balanceOf(Emma), amountToMint); + + vm.prank(Emma); + vm.expectRevert("ERC20: transfer to the zero address"); + tko.transfer(address(0), amountToMint); + } + + function test_TaikoToken_transfer_to_contract_address() public { + uint256 amountToMint = 1 ether; + vm.prank(taikoL1); + tko.mint(Emma, amountToMint); + assertEq(tko.balanceOf(Emma), amountToMint); + + vm.prank(Emma); + vm.expectRevert(TaikoToken.TKO_INVALID_ADDR.selector); + tko.transfer(address(tko), amountToMint); + } + + function test_TaikoToken_transfer_amount_exceeded() public { + uint256 amountToMint = 1 ether; + uint256 amountToTransfer = 2 ether; + vm.prank(taikoL1); + tko.mint(Emma, amountToMint); + assertEq(tko.balanceOf(Emma), amountToMint); + + vm.prank(Emma); + vm.expectRevert(); + tko.transfer(address(tko), amountToTransfer); + assertEq(tko.balanceOf(Emma), amountToMint); + } + + function test_TaikoToken_transferFrom() public { + uint256 amountToMint = 1 ether; + vm.prank(taikoL1); + tko.mint(Emma, amountToMint); + assertEq(tko.balanceOf(Emma), amountToMint); + + vm.prank(Emma); + tko.approve(David, 1 ether); + + vm.prank(David); + tko.transferFrom(Emma, David, amountToMint); + + assertEq(tko.balanceOf(Emma), 0); + assertEq(tko.balanceOf(David), amountToMint); + } + + function test_TaikoToken_transferFrom_to_is_invalid() public { + uint256 amountToMint = 1 ether; + vm.prank(taikoL1); + tko.mint(Emma, amountToMint); + assertEq(tko.balanceOf(Emma), amountToMint); + + vm.prank(Emma); + tko.approve(David, 1 ether); + + vm.prank(David); + vm.expectRevert("ERC20: transfer to the zero address"); + tko.transferFrom(Emma, address(0), amountToMint); + } + + function test_TaikoToken_transferFrom_to_is_the_contract() public { + uint256 amountToMint = 1 ether; + vm.prank(taikoL1); + tko.mint(Emma, amountToMint); + assertEq(tko.balanceOf(Emma), amountToMint); + + vm.prank(Emma); + tko.approve(David, 1 ether); + + vm.prank(David); + vm.expectRevert(TaikoToken.TKO_INVALID_ADDR.selector); + tko.transferFrom(Emma, address(tko), amountToMint); + } + + function test_TaikoToken_transferFrom_from_is_invalid() public { + uint256 amountToMint = 1 ether; + vm.prank(taikoL1); + tko.mint(Emma, amountToMint); + assertEq(tko.balanceOf(Emma), amountToMint); + + vm.prank(Emma); + tko.approve(David, 1 ether); + + vm.prank(David); + // transferFrom(address(0)) will always throw has no allowance + vm.expectRevert("ERC20: insufficient allowance"); + tko.transferFrom(address(0), David, amountToMint); + } + + function test_TaikoToken_transferFrom_amount_exceeded() public { + uint256 amountToMint = 1 ether; + uint256 amountToTransfer = 2 ether; + vm.prank(taikoL1); + tko.mint(Emma, amountToMint); + assertEq(tko.balanceOf(Emma), amountToMint); + + vm.prank(Emma); + vm.expectRevert(); + tko.transfer(address(tko), amountToTransfer); + assertEq(tko.balanceOf(Emma), amountToMint); + } + + function _registerAddress(bytes32 nameHash, address addr) private { + addressManager.setAddress(block.chainid, nameHash, addr); + } + + function _deployViaProxy( + address implementation, + bytes memory data + ) + private + returns (TransparentUpgradeableProxy) + { + return new TransparentUpgradeableProxy( + implementation, + tokenOwner, + data + ); + } +} diff --git a/packages/starter-dapp/package.json b/packages/starter-dapp/package.json index ed09e68ee8..cf35295565 100644 --- a/packages/starter-dapp/package.json +++ b/packages/starter-dapp/package.json @@ -26,7 +26,7 @@ "@types/jest": "^27.0.2", "@types/mixpanel": "^2.14.3", "@types/sanitize-html": "^2.6.2", - "@typescript-eslint/eslint-plugin": "^5.16.0", + "@typescript-eslint/eslint-plugin": "^6.5.0", "@typescript-eslint/parser": "^5.16.0", "@zerodevx/svelte-toast": "^0.6.3", "autoprefixer": "^10.4.13", diff --git a/packages/status-page/package.json b/packages/status-page/package.json index c70186f48c..bcbe2149d0 100644 --- a/packages/status-page/package.json +++ b/packages/status-page/package.json @@ -26,7 +26,7 @@ "@types/jest": "^27.0.2", "@types/mixpanel": "^2.14.3", "@types/sanitize-html": "^2.6.2", - "@typescript-eslint/eslint-plugin": "^5.16.0", + "@typescript-eslint/eslint-plugin": "^6.5.0", "@typescript-eslint/parser": "^5.16.0", "@zerodevx/svelte-toast": "^0.6.3", "autoprefixer": "^10.4.13", diff --git a/packages/website/next.config.mjs b/packages/website/next.config.mjs index 37353bf3e3..f63794efc0 100644 --- a/packages/website/next.config.mjs +++ b/packages/website/next.config.mjs @@ -99,6 +99,13 @@ export default withNextra({ destination: "/docs/guides/run-a-node/claim-prover-rewards", permanent: true, }, + { + source: "/events", + destination: + "https://taikoxyz.notion.site/Taiko-Events-calendar-be7f37a0d11849e5abfd0c332783dfc1", + permanent: false, + basePath: false, + }, ]; }, }); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 8ef633b9d2..0e1fb8b3a9 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -90,8 +90,8 @@ importers: specifier: ^2.6.2 version: 2.9.0 '@typescript-eslint/eslint-plugin': - specifier: ^5.16.0 - version: 5.62.0(@typescript-eslint/parser@5.62.0)(eslint@7.32.0)(typescript@4.9.5) + specifier: ^6.5.0 + version: 6.5.0(@typescript-eslint/parser@5.62.0)(eslint@7.32.0)(typescript@4.9.5) '@typescript-eslint/parser': specifier: ^5.16.0 version: 5.62.0(eslint@7.32.0)(typescript@4.9.5) @@ -121,7 +121,7 @@ importers: version: 7.32.0 eslint-plugin-jest: specifier: ^27.2.1 - version: 27.2.3(@typescript-eslint/eslint-plugin@5.62.0)(eslint@7.32.0)(jest@27.5.1)(typescript@4.9.5) + version: 27.2.3(@typescript-eslint/eslint-plugin@6.5.0)(eslint@7.32.0)(jest@27.5.1)(typescript@4.9.5) eslint-plugin-simple-import-sort: specifier: ^10.0.0 version: 10.0.0(eslint@7.32.0) @@ -250,8 +250,8 @@ importers: specifier: ^4.1.7 version: 4.1.8 '@typescript-eslint/eslint-plugin': - specifier: ^5.45.0 - version: 5.62.0(@typescript-eslint/parser@5.62.0)(eslint@8.46.0)(typescript@5.1.6) + specifier: ^6.5.0 + version: 6.5.0(@typescript-eslint/parser@5.62.0)(eslint@8.46.0)(typescript@5.1.6) '@typescript-eslint/parser': specifier: ^5.45.0 version: 5.62.0(eslint@8.46.0)(typescript@5.1.6) @@ -405,8 +405,8 @@ importers: specifier: ^2.6.2 version: 2.9.0 '@typescript-eslint/eslint-plugin': - specifier: ^5.16.0 - version: 5.62.0(@typescript-eslint/parser@5.62.0)(eslint@7.32.0)(typescript@4.9.5) + specifier: ^6.5.0 + version: 6.5.0(@typescript-eslint/parser@5.62.0)(eslint@7.32.0)(typescript@4.9.5) '@typescript-eslint/parser': specifier: ^5.16.0 version: 5.62.0(eslint@7.32.0)(typescript@4.9.5) @@ -436,7 +436,7 @@ importers: version: 7.32.0 eslint-plugin-jest: specifier: ^27.2.1 - version: 27.2.3(@typescript-eslint/eslint-plugin@5.62.0)(eslint@7.32.0)(jest@27.5.1)(typescript@4.9.5) + version: 27.2.3(@typescript-eslint/eslint-plugin@6.5.0)(eslint@7.32.0)(jest@27.5.1)(typescript@4.9.5) eslint-plugin-simple-import-sort: specifier: ^10.0.0 version: 10.0.0(eslint@7.32.0) @@ -561,8 +561,8 @@ importers: specifier: ^12.20.55 version: 12.20.55 '@typescript-eslint/eslint-plugin': - specifier: ^4.33.0 - version: 4.33.0(@typescript-eslint/parser@4.33.0)(eslint@7.32.0)(typescript@4.9.5) + specifier: ^6.5.0 + version: 6.5.0(@typescript-eslint/parser@4.33.0)(eslint@7.32.0)(typescript@4.9.5) '@typescript-eslint/parser': specifier: ^4.33.0 version: 4.33.0(eslint@7.32.0)(typescript@4.9.5) @@ -634,7 +634,7 @@ importers: version: 3.4.1 solidity-coverage: specifier: github:taikoxyz/solidity-coverage - version: github.com/taikoxyz/solidity-coverage/ceb49fd1f6041e4fcd26079dfb0d3b0f58c812e5(hardhat@2.17.1) + version: git@github.com+taikoxyz/solidity-coverage/ceb49fd1f6041e4fcd26079dfb0d3b0f58c812e5(hardhat@2.17.1) solidity-docgen: specifier: 0.6.0-beta.35 version: 0.6.0-beta.35(hardhat@2.17.1) @@ -714,8 +714,8 @@ importers: specifier: ^2.6.2 version: 2.9.0 '@typescript-eslint/eslint-plugin': - specifier: ^5.16.0 - version: 5.62.0(@typescript-eslint/parser@5.62.0)(eslint@8.46.0)(typescript@4.9.5) + specifier: ^6.5.0 + version: 6.5.0(@typescript-eslint/parser@5.62.0)(eslint@8.46.0)(typescript@4.9.5) '@typescript-eslint/parser': specifier: ^5.16.0 version: 5.62.0(eslint@8.46.0)(typescript@4.9.5) @@ -868,8 +868,8 @@ importers: specifier: ^2.6.2 version: 2.9.0 '@typescript-eslint/eslint-plugin': - specifier: ^5.16.0 - version: 5.62.0(@typescript-eslint/parser@5.62.0)(eslint@8.46.0)(typescript@4.9.5) + specifier: ^6.5.0 + version: 6.5.0(@typescript-eslint/parser@5.62.0)(eslint@8.46.0)(typescript@4.9.5) '@typescript-eslint/parser': specifier: ^5.16.0 version: 5.62.0(eslint@8.46.0)(typescript@4.9.5) @@ -2759,6 +2759,7 @@ packages: /@ethersproject/abi@5.0.0-beta.153: resolution: {integrity: sha512-aXweZ1Z7vMNzJdLpR1CZUAIgnwjrZeUSvN9syCwlBaEBUFJmFY+HHnfuTI5vIhVs/mRkfJVrbEyl51JZQqyjAg==} + requiresBuild: true dependencies: '@ethersproject/address': 5.7.0 '@ethersproject/bignumber': 5.7.0 @@ -4788,12 +4789,14 @@ packages: /@sindresorhus/is@0.14.0: resolution: {integrity: sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==} engines: {node: '>=6'} + requiresBuild: true dev: true optional: true /@sindresorhus/is@4.6.0: resolution: {integrity: sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==} engines: {node: '>=10'} + requiresBuild: true dev: true optional: true @@ -5079,6 +5082,7 @@ packages: /@szmarczak/http-timer@1.1.2: resolution: {integrity: sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA==} engines: {node: '>=6'} + requiresBuild: true dependencies: defer-to-connect: 1.1.3 dev: true @@ -5087,6 +5091,7 @@ packages: /@szmarczak/http-timer@4.0.6: resolution: {integrity: sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==} engines: {node: '>=10'} + requiresBuild: true dependencies: defer-to-connect: 2.0.1 dev: true @@ -5278,6 +5283,7 @@ packages: /@types/cacheable-request@6.0.3: resolution: {integrity: sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw==} + requiresBuild: true dependencies: '@types/http-cache-semantics': 4.0.1 '@types/keyv': 3.1.4 @@ -5398,6 +5404,7 @@ packages: /@types/http-cache-semantics@4.0.1: resolution: {integrity: sha512-SZs7ekbP8CN0txVG2xVRH6EgKmEm31BOxA07vkFaETzZz1xh+cbt8BcI0slpymvwhx5dlFnQG2rTlPVQn+iRPQ==} + requiresBuild: true dev: true optional: true @@ -5446,6 +5453,7 @@ packages: /@types/keyv@3.1.4: resolution: {integrity: sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==} + requiresBuild: true dependencies: '@types/node': 20.4.7 dev: true @@ -5574,6 +5582,7 @@ packages: /@types/responselike@1.0.0: resolution: {integrity: sha512-85Y2BjiufFzaMIlvJDvTTB8Fxl2xfLo4HgmHzVBz08w4wDePCTjYw66PdrolO0kzli3yam/YCgRufyo1DdQVTA==} + requiresBuild: true dependencies: '@types/node': 20.4.7 dev: true @@ -5668,38 +5677,41 @@ packages: '@types/yargs-parser': 21.0.0 dev: true - /@typescript-eslint/eslint-plugin@4.33.0(@typescript-eslint/parser@4.33.0)(eslint@7.32.0)(typescript@4.9.5): - resolution: {integrity: sha512-aINiAxGVdOl1eJyVjaWn/YcVAq4Gi/Yo35qHGCnqbWVz61g39D0h23veY/MA0rFFGfxK7TySg2uwDeNv+JgVpg==} - engines: {node: ^10.12.0 || >=12.0.0} + /@typescript-eslint/eslint-plugin@6.5.0(@typescript-eslint/parser@4.33.0)(eslint@7.32.0)(typescript@4.9.5): + resolution: {integrity: sha512-2pktILyjvMaScU6iK3925uvGU87E+N9rh372uGZgiMYwafaw9SXq86U04XPq3UH6tzRvNgBsub6x2DacHc33lw==} + engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: - '@typescript-eslint/parser': ^4.0.0 - eslint: ^5.0.0 || ^6.0.0 || ^7.0.0 + '@typescript-eslint/parser': ^6.0.0 || ^6.0.0-alpha + eslint: ^7.0.0 || ^8.0.0 typescript: '*' peerDependenciesMeta: typescript: optional: true dependencies: - '@typescript-eslint/experimental-utils': 4.33.0(eslint@7.32.0)(typescript@4.9.5) + '@eslint-community/regexpp': 4.6.2 '@typescript-eslint/parser': 4.33.0(eslint@7.32.0)(typescript@4.9.5) - '@typescript-eslint/scope-manager': 4.33.0 + '@typescript-eslint/scope-manager': 6.5.0 + '@typescript-eslint/type-utils': 6.5.0(eslint@7.32.0)(typescript@4.9.5) + '@typescript-eslint/utils': 6.5.0(eslint@7.32.0)(typescript@4.9.5) + '@typescript-eslint/visitor-keys': 6.5.0 debug: 4.3.4(supports-color@8.1.1) eslint: 7.32.0 - functional-red-black-tree: 1.0.1 + graphemer: 1.4.0 ignore: 5.2.4 - regexpp: 3.2.0 + natural-compare: 1.4.0 semver: 7.5.4 - tsutils: 3.21.0(typescript@4.9.5) + ts-api-utils: 1.0.2(typescript@4.9.5) typescript: 4.9.5 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0)(eslint@7.32.0)(typescript@4.9.5): - resolution: {integrity: sha512-TiZzBSJja/LbhNPvk6yc0JrX9XqhQ0hdh6M2svYfsHGejaKFIAGd9MQ+ERIMzLGlN/kZoYIgdxFV0PuljTKXag==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + /@typescript-eslint/eslint-plugin@6.5.0(@typescript-eslint/parser@5.62.0)(eslint@7.32.0)(typescript@4.9.5): + resolution: {integrity: sha512-2pktILyjvMaScU6iK3925uvGU87E+N9rh372uGZgiMYwafaw9SXq86U04XPq3UH6tzRvNgBsub6x2DacHc33lw==} + engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: - '@typescript-eslint/parser': ^5.0.0 - eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + '@typescript-eslint/parser': ^6.0.0 || ^6.0.0-alpha + eslint: ^7.0.0 || ^8.0.0 typescript: '*' peerDependenciesMeta: typescript: @@ -5707,27 +5719,28 @@ packages: dependencies: '@eslint-community/regexpp': 4.6.2 '@typescript-eslint/parser': 5.62.0(eslint@7.32.0)(typescript@4.9.5) - '@typescript-eslint/scope-manager': 5.62.0 - '@typescript-eslint/type-utils': 5.62.0(eslint@7.32.0)(typescript@4.9.5) - '@typescript-eslint/utils': 5.62.0(eslint@7.32.0)(typescript@4.9.5) + '@typescript-eslint/scope-manager': 6.5.0 + '@typescript-eslint/type-utils': 6.5.0(eslint@7.32.0)(typescript@4.9.5) + '@typescript-eslint/utils': 6.5.0(eslint@7.32.0)(typescript@4.9.5) + '@typescript-eslint/visitor-keys': 6.5.0 debug: 4.3.4(supports-color@8.1.1) eslint: 7.32.0 graphemer: 1.4.0 ignore: 5.2.4 - natural-compare-lite: 1.4.0 + natural-compare: 1.4.0 semver: 7.5.4 - tsutils: 3.21.0(typescript@4.9.5) + ts-api-utils: 1.0.2(typescript@4.9.5) typescript: 4.9.5 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0)(eslint@8.46.0)(typescript@4.9.5): - resolution: {integrity: sha512-TiZzBSJja/LbhNPvk6yc0JrX9XqhQ0hdh6M2svYfsHGejaKFIAGd9MQ+ERIMzLGlN/kZoYIgdxFV0PuljTKXag==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + /@typescript-eslint/eslint-plugin@6.5.0(@typescript-eslint/parser@5.62.0)(eslint@8.46.0)(typescript@4.9.5): + resolution: {integrity: sha512-2pktILyjvMaScU6iK3925uvGU87E+N9rh372uGZgiMYwafaw9SXq86U04XPq3UH6tzRvNgBsub6x2DacHc33lw==} + engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: - '@typescript-eslint/parser': ^5.0.0 - eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + '@typescript-eslint/parser': ^6.0.0 || ^6.0.0-alpha + eslint: ^7.0.0 || ^8.0.0 typescript: '*' peerDependenciesMeta: typescript: @@ -5735,27 +5748,28 @@ packages: dependencies: '@eslint-community/regexpp': 4.6.2 '@typescript-eslint/parser': 5.62.0(eslint@8.46.0)(typescript@4.9.5) - '@typescript-eslint/scope-manager': 5.62.0 - '@typescript-eslint/type-utils': 5.62.0(eslint@8.46.0)(typescript@4.9.5) - '@typescript-eslint/utils': 5.62.0(eslint@8.46.0)(typescript@4.9.5) + '@typescript-eslint/scope-manager': 6.5.0 + '@typescript-eslint/type-utils': 6.5.0(eslint@8.46.0)(typescript@4.9.5) + '@typescript-eslint/utils': 6.5.0(eslint@8.46.0)(typescript@4.9.5) + '@typescript-eslint/visitor-keys': 6.5.0 debug: 4.3.4(supports-color@8.1.1) eslint: 8.46.0 graphemer: 1.4.0 ignore: 5.2.4 - natural-compare-lite: 1.4.0 + natural-compare: 1.4.0 semver: 7.5.4 - tsutils: 3.21.0(typescript@4.9.5) + ts-api-utils: 1.0.2(typescript@4.9.5) typescript: 4.9.5 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0)(eslint@8.46.0)(typescript@5.1.6): - resolution: {integrity: sha512-TiZzBSJja/LbhNPvk6yc0JrX9XqhQ0hdh6M2svYfsHGejaKFIAGd9MQ+ERIMzLGlN/kZoYIgdxFV0PuljTKXag==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + /@typescript-eslint/eslint-plugin@6.5.0(@typescript-eslint/parser@5.62.0)(eslint@8.46.0)(typescript@5.1.6): + resolution: {integrity: sha512-2pktILyjvMaScU6iK3925uvGU87E+N9rh372uGZgiMYwafaw9SXq86U04XPq3UH6tzRvNgBsub6x2DacHc33lw==} + engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: - '@typescript-eslint/parser': ^5.0.0 - eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + '@typescript-eslint/parser': ^6.0.0 || ^6.0.0-alpha + eslint: ^7.0.0 || ^8.0.0 typescript: '*' peerDependenciesMeta: typescript: @@ -5763,39 +5777,22 @@ packages: dependencies: '@eslint-community/regexpp': 4.6.2 '@typescript-eslint/parser': 5.62.0(eslint@8.46.0)(typescript@5.1.6) - '@typescript-eslint/scope-manager': 5.62.0 - '@typescript-eslint/type-utils': 5.62.0(eslint@8.46.0)(typescript@5.1.6) - '@typescript-eslint/utils': 5.62.0(eslint@8.46.0)(typescript@5.1.6) + '@typescript-eslint/scope-manager': 6.5.0 + '@typescript-eslint/type-utils': 6.5.0(eslint@8.46.0)(typescript@5.1.6) + '@typescript-eslint/utils': 6.5.0(eslint@8.46.0)(typescript@5.1.6) + '@typescript-eslint/visitor-keys': 6.5.0 debug: 4.3.4(supports-color@8.1.1) eslint: 8.46.0 graphemer: 1.4.0 ignore: 5.2.4 - natural-compare-lite: 1.4.0 + natural-compare: 1.4.0 semver: 7.5.4 - tsutils: 3.21.0(typescript@5.1.6) + ts-api-utils: 1.0.2(typescript@5.1.6) typescript: 5.1.6 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/experimental-utils@4.33.0(eslint@7.32.0)(typescript@4.9.5): - resolution: {integrity: sha512-zeQjOoES5JFjTnAhI5QY7ZviczMzDptls15GFsI6jyUOq0kOf9+WonkhtlIhh0RgHRnqj5gdNxW5j1EvAyYg6Q==} - engines: {node: ^10.12.0 || >=12.0.0} - peerDependencies: - eslint: '*' - dependencies: - '@types/json-schema': 7.0.12 - '@typescript-eslint/scope-manager': 4.33.0 - '@typescript-eslint/types': 4.33.0 - '@typescript-eslint/typescript-estree': 4.33.0(typescript@4.9.5) - eslint: 7.32.0 - eslint-scope: 5.1.1 - eslint-utils: 3.0.0(eslint@7.32.0) - transitivePeerDependencies: - - supports-color - - typescript - dev: true - /@typescript-eslint/parser@4.33.0(eslint@7.32.0)(typescript@4.9.5): resolution: {integrity: sha512-ZohdsbXadjGBSK0/r+d87X0SBmKzOq4/S5nzK6SBgJspFo9/CUDJ7hjayuze+JK7CZQLDMroqytp7pOcFKTxZA==} engines: {node: ^10.12.0 || >=12.0.0} @@ -5892,61 +5889,69 @@ packages: '@typescript-eslint/visitor-keys': 5.62.0 dev: true - /@typescript-eslint/type-utils@5.62.0(eslint@7.32.0)(typescript@4.9.5): - resolution: {integrity: sha512-xsSQreu+VnfbqQpW5vnCJdq1Z3Q0U31qiWmRhr98ONQmcp/yhiPJFPq8MXiJVLiksmOKSjIldZzkebzHuCGzew==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + /@typescript-eslint/scope-manager@6.5.0: + resolution: {integrity: sha512-A8hZ7OlxURricpycp5kdPTH3XnjG85UpJS6Fn4VzeoH4T388gQJ/PGP4ole5NfKt4WDVhmLaQ/dBLNDC4Xl/Kw==} + engines: {node: ^16.0.0 || >=18.0.0} + dependencies: + '@typescript-eslint/types': 6.5.0 + '@typescript-eslint/visitor-keys': 6.5.0 + dev: true + + /@typescript-eslint/type-utils@6.5.0(eslint@7.32.0)(typescript@4.9.5): + resolution: {integrity: sha512-f7OcZOkRivtujIBQ4yrJNIuwyCQO1OjocVqntl9dgSIZAdKqicj3xFDqDOzHDlGCZX990LqhLQXWRnQvsapq8A==} + engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: - eslint: '*' + eslint: ^7.0.0 || ^8.0.0 typescript: '*' peerDependenciesMeta: typescript: optional: true dependencies: - '@typescript-eslint/typescript-estree': 5.62.0(typescript@4.9.5) - '@typescript-eslint/utils': 5.62.0(eslint@7.32.0)(typescript@4.9.5) + '@typescript-eslint/typescript-estree': 6.5.0(typescript@4.9.5) + '@typescript-eslint/utils': 6.5.0(eslint@7.32.0)(typescript@4.9.5) debug: 4.3.4(supports-color@8.1.1) eslint: 7.32.0 - tsutils: 3.21.0(typescript@4.9.5) + ts-api-utils: 1.0.2(typescript@4.9.5) typescript: 4.9.5 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/type-utils@5.62.0(eslint@8.46.0)(typescript@4.9.5): - resolution: {integrity: sha512-xsSQreu+VnfbqQpW5vnCJdq1Z3Q0U31qiWmRhr98ONQmcp/yhiPJFPq8MXiJVLiksmOKSjIldZzkebzHuCGzew==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + /@typescript-eslint/type-utils@6.5.0(eslint@8.46.0)(typescript@4.9.5): + resolution: {integrity: sha512-f7OcZOkRivtujIBQ4yrJNIuwyCQO1OjocVqntl9dgSIZAdKqicj3xFDqDOzHDlGCZX990LqhLQXWRnQvsapq8A==} + engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: - eslint: '*' + eslint: ^7.0.0 || ^8.0.0 typescript: '*' peerDependenciesMeta: typescript: optional: true dependencies: - '@typescript-eslint/typescript-estree': 5.62.0(typescript@4.9.5) - '@typescript-eslint/utils': 5.62.0(eslint@8.46.0)(typescript@4.9.5) + '@typescript-eslint/typescript-estree': 6.5.0(typescript@4.9.5) + '@typescript-eslint/utils': 6.5.0(eslint@8.46.0)(typescript@4.9.5) debug: 4.3.4(supports-color@8.1.1) eslint: 8.46.0 - tsutils: 3.21.0(typescript@4.9.5) + ts-api-utils: 1.0.2(typescript@4.9.5) typescript: 4.9.5 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/type-utils@5.62.0(eslint@8.46.0)(typescript@5.1.6): - resolution: {integrity: sha512-xsSQreu+VnfbqQpW5vnCJdq1Z3Q0U31qiWmRhr98ONQmcp/yhiPJFPq8MXiJVLiksmOKSjIldZzkebzHuCGzew==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + /@typescript-eslint/type-utils@6.5.0(eslint@8.46.0)(typescript@5.1.6): + resolution: {integrity: sha512-f7OcZOkRivtujIBQ4yrJNIuwyCQO1OjocVqntl9dgSIZAdKqicj3xFDqDOzHDlGCZX990LqhLQXWRnQvsapq8A==} + engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: - eslint: '*' + eslint: ^7.0.0 || ^8.0.0 typescript: '*' peerDependenciesMeta: typescript: optional: true dependencies: - '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.1.6) - '@typescript-eslint/utils': 5.62.0(eslint@8.46.0)(typescript@5.1.6) + '@typescript-eslint/typescript-estree': 6.5.0(typescript@5.1.6) + '@typescript-eslint/utils': 6.5.0(eslint@8.46.0)(typescript@5.1.6) debug: 4.3.4(supports-color@8.1.1) eslint: 8.46.0 - tsutils: 3.21.0(typescript@5.1.6) + ts-api-utils: 1.0.2(typescript@5.1.6) typescript: 5.1.6 transitivePeerDependencies: - supports-color @@ -5962,6 +5967,11 @@ packages: engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dev: true + /@typescript-eslint/types@6.5.0: + resolution: {integrity: sha512-eqLLOEF5/lU8jW3Bw+8auf4lZSbbljHR2saKnYqON12G/WsJrGeeDHWuQePoEf9ro22+JkbPfWQwKEC5WwLQ3w==} + engines: {node: ^16.0.0 || >=18.0.0} + dev: true + /@typescript-eslint/typescript-estree@4.33.0(typescript@4.9.5): resolution: {integrity: sha512-rkWRY1MPFzjwnEVHsxGemDzqqddw2QbTJlICPD9p9I9LfsO8fdmfQPOX3uKfUaGRDFJbfrtm/sXhVXN4E+bzCA==} engines: {node: ^10.12.0 || >=12.0.0} @@ -6025,6 +6035,48 @@ packages: - supports-color dev: true + /@typescript-eslint/typescript-estree@6.5.0(typescript@4.9.5): + resolution: {integrity: sha512-q0rGwSe9e5Kk/XzliB9h2LBc9tmXX25G0833r7kffbl5437FPWb2tbpIV9wAATebC/018pGa9fwPDuvGN+LxWQ==} + engines: {node: ^16.0.0 || >=18.0.0} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@typescript-eslint/types': 6.5.0 + '@typescript-eslint/visitor-keys': 6.5.0 + debug: 4.3.4(supports-color@8.1.1) + globby: 11.1.0 + is-glob: 4.0.3 + semver: 7.5.4 + ts-api-utils: 1.0.2(typescript@4.9.5) + typescript: 4.9.5 + transitivePeerDependencies: + - supports-color + dev: true + + /@typescript-eslint/typescript-estree@6.5.0(typescript@5.1.6): + resolution: {integrity: sha512-q0rGwSe9e5Kk/XzliB9h2LBc9tmXX25G0833r7kffbl5437FPWb2tbpIV9wAATebC/018pGa9fwPDuvGN+LxWQ==} + engines: {node: ^16.0.0 || >=18.0.0} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@typescript-eslint/types': 6.5.0 + '@typescript-eslint/visitor-keys': 6.5.0 + debug: 4.3.4(supports-color@8.1.1) + globby: 11.1.0 + is-glob: 4.0.3 + semver: 7.5.4 + ts-api-utils: 1.0.2(typescript@5.1.6) + typescript: 5.1.6 + transitivePeerDependencies: + - supports-color + dev: true + /@typescript-eslint/utils@5.62.0(eslint@7.32.0)(typescript@4.9.5): resolution: {integrity: sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -6045,40 +6097,57 @@ packages: - typescript dev: true - /@typescript-eslint/utils@5.62.0(eslint@8.46.0)(typescript@4.9.5): - resolution: {integrity: sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + /@typescript-eslint/utils@6.5.0(eslint@7.32.0)(typescript@4.9.5): + resolution: {integrity: sha512-9nqtjkNykFzeVtt9Pj6lyR9WEdd8npPhhIPM992FWVkZuS6tmxHfGVnlUcjpUP2hv8r4w35nT33mlxd+Be1ACQ==} + engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + eslint: ^7.0.0 || ^8.0.0 + dependencies: + '@eslint-community/eslint-utils': 4.4.0(eslint@7.32.0) + '@types/json-schema': 7.0.12 + '@types/semver': 7.5.0 + '@typescript-eslint/scope-manager': 6.5.0 + '@typescript-eslint/types': 6.5.0 + '@typescript-eslint/typescript-estree': 6.5.0(typescript@4.9.5) + eslint: 7.32.0 + semver: 7.5.4 + transitivePeerDependencies: + - supports-color + - typescript + dev: true + + /@typescript-eslint/utils@6.5.0(eslint@8.46.0)(typescript@4.9.5): + resolution: {integrity: sha512-9nqtjkNykFzeVtt9Pj6lyR9WEdd8npPhhIPM992FWVkZuS6tmxHfGVnlUcjpUP2hv8r4w35nT33mlxd+Be1ACQ==} + engines: {node: ^16.0.0 || >=18.0.0} + peerDependencies: + eslint: ^7.0.0 || ^8.0.0 dependencies: '@eslint-community/eslint-utils': 4.4.0(eslint@8.46.0) '@types/json-schema': 7.0.12 '@types/semver': 7.5.0 - '@typescript-eslint/scope-manager': 5.62.0 - '@typescript-eslint/types': 5.62.0 - '@typescript-eslint/typescript-estree': 5.62.0(typescript@4.9.5) + '@typescript-eslint/scope-manager': 6.5.0 + '@typescript-eslint/types': 6.5.0 + '@typescript-eslint/typescript-estree': 6.5.0(typescript@4.9.5) eslint: 8.46.0 - eslint-scope: 5.1.1 semver: 7.5.4 transitivePeerDependencies: - supports-color - typescript dev: true - /@typescript-eslint/utils@5.62.0(eslint@8.46.0)(typescript@5.1.6): - resolution: {integrity: sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + /@typescript-eslint/utils@6.5.0(eslint@8.46.0)(typescript@5.1.6): + resolution: {integrity: sha512-9nqtjkNykFzeVtt9Pj6lyR9WEdd8npPhhIPM992FWVkZuS6tmxHfGVnlUcjpUP2hv8r4w35nT33mlxd+Be1ACQ==} + engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + eslint: ^7.0.0 || ^8.0.0 dependencies: '@eslint-community/eslint-utils': 4.4.0(eslint@8.46.0) '@types/json-schema': 7.0.12 '@types/semver': 7.5.0 - '@typescript-eslint/scope-manager': 5.62.0 - '@typescript-eslint/types': 5.62.0 - '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.1.6) + '@typescript-eslint/scope-manager': 6.5.0 + '@typescript-eslint/types': 6.5.0 + '@typescript-eslint/typescript-estree': 6.5.0(typescript@5.1.6) eslint: 8.46.0 - eslint-scope: 5.1.1 semver: 7.5.4 transitivePeerDependencies: - supports-color @@ -6101,6 +6170,14 @@ packages: eslint-visitor-keys: 3.4.2 dev: true + /@typescript-eslint/visitor-keys@6.5.0: + resolution: {integrity: sha512-yCB/2wkbv3hPsh02ZS8dFQnij9VVQXJMN/gbQsaaY+zxALkZnxa/wagvLEFsAWMPv7d7lxQmNsIzGU1w/T/WyA==} + engines: {node: ^16.0.0 || >=18.0.0} + dependencies: + '@typescript-eslint/types': 6.5.0 + eslint-visitor-keys: 3.4.2 + dev: true + /@vercel/analytics@1.0.1: resolution: {integrity: sha512-Ux0c9qUfkcPqng3vrR0GTrlQdqNJ2JREn/2ydrVuKwM3RtMfF2mWX31Ijqo1opSjNAq6rK76PwtANw6kl6TAow==} dev: false @@ -7614,6 +7691,7 @@ packages: /accepts@1.3.8: resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==} engines: {node: '>= 0.6'} + requiresBuild: true dependencies: mime-types: 2.1.35 negotiator: 0.6.3 @@ -7755,6 +7833,7 @@ packages: /amdefine@1.0.1: resolution: {integrity: sha512-S2Hw0TtNkMJhIabBwIojKL9YHO5T0n5eNqWJ7Lrlel/zDbftQpxpapi8tZs3X1HWa+u+QeydGmzzNU0m09+Rcg==} engines: {node: '>=0.4.2'} + requiresBuild: true dev: true optional: true @@ -7937,6 +8016,7 @@ packages: /array-flatten@1.1.1: resolution: {integrity: sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==} + requiresBuild: true dev: true optional: true @@ -8870,6 +8950,7 @@ packages: /bignumber.js@9.1.1: resolution: {integrity: sha512-pHm4LsMJ6lzgNGVfZHjMoO8sdoRhOzOH4MLmY65Jg70bpxCKu5iOHNJyfF6OyvYw7t8Fpf35RuzUyqnQsj8Vig==} + requiresBuild: true dev: true optional: true @@ -8935,6 +9016,7 @@ packages: /body-parser@1.20.1: resolution: {integrity: sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==} engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} + requiresBuild: true dependencies: bytes: 3.1.2 content-type: 1.0.5 @@ -8956,6 +9038,7 @@ packages: /body-parser@1.20.2: resolution: {integrity: sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==} engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} + requiresBuild: true dependencies: bytes: 3.1.2 content-type: 1.0.5 @@ -9173,6 +9256,7 @@ packages: /buffer-to-arraybuffer@0.0.5: resolution: {integrity: sha512-3dthu5CYiVB1DEJp61FtApNnNndTckcqe4pFcLdvHtrpG+kcyekCJKg4MRiDcFW7A6AODnXB9U4dwQiCW5kzJQ==} + requiresBuild: true dev: true optional: true @@ -9296,12 +9380,14 @@ packages: /cacheable-lookup@5.0.4: resolution: {integrity: sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==} engines: {node: '>=10.6.0'} + requiresBuild: true dev: true optional: true /cacheable-request@6.1.0: resolution: {integrity: sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==} engines: {node: '>=8'} + requiresBuild: true dependencies: clone-response: 1.0.3 get-stream: 5.2.0 @@ -9316,6 +9402,7 @@ packages: /cacheable-request@7.0.4: resolution: {integrity: sha512-v+p6ongsrp0yTGbJXjgxPow2+DL93DASP4kXCDKb8/bwRtt9OEF3whggkkDkGNzgcWy2XaF4a8nZglC7uElscg==} engines: {node: '>=8'} + requiresBuild: true dependencies: clone-response: 1.0.3 get-stream: 5.2.0 @@ -9591,6 +9678,7 @@ packages: /chownr@1.1.4: resolution: {integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==} + requiresBuild: true dev: true optional: true @@ -9617,6 +9705,7 @@ packages: resolution: {integrity: sha512-zT7mPeghoWAu+ppn8+BS1tQ5qGmbMfB4AregnQjA/qHY3GC1m1ptI9GkWNlgeu38r7CuRdXB47uY2XgAYt6QVA==} engines: {node: '>=4.0.0', npm: '>=3.0.0'} deprecated: This module has been superseded by the multiformats module + requiresBuild: true dependencies: buffer: 5.7.1 class-is: 1.1.0 @@ -9639,6 +9728,7 @@ packages: /class-is@1.1.0: resolution: {integrity: sha512-rhjH9AG1fvabIDoGRVH587413LPjTZgmDF9fOFCbFJQV4yuocX1mHxxvXI4g3cGwbVY9wAYIoKlg1N79frJKQw==} + requiresBuild: true dev: true optional: true @@ -9771,6 +9861,7 @@ packages: /clone-response@1.0.3: resolution: {integrity: sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==} + requiresBuild: true dependencies: mimic-response: 1.0.1 dev: true @@ -10116,6 +10207,7 @@ packages: /content-disposition@0.5.4: resolution: {integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==} engines: {node: '>= 0.6'} + requiresBuild: true dependencies: safe-buffer: 5.2.1 dev: true @@ -10123,6 +10215,7 @@ packages: /content-hash@2.5.2: resolution: {integrity: sha512-FvIQKy0S1JaWV10sMsA7TRx8bpU+pqPkhbsfvOJAdjRXvYxEckAwQWGwtRjiaJfh+E0DvcWUGqcdjwMGFjsSdw==} + requiresBuild: true dependencies: cids: 0.7.5 multicodec: 0.5.7 @@ -10133,6 +10226,7 @@ packages: /content-type@1.0.5: resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==} engines: {node: '>= 0.6'} + requiresBuild: true dev: true optional: true @@ -10142,6 +10236,7 @@ packages: /cookie-signature@1.0.6: resolution: {integrity: sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==} + requiresBuild: true dev: true optional: true @@ -10157,6 +10252,7 @@ packages: /cookiejar@2.1.4: resolution: {integrity: sha512-LDx6oHrK+PhzLKJU9j5S7/Y3jM/mUHvD/DeI1WQmJn652iPC5Y4TBzC9l+5OMOXlyTTA+SmVUPm0HQUwpD5Jqw==} + requiresBuild: true dev: true optional: true @@ -10198,6 +10294,7 @@ packages: /cors@2.8.5: resolution: {integrity: sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==} engines: {node: '>= 0.10'} + requiresBuild: true dependencies: object-assign: 4.1.1 vary: 1.1.2 @@ -10895,6 +10992,7 @@ packages: /decompress-response@3.3.0: resolution: {integrity: sha512-BzRPQuY1ip+qDonAOz42gRm/pg9F768C+npV/4JOsxRC2sq+Rlk+Q4ZCAsOhnIaMrgarILY+RMUIvMmmX1qAEA==} engines: {node: '>=4'} + requiresBuild: true dependencies: mimic-response: 1.0.1 dev: true @@ -10903,6 +11001,7 @@ packages: /decompress-response@6.0.0: resolution: {integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==} engines: {node: '>=10'} + requiresBuild: true dependencies: mimic-response: 3.1.0 dev: true @@ -10946,12 +11045,14 @@ packages: /defer-to-connect@1.1.3: resolution: {integrity: sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==} + requiresBuild: true dev: true optional: true /defer-to-connect@2.0.1: resolution: {integrity: sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==} engines: {node: '>=10'} + requiresBuild: true dev: true optional: true @@ -11069,6 +11170,7 @@ packages: /destroy@1.2.0: resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==} engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} + requiresBuild: true dev: true optional: true @@ -11301,6 +11403,7 @@ packages: /duplexer3@0.1.5: resolution: {integrity: sha512-1A8za6ws41LQgv9HrE/66jyC5yuSjQ3L/KOpFtoBilsAK2iA2wuS5rTt1OCzIvtS2V7nVmedsUU+DGRcjBmOYA==} + requiresBuild: true dev: true optional: true @@ -11321,6 +11424,7 @@ packages: /ee-first@1.1.1: resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} + requiresBuild: true dev: true optional: true @@ -11376,6 +11480,7 @@ packages: /encodeurl@1.0.2: resolution: {integrity: sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==} engines: {node: '>= 0.8'} + requiresBuild: true dev: true optional: true @@ -12034,6 +12139,7 @@ packages: /escape-html@1.0.3: resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} + requiresBuild: true dev: true optional: true @@ -12199,7 +12305,7 @@ packages: - supports-color dev: true - /eslint-plugin-jest@27.2.3(@typescript-eslint/eslint-plugin@5.62.0)(eslint@7.32.0)(jest@27.5.1)(typescript@4.9.5): + /eslint-plugin-jest@27.2.3(@typescript-eslint/eslint-plugin@6.5.0)(eslint@7.32.0)(jest@27.5.1)(typescript@4.9.5): resolution: {integrity: sha512-sRLlSCpICzWuje66Gl9zvdF6mwD5X86I4u55hJyFBsxYOsBCmT5+kSUjf+fkFWVMMgpzNEupjW8WzUqi83hJAQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} peerDependencies: @@ -12212,7 +12318,7 @@ packages: jest: optional: true dependencies: - '@typescript-eslint/eslint-plugin': 5.62.0(@typescript-eslint/parser@5.62.0)(eslint@7.32.0)(typescript@4.9.5) + '@typescript-eslint/eslint-plugin': 6.5.0(@typescript-eslint/parser@5.62.0)(eslint@7.32.0)(typescript@4.9.5) '@typescript-eslint/utils': 5.62.0(eslint@7.32.0)(typescript@4.9.5) eslint: 7.32.0 jest: 27.5.1 @@ -12339,16 +12445,6 @@ packages: eslint-visitor-keys: 1.3.0 dev: true - /eslint-utils@3.0.0(eslint@7.32.0): - resolution: {integrity: sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==} - engines: {node: ^10.0.0 || ^12.0.0 || >= 14.0.0} - peerDependencies: - eslint: '>=5' - dependencies: - eslint: 7.32.0 - eslint-visitor-keys: 2.1.0 - dev: true - /eslint-visitor-keys@1.3.0: resolution: {integrity: sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==} engines: {node: '>=4'} @@ -12581,6 +12677,7 @@ packages: /etag@1.8.1: resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} engines: {node: '>= 0.6'} + requiresBuild: true dev: true optional: true @@ -12685,6 +12782,7 @@ packages: /eth-lib@0.1.29: resolution: {integrity: sha512-bfttrr3/7gG4E02HoWTDUcDDslN003OlOoBxk9virpAZQ1ja/jDgwkWB8QfJF7ojuEowrqy+lzp9VcJG7/k5bQ==} + requiresBuild: true dependencies: bn.js: 4.12.0 elliptic: 6.5.4 @@ -12701,6 +12799,7 @@ packages: /eth-lib@0.2.8: resolution: {integrity: sha512-ArJ7x1WcWOlSpzdoTBX8vkwlkSQ85CjjifSZtV4co64vWxSV8geWfPI9x4SVYu3DSxnX4yWFVTtGL+j9DUFLNw==} + requiresBuild: true dependencies: bn.js: 4.12.0 elliptic: 6.5.4 @@ -12723,7 +12822,7 @@ packages: resolution: {integrity: sha512-iNZ576iTOGcfllftB73cPB5AN+XUQAT/T8xzsILsghXC1o8gJUqe3RHlcDqagu+biFpYQ61KQrZZJza8eRSYqw==} deprecated: Deprecated in favor of '@metamask/eth-sig-util' dependencies: - ethereumjs-abi: github.com/ethereumjs/ethereumjs-abi/ee3994657fa7a427238e6ba92a84d0b529bbcde0 + ethereumjs-abi: git@github.com+ethereumjs/ethereumjs-abi/ee3994657fa7a427238e6ba92a84d0b529bbcde0 ethereumjs-util: 5.2.1 dev: true @@ -13102,6 +13201,7 @@ packages: /eventemitter3@4.0.4: resolution: {integrity: sha512-rlaVLnVxtxvoyLsQQFBx53YmXHDxRIzzTLbdfxqi4yocpSjAxXwkU0cScM5JgSKMqEhrZpnvQ2D9gjylR0AimQ==} + requiresBuild: true dev: true optional: true @@ -13195,6 +13295,7 @@ packages: /express@4.18.2: resolution: {integrity: sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==} engines: {node: '>= 0.10.0'} + requiresBuild: true dependencies: accepts: 1.3.8 array-flatten: 1.1.1 @@ -13390,6 +13491,7 @@ packages: /finalhandler@1.2.0: resolution: {integrity: sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==} engines: {node: '>= 0.8'} + requiresBuild: true dependencies: debug: 2.6.9 encodeurl: 1.0.2 @@ -13586,6 +13688,7 @@ packages: /forwarded@0.2.0: resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} engines: {node: '>= 0.6'} + requiresBuild: true dev: true optional: true @@ -13607,6 +13710,7 @@ packages: /fresh@0.5.2: resolution: {integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==} engines: {node: '>= 0.6'} + requiresBuild: true dev: true optional: true @@ -13676,6 +13780,7 @@ packages: /fs-minipass@1.2.7: resolution: {integrity: sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA==} + requiresBuild: true dependencies: minipass: 2.9.0 dev: true @@ -13873,6 +13978,7 @@ packages: /get-stream@4.1.0: resolution: {integrity: sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==} engines: {node: '>=6'} + requiresBuild: true dependencies: pump: 3.0.0 dev: true @@ -13881,6 +13987,7 @@ packages: /get-stream@5.2.0: resolution: {integrity: sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==} engines: {node: '>=8'} + requiresBuild: true dependencies: pump: 3.0.0 dev: true @@ -14146,6 +14253,7 @@ packages: /got@11.8.6: resolution: {integrity: sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g==} engines: {node: '>=10.19.0'} + requiresBuild: true dependencies: '@sindresorhus/is': 4.6.0 '@szmarczak/http-timer': 4.0.6 @@ -14164,6 +14272,7 @@ packages: /got@9.6.0: resolution: {integrity: sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==} engines: {node: '>=8.6'} + requiresBuild: true dependencies: '@sindresorhus/is': 0.14.0 '@szmarczak/http-timer': 1.1.2 @@ -14784,6 +14893,7 @@ packages: /http-https@1.0.0: resolution: {integrity: sha512-o0PWwVCSp3O0wS6FvNr6xfBCHgt0m1tvPLFOCc2iFDKTRAXhB7m8klDf7ErowFH8POa6dVdGatKU5I1YYwzUyg==} + requiresBuild: true dev: true optional: true @@ -14827,6 +14937,7 @@ packages: /http2-wrapper@1.0.3: resolution: {integrity: sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==} engines: {node: '>=10.19.0'} + requiresBuild: true dependencies: quick-lru: 5.1.1 resolve-alpn: 1.2.1 @@ -15064,6 +15175,7 @@ packages: /ipaddr.js@1.9.1: resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} engines: {node: '>= 0.10'} + requiresBuild: true dev: true optional: true @@ -16211,11 +16323,13 @@ packages: /json-buffer@3.0.0: resolution: {integrity: sha512-CuUqjv0FUZIdXkHPI8MezCnFCdaTAacej1TZYulLoAg1h/PhwkdXFN4V/gzY4g+fMBCOV2xF+rp7t2XD2ns/NQ==} + requiresBuild: true dev: true optional: true /json-buffer@3.0.1: resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} + requiresBuild: true dev: true optional: true @@ -16362,6 +16476,7 @@ packages: /keyv@3.1.0: resolution: {integrity: sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==} + requiresBuild: true dependencies: json-buffer: 3.0.0 dev: true @@ -16369,6 +16484,7 @@ packages: /keyv@4.5.3: resolution: {integrity: sha512-QCiSav9WaX1PgETJ+SpNnx2PRRapJ/oRSXM4VO5OGYGSjrxbKPVFVhB3l2OCbLCk329N8qyAtsJjSjvVBWzEug==} + requiresBuild: true dependencies: json-buffer: 3.0.1 dev: true @@ -17058,12 +17174,14 @@ packages: /lowercase-keys@1.0.1: resolution: {integrity: sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==} engines: {node: '>=0.10.0'} + requiresBuild: true dev: true optional: true /lowercase-keys@2.0.0: resolution: {integrity: sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==} engines: {node: '>=8'} + requiresBuild: true dev: true optional: true @@ -17437,6 +17555,7 @@ packages: /media-typer@0.3.0: resolution: {integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==} engines: {node: '>= 0.6'} + requiresBuild: true dev: true optional: true @@ -17522,6 +17641,7 @@ packages: /merge-descriptors@1.0.1: resolution: {integrity: sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==} + requiresBuild: true dev: true optional: true @@ -17606,6 +17726,7 @@ packages: /methods@1.1.2: resolution: {integrity: sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==} engines: {node: '>= 0.6'} + requiresBuild: true dev: true optional: true @@ -18006,6 +18127,7 @@ packages: resolution: {integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==} engines: {node: '>=4'} hasBin: true + requiresBuild: true dev: true optional: true @@ -18028,12 +18150,14 @@ packages: /mimic-response@1.0.1: resolution: {integrity: sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==} engines: {node: '>=4'} + requiresBuild: true dev: true optional: true /mimic-response@3.1.0: resolution: {integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==} engines: {node: '>=10'} + requiresBuild: true dev: true optional: true @@ -18147,6 +18271,7 @@ packages: /minipass@2.9.0: resolution: {integrity: sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==} + requiresBuild: true dependencies: safe-buffer: 5.2.1 yallist: 3.1.1 @@ -18177,6 +18302,7 @@ packages: /minizlib@1.3.3: resolution: {integrity: sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q==} + requiresBuild: true dependencies: minipass: 2.9.0 dev: true @@ -18202,6 +18328,7 @@ packages: resolution: {integrity: sha512-Hepn5kb1lJPtVW84RFT40YG1OddBNTOVUZR2bzQUHc+Z03en8/3uX0+060JDhcEzyO08HmipsN9DcnFMxhIL9w==} engines: {node: '>=4'} deprecated: This package is broken and no longer maintained. 'mkdirp' itself supports promises now, please switch to that. + requiresBuild: true dependencies: mkdirp: 3.0.1 dev: true @@ -18231,6 +18358,7 @@ packages: resolution: {integrity: sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==} engines: {node: '>=10'} hasBin: true + requiresBuild: true dev: true optional: true @@ -18341,6 +18469,7 @@ packages: /mock-fs@4.14.0: resolution: {integrity: sha512-qYvlv/exQ4+svI3UOvPUpLDF0OMX5euvUH0Ny4N5QyRyhNdgAgUrVH3iUINSzEPLvx0kbo/Bp28GJKIqvE7URw==} + requiresBuild: true dev: true optional: true @@ -18385,6 +18514,7 @@ packages: /multibase@0.6.1: resolution: {integrity: sha512-pFfAwyTjbbQgNc3G7D48JkJxWtoJoBMaR4xQUOuB8RnCgRqaYmWNFeJTTvrJ2w51bjLq2zTby6Rqj9TQ9elSUw==} deprecated: This module has been superseded by the multiformats module + requiresBuild: true dependencies: base-x: 3.0.9 buffer: 5.7.1 @@ -18394,6 +18524,7 @@ packages: /multibase@0.7.0: resolution: {integrity: sha512-TW8q03O0f6PNFTQDvh3xxH03c8CjGaaYrjkl9UQPG6rz53TQzzxJVCIWVjzcbN/Q5Y53Zd0IBQBMVktVgNx4Fg==} deprecated: This module has been superseded by the multiformats module + requiresBuild: true dependencies: base-x: 3.0.9 buffer: 5.7.1 @@ -18403,6 +18534,7 @@ packages: /multicodec@0.5.7: resolution: {integrity: sha512-PscoRxm3f+88fAtELwUnZxGDkduE2HD9Q6GHUOywQLjOGT/HAdhjLDYNZ1e7VR0s0TP0EwZ16LNUTFpoBGivOA==} deprecated: This module has been superseded by the multiformats module + requiresBuild: true dependencies: varint: 5.0.2 dev: true @@ -18411,6 +18543,7 @@ packages: /multicodec@1.0.4: resolution: {integrity: sha512-NDd7FeS3QamVtbgfvu5h7fd1IlbaC4EQ0/pgU4zqE2vdHCmBGsUa0TiM8/TdSeG6BMPC92OOCf8F1ocE/Wkrrg==} deprecated: This module has been superseded by the multiformats module + requiresBuild: true dependencies: buffer: 5.7.1 varint: 5.0.2 @@ -18422,6 +18555,7 @@ packages: /multihashes@0.4.21: resolution: {integrity: sha512-uVSvmeCWf36pU2nB4/1kzYZjsXD9vofZKpgudqkceYY5g2aZZXJ5r9lxuzoRLl1OAp28XljXsEJ/X/85ZsKmKw==} + requiresBuild: true dependencies: buffer: 5.7.1 multibase: 0.7.0 @@ -18451,6 +18585,7 @@ packages: /nano-json-stream-parser@0.1.2: resolution: {integrity: sha512-9MqxMH/BSJC7dnLsEMPyfN5Dvoo49IsPFYMcHw3Bcfc2kN0lpHRBSzlMSVx4HGyJ7s9B31CyBTVehWJoQ8Ctew==} + requiresBuild: true dev: true optional: true @@ -18488,10 +18623,6 @@ packages: resolution: {integrity: sha512-hmEVtAGYzVQpCKdbQea4skABsdXW4RUh5t5mJ2zzqowJS2OyXZTU1KhDVFhx+NlWZ4ap9mqR9TcDO3LTTttd+g==} dev: true - /natural-compare-lite@1.4.0: - resolution: {integrity: sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==} - dev: true - /natural-compare@1.4.0: resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} dev: true @@ -18831,12 +18962,14 @@ packages: /normalize-url@4.5.1: resolution: {integrity: sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA==} engines: {node: '>=8'} + requiresBuild: true dev: true optional: true /normalize-url@6.1.0: resolution: {integrity: sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==} engines: {node: '>=10'} + requiresBuild: true dev: true optional: true @@ -19038,6 +19171,7 @@ packages: /oboe@2.1.4: resolution: {integrity: sha512-ymBJ4xSC6GBXLT9Y7lirj+xbqBLa+jADGJldGEYG7u8sZbS9GyG+u1Xk9c5cbriKwSpCg41qUhPjvU5xOpvIyQ==} + requiresBuild: true dependencies: http-https: 1.0.0 dev: true @@ -19053,6 +19187,7 @@ packages: /on-finished@2.4.1: resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} engines: {node: '>= 0.8'} + requiresBuild: true dependencies: ee-first: 1.1.1 dev: true @@ -19144,12 +19279,14 @@ packages: /p-cancelable@1.1.0: resolution: {integrity: sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==} engines: {node: '>=6'} + requiresBuild: true dev: true optional: true /p-cancelable@2.1.1: resolution: {integrity: sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==} engines: {node: '>=8'} + requiresBuild: true dev: true optional: true @@ -19331,6 +19468,7 @@ packages: /parseurl@1.3.3: resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} engines: {node: '>= 0.8'} + requiresBuild: true dev: true optional: true @@ -19457,6 +19595,7 @@ packages: /path-to-regexp@0.1.7: resolution: {integrity: sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==} + requiresBuild: true dev: true optional: true @@ -19644,7 +19783,7 @@ packages: postcss: 8.4.27 postcss-value-parser: 4.2.0 read-cache: 1.0.0 - resolve: 1.22.2 + resolve: 1.22.3 dev: true /postcss-js@4.0.1(postcss@8.4.27): @@ -19860,6 +19999,7 @@ packages: /prepend-http@2.0.0: resolution: {integrity: sha512-ravE6m9Atw9Z/jjttRUZ+clIXogdghyZAuWJ3qEzjT+jI/dL1ifAqhZeC5VHzQp1MSt1+jxKkFNemj/iO7tVUA==} engines: {node: '>=4'} + requiresBuild: true dev: true optional: true @@ -20022,6 +20162,7 @@ packages: /proxy-addr@2.0.7: resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} engines: {node: '>= 0.10'} + requiresBuild: true dependencies: forwarded: 0.2.0 ipaddr.js: 1.9.1 @@ -20103,6 +20244,7 @@ packages: /pump@3.0.0: resolution: {integrity: sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==} + requiresBuild: true dependencies: end-of-stream: 1.4.4 once: 1.4.0 @@ -20150,6 +20292,7 @@ packages: /qs@6.11.0: resolution: {integrity: sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==} engines: {node: '>=0.6'} + requiresBuild: true dependencies: side-channel: 1.0.4 dev: true @@ -20169,6 +20312,7 @@ packages: /query-string@5.1.1: resolution: {integrity: sha512-gjWOsm2SoGlgLEdAGt7a6slVOk9mGiXmPFMqrEhLQ68rhQuBnpfs3+EmlvqKyxnCo9/PPlF+9MtY02S1aFg+Jw==} engines: {node: '>=0.10.0'} + requiresBuild: true dependencies: decode-uri-component: 0.2.2 object-assign: 4.1.1 @@ -20239,12 +20383,14 @@ packages: /range-parser@1.2.1: resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==} engines: {node: '>= 0.6'} + requiresBuild: true dev: true optional: true /raw-body@2.5.1: resolution: {integrity: sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==} engines: {node: '>= 0.8'} + requiresBuild: true dependencies: bytes: 3.1.2 http-errors: 2.0.0 @@ -20723,6 +20869,7 @@ packages: /resolve-alpn@1.2.1: resolution: {integrity: sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==} + requiresBuild: true dev: true optional: true @@ -20788,6 +20935,7 @@ packages: /responselike@1.0.2: resolution: {integrity: sha512-/Fpe5guzJk1gPqdJLJR5u7eG/gNY4nImjbRDaVWVMRhne55TCmj2i9Q+54PBRfatRC8v/rIiv9BN0pMd9OV5EQ==} + requiresBuild: true dependencies: lowercase-keys: 1.0.1 dev: true @@ -20795,6 +20943,7 @@ packages: /responselike@2.0.1: resolution: {integrity: sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==} + requiresBuild: true dependencies: lowercase-keys: 2.0.0 dev: true @@ -21100,6 +21249,7 @@ packages: /scryptsy@1.2.1: resolution: {integrity: sha512-aldIRgMozSJ/Gl6K6qmJZysRP82lz83Wb42vl4PWN8SaLFHIaOzLPc9nUUW2jQN88CuGm5q5HefJ9jZ3nWSmTw==} + requiresBuild: true dependencies: pbkdf2: 3.1.2 dev: true @@ -21174,6 +21324,7 @@ packages: /send@0.18.0: resolution: {integrity: sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==} engines: {node: '>= 0.8.0'} + requiresBuild: true dependencies: debug: 2.6.9 depd: 2.0.0 @@ -21216,6 +21367,7 @@ packages: /serve-static@1.15.0: resolution: {integrity: sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==} engines: {node: '>= 0.8.0'} + requiresBuild: true dependencies: encodeurl: 1.0.2 escape-html: 1.0.3 @@ -21229,6 +21381,7 @@ packages: /servify@0.1.12: resolution: {integrity: sha512-/xE6GvsKKqyo1BAY+KxOWXcLpPsUUyji7Qg3bVD7hh1eRze5bR1uYiuDA/k3Gof1s9BTzQZEJK8sNcNGFIzeWw==} engines: {node: '>=6'} + requiresBuild: true dependencies: body-parser: 1.20.2 cors: 2.8.5 @@ -21345,11 +21498,13 @@ packages: /simple-concat@1.0.1: resolution: {integrity: sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==} + requiresBuild: true dev: true optional: true /simple-get@2.8.2: resolution: {integrity: sha512-Ijd/rV5o+mSBBs4F/x9oDPtTx9Zb6X9brmnXvMW4J7IR15ngi9q5xxqWBKU744jTZiaXtxaPL7uHG6vtN8kUkw==} + requiresBuild: true dependencies: decompress-response: 3.3.0 once: 1.4.0 @@ -21787,6 +21942,7 @@ packages: /strict-uri-encode@1.1.0: resolution: {integrity: sha512-R3f198pcvnB+5IpnBlRkphuE9n46WyVl8I39W/ZUTZLz4nqSP/oLYUrcnJrw462Ds8he4YKMov2efsTIw1BDGQ==} engines: {node: '>=0.10.0'} + requiresBuild: true dev: true optional: true @@ -22390,6 +22546,7 @@ packages: /swarm-js@0.1.42: resolution: {integrity: sha512-BV7c/dVlA3R6ya1lMlSSNPLYrntt0LUq4YMgy3iwpCIc6rZnS5W2wUoctarZ5pXlpKtxDDf9hNziEkcfrxdhqQ==} + requiresBuild: true dependencies: bluebird: 3.7.2 buffer: 5.7.1 @@ -22499,6 +22656,7 @@ packages: /tar@4.4.19: resolution: {integrity: sha512-a20gEsvHnWe0ygBY8JbxoM4w3SJdhc7ZAuxkLqh+nvNQN2IOt0B5lLgM490X5Hl8FF0dl0tOf2ewFYAlIFgzVA==} engines: {node: '>=4.5'} + requiresBuild: true dependencies: chownr: 1.1.4 fs-minipass: 1.2.7 @@ -22675,6 +22833,7 @@ packages: /timed-out@4.0.1: resolution: {integrity: sha512-G7r3AhovYtr5YKOWQkta8RKAPb+J9IsO4uVmzjl8AZwfhs8UcUwTiD6gcJYSgOtzyjvQKrKYn41syHbUWMkafA==} engines: {node: '>=0.10.0'} + requiresBuild: true dev: true optional: true @@ -22759,6 +22918,7 @@ packages: /to-readable-stream@1.0.0: resolution: {integrity: sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q==} engines: {node: '>=6'} + requiresBuild: true dev: true optional: true @@ -22863,6 +23023,24 @@ packages: resolution: {integrity: sha512-0z3j8R7MCjy10kc/g+qg7Ln3alJTodw9aDuVWZa3uiWqfuBMKeAeP2ocWcxoyM3D73yz3Jt/Pu4qPr4wHSdB/Q==} dev: true + /ts-api-utils@1.0.2(typescript@4.9.5): + resolution: {integrity: sha512-Cbu4nIqnEdd+THNEsBdkolnOXhg0I8XteoHaEKgvsxpsbWda4IsUut2c187HxywQCvveojow0Dgw/amxtSKVkQ==} + engines: {node: '>=16.13.0'} + peerDependencies: + typescript: '>=4.2.0' + dependencies: + typescript: 4.9.5 + dev: true + + /ts-api-utils@1.0.2(typescript@5.1.6): + resolution: {integrity: sha512-Cbu4nIqnEdd+THNEsBdkolnOXhg0I8XteoHaEKgvsxpsbWda4IsUut2c187HxywQCvveojow0Dgw/amxtSKVkQ==} + engines: {node: '>=16.13.0'} + peerDependencies: + typescript: '>=4.2.0' + dependencies: + typescript: 5.1.6 + dev: true + /ts-dedent@2.2.0: resolution: {integrity: sha512-q5W7tVM71e2xjHZTlgfTDoPF/SmqKG5hddq9SzR49CH2hayqRKJtQ4mtRlSxKaJlR/+9rEM+mnBHf7I2/BQcpQ==} engines: {node: '>=6.10'} @@ -23124,6 +23302,7 @@ packages: /type-is@1.6.18: resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==} engines: {node: '>= 0.6'} + requiresBuild: true dependencies: media-typer: 0.3.0 mime-types: 2.1.35 @@ -23271,6 +23450,7 @@ packages: /ultron@1.1.1: resolution: {integrity: sha512-UIEXBNeYmKptWH6z8ZnqTeS8fV74zG0/eRU9VGkpzz+LIJNs8W/zM/L+7ctCkRrgbNnnR0xxw4bKOr0cW0N0Og==} + requiresBuild: true dev: true optional: true @@ -23285,6 +23465,7 @@ packages: /underscore@1.9.1: resolution: {integrity: sha512-5/4etnCkd9c8gwgowi5/om/mYO5ajCaOgdzj/oW+0eQV9WxKBDZw5+ycmKmeaTXjInS/W0BzpGLo2xR2aBwZdg==} + requiresBuild: true dev: true optional: true @@ -23543,6 +23724,7 @@ packages: /url-parse-lax@3.0.0: resolution: {integrity: sha512-NjFKA0DidqPa5ciFcSrXnAltTtzz84ogy+NebPvfEgAck0+TNg4UJ4IN+fB7zRZfbgUf0syOo9MDxFkDSMuFaQ==} engines: {node: '>=4'} + requiresBuild: true dependencies: prepend-http: 2.0.0 dev: true @@ -23557,6 +23739,7 @@ packages: /url-set-query@1.0.0: resolution: {integrity: sha512-3AChu4NiXquPfeckE5R5cGdiHCMWJx1dwCWOmWIL4KHAziJNOFIYJlpGFeKDvwLPHovZRCxK3cYlwzqI9Vp+Gg==} + requiresBuild: true dev: true optional: true @@ -23621,6 +23804,7 @@ packages: /utils-merge@1.0.1: resolution: {integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==} engines: {node: '>= 0.4.0'} + requiresBuild: true dev: true optional: true @@ -23633,6 +23817,7 @@ packages: resolution: {integrity: sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==} 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. hasBin: true + requiresBuild: true dev: true optional: true @@ -23737,12 +23922,14 @@ packages: /varint@5.0.2: resolution: {integrity: sha512-lKxKYG6H03yCZUpAGOPOsMcGxd1RHCu1iKvEHYDPmTyq2HueGhD73ssNBqqQWfvYs04G9iUFRvmAVLW20Jw6ow==} + requiresBuild: true dev: true optional: true /vary@1.1.2: resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} engines: {node: '>= 0.8'} + requiresBuild: true dev: true optional: true @@ -24269,6 +24456,7 @@ packages: /web3-bzz@1.2.11: resolution: {integrity: sha512-XGpWUEElGypBjeFyUhTkiPXFbDVD6Nr/S5jznE3t8cWUA0FxRf1n3n/NuIZeb0H9RkN2Ctd/jNma/k8XGa3YKg==} engines: {node: '>=8.0.0'} + requiresBuild: true dependencies: '@types/node': 12.20.55 got: 9.6.0 @@ -24284,6 +24472,7 @@ packages: /web3-core-helpers@1.2.11: resolution: {integrity: sha512-PEPoAoZd5ME7UfbnCZBdzIerpe74GEvlwT4AjOmHeCVZoIFk7EqvOZDejJHt+feJA6kMVTdd0xzRNN295UhC1A==} engines: {node: '>=8.0.0'} + requiresBuild: true dependencies: underscore: 1.9.1 web3-eth-iban: 1.2.11 @@ -24294,6 +24483,7 @@ packages: /web3-core-method@1.2.11: resolution: {integrity: sha512-ff0q76Cde94HAxLDZ6DbdmKniYCQVtvuaYh+rtOUMB6kssa5FX0q3vPmixi7NPooFnbKmmZCM6NvXg4IreTPIw==} engines: {node: '>=8.0.0'} + requiresBuild: true dependencies: '@ethersproject/transactions': 5.7.0 underscore: 1.9.1 @@ -24307,6 +24497,7 @@ packages: /web3-core-promievent@1.2.11: resolution: {integrity: sha512-il4McoDa/Ox9Agh4kyfQ8Ak/9ABYpnF8poBLL33R/EnxLsJOGQG2nZhkJa3I067hocrPSjEdlPt/0bHXsln4qA==} engines: {node: '>=8.0.0'} + requiresBuild: true dependencies: eventemitter3: 4.0.4 dev: true @@ -24315,6 +24506,7 @@ packages: /web3-core-requestmanager@1.2.11: resolution: {integrity: sha512-oFhBtLfOiIbmfl6T6gYjjj9igOvtyxJ+fjS+byRxiwFJyJ5BQOz4/9/17gWR1Cq74paTlI7vDGxYfuvfE/mKvA==} engines: {node: '>=8.0.0'} + requiresBuild: true dependencies: underscore: 1.9.1 web3-core-helpers: 1.2.11 @@ -24329,6 +24521,7 @@ packages: /web3-core-subscriptions@1.2.11: resolution: {integrity: sha512-qEF/OVqkCvQ7MPs1JylIZCZkin0aKK9lDxpAtQ1F8niEDGFqn7DT8E/vzbIa0GsOjL2fZjDhWJsaW+BSoAW1gg==} engines: {node: '>=8.0.0'} + requiresBuild: true dependencies: eventemitter3: 4.0.4 underscore: 1.9.1 @@ -24339,6 +24532,7 @@ packages: /web3-core@1.2.11: resolution: {integrity: sha512-CN7MEYOY5ryo5iVleIWRE3a3cZqVaLlIbIzDPsvQRUfzYnvzZQRZBm9Mq+ttDi2STOOzc1MKylspz/o3yq/LjQ==} engines: {node: '>=8.0.0'} + requiresBuild: true dependencies: '@types/bn.js': 4.11.6 '@types/node': 12.20.55 @@ -24355,6 +24549,7 @@ packages: /web3-eth-abi@1.2.11: resolution: {integrity: sha512-PkRYc0+MjuLSgg03QVWqWlQivJqRwKItKtEpRUaxUAeLE7i/uU39gmzm2keHGcQXo3POXAbOnMqkDvOep89Crg==} engines: {node: '>=8.0.0'} + requiresBuild: true dependencies: '@ethersproject/abi': 5.0.0-beta.153 underscore: 1.9.1 @@ -24365,6 +24560,7 @@ packages: /web3-eth-accounts@1.2.11: resolution: {integrity: sha512-6FwPqEpCfKIh3nSSGeo3uBm2iFSnFJDfwL3oS9pyegRBXNsGRVpgiW63yhNzL0796StsvjHWwQnQHsZNxWAkGw==} engines: {node: '>=8.0.0'} + requiresBuild: true dependencies: crypto-browserify: 3.12.0 eth-lib: 0.2.8 @@ -24385,6 +24581,7 @@ packages: /web3-eth-contract@1.2.11: resolution: {integrity: sha512-MzYuI/Rq2o6gn7vCGcnQgco63isPNK5lMAan2E51AJLknjSLnOxwNY3gM8BcKoy4Z+v5Dv00a03Xuk78JowFow==} engines: {node: '>=8.0.0'} + requiresBuild: true dependencies: '@types/bn.js': 4.11.6 underscore: 1.9.1 @@ -24403,6 +24600,7 @@ packages: /web3-eth-ens@1.2.11: resolution: {integrity: sha512-dbW7dXP6HqT1EAPvnniZVnmw6TmQEKF6/1KgAxbo8iBBYrVTMDGFQUUnZ+C4VETGrwwaqtX4L9d/FrQhZ6SUiA==} engines: {node: '>=8.0.0'} + requiresBuild: true dependencies: content-hash: 2.5.2 eth-ens-namehash: 2.0.8 @@ -24421,6 +24619,7 @@ packages: /web3-eth-iban@1.2.11: resolution: {integrity: sha512-ozuVlZ5jwFC2hJY4+fH9pIcuH1xP0HEFhtWsR69u9uDIANHLPQQtWYmdj7xQ3p2YT4bQLq/axKhZi7EZVetmxQ==} engines: {node: '>=8.0.0'} + requiresBuild: true dependencies: bn.js: 4.12.0 web3-utils: 1.2.11 @@ -24430,6 +24629,7 @@ packages: /web3-eth-personal@1.2.11: resolution: {integrity: sha512-42IzUtKq9iHZ8K9VN0vAI50iSU9tOA1V7XU2BhF/tb7We2iKBVdkley2fg26TxlOcKNEHm7o6HRtiiFsVK4Ifw==} engines: {node: '>=8.0.0'} + requiresBuild: true dependencies: '@types/node': 12.20.55 web3-core: 1.2.11 @@ -24445,6 +24645,7 @@ packages: /web3-eth@1.2.11: resolution: {integrity: sha512-REvxW1wJ58AgHPcXPJOL49d1K/dPmuw4LjPLBPStOVkQjzDTVmJEIsiLwn2YeuNDd4pfakBwT8L3bz1G1/wVsQ==} engines: {node: '>=8.0.0'} + requiresBuild: true dependencies: underscore: 1.9.1 web3-core: 1.2.11 @@ -24467,6 +24668,7 @@ packages: /web3-net@1.2.11: resolution: {integrity: sha512-sjrSDj0pTfZouR5BSTItCuZ5K/oZPVdVciPQ6981PPPIwJJkCMeVjD7I4zO3qDPCnBjBSbWvVnLdwqUBPtHxyg==} engines: {node: '>=8.0.0'} + requiresBuild: true dependencies: web3-core: 1.2.11 web3-core-method: 1.2.11 @@ -24509,6 +24711,7 @@ packages: /web3-providers-http@1.2.11: resolution: {integrity: sha512-psh4hYGb1+ijWywfwpB2cvvOIMISlR44F/rJtYkRmQ5jMvG4FOCPlQJPiHQZo+2cc3HbktvvSJzIhkWQJdmvrA==} engines: {node: '>=8.0.0'} + requiresBuild: true dependencies: web3-core-helpers: 1.2.11 xhr2-cookies: 1.1.0 @@ -24518,6 +24721,7 @@ packages: /web3-providers-ipc@1.2.11: resolution: {integrity: sha512-yhc7Y/k8hBV/KlELxynWjJDzmgDEDjIjBzXK+e0rHBsYEhdCNdIH5Psa456c+l0qTEU2YzycF8VAjYpWfPnBpQ==} engines: {node: '>=8.0.0'} + requiresBuild: true dependencies: oboe: 2.1.4 underscore: 1.9.1 @@ -24528,6 +24732,7 @@ packages: /web3-providers-ws@1.2.11: resolution: {integrity: sha512-ZxnjIY1Er8Ty+cE4migzr43zA/+72AF1myzsLaU5eVgdsfV7Jqx7Dix1hbevNZDKFlSoEyq/3j/jYalh3So1Zg==} engines: {node: '>=8.0.0'} + requiresBuild: true dependencies: eventemitter3: 4.0.4 underscore: 1.9.1 @@ -24541,6 +24746,7 @@ packages: /web3-shh@1.2.11: resolution: {integrity: sha512-B3OrO3oG1L+bv3E1sTwCx66injW1A8hhwpknDUbV+sw3fehFazA06z9SGXUefuFI1kVs4q2vRi0n4oCcI4dZDg==} engines: {node: '>=8.0.0'} + requiresBuild: true dependencies: web3-core: 1.2.11 web3-core-method: 1.2.11 @@ -24567,6 +24773,7 @@ packages: /web3-utils@1.2.11: resolution: {integrity: sha512-3Tq09izhD+ThqHEaWYX4VOT7dNPdZiO+c/1QMA0s5X2lDFKK/xHJb7cyTRRVzN2LvlHbR7baS1tmQhSua51TcQ==} engines: {node: '>=8.0.0'} + requiresBuild: true dependencies: bn.js: 4.12.0 eth-lib: 0.2.8 @@ -24896,6 +25103,7 @@ packages: /ws@3.3.3: resolution: {integrity: sha512-nnWLa/NwZSt4KQJu51MYlCcSQ5g7INpOrOMt4XV8j4dqTXdmlUmSHQ8/oLC069ckre0fRsgfvsKwbTdtKLCDkA==} + requiresBuild: true peerDependencies: bufferutil: ^4.0.1 utf-8-validate: ^5.0.2 @@ -24991,6 +25199,7 @@ packages: /xhr-request-promise@0.1.3: resolution: {integrity: sha512-YUBytBsuwgitWtdRzXDDkWAXzhdGB8bYm0sSzMPZT7Z2MBjMSTHFsyCT1yCRATY+XC69DUrQraRAEgcoCRaIPg==} + requiresBuild: true dependencies: xhr-request: 1.1.0 dev: true @@ -24998,6 +25207,7 @@ packages: /xhr-request@1.1.0: resolution: {integrity: sha512-Y7qzEaR3FDtL3fP30k9wO/e+FBnBByZeybKOhASsGP30NIkRAAkKD/sCnLvgEfAIEC1rcmK7YG8f4oEnIrrWzA==} + requiresBuild: true dependencies: buffer-to-arraybuffer: 0.0.5 object-assign: 4.1.1 @@ -25011,6 +25221,7 @@ packages: /xhr2-cookies@1.1.0: resolution: {integrity: sha512-hjXUA6q+jl/bd8ADHcVfFsSPIf+tyLIjuO9TwJC9WI6JP2zKcS7C+p56I9kCLLsaCiNT035iYvEUUzdEFj/8+g==} + requiresBuild: true dependencies: cookiejar: 2.1.4 dev: true @@ -25277,8 +25488,8 @@ packages: resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==} dev: false - github.com/ethereumjs/ethereumjs-abi/ee3994657fa7a427238e6ba92a84d0b529bbcde0: - resolution: {tarball: https://codeload.github.com/ethereumjs/ethereumjs-abi/tar.gz/ee3994657fa7a427238e6ba92a84d0b529bbcde0} + git@github.com+ethereumjs/ethereumjs-abi/ee3994657fa7a427238e6ba92a84d0b529bbcde0: + resolution: {commit: ee3994657fa7a427238e6ba92a84d0b529bbcde0, repo: git@github.com:ethereumjs/ethereumjs-abi.git, type: git} name: ethereumjs-abi version: 0.6.8 dependencies: @@ -25286,9 +25497,9 @@ packages: ethereumjs-util: 6.2.1 dev: true - github.com/taikoxyz/solidity-coverage/ceb49fd1f6041e4fcd26079dfb0d3b0f58c812e5(hardhat@2.17.1): - resolution: {tarball: https://codeload.github.com/taikoxyz/solidity-coverage/tar.gz/ceb49fd1f6041e4fcd26079dfb0d3b0f58c812e5} - id: github.com/taikoxyz/solidity-coverage/ceb49fd1f6041e4fcd26079dfb0d3b0f58c812e5 + git@github.com+taikoxyz/solidity-coverage/ceb49fd1f6041e4fcd26079dfb0d3b0f58c812e5(hardhat@2.17.1): + resolution: {commit: ceb49fd1f6041e4fcd26079dfb0d3b0f58c812e5, repo: git@github.com:taikoxyz/solidity-coverage.git, type: git} + id: git@github.com+taikoxyz/solidity-coverage/ceb49fd1f6041e4fcd26079dfb0d3b0f58c812e5 name: solidity-coverage version: 0.8.1 hasBin: true