From 6f691322c9671934d6066cd5c496330059e8c861 Mon Sep 17 00:00:00 2001 From: Daniel Wang <99078276+dantaik@users.noreply.github.com> Date: Wed, 22 Mar 2023 12:32:10 +0800 Subject: [PATCH 01/47] feat(protocol): major protocol upgrade (#13254) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Jeffery Walsh Co-authored-by: David Co-authored-by: jeff <113397187+cyberhorsey@users.noreply.github.com> Co-authored-by: dave | d1onys1us <13951458+d1onys1us@users.noreply.github.com> Co-authored-by: Brecht Devos Co-authored-by: D <51912515+adaki2004@users.noreply.github.com> Co-authored-by: Keszey Dániel --- .github/workflows/protocol.yml | 27 +- .gitmodules | 16 + README.md | 4 - packages/bridge-ui/CHANGELOG.md | 16 +- .../bridge-ui/src/proof/ProofService.spec.ts | 6 +- packages/bridge-ui/src/proof/ProofService.ts | 5 +- packages/protocol/.eslintignore | 3 +- packages/protocol/.gas-snapshot | 2 + packages/protocol/.gitignore | 3 + packages/protocol/.prettierignore | 2 +- packages/protocol/.solcover.js | 4 - packages/protocol/.solhint.json | 3 +- packages/protocol/.solhintignore | 10 +- packages/protocol/CHANGELOG.md | 18 +- packages/protocol/README.md | 9 + .../protocol/contracts/L1/ProofVerifier.sol | 60 - .../protocol/contracts/L1/TaikoConfig.sol | 64 + .../contracts/L1/TaikoCustomErrors.sol | 48 - packages/protocol/contracts/L1/TaikoData.sol | 152 +- .../protocol/contracts/L1/TaikoErrors.sol | 32 + .../protocol/contracts/L1/TaikoEvents.sol | 18 +- packages/protocol/contracts/L1/TaikoL1.sol | 269 +- packages/protocol/contracts/L1/TaikoToken.sol | 27 +- .../contracts/L1/libs/LibProposing.sol | 346 +- .../protocol/contracts/L1/libs/LibProving.sol | 446 +-- .../contracts/L1/libs/LibTokenomics.sol | 205 ++ .../protocol/contracts/L1/libs/LibUtils.sol | 146 +- .../contracts/L1/libs/LibVerifying.sol | 310 +- packages/protocol/contracts/L2/TaikoL2.sol | 230 +- .../TaikoL2Signer.sol} | 50 +- packages/protocol/contracts/bridge/Bridge.sol | 1 - .../protocol/contracts/bridge/EtherVault.sol | 8 +- .../protocol/contracts/bridge/TokenVault.sol | 19 +- .../contracts/bridge/libs/LibBridgeData.sol | 4 +- .../contracts/bridge/libs/LibBridgeInvoke.sol | 4 +- .../bridge/libs/LibBridgeProcess.sol | 25 +- .../bridge/libs/LibBridgeRelease.sol | 10 +- .../contracts/bridge/libs/LibBridgeRetry.sol | 15 +- .../contracts/bridge/libs/LibBridgeSend.sol | 8 +- .../contracts/bridge/libs/LibBridgeStatus.sol | 17 +- .../contracts/common/AddressResolver.sol | 26 +- .../protocol/contracts/common/IHeaderSync.sol | 19 - .../protocol/contracts/common/IXchainSync.sol | 37 + .../protocol/contracts/libs/Lib1559Math.sol | 28 +- .../protocol/contracts/libs/LibAddress.sol | 6 +- .../contracts/libs/LibBlockHeader.sol | 15 +- .../contracts/libs/LibInvalidTxList.sol | 106 - packages/protocol/contracts/libs/LibMath.sol | 35 - .../contracts/libs/LibReceiptDecoder.sol | 83 - .../contracts/libs/LibSharedConfig.sol | 44 - .../protocol/contracts/libs/LibTrieProof.sol | 32 +- .../protocol/contracts/libs/LibTxDecoder.sol | 237 -- .../protocol/contracts/libs/LibTxUtils.sol | 104 - packages/protocol/contracts/libs/LibZKP.sol | 31 - .../contracts/signal/SignalService.sol | 51 +- .../contracts/test/L1/TestTaikoL1.sol | 62 +- .../test/L1/TestTaikoL1EnableTokenomics.sol | 59 +- .../contracts/test/L1/TestTaikoL2.sol | 53 - .../L1/TestTaikoL2EnablePublicInputsCheck.sol | 53 - .../contracts/test/bridge/TestHeaderSync.sol | 24 +- .../test/libs/TestLibAnchorSignature.sol | 34 - .../contracts/test/libs/TestLibProving.sol | 386 --- .../test/libs/TestLibReceiptDecoder.sol | 23 - .../contracts/test/libs/TestLibTrieProof.sol | 7 +- .../contracts/test/libs/TestLibTxUtils.sol | 26 - .../contracts/test/libs/TestLibZKP.sol | 19 - .../thirdparty/TestLibBlockHeaderDecoder.sol | 35 - .../contracts/thirdparty/AddressManager.sol | 3 +- .../contracts/thirdparty/ERC20Upgradeable.sol | 2 +- .../thirdparty/LibBlockHeaderDecoder.sol | 234 -- .../contracts/thirdparty/LibMerkleTrie.sol | 16 +- packages/protocol/foundry.toml | 10 + packages/protocol/hardhat.config.ts | 3 + packages/protocol/lib/forge-std | 1 + packages/protocol/lib/openzeppelin-contracts | 1 + .../lib/openzeppelin-contracts-upgradeable | 1 + packages/protocol/package.json | 58 +- packages/protocol/remappings.txt | 5 + packages/protocol/tasks/deploy_L1.ts | 44 +- .../test/L1/TaikoL1.integration.test.ts | 326 +- packages/protocol/test/L1/TaikoL1.test.ts | 26 +- packages/protocol/test/L1/TaikoToken.test.ts | 4 +- packages/protocol/test/L2/TaikoL2.test.ts | 38 - .../test/bridge/Bridge.integration.test.ts | 54 +- .../test/genesis/generate_genesis.test.ts | 143 - .../test/libs/LibAnchorSignature.test.ts | 46 - .../test/libs/LibReceiptDecoder.test.ts | 83 - .../protocol/test/libs/LibTrieProof.test.ts | 28 +- .../protocol/test/libs/LibTxDecoder.test.ts | 220 -- .../protocol/test/libs/LibTxUtils.test.ts | 200 -- packages/protocol/test/libs/LibZKP.test.ts | 62 - .../signal/SignalService.integration.test.ts | 54 +- .../thirdparty/LibBlockHeaderDecoder.test.ts | 169 - .../protocol/test/tokenomics/blockFee.test.ts | 16 +- .../test/tokenomics/proofReward.test.ts | 10 +- packages/protocol/test/utils/blockListener.ts | 2 +- .../protocol/test/utils/block_metadata.ts | 2 - packages/protocol/test/utils/bridge.ts | 14 +- packages/protocol/test/utils/commit.ts | 69 +- packages/protocol/test/utils/encoding.ts | 4 +- packages/protocol/test/utils/fixture.ts | 9 +- packages/protocol/test/utils/onNewL2Block.ts | 4 +- packages/protocol/test/utils/propose.ts | 4 - packages/protocol/test/utils/proposer.ts | 28 +- packages/protocol/test/utils/prove.ts | 16 +- packages/protocol/test/utils/signal.ts | 30 +- packages/protocol/test/utils/taikoL1.ts | 47 +- packages/protocol/test/utils/taikoL2.ts | 26 +- packages/protocol/test/utils/taikoToken.ts | 6 +- packages/protocol/test/utils/verify.ts | 8 +- packages/protocol/test2/GasComparison.t.sol | 268 ++ packages/protocol/test2/LibTokenomics.t.sol | 45 + packages/protocol/test2/TaikoL1.t.sol | 201 ++ packages/protocol/test2/TaikoL1TestBase.sol | 194 ++ packages/protocol/test2/TaikoL2.t.sol | 56 + .../protocol/utils/generate_config/main.py | 2 +- .../utils/generate_genesis/taikoL2.ts | 33 +- packages/relayer/TaikoL1.json | 14 +- packages/relayer/contracts/taikol1/TaikoL1.go | 16 +- packages/relayer/contracts/taikol2/TaikoL2.go | 5 +- packages/relayer/encoding/storage_proof.go | 24 - .../relayer/encoding/storage_proof_test.go | 20 - packages/relayer/encoding/types.go | 2 - .../relayer/proof/encoded_signal_proof.go | 12 +- .../proof/encoded_signal_proof_test.go | 2 +- .../status-page/src/constants/abi/TaikoL1.ts | 8 +- .../src/utils/getAvailableSlots.ts | 4 +- .../src/utils/getLastVerifiedBlockId.ts | 4 +- .../status-page/src/utils/getPendingBlocks.ts | 4 +- .../L1/ProofVerifier.md | 41 - .../contract-documentation/L1/TaikoConfig.md | 11 + .../L1/TaikoCustomErrors.md | 227 -- .../contract-documentation/L1/TaikoData.md | 149 +- .../contract-documentation/L1/TaikoErrors.md | 125 + .../contract-documentation/L1/TaikoEvents.md | 18 +- .../contract-documentation/L1/TaikoL1.md | 106 +- .../contract-documentation/L1/TaikoToken.md | 8 +- .../contract-documentation/L2/TaikoL2.md | 97 +- .../L2/TaikoL2Signer.md | 29 + .../contract-documentation/_meta.json | 17 - .../common/AddressResolver.md | 6 + .../common/IHeaderSync.md | 26 - .../common/IXchainSync.md | 55 + packages/whitepaper/main.tex | 17 +- pnpm-lock.yaml | 2770 ++++++----------- 145 files changed, 3875 insertions(+), 7144 deletions(-) create mode 100644 .gitmodules create mode 100644 packages/protocol/.gas-snapshot delete mode 100644 packages/protocol/contracts/L1/ProofVerifier.sol create mode 100644 packages/protocol/contracts/L1/TaikoConfig.sol delete mode 100644 packages/protocol/contracts/L1/TaikoCustomErrors.sol create mode 100644 packages/protocol/contracts/L1/TaikoErrors.sol create mode 100644 packages/protocol/contracts/L1/libs/LibTokenomics.sol rename packages/protocol/contracts/{libs/LibAnchorSignature.sol => L2/TaikoL2Signer.sol} (71%) delete mode 100644 packages/protocol/contracts/common/IHeaderSync.sol create mode 100644 packages/protocol/contracts/common/IXchainSync.sol delete mode 100644 packages/protocol/contracts/libs/LibInvalidTxList.sol delete mode 100644 packages/protocol/contracts/libs/LibReceiptDecoder.sol delete mode 100644 packages/protocol/contracts/libs/LibSharedConfig.sol delete mode 100644 packages/protocol/contracts/libs/LibTxDecoder.sol delete mode 100644 packages/protocol/contracts/libs/LibTxUtils.sol delete mode 100644 packages/protocol/contracts/libs/LibZKP.sol delete mode 100644 packages/protocol/contracts/test/L1/TestTaikoL2.sol delete mode 100644 packages/protocol/contracts/test/L1/TestTaikoL2EnablePublicInputsCheck.sol delete mode 100644 packages/protocol/contracts/test/libs/TestLibAnchorSignature.sol delete mode 100644 packages/protocol/contracts/test/libs/TestLibProving.sol delete mode 100644 packages/protocol/contracts/test/libs/TestLibReceiptDecoder.sol delete mode 100644 packages/protocol/contracts/test/libs/TestLibTxUtils.sol delete mode 100644 packages/protocol/contracts/test/libs/TestLibZKP.sol delete mode 100644 packages/protocol/contracts/test/thirdparty/TestLibBlockHeaderDecoder.sol delete mode 100644 packages/protocol/contracts/thirdparty/LibBlockHeaderDecoder.sol create mode 100644 packages/protocol/foundry.toml create mode 160000 packages/protocol/lib/forge-std create mode 160000 packages/protocol/lib/openzeppelin-contracts create mode 160000 packages/protocol/lib/openzeppelin-contracts-upgradeable create mode 100644 packages/protocol/remappings.txt delete mode 100644 packages/protocol/test/L2/TaikoL2.test.ts delete mode 100644 packages/protocol/test/libs/LibAnchorSignature.test.ts delete mode 100644 packages/protocol/test/libs/LibReceiptDecoder.test.ts delete mode 100644 packages/protocol/test/libs/LibTxDecoder.test.ts delete mode 100644 packages/protocol/test/libs/LibTxUtils.test.ts delete mode 100644 packages/protocol/test/libs/LibZKP.test.ts delete mode 100644 packages/protocol/test/thirdparty/LibBlockHeaderDecoder.test.ts create mode 100644 packages/protocol/test2/GasComparison.t.sol create mode 100644 packages/protocol/test2/LibTokenomics.t.sol create mode 100644 packages/protocol/test2/TaikoL1.t.sol create mode 100644 packages/protocol/test2/TaikoL1TestBase.sol create mode 100644 packages/protocol/test2/TaikoL2.t.sol delete mode 100644 packages/relayer/encoding/storage_proof.go delete mode 100644 packages/relayer/encoding/storage_proof_test.go delete mode 100644 packages/website/pages/docs/reference/contract-documentation/L1/ProofVerifier.md create mode 100644 packages/website/pages/docs/reference/contract-documentation/L1/TaikoConfig.md delete mode 100644 packages/website/pages/docs/reference/contract-documentation/L1/TaikoCustomErrors.md create mode 100644 packages/website/pages/docs/reference/contract-documentation/L1/TaikoErrors.md create mode 100644 packages/website/pages/docs/reference/contract-documentation/L2/TaikoL2Signer.md delete mode 100644 packages/website/pages/docs/reference/contract-documentation/_meta.json delete mode 100644 packages/website/pages/docs/reference/contract-documentation/common/IHeaderSync.md create mode 100644 packages/website/pages/docs/reference/contract-documentation/common/IXchainSync.md diff --git a/.github/workflows/protocol.yml b/.github/workflows/protocol.yml index 4c8d74bb55e..abf353d8257 100644 --- a/.github/workflows/protocol.yml +++ b/.github/workflows/protocol.yml @@ -20,31 +20,42 @@ jobs: - name: Checkout repository uses: actions/checkout@v3 + with: + submodules: recursive + + - name: Install Foundry + uses: foundry-rs/foundry-toolchain@v1 + - name: protocol - Unit Tests (foundry) + run: forge test -vvv + + - name: protocol - Run snapshot (foundry) + run: forge snapshot + - name: Install pnpm dependencies uses: ./.github/actions/install-pnpm-dependencies - - name: protocol - Unit Tests + - name: protocol - Unit Tests (hardhat) working-directory: ./packages/protocol run: pnpm clean && pnpm test - - name: protocol - Integration Tests + - name: protocol - Integration Tests (hardhat) working-directory: ./packages/protocol run: pnpm test:integration - - name: protocol - Tokenomics Tests - working-directory: ./packages/protocol - run: pnpm test:tokenomics + # - name: protocol - Tokenomics Tests (hardhat) + # working-directory: ./packages/protocol + # run: pnpm test:tokenomics - - name: protocol - Bridge Tests + - name: protocol - Bridge Tests (hardhat) working-directory: ./packages/protocol run: pnpm test:bridge - - name: protocol - Test Coverage + - name: protocol - Test Coverage (hardhat) working-directory: ./packages/protocol run: pnpm test:coverage - - name: protocol - Generate Genesis + - name: protocol - Generate Genesis (hardhat) working-directory: ./packages/protocol run: pnpm test:genesis diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 00000000000..d075cf60403 --- /dev/null +++ b/.gitmodules @@ -0,0 +1,16 @@ +[submodule "packages/protocol/lib/solmate"] + path = packages/protocol/lib/solmate + url = https://github.com/rari-capital/solmate + branch = v1.5.0 +[submodule "packages/protocol/lib/openzeppelin-contracts-upgradeable"] + path = packages/protocol/lib/openzeppelin-contracts-upgradeable + url = https://github.com/OpenZeppelin/openzeppelin-contracts-upgradeable + branch = v4.8.2 +[submodule "packages/protocol/lib/openzeppelin-contracts"] + path = packages/protocol/lib/openzeppelin-contracts + url = https://github.com/OpenZeppelin/openzeppelin-contracts + branch = v4.8.2 +[submodule "packages/protocol/lib/forge-std"] + path = packages/protocol/lib/forge-std + url = https://github.com/foundry-rs/forge-std + branch = chore/v1.5.1 diff --git a/README.md b/README.md index 4424a477c0d..fdc66042453 100644 --- a/README.md +++ b/README.md @@ -23,10 +23,6 @@ [![GitHub Workflow Status](https://img.shields.io/github/actions/workflow/status/taikoxyz/taiko-mono/bridge-ui.yml?branch=main&label=Bridge%20UI&logo=github)](https://github.com/taikoxyz/taiko-mono/actions/workflows/bridge-ui.yml) [![GitHub Workflow Status](https://img.shields.io/github/actions/workflow/status/taikoxyz/taiko-mono/website.yml?branch=main&label=Website&logo=github)](https://github.com/taikoxyz/taiko-mono/actions/workflows/website.yml) -[![Codecov](https://img.shields.io/codecov/c/github/taikoxyz/taiko-mono?flag=protocol&label=Protocol&logo=codecov&token=E468X2PTJC)](https://app.codecov.io/gh/taikoxyz/taiko-mono/tree/main/packages/protocol) -[![Codecov](https://img.shields.io/codecov/c/github/taikoxyz/taiko-mono?flag=relayer&label=Relayer&logo=codecov&token=E468X2PTJC)](https://app.codecov.io/gh/taikoxyz/taiko-mono/tree/main/packages/relayer) -[![Codecov](https://img.shields.io/codecov/c/github/taikoxyz/taiko-mono?flag=bridge-ui&label=Bridge%20UI&logo=codecov&token=E468X2PTJC)](https://app.codecov.io/gh/taikoxyz/taiko-mono/tree/main/packages/bridge-ui) - ## Documentation diff --git a/packages/bridge-ui/CHANGELOG.md b/packages/bridge-ui/CHANGELOG.md index c14361c7c3f..bb556a69049 100644 --- a/packages/bridge-ui/CHANGELOG.md +++ b/packages/bridge-ui/CHANGELOG.md @@ -2,20 +2,18 @@ ## [0.3.0](https://github.com/taikoxyz/taiko-mono/compare/bridge-ui-v0.2.0...bridge-ui-v0.3.0) (2023-03-15) - ### Features -* **bridge-ui:** custom recipient address ([#13309](https://github.com/taikoxyz/taiko-mono/issues/13309)) ([56d8848](https://github.com/taikoxyz/taiko-mono/commit/56d884812b3f12a52895bc666cb25e6edbe6eba0)) -* **bridge-ui:** fetch transactions from relayer api ([#13244](https://github.com/taikoxyz/taiko-mono/issues/13244)) ([9732cc0](https://github.com/taikoxyz/taiko-mono/commit/9732cc084ed99196a4cd2ccedf9187af4d289ed6)) -* **bridge-ui:** support both bull and horse tokens on the bridge UI ([#13249](https://github.com/taikoxyz/taiko-mono/issues/13249)) ([f9f38bb](https://github.com/taikoxyz/taiko-mono/commit/f9f38bb075c02c7976e0d04c84e4b8b5ac255644)) -* **bridge-ui:** support route param to directly open transactions tab ([#13281](https://github.com/taikoxyz/taiko-mono/issues/13281)) ([b4c31cd](https://github.com/taikoxyz/taiko-mono/commit/b4c31cd8566b834cbf83a434c705fb281d375d12)) - +- **bridge-ui:** custom recipient address ([#13309](https://github.com/taikoxyz/taiko-mono/issues/13309)) ([56d8848](https://github.com/taikoxyz/taiko-mono/commit/56d884812b3f12a52895bc666cb25e6edbe6eba0)) +- **bridge-ui:** fetch transactions from relayer api ([#13244](https://github.com/taikoxyz/taiko-mono/issues/13244)) ([9732cc0](https://github.com/taikoxyz/taiko-mono/commit/9732cc084ed99196a4cd2ccedf9187af4d289ed6)) +- **bridge-ui:** support both bull and horse tokens on the bridge UI ([#13249](https://github.com/taikoxyz/taiko-mono/issues/13249)) ([f9f38bb](https://github.com/taikoxyz/taiko-mono/commit/f9f38bb075c02c7976e0d04c84e4b8b5ac255644)) +- **bridge-ui:** support route param to directly open transactions tab ([#13281](https://github.com/taikoxyz/taiko-mono/issues/13281)) ([b4c31cd](https://github.com/taikoxyz/taiko-mono/commit/b4c31cd8566b834cbf83a434c705fb281d375d12)) ### Bug Fixes -* **bridge-ui:** minor transactions list fix ([#13266](https://github.com/taikoxyz/taiko-mono/issues/13266)) ([4e78865](https://github.com/taikoxyz/taiko-mono/commit/4e788655ebd508eca3e1665ecb50f3010d2f51af)) -* **bridge-ui:** transaction and pendingTransaction refactor ([#13307](https://github.com/taikoxyz/taiko-mono/issues/13307)) ([9d215cf](https://github.com/taikoxyz/taiko-mono/commit/9d215cfe5ac6863405390444672a1e70e7501032)) -* **website,bridge-ui:** broken docs link + remove deprecated note in docs ([#13259](https://github.com/taikoxyz/taiko-mono/issues/13259)) ([912c155](https://github.com/taikoxyz/taiko-mono/commit/912c15595d7b0e3e2b4ec62fbcebeaf9dbc9db66)) +- **bridge-ui:** minor transactions list fix ([#13266](https://github.com/taikoxyz/taiko-mono/issues/13266)) ([4e78865](https://github.com/taikoxyz/taiko-mono/commit/4e788655ebd508eca3e1665ecb50f3010d2f51af)) +- **bridge-ui:** transaction and pendingTransaction refactor ([#13307](https://github.com/taikoxyz/taiko-mono/issues/13307)) ([9d215cf](https://github.com/taikoxyz/taiko-mono/commit/9d215cfe5ac6863405390444672a1e70e7501032)) +- **website,bridge-ui:** broken docs link + remove deprecated note in docs ([#13259](https://github.com/taikoxyz/taiko-mono/issues/13259)) ([912c155](https://github.com/taikoxyz/taiko-mono/commit/912c15595d7b0e3e2b4ec62fbcebeaf9dbc9db66)) ## [0.2.0](https://github.com/taikoxyz/taiko-mono/compare/bridge-ui-v0.1.2...bridge-ui-v0.2.0) (2023-03-01) diff --git a/packages/bridge-ui/src/proof/ProofService.spec.ts b/packages/bridge-ui/src/proof/ProofService.spec.ts index 8ba5fc8d02f..776145938fd 100644 --- a/packages/bridge-ui/src/proof/ProofService.spec.ts +++ b/packages/bridge-ui/src/proof/ProofService.spec.ts @@ -105,11 +105,9 @@ const invalidStorageProof2: EthGetProofResponse = { }; const expectedProof = - '0x000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000380a7881266ca0a344c43cb24175d9dbd243b58d45d6ae6ad71310a273a3d1d3afb1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347000000000000000000000000ea674fdde714fd979de3edf0f56aa9716b898ec8c0dcf937b3f6136dd70a1ad11cc57b040fd410f3c49a5146f20c732895a3cc217273ade6b6ed865a9975ac281da23b90b141a8b607d874d2cd95e65e81336f8e74bb61e381e9238a08b169580f3cbf9b8b79d7d5ee708d3e286103eb291dfd0800000000000400000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000020000000000000000000000000000000000000000000000000100000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000007b000000000000000000000000000000000000000000000000000000000000007b000000000000000000000000000000000000000000000000000000000000007b000000000000000000000000000000000000000000000000000000000000007b000000000000000000000000000000000000000000000000000000000000007b0000000000000000000000000000000000000000000000000000000000000300f5ba25df1e92e89a09e0b32063b81795f631100801158f5fa733f2ba26843bd0000000000000000000000000000000000000000000000000000000000000007b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001265746865726d696e652d75732d7765737431000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000001c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000022e1a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'; - + '0x000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000380a7881266ca0a344c43cb24175d9dbd243b58d45d6ae6ad71310a273a3d1d3afb1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347000000000000000000000000ea674fdde714fd979de3edf0f56aa9716b898ec8c0dcf937b3f6136dd70a1ad11cc57b040fd410f3c49a5146f20c732895a3cc217273ade6b6ed865a9975ac281da23b90b141a8b607d874d2cd95e65e81336f8e74bb61e381e9238a08b169580f3cbf9b8b79d7d5ee708d3e286103eb291dfd0800000000000400000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000020000000000000000000000000000000000000000000000000100000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000007b000000000000000000000000000000000000000000000000000000000000007b000000000000000000000000000000000000000000000000000000000000007b000000000000000000000000000000000000000000000000000000000000007b000000000000000000000000000000000000000000000000000000000000007b0000000000000000000000000000000000000000000000000000000000000300f5ba25df1e92e89a09e0b32063b81795f631100801158f5fa733f2ba26843bd0000000000000000000000000000000000000000000000000000000000000007b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001265746865726d696e652d75732d776573743100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000022e1a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'; const expectedProofWithBaseFee = - '0x000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000380a7881266ca0a344c43cb24175d9dbd243b58d45d6ae6ad71310a273a3d1d3afb1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347000000000000000000000000ea674fdde714fd979de3edf0f56aa9716b898ec8c0dcf937b3f6136dd70a1ad11cc57b040fd410f3c49a5146f20c732895a3cc217273ade6b6ed865a9975ac281da23b90b141a8b607d874d2cd95e65e81336f8e74bb61e381e9238a08b169580f3cbf9b8b79d7d5ee708d3e286103eb291dfd0800000000000400000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000020000000000000000000000000000000000000000000000000100000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000007b000000000000000000000000000000000000000000000000000000000000007b000000000000000000000000000000000000000000000000000000000000007b000000000000000000000000000000000000000000000000000000000000007b000000000000000000000000000000000000000000000000000000000000007b0000000000000000000000000000000000000000000000000000000000000300f5ba25df1e92e89a09e0b32063b81795f631100801158f5fa733f2ba26843bd0000000000000000000000000000000000000000000000000000000000000007b00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001265746865726d696e652d75732d7765737431000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000001c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000022e1a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'; - + '0x000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000380a7881266ca0a344c43cb24175d9dbd243b58d45d6ae6ad71310a273a3d1d3afb1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347000000000000000000000000ea674fdde714fd979de3edf0f56aa9716b898ec8c0dcf937b3f6136dd70a1ad11cc57b040fd410f3c49a5146f20c732895a3cc217273ade6b6ed865a9975ac281da23b90b141a8b607d874d2cd95e65e81336f8e74bb61e381e9238a08b169580f3cbf9b8b79d7d5ee708d3e286103eb291dfd0800000000000400000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000020000000000000000000000000000000000000000000000000100000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000007b000000000000000000000000000000000000000000000000000000000000007b000000000000000000000000000000000000000000000000000000000000007b000000000000000000000000000000000000000000000000000000000000007b000000000000000000000000000000000000000000000000000000000000007b0000000000000000000000000000000000000000000000000000000000000300f5ba25df1e92e89a09e0b32063b81795f631100801158f5fa733f2ba26843bd0000000000000000000000000000000000000000000000000000000000000007b00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001265746865726d696e652d75732d776573743100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000022e1a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'; const srcChain = 167001; const destChain = 31336; diff --git a/packages/bridge-ui/src/proof/ProofService.ts b/packages/bridge-ui/src/proof/ProofService.ts index 878a09b6693..2ee674f6549 100644 --- a/packages/bridge-ui/src/proof/ProofService.ts +++ b/packages/bridge-ui/src/proof/ProofService.ts @@ -68,10 +68,7 @@ export class ProofService implements Prover { blockHeader: BlockHeader, ) { // RLP encode the proof together for LibTrieProof to decode - const encodedProof = ethers.utils.defaultAbiCoder.encode( - ['bytes', 'bytes'], - [RLP.encode(proof.accountProof), RLP.encode(proof.storageProof[0].proof)], - ); + const encodedProof = RLP.encode(proof.storageProof[0].proof); // encode the SignalProof struct from LibBridgeSignal const signalProof = ethers.utils.defaultAbiCoder.encode( diff --git a/packages/protocol/.eslintignore b/packages/protocol/.eslintignore index a51367fe352..fcece9835f3 100644 --- a/packages/protocol/.eslintignore +++ b/packages/protocol/.eslintignore @@ -1,4 +1,5 @@ node_modules artifacts cache -coverage \ No newline at end of file +coverage +lib \ No newline at end of file diff --git a/packages/protocol/.gas-snapshot b/packages/protocol/.gas-snapshot new file mode 100644 index 00000000000..1679d511059 --- /dev/null +++ b/packages/protocol/.gas-snapshot @@ -0,0 +1,2 @@ +GasComparisonTest:testCompareHashString(uint256) (runs: 256, μ: 282730, ~: 206082) +TaikoL1Test:testProposeSingleBlock() (gas: 3474497) \ No newline at end of file diff --git a/packages/protocol/.gitignore b/packages/protocol/.gitignore index b660994e1f3..238cb7bbda3 100644 --- a/packages/protocol/.gitignore +++ b/packages/protocol/.gitignore @@ -16,6 +16,9 @@ npm-debug.log* # Hardhat files cache artifacts +cache +cache_forge +cache_hardhat out # Editors diff --git a/packages/protocol/.prettierignore b/packages/protocol/.prettierignore index 4b910ac3a6a..3fadde88a77 100644 --- a/packages/protocol/.prettierignore +++ b/packages/protocol/.prettierignore @@ -1,6 +1,6 @@ node_modules +lib artifacts cache coverage* gasReporterOutput.json -contracts/thirdparty/LibBlockHeaderDecoder.sol diff --git a/packages/protocol/.solcover.js b/packages/protocol/.solcover.js index 8064404e0ca..0cc5bfc493b 100644 --- a/packages/protocol/.solcover.js +++ b/packages/protocol/.solcover.js @@ -1,10 +1,6 @@ module.exports = { configureYulOptimizer: true, skipFiles: [ - "thirdparty/LibBlockHeaderDecoder.sol", // assembly too long - "libs/LibReceiptDecoder.sol", //integration test, - "test/libs/TestLibReceiptDecoder.sol", //integration tests - "test/thirdparty/TestLibBlockHeaderDecoder.sol", // assembly too long ], mocha: { grep: "^[^integration]", diff --git a/packages/protocol/.solhint.json b/packages/protocol/.solhint.json index 46c6ff69ac8..1ccc385aed2 100644 --- a/packages/protocol/.solhint.json +++ b/packages/protocol/.solhint.json @@ -9,6 +9,7 @@ "no-inline-assembly": "off", "not-rely-on-time": "off", "ordering": "warn", - "payable-fallback": "off" + "payable-fallback": "off", + "no-console": "off" } } diff --git a/packages/protocol/.solhintignore b/packages/protocol/.solhintignore index 871b9009a80..35e56e7003c 100644 --- a/packages/protocol/.solhintignore +++ b/packages/protocol/.solhintignore @@ -1,10 +1,6 @@ node_modules/ -contracts/aux/tokens/ERC20Upgradeable.sol +lib/ contracts/test/TestLibRLPReader.sol contracts/test/TestLibRLPWriter.sol -contracts/libs/Lib1559Math.sol -contracts/libs/LibAddress.sol -contracts/libs/LibMath.sol -contracts/libs/LibUint512Math.sol -contracts/libs/LibSharedConfig.sol -**/contracts/thirdparty/**/*.sol \ No newline at end of file +**/contracts/thirdparty/**/*.sol +test2/GasComparison.t.sol \ No newline at end of file diff --git a/packages/protocol/CHANGELOG.md b/packages/protocol/CHANGELOG.md index 060697294da..ee4c5dd4ff2 100644 --- a/packages/protocol/CHANGELOG.md +++ b/packages/protocol/CHANGELOG.md @@ -2,20 +2,18 @@ ## [0.5.0](https://github.com/taikoxyz/taiko-mono/compare/protocol-v0.4.0...protocol-v0.5.0) (2023-03-15) - ### Features -* **protocol:** let `PlonkVerifier` return `keccak256("taiko")` ([#13277](https://github.com/taikoxyz/taiko-mono/issues/13277)) ([8ca632c](https://github.com/taikoxyz/taiko-mono/commit/8ca632ce9263219a37368d1f0f84a44cbb369794)) -* **protocol:** optimize gas for processMessage & retryMessage ([#13181](https://github.com/taikoxyz/taiko-mono/issues/13181)) ([178e382](https://github.com/taikoxyz/taiko-mono/commit/178e3823d9ca8a0396ef2a7198c064368feaca90)) -* **protocol:** tokens can only mint once ([#13252](https://github.com/taikoxyz/taiko-mono/issues/13252)) ([72d152b](https://github.com/taikoxyz/taiko-mono/commit/72d152b7d998b9f306a12823df964a2da18687dd)) -* **protocol:** update `LibBlockHeader` to hash post Shanghai fork blocks ([#13278](https://github.com/taikoxyz/taiko-mono/issues/13278)) ([2e34634](https://github.com/taikoxyz/taiko-mono/commit/2e34634560a28c356404f2d837d21f2e5e85bfa3)) - +- **protocol:** let `PlonkVerifier` return `keccak256("taiko")` ([#13277](https://github.com/taikoxyz/taiko-mono/issues/13277)) ([8ca632c](https://github.com/taikoxyz/taiko-mono/commit/8ca632ce9263219a37368d1f0f84a44cbb369794)) +- **protocol:** optimize gas for processMessage & retryMessage ([#13181](https://github.com/taikoxyz/taiko-mono/issues/13181)) ([178e382](https://github.com/taikoxyz/taiko-mono/commit/178e3823d9ca8a0396ef2a7198c064368feaca90)) +- **protocol:** tokens can only mint once ([#13252](https://github.com/taikoxyz/taiko-mono/issues/13252)) ([72d152b](https://github.com/taikoxyz/taiko-mono/commit/72d152b7d998b9f306a12823df964a2da18687dd)) +- **protocol:** update `LibBlockHeader` to hash post Shanghai fork blocks ([#13278](https://github.com/taikoxyz/taiko-mono/issues/13278)) ([2e34634](https://github.com/taikoxyz/taiko-mono/commit/2e34634560a28c356404f2d837d21f2e5e85bfa3)) ### Bug Fixes -* **protocol:** fix config.slotSmoothingFactor and getTimeAdjustedFee bug ([#13293](https://github.com/taikoxyz/taiko-mono/issues/13293)) ([18f3d9f](https://github.com/taikoxyz/taiko-mono/commit/18f3d9fcf99691f54b65198618c49e57590b0a84)) -* **protocol:** make download solc script can run outside the protocol dir ([#13263](https://github.com/taikoxyz/taiko-mono/issues/13263)) ([7cd7787](https://github.com/taikoxyz/taiko-mono/commit/7cd77873d0ce1e5f8b43167a8009327cca4200c3)) -* **protocol:** Wrong calculation when minting ERC20 tokens ([#13250](https://github.com/taikoxyz/taiko-mono/issues/13250)) ([5920b7e](https://github.com/taikoxyz/taiko-mono/commit/5920b7eee377e913c10b5b78384f24712808f179)) +- **protocol:** fix config.slotSmoothingFactor and getTimeAdjustedFee bug ([#13293](https://github.com/taikoxyz/taiko-mono/issues/13293)) ([18f3d9f](https://github.com/taikoxyz/taiko-mono/commit/18f3d9fcf99691f54b65198618c49e57590b0a84)) +- **protocol:** make download solc script can run outside the protocol dir ([#13263](https://github.com/taikoxyz/taiko-mono/issues/13263)) ([7cd7787](https://github.com/taikoxyz/taiko-mono/commit/7cd77873d0ce1e5f8b43167a8009327cca4200c3)) +- **protocol:** Wrong calculation when minting ERC20 tokens ([#13250](https://github.com/taikoxyz/taiko-mono/issues/13250)) ([5920b7e](https://github.com/taikoxyz/taiko-mono/commit/5920b7eee377e913c10b5b78384f24712808f179)) ## [0.4.0](https://github.com/taikoxyz/taiko-mono/compare/protocol-v0.3.0...protocol-v0.4.0) (2023-03-01) @@ -107,7 +105,7 @@ - **protocol:** fix `BlockVerified` event ([#381](https://github.com/taikoxyz/taiko-mono/issues/381)) ([fe479c8](https://github.com/taikoxyz/taiko-mono/commit/fe479c8ff22b0da59ec75cc9e0dea04e38ebbb92)) - **protocol:** fix `TokenVault.sendERC20` ([#420](https://github.com/taikoxyz/taiko-mono/issues/420)) ([d42b953](https://github.com/taikoxyz/taiko-mono/commit/d42b953c51e66948d7a6563042f7a521ee2d557a)) - **protocol:** fix an occasional error in `test:tokenomics` ([#12950](https://github.com/taikoxyz/taiko-mono/issues/12950)) ([005364c](https://github.com/taikoxyz/taiko-mono/commit/005364c11c327f6dcaad7872c5064eb81e52f35b)) -- **protocol:** Fix bug in getProposedBlock ([#11679](https://github.com/taikoxyz/taiko-mono/issues/11679)) ([a6a596c](https://github.com/taikoxyz/taiko-mono/commit/a6a596cf10ecfa517a781e8c487b2d74f05a9526)) +- **protocol:** Fix bug in getBlock ([#11679](https://github.com/taikoxyz/taiko-mono/issues/11679)) ([a6a596c](https://github.com/taikoxyz/taiko-mono/commit/a6a596cf10ecfa517a781e8c487b2d74f05a9526)) - **protocol:** let `LibZKP.verify` return `true` ([#12676](https://github.com/taikoxyz/taiko-mono/issues/12676)) ([d0f17a6](https://github.com/taikoxyz/taiko-mono/commit/d0f17a6dc8921df49a63831d91170a7c11476bd9)) - **protocol:** Remove enableDestChain functionality ([#12341](https://github.com/taikoxyz/taiko-mono/issues/12341)) ([362d083](https://github.com/taikoxyz/taiko-mono/commit/362d083497cc74b3bcd05a406beeff2101a422ef)) - **protocol:** update avg proof time and avg block time ([#391](https://github.com/taikoxyz/taiko-mono/issues/391)) ([3681483](https://github.com/taikoxyz/taiko-mono/commit/3681483efe97c38a488563594c003dabfa23b2de)) diff --git a/packages/protocol/README.md b/packages/protocol/README.md index 47ed575f7a8..39fa49340d4 100644 --- a/packages/protocol/README.md +++ b/packages/protocol/README.md @@ -57,3 +57,12 @@ The script will output two JSON files under `./deployments`: - `l2_genesis_alloc.json`: the `alloc` field which will be used in L2 genesis JSON file - `l2_genesis_storage_layout.json`: the storage layout of those pre-deployed contracts + +## Using Foundry + +This project also integrates with Foundry for building and testing contracts. + +- To compile using foundry: `forge build` or `pnpm compile:foundry` +- To run foundry tests: `forge test --gas-report -vvv` or `pnpm test:foundry` + +Note that compiling with foundry uses dependencies inside the `lib` dir (instead of `node_modules`). diff --git a/packages/protocol/contracts/L1/ProofVerifier.sol b/packages/protocol/contracts/L1/ProofVerifier.sol deleted file mode 100644 index 4b82a284b3a..00000000000 --- a/packages/protocol/contracts/L1/ProofVerifier.sol +++ /dev/null @@ -1,60 +0,0 @@ -// SPDX-License-Identifier: MIT -// _____ _ _ _ _ -// |_ _|_ _(_) |_____ | | __ _| |__ ___ -// | |/ _` | | / / _ \ | |__/ _` | '_ (_-< -// |_|\__,_|_|_\_\___/ |____\__,_|_.__/__/ - -pragma solidity ^0.8.18; - -import {EssentialContract} from "../common/EssentialContract.sol"; -import {LibZKP} from "../libs/LibZKP.sol"; -import {LibMerkleTrie} from "../thirdparty/LibMerkleTrie.sol"; - -interface IProofVerifier { - function verifyZKP( - string memory verifierId, - bytes calldata zkproof, - bytes32 instance - ) external view returns (bool verified); - - function verifyMKP( - bytes memory key, - bytes memory value, - bytes memory proof, - bytes32 root - ) external pure returns (bool verified); -} - -contract ProofVerifier is IProofVerifier, EssentialContract { - function init(address addressManager) external initializer { - EssentialContract._init(addressManager); - } - - function verifyZKP( - string memory verifierId, - bytes calldata zkproof, - bytes32 instance - ) external view returns (bool) { - return - LibZKP.verify({ - plonkVerifier: resolve(verifierId, false), - zkproof: zkproof, - instance: instance - }); - } - - function verifyMKP( - bytes memory key, - bytes memory value, - bytes memory proof, - bytes32 root - ) external pure returns (bool) { - return - LibMerkleTrie.verifyInclusionProof({ - _key: key, - _value: value, - _proof: proof, - _root: root - }); - } -} diff --git a/packages/protocol/contracts/L1/TaikoConfig.sol b/packages/protocol/contracts/L1/TaikoConfig.sol new file mode 100644 index 00000000000..96d5fbc47ac --- /dev/null +++ b/packages/protocol/contracts/L1/TaikoConfig.sol @@ -0,0 +1,64 @@ +// SPDX-License-Identifier: MIT +// _____ _ _ _ _ +// |_ _|_ _(_) |_____ | | __ _| |__ ___ +// | |/ _` | | / / _ \ | |__/ _` | '_ (_-< +// |_|\__,_|_|_\_\___/ |____\__,_|_.__/__/ + +pragma solidity ^0.8.18; + +import {TaikoData} from "../L1/TaikoData.sol"; + +library TaikoConfig { + function getConfig() internal pure returns (TaikoData.Config memory) { + return + TaikoData.Config({ + chainId: 167, + // maxNumProposedBlocks-1 is actually the max number of pending blocks. + // two weeks if avg block time is 10 seconds + maxNumProposedBlocks: 120961, + maxNumVerifiedBlocks: 4096, + //Each time one more block is verified, there will be ~20k + // more gas cost. + maxVerificationsPerTx: 10, + // Set it to 6M, since its the upper limit of the Alpha-2 + // testnet's circuits. + blockMaxGasLimit: 6000000, + // Set it to 79 (+1 TaikoL2.anchor transaction = 80), + // and 80 is the upper limit of the Alpha-2 testnet's circuits. + maxTransactionsPerBlock: 79, + // Set it to 120KB, since 128KB is the upper size limit + // of a geth transaction, so using 120KB for the proposed + // transactions list calldata, 8K for the remaining tx fields. + maxBytesPerTxList: 120000, + minTxGasLimit: 21000, + slotSmoothingFactor: 946649, + anchorTxGasLimit: 180000, + // 100 basis points or 1% + rewardBurnBips: 100, + proposerDepositPctg: 25, // - 25% + // Moving average factors + feeBaseMAF: 1024, + bootstrapDiscountHalvingPeriod: 1 seconds, // owner:daniel + constantFeeRewardBlocks: 1024, + txListCacheExpiry: 0, + enableSoloProposer: false, + enableOracleProver: true, + enableTokenomics: true, + skipZKPVerification: false, + proposingConfig: TaikoData.FeeConfig({ + avgTimeMAF: 1024, + avgTimeCap: 60 seconds * 1000, + gracePeriodPctg: 200, + maxPeriodPctg: 400, + multiplerPctg: 300 + }), + provingConfig: TaikoData.FeeConfig({ + avgTimeMAF: 1024, + avgTimeCap: 30 minutes * 1000, + gracePeriodPctg: 200, + maxPeriodPctg: 400, + multiplerPctg: 300 + }) + }); + } +} diff --git a/packages/protocol/contracts/L1/TaikoCustomErrors.sol b/packages/protocol/contracts/L1/TaikoCustomErrors.sol deleted file mode 100644 index 059a924e2fd..00000000000 --- a/packages/protocol/contracts/L1/TaikoCustomErrors.sol +++ /dev/null @@ -1,48 +0,0 @@ -// SPDX-License-Identifier: MIT -// _____ _ _ _ _ -// |_ _|_ _(_) |_____ | | __ _| |__ ___ -// | |/ _` | | / / _ \ | |__/ _` | '_ (_-< -// |_|\__,_|_|_\_\___/ |____\__,_|_.__/__/ - -pragma solidity ^0.8.18; - -abstract contract TaikoCustomErrors { - // The following custom errors must match the definitions in other V1 libraries. - error L1_0_FEE_BASE(); - error L1_ALREADY_PROVEN(); - error L1_ANCHOR_CALLDATA(); - error L1_ANCHOR_DEST(); - error L1_ANCHOR_GAS_LIMIT(); - error L1_ANCHOR_RECEIPT_ADDR(); - error L1_ANCHOR_RECEIPT_DATA(); - error L1_ANCHOR_RECEIPT_LOGS(); - error L1_ANCHOR_RECEIPT_PROOF(); - error L1_ANCHOR_RECEIPT_STATUS(); - error L1_ANCHOR_RECEIPT_TOPICS(); - error L1_ANCHOR_SIG_R(); - error L1_ANCHOR_SIG_S(); - error L1_ANCHOR_TX_PROOF(); - error L1_ANCHOR_TYPE(); - error L1_BLOCK_NUMBER(); - error L1_CANNOT_BE_FIRST_PROVER(); - error L1_COMMITTED(); - error L1_CONFLICT_PROOF(); - error L1_CONTRACT_NOT_ALLOWED(); - error L1_DUP_PROVERS(); - error L1_EXTRA_DATA(); - error L1_GAS_LIMIT(); - error L1_ID(); - error L1_INPUT_SIZE(); - error L1_INVALID_CONFIG(); - error L1_INVALID_PARAM(); - error L1_METADATA_FIELD(); - error L1_META_MISMATCH(); - error L1_NOT_COMMITTED(); - error L1_NOT_ORACLE_PROVER(); - error L1_PROOF_LENGTH(); - error L1_PROVER(); - error L1_SOLO_PROPOSER(); - error L1_TOO_MANY_BLOCKS(); - error L1_TX_LIST(); - error L1_ZKP(); -} diff --git a/packages/protocol/contracts/L1/TaikoData.sol b/packages/protocol/contracts/L1/TaikoData.sol index 25f97083af8..5474e7fe12f 100644 --- a/packages/protocol/contracts/L1/TaikoData.sol +++ b/packages/protocol/contracts/L1/TaikoData.sol @@ -6,109 +6,155 @@ pragma solidity ^0.8.18; -import {BlockHeader} from "../libs/LibBlockHeader.sol"; - library TaikoData { + struct FeeConfig { + uint16 avgTimeMAF; + uint64 avgTimeCap; // miliseconds + uint16 gracePeriodPctg; + uint16 maxPeriodPctg; + // extra fee/reward on top of baseFee + uint16 multiplerPctg; + } + struct Config { uint256 chainId; - // up to 2048 pending blocks - uint256 maxNumBlocks; - uint256 blockHashHistory; - // This number is calculated from maxNumBlocks to make + uint256 maxNumProposedBlocks; + uint256 maxNumVerifiedBlocks; + // This number is calculated from maxNumProposedBlocks to make // the 'the maximum value of the multiplier' close to 20.0 uint256 maxVerificationsPerTx; - uint256 commitConfirmations; uint256 blockMaxGasLimit; uint256 maxTransactionsPerBlock; uint256 maxBytesPerTxList; uint256 minTxGasLimit; - uint256 anchorTxGasLimit; uint256 slotSmoothingFactor; + uint256 anchorTxGasLimit; uint256 rewardBurnBips; uint256 proposerDepositPctg; // Moving average factors uint256 feeBaseMAF; - uint256 blockTimeMAF; - uint256 proofTimeMAF; - uint64 rewardMultiplierPctg; - uint64 feeGracePeriodPctg; - uint64 feeMaxPeriodPctg; - uint64 blockTimeCap; - uint64 proofTimeCap; uint64 bootstrapDiscountHalvingPeriod; + uint64 constantFeeRewardBlocks; + uint64 txListCacheExpiry; + bool enableSoloProposer; + bool enableOracleProver; bool enableTokenomics; - bool enablePublicInputsCheck; - bool enableAnchorValidation; + bool skipZKPVerification; + FeeConfig proposingConfig; + FeeConfig provingConfig; + } + + struct StateVariables { + uint64 feeBaseTwei; + uint64 genesisHeight; + uint64 genesisTimestamp; + uint64 nextBlockId; + uint64 lastBlockId; + uint64 avgBlockTime; + uint64 avgProofTime; + uint64 lastProposedAt; } + // 3 slots + struct BlockMetadataInput { + bytes32 txListHash; + address beneficiary; + uint32 gasLimit; + uint24 txListByteStart; // byte-wise start index (inclusive) + uint24 txListByteEnd; // byte-wise end index (exclusive) + uint8 cacheTxListInfo; // non-zero = True + } + + // 5 slots struct BlockMetadata { - uint256 id; - uint256 l1Height; + uint64 id; + uint32 gasLimit; + uint64 timestamp; + uint64 l1Height; bytes32 l1Hash; - address beneficiary; - bytes32 txListHash; bytes32 mixHash; - bytes extraData; - uint64 gasLimit; - uint64 timestamp; - uint64 commitHeight; - uint64 commitSlot; + bytes32 txListHash; + uint24 txListByteStart; + uint24 txListByteEnd; + address beneficiary; + } + + struct ZKProof { + bytes data; + uint16 verifierId; } - struct Evidence { + struct BlockEvidence { TaikoData.BlockMetadata meta; - BlockHeader header; + ZKProof zkproof; + bytes32 parentHash; + bytes32 blockHash; + bytes32 signalRoot; address prover; - bytes[] proofs; - uint16 circuitId; } - // 3 slots + struct ForkChoice { + bytes32 blockHash; + bytes32 signalRoot; + address prover; + uint64 provenAt; + } + + // 4 slots struct ProposedBlock { bytes32 metaHash; uint256 deposit; address proposer; uint64 proposedAt; + uint24 nextForkChoiceId; + // ForkChoice storage are reusable + mapping(uint256 forkChoiceId => ForkChoice) forkChoices; } - // 3 + n slots - struct ForkChoice { + // 3 slots + struct VerifiedBlock { + uint64 blockId; bytes32 blockHash; - address prover; - uint64 provenAt; + bytes32 signalRoot; } // This struct takes 9 slots. + struct TxListInfo { + uint64 validSince; + uint24 size; + } + struct State { - // some blocks' hashes won't be persisted, - // only the latest one if verified in a batch - mapping(uint256 blockId => bytes32 blockHash) l2Hashes; - mapping(uint256 blockId => ProposedBlock proposedBlock) proposedBlocks; - // solhint-disable-next-line max-line-length - mapping(uint256 blockId => mapping(bytes32 parentHash => ForkChoice forkChoice)) forkChoices; + // Ring buffer for proposed but unverified blocks. + mapping(uint256 blockId_mode_maxNumProposedBlocks => ProposedBlock) proposedBlocks; + // Ring buffer for recent verified blocks. + // It shall be big enough to cache the last verified block's hash and + // signal root for long enough so signals can be verified anytime within + // 30 minutes. + mapping(uint256 blockId_mode_maxNumVerifiedBlocks => VerifiedBlock) verifiedBlocks; + // A mapping from (blockId, parentHash) to a reusable ForkChoice storage pointer. // solhint-disable-next-line max-line-length - mapping(address proposerAddress => mapping(uint256 commitSlot => bytes32 commitHash)) commits; - // solhint-disable-next-line max-line-length - mapping(address prover => uint256 outstandingReward) balances; + mapping(uint256 blockId => mapping(bytes32 parentHash => uint256 forkChoiceId)) forkChoiceIds; + mapping(address account => uint256 balance) balances; + mapping(bytes32 txListHash => TxListInfo) txListInfo; // Never or rarely changed uint64 genesisHeight; uint64 genesisTimestamp; - uint64 __reservedA1; - uint64 __reservedA2; + uint64 __reserved1; + uint64 __reserved2; // Changed when a block is proposed or proven/finalized - uint256 feeBase; // Changed when a block is proposed uint64 nextBlockId; uint64 lastProposedAt; // Timestamp when the last block is proposed. - uint64 avgBlockTime; // The block time moving average - uint64 __avgGasLimit; // the block gaslimit moving average, not updated. + uint64 avgBlockTime; // miliseconds + uint64 __reserved3; // Changed when a block is proven/finalized - uint64 latestVerifiedHeight; - uint64 latestVerifiedId; + uint64 __reserved4; + uint64 lastBlockId; // the proof time moving average, note that for each block, only the // first proof's time is considered. - uint64 avgProofTime; - uint64 __reservedC1; + uint64 avgProofTime; // miliseconds + uint64 feeBaseTwei; // Reserved uint256[42] __gap; } diff --git a/packages/protocol/contracts/L1/TaikoErrors.sol b/packages/protocol/contracts/L1/TaikoErrors.sol new file mode 100644 index 00000000000..797c26c9147 --- /dev/null +++ b/packages/protocol/contracts/L1/TaikoErrors.sol @@ -0,0 +1,32 @@ +// SPDX-License-Identifier: MIT +// _____ _ _ _ _ +// |_ _|_ _(_) |_____ | | __ _| |__ ___ +// | |/ _` | | / / _ \ | |__/ _` | '_ (_-< +// |_|\__,_|_|_\_\___/ |____\__,_|_.__/__/ + +pragma solidity ^0.8.18; + +abstract contract TaikoErrors { + // The following custom errors must match the definitions in other V1 libraries. + error L1_ALREADY_PROVEN(); + error L1_BLOCK_NUMBER(); + error L1_CONFLICT_PROOF(); + error L1_CONTRACT_NOT_ALLOWED(); + error L1_EVIDENCE_MISMATCH(); + error L1_FORK_CHOICE_ID(); + error L1_ID(); + error L1_INSUFFICIENT_TOKEN(); + error L1_INVALID_CONFIG(); + error L1_INVALID_EVIDENCE(); + error L1_INVALID_METADATA(); + error L1_INVALID_PARAM(); + error L1_INVALID_PROOF(); + error L1_NOT_ORACLE_PROVER(); + error L1_NOT_SOLO_PROPOSER(); + error L1_TOO_MANY_BLOCKS(); + error L1_TX_LIST_NOT_EXIST(); + error L1_TX_LIST_HASH(); + error L1_TX_LIST_RANGE(); + error L1_TX_LIST(); + error L1_UNEXPECTED_FORK_CHOICE_ID(); +} diff --git a/packages/protocol/contracts/L1/TaikoEvents.sol b/packages/protocol/contracts/L1/TaikoEvents.sol index 78110b830d0..752080a7efe 100644 --- a/packages/protocol/contracts/L1/TaikoEvents.sol +++ b/packages/protocol/contracts/L1/TaikoEvents.sol @@ -9,18 +9,20 @@ pragma solidity ^0.8.18; import {TaikoData} from "./TaikoData.sol"; abstract contract TaikoEvents { - // The following events must match the definitions in other V1 libraries. - event BlockVerified(uint256 indexed id, bytes32 blockHash); - - event BlockCommitted(uint64 commitSlot, bytes32 commitHash); - - event BlockProposed(uint256 indexed id, TaikoData.BlockMetadata meta); + // The following events must match the definitions in corresponding L1 libraries. + event BlockProposed( + uint256 indexed id, + TaikoData.BlockMetadata meta, + bool txListCached + ); event BlockProven( uint256 indexed id, bytes32 parentHash, bytes32 blockHash, - address prover, - uint64 provenAt + bytes32 signalRoot, + address prover ); + + event BlockVerified(uint256 indexed id, bytes32 blockHash); } diff --git a/packages/protocol/contracts/L1/TaikoL1.sol b/packages/protocol/contracts/L1/TaikoL1.sol index b862ca1fb00..36e36eeb935 100644 --- a/packages/protocol/contracts/L1/TaikoL1.sol +++ b/packages/protocol/contracts/L1/TaikoL1.sol @@ -6,103 +6,69 @@ pragma solidity ^0.8.18; +import {AddressResolver} from "../common/AddressResolver.sol"; import {EssentialContract} from "../common/EssentialContract.sol"; -import {IHeaderSync} from "../common/IHeaderSync.sol"; -import {LibAnchorSignature} from "../libs/LibAnchorSignature.sol"; -import {LibSharedConfig} from "../libs/LibSharedConfig.sol"; -import {TaikoData} from "./TaikoData.sol"; -import {TaikoEvents} from "./TaikoEvents.sol"; -import {TaikoCustomErrors} from "./TaikoCustomErrors.sol"; +import {IXchainSync} from "../common/IXchainSync.sol"; import {LibProposing} from "./libs/LibProposing.sol"; import {LibProving} from "./libs/LibProving.sol"; +import {LibTokenomics} from "./libs/LibVerifying.sol"; import {LibUtils} from "./libs/LibUtils.sol"; import {LibVerifying} from "./libs/LibVerifying.sol"; -import {AddressResolver} from "../common/AddressResolver.sol"; +import {TaikoConfig} from "./TaikoConfig.sol"; +import {TaikoErrors} from "./TaikoErrors.sol"; +import {TaikoData} from "./TaikoData.sol"; +import {TaikoEvents} from "./TaikoEvents.sol"; -contract TaikoL1 is - EssentialContract, - IHeaderSync, - TaikoEvents, - TaikoCustomErrors -{ +contract TaikoL1 is EssentialContract, IXchainSync, TaikoEvents, TaikoErrors { using LibUtils for TaikoData.State; TaikoData.State public state; uint256[100] private __gap; - modifier onlyFromEOA() { - // solhint-disable-next-line avoid-tx-origin - if (msg.sender != tx.origin) revert L1_CONTRACT_NOT_ALLOWED(); - _; - } - function init( address _addressManager, bytes32 _genesisBlockHash, - uint256 _feeBase + uint64 _feeBaseTwei ) external initializer { EssentialContract._init(_addressManager); LibVerifying.init({ state: state, - genesisBlockHash: _genesisBlockHash, config: getConfig(), - feeBase: _feeBase - }); - } - - /** - * Write a _commit hash_ so a few blocks later a L2 block can be proposed - * such that `calculateCommitHash(meta.beneficiary, meta.txListHash)` equals - * to this commit hash. - * - * @param commitSlot A slot to save this commit. Slot 0 will always be reset - * to zero for refund. - * @param commitHash Calculated with: - * `calculateCommitHash(beneficiary, txListHash)`. - */ - function commitBlock(uint64 commitSlot, bytes32 commitHash) external { - LibProposing.commitBlock({ - state: state, - config: getConfig(), - commitSlot: commitSlot, - commitHash: commitHash + genesisBlockHash: _genesisBlockHash, + feeBaseTwei: _feeBaseTwei }); } /** * Propose a Taiko L2 block. * - * @param inputs A list of data input: - * - inputs[0] is abi-encoded BlockMetadata that the actual L2 block - * header must satisfy. - * Note the following fields in the provided meta object must - * be zeros -- their actual values will be provisioned by Ethereum. - * - id - * - l1Height - * - l1Hash - * - mixHash - * - timestamp - * - inputs[1] is a list of transactions in this block, encoded with - * RLP. Note, in the corresponding L2 block an _anchor transaction_ - * will be the first transaction in the block -- if there are - * n transactions in `txList`, then there will be up to n+1 - * transactions in the L2 block. + * @param input An abi-encoded BlockMetadataInput that the actual L2 + * block header must satisfy. + * @param txList A list of transactions in this block, encoded with RLP. + * Note, in the corresponding L2 block an _anchor transaction_ + * will be the first transaction in the block -- if there are + * `n` transactions in `txList`, then there will be up to `n + 1` + * transactions in the L2 block. */ function proposeBlock( - bytes[] calldata inputs - ) external onlyFromEOA nonReentrant { + bytes calldata input, + bytes calldata txList + ) external nonReentrant { TaikoData.Config memory config = getConfig(); LibProposing.proposeBlock({ state: state, config: config, resolver: AddressResolver(this), - inputs: inputs - }); - LibVerifying.verifyBlocks({ - state: state, - config: config, - maxBlocks: config.maxVerificationsPerTx + input: abi.decode(input, (TaikoData.BlockMetadataInput)), + txList: txList }); + if (config.maxVerificationsPerTx > 0) { + LibVerifying.verifyBlocks({ + state: state, + config: config, + maxBlocks: config.maxVerificationsPerTx + }); + } } /** @@ -111,73 +77,35 @@ contract TaikoL1 is * * @param blockId The index of the block to prove. This is also used * to select the right implementation version. - * @param inputs A list of data input: - * - inputs[0] is an abi-encoded object with various information - * regarding the block to be proven and the actual proofs. - * - inputs[1] is the actual anchor transaction in this L2 block. - * Note that the anchor transaction is always the first transaction - * in the block. - * - inputs[2] is the receipt of the anchor transaction. + * @param input An abi-encoded TaikoData.ValidBlockEvidence object. */ function proveBlock( uint256 blockId, - bytes[] calldata inputs - ) external onlyFromEOA nonReentrant { + bytes calldata input + ) external nonReentrant { TaikoData.Config memory config = getConfig(); LibProving.proveBlock({ state: state, config: config, resolver: AddressResolver(this), blockId: blockId, - inputs: inputs - }); - LibVerifying.verifyBlocks({ - state: state, - config: config, - maxBlocks: config.maxVerificationsPerTx - }); - } - - /** - * Prove a block is invalid with a zero-knowledge proof and a receipt - * merkel proof. - * - * @param blockId The index of the block to prove. This is also used to - * select the right implementation version. - * @param inputs A list of data input: - * - inputs[0] An Evidence object with various information regarding - * the block to be proven and the actual proofs. - * - inputs[1] The target block to be proven invalid. - * - inputs[2] The receipt for the `invalidBlock` transaction - * on L2. Note that the `invalidBlock` transaction is supposed to - * be the only transaction in the L2 block. - */ - function proveBlockInvalid( - uint256 blockId, - bytes[] calldata inputs - ) external onlyFromEOA nonReentrant { - TaikoData.Config memory config = getConfig(); - - LibProving.proveBlockInvalid({ - state: state, - config: config, - resolver: AddressResolver(this), - blockId: blockId, - inputs: inputs - }); - LibVerifying.verifyBlocks({ - state: state, - config: config, - maxBlocks: config.maxVerificationsPerTx + evidence: abi.decode(input, (TaikoData.BlockEvidence)) }); + if (config.maxVerificationsPerTx > 0) { + LibVerifying.verifyBlocks({ + state: state, + config: config, + maxBlocks: config.maxVerificationsPerTx + }); + } } /** * Verify up to N blocks. * @param maxBlocks Max number of blocks to verify. */ - function verifyBlocks(uint256 maxBlocks) external onlyFromEOA nonReentrant { + function verifyBlocks(uint256 maxBlocks) external nonReentrant { if (maxBlocks == 0) revert L1_INVALID_PARAM(); LibVerifying.verifyBlocks({ state: state, @@ -186,27 +114,34 @@ contract TaikoL1 is }); } - function withdrawBalance() external nonReentrant { - LibVerifying.withdrawBalance(state, AddressResolver(this)); + function deposit(uint256 amount) external nonReentrant { + LibTokenomics.deposit(state, AddressResolver(this), amount); + } + + function withdraw(uint256 amount) external nonReentrant { + LibTokenomics.withdraw(state, AddressResolver(this), amount); } - function getRewardBalance(address addr) public view returns (uint256) { + function getBalance(address addr) public view returns (uint256) { return state.balances[addr]; } - function getBlockFee() public view returns (uint256) { - (, uint256 fee, uint256 deposit) = LibProposing.getBlockFee( + function getBlockFee() + public + view + returns (uint256 feeAmount, uint256 depositAmount) + { + (, feeAmount, depositAmount) = LibTokenomics.getBlockFee( state, getConfig() ); - return fee + deposit; } function getProofReward( uint64 provenAt, uint64 proposedAt ) public view returns (uint256 reward) { - (, reward, ) = LibVerifying.getProofReward({ + (, reward, ) = LibTokenomics.getProofReward({ state: state, config: getConfig(), provenAt: provenAt, @@ -214,65 +149,77 @@ contract TaikoL1 is }); } - function isCommitValid( - uint256 commitSlot, - uint256 commitHeight, - bytes32 commitHash - ) public view returns (bool) { + function getBlock( + uint256 id + ) + public + view + returns ( + bytes32 _metaHash, + uint256 _deposit, + address _proposer, + uint64 _proposedAt + ) + { + TaikoData.ProposedBlock storage blk = LibProposing.getBlock( + state, + getConfig().maxNumProposedBlocks, + id + ); + _metaHash = blk.metaHash; + _deposit = blk.deposit; + _proposer = blk.proposer; + _proposedAt = blk.proposedAt; + } + + function getForkChoice( + uint256 id, + bytes32 parentHash + ) public view returns (TaikoData.ForkChoice memory) { return - LibProposing.isCommitValid( + LibProving.getForkChoice( state, - getConfig().commitConfirmations, - commitSlot, - commitHeight, - commitHash + getConfig().maxNumProposedBlocks, + id, + parentHash ); } - function getProposedBlock( - uint256 id - ) public view returns (TaikoData.ProposedBlock memory) { + function getXchainBlockHash( + uint256 blockId + ) public view override returns (bytes32) { return - LibProposing.getProposedBlock(state, getConfig().maxNumBlocks, id); + LibUtils + .getL2ChainData( + state, + blockId, + getConfig().maxNumVerifiedBlocks + ) + .blockHash; } - function getSyncedHeader( - uint256 number + function getXchainSignalRoot( + uint256 blockId ) public view override returns (bytes32) { - return state.getL2BlockHash(number, getConfig().blockHashHistory); - } - - function getLatestSyncedHeader() public view override returns (bytes32) { return - state.getL2BlockHash( - state.latestVerifiedHeight, - getConfig().blockHashHistory - ); + LibUtils + .getL2ChainData( + state, + blockId, + getConfig().maxNumVerifiedBlocks + ) + .signalRoot; } function getStateVariables() public view - returns (LibUtils.StateVariables memory) + returns (TaikoData.StateVariables memory) { return state.getStateVariables(); } - function signWithGoldenTouch( - bytes32 hash, - uint8 k - ) public view returns (uint8 v, uint256 r, uint256 s) { - return LibAnchorSignature.signTransaction(hash, k); - } - - function getForkChoice( - uint256 id, - bytes32 parentHash - ) public view returns (TaikoData.ForkChoice memory) { - return state.forkChoices[id][parentHash]; - } - function getConfig() public pure virtual returns (TaikoData.Config memory) { - return LibSharedConfig.getConfig(); + return TaikoConfig.getConfig(); } } diff --git a/packages/protocol/contracts/L1/TaikoToken.sol b/packages/protocol/contracts/L1/TaikoToken.sol index 6d45ac303f6..148e8eb96bb 100644 --- a/packages/protocol/contracts/L1/TaikoToken.sol +++ b/packages/protocol/contracts/L1/TaikoToken.sol @@ -7,16 +7,15 @@ pragma solidity ^0.8.18; import { - SafeCastUpgradeable -} from "@openzeppelin/contracts-upgradeable/utils/math/SafeCastUpgradeable.sol"; - + ERC20Upgradeable, + IERC20Upgradeable +} from "../thirdparty/ERC20Upgradeable.sol"; import {EssentialContract} from "../common/EssentialContract.sol"; import {IMintableERC20} from "../common/IMintableERC20.sol"; import {LibMath} from "../libs/LibMath.sol"; import { - ERC20Upgradeable, - IERC20Upgradeable -} from "../thirdparty/ERC20Upgradeable.sol"; + SafeCastUpgradeable +} from "@openzeppelin/contracts-upgradeable/utils/math/SafeCastUpgradeable.sol"; /// @dev This is Taiko's governance and fee token. contract TaikoToken is EssentialContract, ERC20Upgradeable, IMintableERC20 { @@ -36,6 +35,7 @@ contract TaikoToken is EssentialContract, ERC20Upgradeable, IMintableERC20 { event Burn(address account, uint256 amount); error TKO_INVALID_ADDR(); + error TKO_INVALID_PREMINT_PARAMS(); /********************* * External Functions* @@ -45,16 +45,25 @@ contract TaikoToken is EssentialContract, ERC20Upgradeable, IMintableERC20 { /// Based on our simulation in simulate/tokenomics/index.js, both /// amountMintToDAO and amountMintToDev shall be set to ~150,000,000. function init( - string memory _name, - string memory _symbol, - address _addressManager + address _addressManager, + string calldata _name, + string calldata _symbol, + address[] calldata _premintRecipients, + uint256[] calldata _premintAmounts ) external initializer { + if (_premintRecipients.length != _premintAmounts.length) + revert TKO_INVALID_PREMINT_PARAMS(); + EssentialContract._init(_addressManager); ERC20Upgradeable.__ERC20_init({ name_: _name, symbol_: _symbol, decimals_: 18 }); + + for (uint i = 0; i < _premintRecipients.length; ++i) { + _mint(_premintRecipients[i], _premintAmounts[i]); + } } /********************* diff --git a/packages/protocol/contracts/L1/libs/LibProposing.sol b/packages/protocol/contracts/L1/libs/LibProposing.sol index 1fe78827784..4e8a1e71e54 100644 --- a/packages/protocol/contracts/L1/libs/LibProposing.sol +++ b/packages/protocol/contracts/L1/libs/LibProposing.sol @@ -6,265 +6,191 @@ pragma solidity ^0.8.18; +import {AddressResolver} from "../../common/AddressResolver.sol"; +import {LibTokenomics} from "./LibTokenomics.sol"; +import {LibUtils} from "./LibUtils.sol"; import { SafeCastUpgradeable } from "@openzeppelin/contracts-upgradeable/utils/math/SafeCastUpgradeable.sol"; - -import {LibTxDecoder} from "../../libs/LibTxDecoder.sol"; -import {TaikoToken} from "../TaikoToken.sol"; -import {LibUtils} from "./LibUtils.sol"; import {TaikoData} from "../TaikoData.sol"; -import {AddressResolver} from "../../common/AddressResolver.sol"; library LibProposing { - using LibTxDecoder for bytes; using SafeCastUpgradeable for uint256; - using LibUtils for TaikoData.BlockMetadata; using LibUtils for TaikoData.State; - event BlockCommitted(uint64 commitSlot, bytes32 commitHash); - event BlockProposed(uint256 indexed id, TaikoData.BlockMetadata meta); + event BlockProposed( + uint256 indexed id, + TaikoData.BlockMetadata meta, + bool txListCached + ); - error L1_COMMITTED(); - error L1_EXTRA_DATA(); - error L1_GAS_LIMIT(); error L1_ID(); - error L1_INPUT_SIZE(); - error L1_METADATA_FIELD(); - error L1_NOT_COMMITTED(); - error L1_SOLO_PROPOSER(); + error L1_INSUFFICIENT_TOKEN(); + error L1_INVALID_METADATA(); + error L1_NOT_SOLO_PROPOSER(); error L1_TOO_MANY_BLOCKS(); + error L1_TX_LIST_NOT_EXIST(); + error L1_TX_LIST_HASH(); + error L1_TX_LIST_RANGE(); error L1_TX_LIST(); - function commitBlock( - TaikoData.State storage state, - TaikoData.Config memory config, - uint64 commitSlot, - bytes32 commitHash - ) public { - assert(config.commitConfirmations > 0); - - bytes32 hash = _aggregateCommitHash(block.number, commitHash); - - if (state.commits[msg.sender][commitSlot] == hash) - revert L1_COMMITTED(); - - state.commits[msg.sender][commitSlot] = hash; - - emit BlockCommitted({commitSlot: commitSlot, commitHash: commitHash}); - } - function proposeBlock( TaikoData.State storage state, TaikoData.Config memory config, AddressResolver resolver, - bytes[] calldata inputs - ) public { + TaikoData.BlockMetadataInput memory input, + bytes calldata txList + ) internal { // For alpha-2 testnet, the network only allows an special address // to propose but anyone to prove. This is the first step of testing // the tokenomics. + if ( + config.enableSoloProposer && + msg.sender != resolver.resolve("solo_proposer", false) + ) revert L1_NOT_SOLO_PROPOSER(); - // TODO(daniel): remove this special address. - address soloProposer = resolver.resolve("solo_proposer", true); - if (soloProposer != address(0) && soloProposer != msg.sender) - revert L1_SOLO_PROPOSER(); - - if (inputs.length != 2) revert L1_INPUT_SIZE(); - TaikoData.BlockMetadata memory meta = abi.decode( - inputs[0], - (TaikoData.BlockMetadata) - ); - _verifyBlockCommit({ - state: state, - commitConfirmations: config.commitConfirmations, - meta: meta - }); - _validateMetadata(config, meta); + if ( + input.beneficiary == address(0) || + input.gasLimit > config.blockMaxGasLimit + ) revert L1_INVALID_METADATA(); - { - bytes calldata txList = inputs[1]; - // perform validation and populate some fields - if ( - txList.length < 0 || - txList.length > config.maxBytesPerTxList || - meta.txListHash != txList.hashTxList() - ) revert L1_TX_LIST(); + if ( + state.nextBlockId >= state.lastBlockId + config.maxNumProposedBlocks + ) revert L1_TOO_MANY_BLOCKS(); - if ( - state.nextBlockId >= - state.latestVerifiedId + config.maxNumBlocks - ) revert L1_TOO_MANY_BLOCKS(); + uint64 timeNow = uint64(block.timestamp); + bool txListCached; - meta.id = state.nextBlockId; - meta.l1Height = block.number - 1; - meta.l1Hash = blockhash(block.number - 1); - meta.timestamp = uint64(block.timestamp); + // hanlding txList + { + uint24 size = uint24(txList.length); + if (size > config.maxBytesPerTxList) revert L1_TX_LIST(); + + if (input.txListByteStart > input.txListByteEnd) + revert L1_TX_LIST_RANGE(); + + if (config.txListCacheExpiry == 0) { + // caching is disabled + if (input.txListByteStart != 0 || input.txListByteEnd != size) + revert L1_TX_LIST_RANGE(); + } else { + // caching is enabled + if (size == 0) { + // This blob shall have been submitted earlier + TaikoData.TxListInfo memory info = state.txListInfo[ + input.txListHash + ]; + + if (input.txListByteEnd > info.size) + revert L1_TX_LIST_RANGE(); + + if ( + info.size == 0 || + info.validSince + config.txListCacheExpiry < timeNow + ) revert L1_TX_LIST_NOT_EXIST(); + } else { + if (input.txListByteEnd > size) revert L1_TX_LIST_RANGE(); + if (input.txListHash != keccak256(txList)) + revert L1_TX_LIST_HASH(); + + if (input.cacheTxListInfo != 0) { + state.txListInfo[input.txListHash] = TaikoData + .TxListInfo({validSince: timeNow, size: size}); + txListCached = true; + } + } + } + } - // After The Merge, L1 mixHash contains the prevrandao - // from the beacon chain. Since multiple Taiko blocks - // can be proposed in one Ethereum block, we need to - // add salt to this random number as L2 mixHash - meta.mixHash = keccak256( - abi.encodePacked(block.prevrandao, state.nextBlockId) - ); + // After The Merge, L1 mixHash contains the prevrandao + // from the beacon chain. Since multiple Taiko blocks + // can be proposed in one Ethereum block, we need to + // add salt to this random number as L2 mixHash + uint256 mixHash; + unchecked { + mixHash = block.prevrandao * state.nextBlockId; } + TaikoData.BlockMetadata memory meta = TaikoData.BlockMetadata({ + id: state.nextBlockId, + gasLimit: input.gasLimit, + timestamp: timeNow, + l1Height: uint64(block.number - 1), + l1Hash: blockhash(block.number - 1), + mixHash: bytes32(mixHash), + txListHash: input.txListHash, + txListByteStart: input.txListByteStart, + txListByteEnd: input.txListByteEnd, + beneficiary: input.beneficiary + }); + uint256 deposit; if (config.enableTokenomics) { uint256 newFeeBase; { uint256 fee; - (newFeeBase, fee, deposit) = getBlockFee(state, config); - TaikoToken(resolver.resolve("tko_token", false)).burn( - msg.sender, - fee + deposit + (newFeeBase, fee, deposit) = LibTokenomics.getBlockFee( + state, + config ); + + uint256 burnAmount = fee + deposit; + if (state.balances[msg.sender] <= burnAmount) + revert L1_INSUFFICIENT_TOKEN(); + + state.balances[msg.sender] -= burnAmount; } // Update feeBase and avgBlockTime - state.feeBase = LibUtils.movingAverage({ - maValue: state.feeBase, - newValue: newFeeBase, - maf: config.feeBaseMAF - }); + state.feeBaseTwei = LibUtils + .movingAverage({ + maValue: state.feeBaseTwei, + newValue: LibTokenomics.toTwei(newFeeBase), + maf: config.feeBaseMAF + }) + .toUint64(); } - _saveProposedBlock( - state, - config.maxNumBlocks, - state.nextBlockId, - TaikoData.ProposedBlock({ - metaHash: meta.hashMetadata(), - deposit: deposit, - proposer: msg.sender, - proposedAt: meta.timestamp - }) - ); - - state.avgBlockTime = LibUtils - .movingAverage({ - maValue: state.avgBlockTime, - newValue: meta.timestamp - state.lastProposedAt, - maf: config.blockTimeMAF - }) - .toUint64(); + TaikoData.ProposedBlock storage blk = state.proposedBlocks[ + state.nextBlockId % config.maxNumProposedBlocks + ]; - state.lastProposedAt = meta.timestamp; + blk.metaHash = LibUtils.hashMetadata(meta); + blk.deposit = deposit; + blk.proposer = msg.sender; + blk.proposedAt = meta.timestamp; + blk.nextForkChoiceId = 1; - emit BlockProposed(state.nextBlockId++, meta); - } + if (state.lastProposedAt > 0) { + uint256 blockTime; + unchecked { + blockTime = (meta.timestamp - state.lastProposedAt) * 1000; + } + state.avgBlockTime = LibUtils + .movingAverage({ + maValue: state.avgBlockTime, + newValue: blockTime, + maf: config.proposingConfig.avgTimeMAF + }) + .toUint64(); + } - function getBlockFee( - TaikoData.State storage state, - TaikoData.Config memory config - ) public view returns (uint256 newFeeBase, uint256 fee, uint256 deposit) { - (newFeeBase, ) = LibUtils.getTimeAdjustedFee({ - state: state, - config: config, - isProposal: true, - tNow: uint64(block.timestamp), - tLast: state.lastProposedAt, - tAvg: state.avgBlockTime, - tCap: config.blockTimeCap - }); - fee = LibUtils.getSlotsAdjustedFee({ - state: state, - config: config, - isProposal: true, - feeBase: newFeeBase - }); - fee = LibUtils.getBootstrapDiscountedFee(state, config, fee); - deposit = (fee * config.proposerDepositPctg) / 100; - } + state.lastProposedAt = meta.timestamp; - function isCommitValid( - TaikoData.State storage state, - uint256 commitConfirmations, - uint256 commitSlot, - uint256 commitHeight, - bytes32 commitHash - ) public view returns (bool) { - assert(commitConfirmations > 0); - bytes32 hash = _aggregateCommitHash(commitHeight, commitHash); - return - state.commits[msg.sender][commitSlot] == hash && - block.number >= commitHeight + commitConfirmations; + emit BlockProposed(state.nextBlockId, meta, txListCached); + unchecked { + ++state.nextBlockId; + } } - function getProposedBlock( + function getBlock( TaikoData.State storage state, - uint256 maxNumBlocks, + uint256 maxNumProposedBlocks, uint256 id ) internal view returns (TaikoData.ProposedBlock storage) { - if (id <= state.latestVerifiedId || id >= state.nextBlockId) { + if (id <= state.lastBlockId || id >= state.nextBlockId) { revert L1_ID(); } - return state.getProposedBlock(maxNumBlocks, id); - } - - function _saveProposedBlock( - TaikoData.State storage state, - uint256 maxNumBlocks, - uint256 id, - TaikoData.ProposedBlock memory blk - ) private { - state.proposedBlocks[id % maxNumBlocks] = blk; - } - - function _verifyBlockCommit( - TaikoData.State storage state, - uint256 commitConfirmations, - TaikoData.BlockMetadata memory meta - ) private view { - if (commitConfirmations == 0) { - return; - } - bytes32 commitHash = _calculateCommitHash( - meta.beneficiary, - meta.txListHash - ); - - if ( - !isCommitValid({ - state: state, - commitConfirmations: commitConfirmations, - commitSlot: meta.commitSlot, - commitHeight: meta.commitHeight, - commitHash: commitHash - }) - ) revert L1_NOT_COMMITTED(); - } - - function _validateMetadata( - TaikoData.Config memory config, - TaikoData.BlockMetadata memory meta - ) private pure { - if ( - meta.id != 0 || - meta.l1Height != 0 || - meta.l1Hash != 0 || - meta.mixHash != 0 || - meta.timestamp != 0 || - meta.beneficiary == address(0) || - meta.txListHash == 0 - ) revert L1_METADATA_FIELD(); - - if (meta.gasLimit > config.blockMaxGasLimit) revert L1_GAS_LIMIT(); - if (meta.extraData.length > 32) { - revert L1_EXTRA_DATA(); - } - } - - function _calculateCommitHash( - address beneficiary, - bytes32 txListHash - ) private pure returns (bytes32) { - return keccak256(abi.encodePacked(beneficiary, txListHash)); - } - function _aggregateCommitHash( - uint256 commitHeight, - bytes32 commitHash - ) private pure returns (bytes32) { - return keccak256(abi.encodePacked(commitHash, commitHeight)); + return state.proposedBlocks[id % maxNumProposedBlocks]; } } diff --git a/packages/protocol/contracts/L1/libs/LibProving.sol b/packages/protocol/contracts/L1/libs/LibProving.sol index 99417aa308e..2dddaca9430 100644 --- a/packages/protocol/contracts/L1/libs/LibProving.sol +++ b/packages/protocol/contracts/L1/libs/LibProving.sol @@ -6,372 +6,194 @@ pragma solidity ^0.8.18; -import {IProofVerifier} from "../ProofVerifier.sol"; import {AddressResolver} from "../../common/AddressResolver.sol"; -import {LibAnchorSignature} from "../../libs/LibAnchorSignature.sol"; -import {LibBlockHeader, BlockHeader} from "../../libs/LibBlockHeader.sol"; -import {LibReceiptDecoder} from "../../libs/LibReceiptDecoder.sol"; -import {LibTxDecoder} from "../../libs/LibTxDecoder.sol"; -import {LibTxUtils} from "../../libs/LibTxUtils.sol"; -import {LibBytesUtils} from "../../thirdparty/LibBytesUtils.sol"; -import {LibRLPWriter} from "../../thirdparty/LibRLPWriter.sol"; +import {LibTokenomics} from "./LibTokenomics.sol"; import {LibUtils} from "./LibUtils.sol"; import {TaikoData} from "../../L1/TaikoData.sol"; library LibProving { - using LibBlockHeader for BlockHeader; - using LibUtils for TaikoData.BlockMetadata; using LibUtils for TaikoData.State; - bool private constant FLAG_VALIDATE_ANCHOR_TX_SIGNATURE = true; - bool private constant FLAG_CHECK_METADATA = true; - bool private constant FLAG_VALIDATE_HEADER_FOR_METADATA = true; - - bytes32 public constant INVALIDATE_BLOCK_LOG_TOPIC = - keccak256("BlockInvalidated(bytes32)"); - - bytes4 public constant ANCHOR_TX_SELECTOR = - bytes4(keccak256("anchor(uint256,bytes32)")); - event BlockProven( uint256 indexed id, bytes32 parentHash, bytes32 blockHash, - address prover, - uint64 provenAt + bytes32 signalRoot, + address prover ); error L1_ALREADY_PROVEN(); - error L1_ANCHOR_CALLDATA(); - error L1_ANCHOR_DEST(); - error L1_ANCHOR_GAS_LIMIT(); - error L1_ANCHOR_RECEIPT_ADDR(); - error L1_ANCHOR_RECEIPT_DATA(); - error L1_ANCHOR_RECEIPT_LOGS(); - error L1_ANCHOR_RECEIPT_PROOF(); - error L1_ANCHOR_RECEIPT_STATUS(); - error L1_ANCHOR_RECEIPT_TOPICS(); - error L1_ANCHOR_SIG_R(); - error L1_ANCHOR_SIG_S(); - error L1_ANCHOR_TX_PROOF(); - error L1_ANCHOR_TYPE(); - error L1_CANNOT_BE_FIRST_PROVER(); error L1_CONFLICT_PROOF(); + error L1_EVIDENCE_MISMATCH(); + error L1_FORK_CHOICE_ID(); error L1_ID(); - error L1_INPUT_SIZE(); - error L1_META_MISMATCH(); + error L1_INVALID_PROOF(); + error L1_INVALID_EVIDENCE(); error L1_NOT_ORACLE_PROVER(); - error L1_PROOF_LENGTH(); - error L1_PROVER(); - error L1_ZKP(); + error L1_UNEXPECTED_FORK_CHOICE_ID(); function proveBlock( TaikoData.State storage state, TaikoData.Config memory config, AddressResolver resolver, uint256 blockId, - bytes[] calldata inputs - ) public { - // Check and decode inputs - if (inputs.length != 3) revert L1_INPUT_SIZE(); - TaikoData.Evidence memory evidence = abi.decode( - inputs[0], - (TaikoData.Evidence) - ); - - // Check evidence - if (evidence.meta.id != blockId) revert L1_ID(); - - if (evidence.proofs.length != 3) revert L1_PROOF_LENGTH(); - - IProofVerifier proofVerifier = IProofVerifier( - resolver.resolve("proof_verifier", false) - ); - - if (config.enableAnchorValidation) { - _proveAnchorForValidBlock({ - config: config, - resolver: resolver, - proofVerifier: proofVerifier, - evidence: evidence, - anchorTx: inputs[1], - anchorReceipt: inputs[2] - }); - } - - // ZK-prove block and mark block proven to be valid. - _proveBlock({ - state: state, - config: config, - resolver: resolver, - proofVerifier: proofVerifier, - evidence: evidence, - target: evidence.meta, - blockHashOverride: 0 - }); - } - - function proveBlockInvalid( - TaikoData.State storage state, - TaikoData.Config memory config, - AddressResolver resolver, - uint256 blockId, - bytes[] calldata inputs - ) public { - // Check and decode inputs - if (inputs.length != 3) revert L1_INPUT_SIZE(); - TaikoData.Evidence memory evidence = abi.decode( - inputs[0], - (TaikoData.Evidence) - ); - TaikoData.BlockMetadata memory target = abi.decode( - inputs[1], - (TaikoData.BlockMetadata) - ); - - // Check evidence - if (evidence.meta.id != blockId) revert L1_ID(); - if (evidence.proofs.length != 2) revert L1_PROOF_LENGTH(); - - IProofVerifier proofVerifier = IProofVerifier( - resolver.resolve("proof_verifier", false) - ); + TaikoData.BlockEvidence memory evidence + ) internal { + TaikoData.BlockMetadata memory meta = evidence.meta; + if ( + meta.id != blockId || + meta.id <= state.lastBlockId || + meta.id >= state.nextBlockId + ) revert L1_ID(); - if (config.enableAnchorValidation) { - _proveAnchorForInvalidBlock({ - config: config, - resolver: resolver, - target: target, - proofVerifier: proofVerifier, - evidence: evidence, - invalidateBlockReceipt: inputs[2] - }); - } + if ( + // 0 and 1 (placeholder) are not allowed + uint256(evidence.parentHash) <= 1 || + // 0 and 1 (placeholder) are not allowed + uint256(evidence.blockHash) <= 1 || + // cannot be the same hash + evidence.blockHash == evidence.parentHash || + // 0 and 1 (placeholder) are not allowed + uint256(evidence.signalRoot) <= 1 || + // prover must not be zero + evidence.prover == address(0) + ) revert L1_INVALID_EVIDENCE(); + + TaikoData.ProposedBlock storage blk = state.proposedBlocks[ + meta.id % config.maxNumProposedBlocks + ]; - // ZK-prove block and mark block proven as invalid. - _proveBlock({ - state: state, - config: config, - resolver: resolver, - proofVerifier: proofVerifier, - evidence: evidence, - target: target, - blockHashOverride: LibUtils.BLOCK_DEADEND_HASH - }); - } + if (blk.metaHash != LibUtils.hashMetadata(meta)) + revert L1_EVIDENCE_MISMATCH(); - function _proveBlock( - TaikoData.State storage state, - TaikoData.Config memory config, - AddressResolver resolver, - IProofVerifier proofVerifier, - TaikoData.Evidence memory evidence, - TaikoData.BlockMetadata memory target, - bytes32 blockHashOverride - ) private { - if (evidence.meta.id != target.id) revert L1_ID(); - if (evidence.prover == address(0)) revert L1_PROVER(); + uint256 fcId = state.forkChoiceIds[blockId][evidence.parentHash]; + if (fcId == 0) { + fcId = blk.nextForkChoiceId; + state.forkChoiceIds[blockId][evidence.parentHash] = fcId; - if (FLAG_CHECK_METADATA) { - if ( - target.id <= state.latestVerifiedId || - target.id >= state.nextBlockId - ) revert L1_ID(); - if ( - state - .getProposedBlock(config.maxNumBlocks, target.id) - .metaHash != target.hashMetadata() - ) revert L1_META_MISMATCH(); - } - - if (FLAG_VALIDATE_HEADER_FOR_METADATA) { - if ( - evidence.header.parentHash == 0 || - evidence.header.beneficiary != evidence.meta.beneficiary || - evidence.header.difficulty != 0 || - evidence.header.gasLimit != - evidence.meta.gasLimit + config.anchorTxGasLimit || - evidence.header.gasUsed == 0 || - evidence.header.timestamp != evidence.meta.timestamp || - evidence.header.extraData.length != - evidence.meta.extraData.length || - keccak256(evidence.header.extraData) != - keccak256(evidence.meta.extraData) || - evidence.header.mixHash != evidence.meta.mixHash - ) revert L1_META_MISMATCH(); + unchecked { + ++blk.nextForkChoiceId; + } + } else if (fcId >= blk.nextForkChoiceId) { + revert L1_UNEXPECTED_FORK_CHOICE_ID(); // this shall not happen } - // For alpha-2 testnet, the network allows any address to submit ZKP, - // but a special prover can skip ZKP verification if the ZKP is empty. + TaikoData.ForkChoice storage fc = blk.forkChoices[fcId]; bool oracleProving; + if (uint256(fc.blockHash) <= 1) { + // 0 or 1 (placeholder) indicate this block has not been proven + if (config.enableOracleProver) { + if (msg.sender != resolver.resolve("oracle_prover", false)) + revert L1_NOT_ORACLE_PROVER(); - TaikoData.ForkChoice storage fc = state.forkChoices[target.id][ - evidence.header.parentHash - ]; + oracleProving = true; + } - bytes32 blockHash = evidence.header.hashBlockHeader(); - bytes32 _blockHash = blockHashOverride == 0 - ? blockHash - : blockHashOverride; + fc.blockHash = evidence.blockHash; + fc.signalRoot = evidence.signalRoot; - if (fc.blockHash == 0) { - address oracleProver = resolver.resolve("oracle_prover", true); - if (msg.sender == oracleProver) { - oracleProving = true; + if (oracleProving) { + // make sure we reset the prover address to indicate it is + // proven by the oracle prover + fc.prover = address(0); } else { - if (oracleProver != address(0)) revert L1_NOT_ORACLE_PROVER(); fc.prover = evidence.prover; fc.provenAt = uint64(block.timestamp); } - fc.blockHash = _blockHash; } else { - if (fc.blockHash != _blockHash) revert L1_CONFLICT_PROOF(); if (fc.prover != address(0)) revert L1_ALREADY_PROVEN(); + if ( + fc.blockHash != evidence.blockHash || + fc.signalRoot != evidence.signalRoot + ) revert L1_CONFLICT_PROOF(); fc.prover = evidence.prover; fc.provenAt = uint64(block.timestamp); } - if (oracleProving) { - // do not verify zkp - } else { - bool verified = proofVerifier.verifyZKP({ - verifierId: string( - abi.encodePacked("plonk_verifier_", evidence.circuitId) - ), - zkproof: evidence.proofs[0], - instance: _getInstance(evidence) - }); - if (!verified) revert L1_ZKP(); - } + if (!oracleProving && !config.skipZKPVerification) { + bytes32 instance; + { + // otherwise: stack too deep + address l1SignalService = resolver.resolve( + "signal_service", + false + ); + address l2SignalService = resolver.resolve( + config.chainId, + "signal_service", + false + ); + address taikoL2 = resolver.resolve( + config.chainId, + "taiko_l2", + false + ); - emit BlockProven({ - id: target.id, - parentHash: evidence.header.parentHash, - blockHash: _blockHash, - prover: fc.prover, - provenAt: fc.provenAt - }); - } + bytes32[9] memory inputs; + inputs[0] = bytes32(uint256(uint160(l1SignalService))); + inputs[1] = bytes32(uint256(uint160(l2SignalService))); + inputs[2] = bytes32(uint256(uint160(taikoL2))); + inputs[3] = evidence.parentHash; + inputs[4] = evidence.blockHash; + inputs[5] = evidence.signalRoot; + inputs[6] = bytes32(uint256(uint160(evidence.prover))); + inputs[7] = blk.metaHash; + + // Circuits shall use this value to check anchor gas limit. + // Note that this value is not necessary and can be hard-coded + // in to the circuit code, but if we upgrade the protocol + // and the gas limit changes, then having it here may be handy. + inputs[8] = bytes32(config.anchorTxGasLimit); + + assembly { + instance := keccak256(inputs, mul(32, 9)) + } + } - function _proveAnchorForValidBlock( - TaikoData.Config memory config, - AddressResolver resolver, - IProofVerifier proofVerifier, - TaikoData.Evidence memory evidence, - bytes calldata anchorTx, - bytes calldata anchorReceipt - ) private view { - // Check anchor tx is valid - LibTxDecoder.Tx memory _tx = LibTxDecoder.decodeTx( - config.chainId, - anchorTx - ); - if (_tx.txType != 0) revert L1_ANCHOR_TYPE(); - if (_tx.destination != resolver.resolve(config.chainId, "taiko", false)) - revert L1_ANCHOR_DEST(); - if (_tx.gasLimit != config.anchorTxGasLimit) - revert L1_ANCHOR_GAS_LIMIT(); + bytes memory verifierId = abi.encodePacked( + "verifier_", + evidence.zkproof.verifierId + ); - if (FLAG_VALIDATE_ANCHOR_TX_SIGNATURE) { - // Check anchor tx's signature is valid and deterministic - if ( - _tx.r != LibAnchorSignature.GX && - _tx.r != LibAnchorSignature.GX2 - ) revert L1_ANCHOR_SIG_R(); + (bool verified, bytes memory ret) = resolver + .resolve(string(verifierId), false) + .staticcall(bytes.concat(instance, evidence.zkproof.data)); - if (_tx.r == LibAnchorSignature.GX2) { - (, , uint256 s) = LibAnchorSignature.signTransaction( - LibTxUtils.hashUnsignedTx(config.chainId, _tx), - 1 - ); - if (s != 0) revert L1_ANCHOR_SIG_S(); - } + if ( + !verified || + ret.length != 32 || + bytes32(ret) != keccak256("taiko") + ) revert L1_INVALID_PROOF(); } - // Check anchor tx's calldata is valid - if ( - !LibBytesUtils.equal( - _tx.data, - bytes.concat( - ANCHOR_TX_SELECTOR, - bytes32(evidence.meta.l1Height), - evidence.meta.l1Hash - ) - ) - ) revert L1_ANCHOR_CALLDATA(); - - // Check anchor tx is the 1st tx in the block - if ( - !proofVerifier.verifyMKP({ - key: LibRLPWriter.writeUint(0), - value: anchorTx, - proof: evidence.proofs[1], - root: evidence.header.transactionsRoot - }) - ) revert L1_ANCHOR_TX_PROOF(); - // Check anchor tx does not throw - LibReceiptDecoder.Receipt memory receipt = LibReceiptDecoder - .decodeReceipt(anchorReceipt); - if (receipt.status != 1) revert L1_ANCHOR_RECEIPT_STATUS(); - if ( - !proofVerifier.verifyMKP({ - key: LibRLPWriter.writeUint(0), - value: anchorReceipt, - proof: evidence.proofs[2], - root: evidence.header.receiptsRoot - }) - ) revert L1_ANCHOR_RECEIPT_PROOF(); - } - - function _proveAnchorForInvalidBlock( - TaikoData.Config memory config, - AddressResolver resolver, - TaikoData.BlockMetadata memory target, - IProofVerifier proofVerifier, - TaikoData.Evidence memory evidence, - bytes calldata invalidateBlockReceipt - ) private view { - if ( - !proofVerifier.verifyMKP({ - key: LibRLPWriter.writeUint(0), - value: invalidateBlockReceipt, - proof: evidence.proofs[1], - root: evidence.header.receiptsRoot - }) - ) revert L1_ANCHOR_RECEIPT_PROOF(); - // Check the 1st receipt is for an InvalidateBlock tx with - // a BlockInvalidated event - LibReceiptDecoder.Receipt memory receipt = LibReceiptDecoder - .decodeReceipt(invalidateBlockReceipt); - if (receipt.status != 1) revert L1_ANCHOR_RECEIPT_STATUS(); - if (receipt.logs.length != 1) revert L1_ANCHOR_RECEIPT_LOGS(); - LibReceiptDecoder.Log memory log = receipt.logs[0]; - if ( - log.contractAddress != - resolver.resolve(config.chainId, "taiko", false) - ) revert L1_ANCHOR_RECEIPT_ADDR(); - if (log.data.length != 0) revert L1_ANCHOR_RECEIPT_DATA(); - if ( - log.topics.length != 2 || - log.topics[0] != INVALIDATE_BLOCK_LOG_TOPIC || - log.topics[1] != target.txListHash - ) revert L1_ANCHOR_RECEIPT_TOPICS(); + emit BlockProven({ + id: blockId, + parentHash: evidence.parentHash, + blockHash: evidence.blockHash, + signalRoot: evidence.signalRoot, + prover: evidence.prover + }); } - function _getInstance( - TaikoData.Evidence memory evidence - ) internal pure returns (bytes32) { - bytes[] memory list = LibBlockHeader.getBlockHeaderRLPItemsList( - evidence.header, - 2 - ); + function getForkChoice( + TaikoData.State storage state, + uint256 maxNumProposedBlocks, + uint256 id, + bytes32 parentHash + ) internal view returns (TaikoData.ForkChoice storage) { + if (id <= state.lastBlockId || id >= state.nextBlockId) { + revert L1_ID(); + } - uint256 len = list.length; - list[len - 2] = LibRLPWriter.writeAddress(evidence.prover); - list[len - 1] = LibRLPWriter.writeHash(evidence.meta.txListHash); + TaikoData.ProposedBlock storage blk = state.proposedBlocks[ + id % maxNumProposedBlocks + ]; + uint256 fcId = state.forkChoiceIds[id][parentHash]; + if (fcId == 0 || fcId >= blk.nextForkChoiceId) + revert L1_FORK_CHOICE_ID(); - return keccak256(LibRLPWriter.writeList(list)); + return blk.forkChoices[fcId]; } } diff --git a/packages/protocol/contracts/L1/libs/LibTokenomics.sol b/packages/protocol/contracts/L1/libs/LibTokenomics.sol new file mode 100644 index 00000000000..69808fad441 --- /dev/null +++ b/packages/protocol/contracts/L1/libs/LibTokenomics.sol @@ -0,0 +1,205 @@ +// SPDX-License-Identifier: MIT +// _____ _ _ _ _ +// |_ _|_ _(_) |_____ | | __ _| |__ ___ +// | |/ _` | | / / _ \ | |__/ _` | '_ (_-< +// |_|\__,_|_|_\_\___/ |____\__,_|_.__/__/ + +pragma solidity ^0.8.18; + +import {AddressResolver} from "../../common/AddressResolver.sol"; +import {LibMath} from "../../libs/LibMath.sol"; +import { + SafeCastUpgradeable +} from "@openzeppelin/contracts-upgradeable/utils/math/SafeCastUpgradeable.sol"; +import {TaikoData} from "../TaikoData.sol"; +import {TaikoToken} from "../TaikoToken.sol"; + +library LibTokenomics { + using LibMath for uint256; + uint256 private constant TWEI_TO_WEI = 1E12; + + error L1_INSUFFICIENT_TOKEN(); + error L1_INVALID_PARAM(); + + function withdraw( + TaikoData.State storage state, + AddressResolver resolver, + uint256 amount + ) internal { + uint256 balance = state.balances[msg.sender]; + if (balance < amount) revert L1_INSUFFICIENT_TOKEN(); + + unchecked { + state.balances[msg.sender] -= amount; + } + + TaikoToken(resolver.resolve("taiko_token", false)).mint( + msg.sender, + amount + ); + } + + function deposit( + TaikoData.State storage state, + AddressResolver resolver, + uint256 amount + ) internal { + if (amount > 0) { + TaikoToken(resolver.resolve("taiko_token", false)).burn( + msg.sender, + amount + ); + state.balances[msg.sender] += amount; + } + } + + function fromTwei(uint64 amount) internal pure returns (uint256) { + if (amount == 0) { + return TWEI_TO_WEI; + } else { + return amount * TWEI_TO_WEI; + } + } + + function toTwei(uint256 amount) internal pure returns (uint64) { + uint256 _twei = amount / TWEI_TO_WEI; + if (_twei > type(uint64).max) { + return type(uint64).max; + } else if (_twei == 0) { + return uint64(1); + } else { + return uint64(_twei); + } + } + + function getBlockFee( + TaikoData.State storage state, + TaikoData.Config memory config + ) + internal + view + returns (uint256 newFeeBase, uint256 fee, uint256 depositAmount) + { + uint256 feeBase = fromTwei(state.feeBaseTwei); + if (state.nextBlockId <= config.constantFeeRewardBlocks) { + fee = feeBase; + newFeeBase = feeBase; + } else { + (newFeeBase, ) = getTimeAdjustedFee({ + feeConfig: config.proposingConfig, + feeBase: feeBase, + isProposal: true, + tNow: block.timestamp, + tLast: state.lastProposedAt, + tAvg: state.avgBlockTime + }); + fee = getSlotsAdjustedFee({ + state: state, + config: config, + isProposal: true, + feeBase: newFeeBase + }); + } + + if (config.bootstrapDiscountHalvingPeriod > 0) { + unchecked { + uint256 halves = uint256( + block.timestamp - state.genesisTimestamp + ) / config.bootstrapDiscountHalvingPeriod; + uint256 gamma = 1024 - (1024 >> (1 + halves)); + fee = (fee * gamma) / 1024; + } + } + + unchecked { + depositAmount = (fee * config.proposerDepositPctg) / 100; + } + } + + function getProofReward( + TaikoData.State storage state, + TaikoData.Config memory config, + uint64 provenAt, + uint64 proposedAt + ) + internal + view + returns (uint256 newFeeBase, uint256 reward, uint256 tRelBp) + { + if (proposedAt > provenAt) revert L1_INVALID_PARAM(); + + uint256 feeBase = fromTwei(state.feeBaseTwei); + if (state.lastBlockId <= config.constantFeeRewardBlocks) { + reward = feeBase; + newFeeBase = feeBase; + // tRelBp = 0; + } else { + (newFeeBase, tRelBp) = getTimeAdjustedFee({ + feeConfig: config.provingConfig, + feeBase: feeBase, + isProposal: false, + tNow: provenAt, + tLast: proposedAt, + tAvg: state.avgProofTime + }); + reward = getSlotsAdjustedFee({ + state: state, + config: config, + isProposal: false, + feeBase: newFeeBase + }); + } + unchecked { + reward = (reward * (10000 - config.rewardBurnBips)) / 10000; + } + } + + // Implement "Slot-availability Multipliers", see the whitepaper. + function getSlotsAdjustedFee( + TaikoData.State storage state, + TaikoData.Config memory config, + bool isProposal, + uint256 feeBase + ) internal view returns (uint256) { + unchecked { + // m is the `n'` in the whitepaper + uint256 m = 1000 * + (config.maxNumProposedBlocks - 1) + + config.slotSmoothingFactor; + // n is the number of unverified blocks + uint256 n = 1000 * (state.nextBlockId - state.lastBlockId - 1); + // k is `m − n + 1` or `m − n - 1`in the whitepaper + uint256 k = isProposal ? m - n - 1000 : m - n + 1000; + return (feeBase * (m - 1000) * m) / (m - n) / k; + } + } + + // Implement "Incentive Multipliers", see the whitepaper. + function getTimeAdjustedFee( + TaikoData.FeeConfig memory feeConfig, + uint256 feeBase, + bool isProposal, + uint256 tNow, // seconds + uint256 tLast, // seconds + uint256 tAvg // milliseconds + ) internal pure returns (uint256 newFeeBase, uint256 tRelBp) { + if (tAvg == 0 || tNow == tLast) { + return (feeBase, 0); + } + + unchecked { + tAvg = tAvg.min(feeConfig.avgTimeCap); + uint256 max = (feeConfig.maxPeriodPctg * tAvg) / 100; + uint256 grace = (feeConfig.gracePeriodPctg * tAvg) / 100; + uint256 t = ((tNow - tLast) * 1000).max(grace).min(max); + tRelBp = (10000 * (t - grace)) / (max - grace); // [0-10000] + uint256 alpha = 10000 + (tRelBp * feeConfig.multiplerPctg) / 100; + + if (isProposal) { + newFeeBase = (feeBase * 10000) / alpha; // fee + } else { + newFeeBase = (feeBase * alpha) / 10000; // reward + } + } + } +} diff --git a/packages/protocol/contracts/L1/libs/LibUtils.sol b/packages/protocol/contracts/L1/libs/LibUtils.sol index 1694a299a96..56952929656 100644 --- a/packages/protocol/contracts/L1/libs/LibUtils.sol +++ b/packages/protocol/contracts/L1/libs/LibUtils.sol @@ -6,141 +6,51 @@ pragma solidity ^0.8.18; +import {LibMath} from "../../libs/LibMath.sol"; +import {LibTokenomics} from "./LibTokenomics.sol"; import { SafeCastUpgradeable } from "@openzeppelin/contracts-upgradeable/utils/math/SafeCastUpgradeable.sol"; - -import {LibMath} from "../../libs/LibMath.sol"; import {TaikoData} from "../TaikoData.sol"; library LibUtils { using LibMath for uint256; - bytes32 public constant BLOCK_DEADEND_HASH = bytes32(uint256(1)); - error L1_BLOCK_NUMBER(); - struct StateVariables { - uint256 feeBase; - uint64 genesisHeight; - uint64 genesisTimestamp; - uint64 nextBlockId; - uint64 lastProposedAt; - uint64 avgBlockTime; - uint64 latestVerifiedHeight; - uint64 latestVerifiedId; - uint64 avgProofTime; - } - - function getProposedBlock( - TaikoData.State storage state, - uint256 maxNumBlocks, - uint256 id - ) internal view returns (TaikoData.ProposedBlock storage) { - return state.proposedBlocks[id % maxNumBlocks]; - } - - function getL2BlockHash( + function getL2ChainData( TaikoData.State storage state, - uint256 number, - uint256 blockHashHistory - ) internal view returns (bytes32) { - if ( - number + blockHashHistory <= state.latestVerifiedHeight || - number > state.latestVerifiedHeight + uint256 blockId, + uint256 maxNumVerifiedBlocks + ) internal view returns (TaikoData.VerifiedBlock storage verifiedBlock) { + uint256 _blockId = blockId; + if (_blockId == 0) { + _blockId = state.lastBlockId; + } else if ( + _blockId + maxNumVerifiedBlocks <= state.lastBlockId || + _blockId > state.lastBlockId ) revert L1_BLOCK_NUMBER(); - return state.l2Hashes[number % blockHashHistory]; + verifiedBlock = state.verifiedBlocks[_blockId % maxNumVerifiedBlocks]; + if (verifiedBlock.blockId != blockId) revert L1_BLOCK_NUMBER(); } function getStateVariables( TaikoData.State storage state - ) internal view returns (StateVariables memory) { + ) internal view returns (TaikoData.StateVariables memory) { return - StateVariables({ - feeBase: state.feeBase, + TaikoData.StateVariables({ + feeBaseTwei: state.feeBaseTwei, genesisHeight: state.genesisHeight, genesisTimestamp: state.genesisTimestamp, nextBlockId: state.nextBlockId, lastProposedAt: state.lastProposedAt, avgBlockTime: state.avgBlockTime, - latestVerifiedHeight: state.latestVerifiedHeight, - latestVerifiedId: state.latestVerifiedId, + lastBlockId: state.lastBlockId, avgProofTime: state.avgProofTime }); } - // Implement "Incentive Multipliers", see the whitepaper. - function getTimeAdjustedFee( - TaikoData.State storage state, - TaikoData.Config memory config, - bool isProposal, - uint64 tNow, - uint64 tLast, - uint64 tAvg, - uint64 tCap - ) internal view returns (uint256 newFeeBase, uint256 tRelBp) { - if ( - tCap == 0 || - tAvg == 0 || - config.feeMaxPeriodPctg <= config.feeGracePeriodPctg || - config.rewardMultiplierPctg <= 100 - ) { - newFeeBase = state.feeBase; - // tRelBp = 0; - } else { - uint256 _tAvg = uint256(tAvg).min(tCap); - uint256 grace = (config.feeGracePeriodPctg * _tAvg) / 100; - uint256 max = (config.feeMaxPeriodPctg * _tAvg) / 100; - uint256 t = uint256(tNow - tLast).max(grace).min(max); - tRelBp = ((t - grace) * 10000) / (max - grace); // [0 - 10000] - uint256 alpha = 10000 + - ((config.rewardMultiplierPctg - 100) * tRelBp) / - 100; - if (isProposal) { - newFeeBase = (state.feeBase * 10000) / alpha; // fee - } else { - newFeeBase = (state.feeBase * alpha) / 10000; // reward - } - } - } - - // Implement "Slot-availability Multipliers", see the whitepaper. - function getSlotsAdjustedFee( - TaikoData.State storage state, - TaikoData.Config memory config, - bool isProposal, - uint256 feeBase - ) internal view returns (uint256) { - // m is the `n'` in the whitepaper - uint256 m = 1000 * - (config.maxNumBlocks - 1) + - config.slotSmoothingFactor; - // n is the number of unverified blocks - uint256 n = 1000 * (state.nextBlockId - state.latestVerifiedId - 1); - // k is `m − n + 1` or `m − n - 1`in the whitepaper - uint256 k = isProposal ? m - n - 1000 : m - n + 1000; - return (feeBase * (m - 1000) * m) / (m - n) / k; - } - - // Implement "Bootstrap Discount Multipliers", see the whitepaper. - function getBootstrapDiscountedFee( - TaikoData.State storage state, - TaikoData.Config memory config, - uint256 feeBase - ) internal view returns (uint256) { - uint256 halves = uint256(block.timestamp - state.genesisTimestamp) / - config.bootstrapDiscountHalvingPeriod; - uint256 gamma = 1024 - (1024 >> halves); - return (feeBase * gamma) / 1024; - } - - function hashMetadata( - TaikoData.BlockMetadata memory meta - ) internal pure returns (bytes32) { - return keccak256(abi.encode(meta)); - } - function movingAverage( uint256 maValue, uint256 newValue, @@ -152,4 +62,24 @@ library LibUtils { uint256 _ma = (maValue * (maf - 1) + newValue) / maf; return _ma > 0 ? _ma : maValue; } + + function hashMetadata( + TaikoData.BlockMetadata memory meta + ) internal pure returns (bytes32 hash) { + bytes32[5] memory inputs; + inputs[0] = + bytes32(uint256(meta.id) << 192) | + bytes32(uint256(meta.gasLimit) << 128) | + bytes32(uint256(meta.timestamp) << 64) | + bytes32(uint256(meta.l1Height)); + + inputs[1] = meta.l1Hash; + inputs[2] = meta.mixHash; + inputs[3] = meta.txListHash; + inputs[4] = bytes32(uint256(uint160(meta.beneficiary))); + + assembly { + hash := keccak256(inputs, mul(5, 32)) + } + } } diff --git a/packages/protocol/contracts/L1/libs/LibVerifying.sol b/packages/protocol/contracts/L1/libs/LibVerifying.sol index a39fef8cddc..71cba51f202 100644 --- a/packages/protocol/contracts/L1/libs/LibVerifying.sol +++ b/packages/protocol/contracts/L1/libs/LibVerifying.sol @@ -6,238 +6,218 @@ pragma solidity ^0.8.18; +import {AddressResolver} from "../../common/AddressResolver.sol"; +import {LibTokenomics} from "./LibTokenomics.sol"; +import {LibUtils} from "./LibUtils.sol"; import { SafeCastUpgradeable } from "@openzeppelin/contracts-upgradeable/utils/math/SafeCastUpgradeable.sol"; - -import {AddressResolver} from "../../common/AddressResolver.sol"; -import {TaikoToken} from "../TaikoToken.sol"; -import {LibUtils} from "./LibUtils.sol"; import {TaikoData} from "../../L1/TaikoData.sol"; -/** - * LibVerifying. - */ library LibVerifying { using SafeCastUpgradeable for uint256; using LibUtils for TaikoData.State; - event BlockVerified(uint256 indexed id, bytes32 blockHash); - event HeaderSynced(uint256 indexed srcHeight, bytes32 srcHash); - - error L1_0_FEE_BASE(); error L1_INVALID_CONFIG(); - error L1_INVALID_PARAM(); + + event BlockVerified(uint256 indexed id, bytes32 blockHash); + event XchainSynced( + uint256 indexed srcHeight, + bytes32 blockHash, + bytes32 signalRoot + ); function init( TaikoData.State storage state, TaikoData.Config memory config, bytes32 genesisBlockHash, - uint feeBase + uint64 feeBaseTwei ) internal { - if ( - config.chainId <= 1 || - config.maxNumBlocks <= 1 || - config.blockHashHistory == 0 || - config.blockMaxGasLimit == 0 || - config.maxTransactionsPerBlock == 0 || - config.maxBytesPerTxList == 0 || - config.minTxGasLimit == 0 || - config.slotSmoothingFactor == 0 || - config.rewardBurnBips >= 10000 || - config.feeBaseMAF == 0 || - config.blockTimeMAF == 0 || - config.proofTimeMAF == 0 || - config.blockTimeCap == 0 || - config.proofTimeCap == 0 || - config.feeGracePeriodPctg > config.feeMaxPeriodPctg || - config.rewardMultiplierPctg < 100 - ) revert L1_INVALID_CONFIG(); - - if (feeBase == 0) revert L1_0_FEE_BASE(); + _checkConfig(config); state.genesisHeight = uint64(block.number); state.genesisTimestamp = uint64(block.timestamp); - state.feeBase = feeBase; + state.feeBaseTwei = feeBaseTwei; state.nextBlockId = 1; - state.lastProposedAt = uint64(block.timestamp); - state.l2Hashes[0] = genesisBlockHash; + + state.verifiedBlocks[0].blockHash = genesisBlockHash; emit BlockVerified(0, genesisBlockHash); - emit HeaderSynced(0, genesisBlockHash); } function verifyBlocks( TaikoData.State storage state, TaikoData.Config memory config, uint256 maxBlocks - ) public { - uint64 latestL2Height = state.latestVerifiedHeight; - bytes32 latestL2Hash = state.l2Hashes[ - latestL2Height % config.blockHashHistory - ]; - uint64 processed; + ) internal { + bytes32 blockHash = state + .verifiedBlocks[state.lastBlockId % config.maxNumVerifiedBlocks] + .blockHash; - for ( - uint256 i = state.latestVerifiedId + 1; - i < state.nextBlockId && processed < maxBlocks; + bytes32 signalRoot; + uint64 processed; + uint256 i; + unchecked { + i = state.lastBlockId + 1; + } - ) { - TaikoData.ForkChoice storage fc = state.forkChoices[i][ - latestL2Hash + while (i < state.nextBlockId && processed < maxBlocks) { + TaikoData.ProposedBlock storage blk = state.proposedBlocks[ + i % config.maxNumProposedBlocks ]; - TaikoData.ProposedBlock storage target = state.getProposedBlock( - config.maxNumBlocks, - i - ); - if (fc.prover == address(0)) { + uint256 fcId = state.forkChoiceIds[i][blockHash]; + + if (blk.nextForkChoiceId <= fcId) { break; - } else { - (latestL2Height, latestL2Hash) = _verifyBlock({ - state: state, - config: config, - fc: fc, - target: target, - latestL2Height: latestL2Height, - latestL2Hash: latestL2Hash - }); - processed += 1; - emit BlockVerified(i, fc.blockHash); + } + + TaikoData.ForkChoice storage fc = blk.forkChoices[fcId]; - // clean up the fork choice - fc.blockHash = 0; - fc.prover = address(0); - fc.provenAt = 0; + if (fc.prover == address(0)) { + break; } + (blockHash, signalRoot) = _markBlockVerified({ + state: state, + config: config, + fc: fc, + blk: blk + }); + + emit BlockVerified(i, blockHash); + unchecked { ++i; + ++processed; } } if (processed > 0) { - state.latestVerifiedId += processed; - - if (latestL2Height > state.latestVerifiedHeight) { - state.latestVerifiedHeight = latestL2Height; - - // Note: Not all L2 hashes are stored on L1, only the last - // verified one in a batch. This is sufficient because the last - // verified hash is the only one needed checking the existence - // of a cross-chain message with a merkle proof. - state.l2Hashes[ - latestL2Height % config.blockHashHistory - ] = latestL2Hash; - emit HeaderSynced(latestL2Height, latestL2Hash); + unchecked { + state.lastBlockId += processed; } - } - } - function withdrawBalance( - TaikoData.State storage state, - AddressResolver resolver - ) public { - uint256 balance = state.balances[msg.sender]; - if (balance <= 1) return; - - state.balances[msg.sender] = 1; - TaikoToken(resolver.resolve("tko_token", false)).mint( - msg.sender, - balance - 1 - ); - } + // Note: Not all L2 hashes are stored on L1, only the last + // verified one in a batch. This is sufficient because the last + // verified hash is the only one needed checking the existence + // of a cross-chain message with a merkle proof. + state.verifiedBlocks[ + state.lastBlockId % config.maxNumVerifiedBlocks + ] = TaikoData.VerifiedBlock( + state.lastBlockId, + blockHash, + signalRoot + ); - function getProofReward( - TaikoData.State storage state, - TaikoData.Config memory config, - uint64 provenAt, - uint64 proposedAt - ) public view returns (uint256 newFeeBase, uint256 reward, uint256 tRelBp) { - if (proposedAt > provenAt) revert L1_INVALID_PARAM(); - (newFeeBase, tRelBp) = LibUtils.getTimeAdjustedFee({ - state: state, - config: config, - isProposal: false, - tNow: provenAt, - tLast: proposedAt, - tAvg: state.avgProofTime, - tCap: config.proofTimeCap - }); - reward = LibUtils.getSlotsAdjustedFee({ - state: state, - config: config, - isProposal: false, - feeBase: newFeeBase - }); - reward = (reward * (10000 - config.rewardBurnBips)) / 10000; + emit XchainSynced(state.lastBlockId, blockHash, signalRoot); + } } - function _verifyBlock( + function _markBlockVerified( TaikoData.State storage state, TaikoData.Config memory config, TaikoData.ForkChoice storage fc, - TaikoData.ProposedBlock storage target, - uint64 latestL2Height, - bytes32 latestL2Hash - ) private returns (uint64 _latestL2Height, bytes32 _latestL2Hash) { + TaikoData.ProposedBlock storage blk + ) private returns (bytes32 blockHash, bytes32 signalRoot) { if (config.enableTokenomics) { - uint256 newFeeBase; - { - uint256 reward; - uint256 tRelBp; // [0-10000], see the whitepaper - (newFeeBase, reward, tRelBp) = getProofReward({ + (uint256 newFeeBase, uint256 amount, uint256 tRelBp) = LibTokenomics + .getProofReward({ state: state, config: config, provenAt: fc.provenAt, - proposedAt: target.proposedAt + proposedAt: blk.proposedAt }); - // reward the prover - if (reward > 0) { - if (state.balances[fc.prover] == 0) { - // Reduce reward to 1 wei as a penalty if the prover - // has 0 TKO outstanding balance. - state.balances[fc.prover] = 1; - } else { - state.balances[fc.prover] += reward; - } - } - - // refund proposer deposit - uint256 refund = (target.deposit * (10000 - tRelBp)) / 10000; - if (refund > 0) { - if (state.balances[target.proposer] == 0) { - // Reduce refund to 1 wei as a penalty if the proposer - // has 0 TKO outstanding balance. - state.balances[target.proposer] = 1; - } else { - state.balances[target.proposer] += refund; - } - } + // reward the prover + _addToBalance(state, fc.prover, amount); + + // refund proposer deposit for valid blocks + unchecked { + // tRelBp in [0-10000] + amount = (blk.deposit * (10000 - tRelBp)) / 10000; } + _addToBalance(state, blk.proposer, amount); + // Update feeBase and avgProofTime - state.feeBase = LibUtils.movingAverage({ - maValue: state.feeBase, - newValue: newFeeBase, - maf: config.feeBaseMAF - }); + state.feeBaseTwei = LibUtils + .movingAverage({ + maValue: state.feeBaseTwei, + newValue: LibTokenomics.toTwei(newFeeBase), + maf: config.feeBaseMAF + }) + .toUint64(); } + uint proofTime; + unchecked { + proofTime = (fc.provenAt - blk.proposedAt) * 1000; + } state.avgProofTime = LibUtils .movingAverage({ maValue: state.avgProofTime, - newValue: fc.provenAt - target.proposedAt, - maf: config.proofTimeMAF + newValue: proofTime, + maf: config.provingConfig.avgTimeMAF }) .toUint64(); - if (fc.blockHash != LibUtils.BLOCK_DEADEND_HASH) { - _latestL2Height = latestL2Height + 1; - _latestL2Hash = fc.blockHash; + blockHash = fc.blockHash; + signalRoot = fc.signalRoot; + + blk.nextForkChoiceId = 1; + + // Clean up the fork choice but keep non-zeros if possible to be + // reused. + fc.blockHash = bytes32(uint256(1)); // none-zero placeholder + fc.signalRoot = bytes32(uint256(1)); // none-zero placeholder + fc.provenAt = 1; // none-zero placeholder + fc.prover = address(0); + } + + function _addToBalance( + TaikoData.State storage state, + address account, + uint256 amount + ) private { + if (amount == 0) return; + if (state.balances[account] == 0) { + // Reduce refund to 1 wei as a penalty if the proposer + // has 0 TKO outstanding balance. + state.balances[account] = 1; } else { - _latestL2Height = latestL2Height; - _latestL2Hash = latestL2Hash; + state.balances[account] += amount; } } + + function _checkConfig(TaikoData.Config memory config) private pure { + if ( + config.chainId <= 1 || + config.maxNumProposedBlocks <= 1 || + config.maxNumVerifiedBlocks == 0 || + config.blockMaxGasLimit == 0 || + config.maxTransactionsPerBlock == 0 || + config.maxBytesPerTxList == 0 || + // EIP-4844 blob size up to 128K + config.maxBytesPerTxList > 128 * 1024 || + config.minTxGasLimit == 0 || + config.slotSmoothingFactor == 0 || + config.anchorTxGasLimit == 0 || + // EIP-4844 blob deleted after 30 days + config.txListCacheExpiry > 30 * 24 hours || + config.rewardBurnBips >= 10000 + ) revert L1_INVALID_CONFIG(); + + _checkFeeConfig(config.proposingConfig); + _checkFeeConfig(config.provingConfig); + } + + function _checkFeeConfig( + TaikoData.FeeConfig memory feeConfig + ) private pure { + if ( + feeConfig.avgTimeMAF <= 1 || + feeConfig.avgTimeCap == 0 || + feeConfig.gracePeriodPctg > feeConfig.maxPeriodPctg + ) revert L1_INVALID_CONFIG(); + } } diff --git a/packages/protocol/contracts/L2/TaikoL2.sol b/packages/protocol/contracts/L2/TaikoL2.sol index 356543d69f6..e7c55a9e634 100644 --- a/packages/protocol/contracts/L2/TaikoL2.sol +++ b/packages/protocol/contracts/L2/TaikoL2.sol @@ -6,22 +6,15 @@ pragma solidity ^0.8.18; -import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; -import { - ReentrancyGuard -} from "@openzeppelin/contracts/security/ReentrancyGuard.sol"; - -import {AddressResolver} from "../common/AddressResolver.sol"; -import {IHeaderSync} from "../common/IHeaderSync.sol"; -import {LibAnchorSignature} from "../libs/LibAnchorSignature.sol"; -import {LibInvalidTxList} from "../libs/LibInvalidTxList.sol"; -import {LibSharedConfig} from "../libs/LibSharedConfig.sol"; -import {LibTxDecoder} from "../libs/LibTxDecoder.sol"; -import {TaikoData} from "../L1/TaikoData.sol"; - -contract TaikoL2 is AddressResolver, ReentrancyGuard, IHeaderSync { - using LibTxDecoder for bytes; - +import {EssentialContract} from "../common/EssentialContract.sol"; +import {IXchainSync} from "../common/IXchainSync.sol"; +import {TaikoL2Signer} from "./TaikoL2Signer.sol"; + +contract TaikoL2 is EssentialContract, TaikoL2Signer, IXchainSync { + struct VerifiedBlock { + bytes32 blockHash; + bytes32 signalRoot; + } /********************** * State Variables * **********************/ @@ -30,13 +23,10 @@ contract TaikoL2 is AddressResolver, ReentrancyGuard, IHeaderSync { // All L2 block hashes will be saved in this mapping. mapping(uint256 blockNumber => bytes32 blockHash) private _l2Hashes; - // Mapping from L1 block numbers to their block hashes. - // Note that only hashes of L1 blocks where at least one L2 - // block has been proposed will be saved in this mapping. - mapping(uint256 blockNumber => bytes32 blockHash) private _l1Hashes; + mapping(uint256 blockNumber => VerifiedBlock) private _l1VerifiedBlocks; // A hash to check te integrity of public inputs. - bytes32 private _publicInputHash; + bytes32 public publicInputHash; // The latest L1 block where a L2 block has been proposed. uint256 public latestSyncedL1Height; @@ -47,33 +37,39 @@ contract TaikoL2 is AddressResolver, ReentrancyGuard, IHeaderSync { * Events and Errors * **********************/ - event BlockInvalidated(bytes32 indexed txListHash); + // Captures all block variables mentioned in + // https://docs.soliditylang.org/en/v0.8.18/units-and-global-variables.html + event BlockVars( + uint256 number, + bytes32 parentHash, + uint256 timestamp, + uint256 basefee, + uint256 prevrandao, + address coinbase, + uint256 gaslimit, + uint256 chainid + ); - error L2_INVALID_SENDER(); error L2_INVALID_CHAIN_ID(); - error L2_INVALID_GAS_PRICE(); + error L2_INVALID_SENDER(); error L2_PUBLIC_INPUT_HASH_MISMATCH(); + error L2_TOO_LATE(); /********************** * Constructor * **********************/ - constructor(address _addressManager) { - if (block.chainid == 0) revert L2_INVALID_CHAIN_ID(); - AddressResolver._init(_addressManager); + function init(address _addressManager) external initializer { + if (block.chainid <= 1) revert L2_INVALID_CHAIN_ID(); + if (block.number > 1) revert L2_TOO_LATE(); - bytes32[255] memory ancestors; - uint256 number = block.number; - for (uint256 i; i < 255 && number >= i + 2; ++i) { - ancestors[i] = blockhash(number - i - 2); - } + EssentialContract._init(_addressManager); - _publicInputHash = _hashPublicInputs({ - chainId: block.chainid, - number: number, - baseFee: 0, - ancestors: ancestors - }); + (publicInputHash, ) = _calcPublicInputHash(block.number); + if (block.number > 0) { + uint parentHeight = block.number - 1; + _l2Hashes[parentHeight] = blockhash(parentHeight); + } } /********************** @@ -86,77 +82,75 @@ contract TaikoL2 is AddressResolver, ReentrancyGuard, IHeaderSync { * certain block-level global variables because they are not part of the * Trie structure. * - * Note: This transaction shall be the first transaction in every L2 block. + * A circuit will verify the integratity among: + * - l1Hash, l1SignalRoot, and l1SignalServiceAddress + * - (l1Hash and l1SignalServiceAddress) are both hased into of the + * ZKP's instance. + * + * This transaction shall be the first transaction in every L2 block. * * @param l1Height The latest L1 block height when this block was proposed. * @param l1Hash The latest L1 block hash when this block was proposed. + * @param l1SignalRoot The latest value of the L1 "signal service storage root". */ - function anchor(uint256 l1Height, bytes32 l1Hash) external { - TaikoData.Config memory config = getConfig(); - if (config.enablePublicInputsCheck) { - _checkPublicInputs(); - } - latestSyncedL1Height = l1Height; - _l1Hashes[l1Height] = l1Hash; - emit HeaderSynced(l1Height, l1Hash); - } - - /** - * Invalidate a L2 block by verifying its txList is not intrinsically valid. - * - * @param txList The L2 block's txlist. - * @param hint A hint for this method to invalidate the txList. - * @param txIdx If the hint is for a specific transaction in txList, - * txIdx specifies which transaction to check. - */ - function invalidateBlock( - bytes calldata txList, - LibInvalidTxList.Hint hint, - uint256 txIdx + function anchor( + uint256 l1Height, + bytes32 l1Hash, + bytes32 l1SignalRoot ) external { - if (msg.sender != LibAnchorSignature.K_GOLDEN_TOUCH_ADDRESS) - revert L2_INVALID_SENDER(); + if (msg.sender != GOLDEN_TOUCH_ADDRESS) revert L2_INVALID_SENDER(); - if (tx.gasprice != 0) revert L2_INVALID_GAS_PRICE(); + uint256 parentHeight = block.number - 1; + bytes32 parentHash = blockhash(parentHeight); - TaikoData.Config memory config = getConfig(); - LibInvalidTxList.verifyTxListInvalid({ - config: config, - encoded: txList, - hint: hint, - txIdx: txIdx - }); + (bytes32 prevPIH, bytes32 currPIH) = _calcPublicInputHash(parentHeight); - if (config.enablePublicInputsCheck) { - _checkPublicInputs(); + if (publicInputHash != prevPIH) { + revert L2_PUBLIC_INPUT_HASH_MISMATCH(); } - emit BlockInvalidated(txList.hashTxList()); + // replace the oldest block hash with the parent's blockhash + + publicInputHash = currPIH; + _l2Hashes[parentHeight] = parentHash; + + latestSyncedL1Height = l1Height; + _l1VerifiedBlocks[l1Height] = VerifiedBlock(l1Hash, l1SignalRoot); + + emit XchainSynced(l1Height, l1Hash, l1SignalRoot); + + // We emit this event so circuits can grab its data to verify block variables. + // If plonk lookup table already has all these data, we can still use this + // event for debugging purpose. + emit BlockVars({ + number: block.number, + parentHash: parentHash, + timestamp: block.timestamp, + basefee: 0, //block.basefee, + prevrandao: block.prevrandao, + coinbase: block.coinbase, + gaslimit: block.gaslimit, + chainid: block.chainid + }); } /********************** * Public Functions * **********************/ - function getConfig() - public - view - virtual - returns (TaikoData.Config memory config) - { - config = LibSharedConfig.getConfig(); - config.chainId = block.chainid; - } - - function getSyncedHeader( + function getXchainBlockHash( uint256 number ) public view override returns (bytes32) { - return _l1Hashes[number]; + uint256 _number = number == 0 ? latestSyncedL1Height : number; + return _l1VerifiedBlocks[_number].blockHash; } - function getLatestSyncedHeader() public view override returns (bytes32) { - return _l1Hashes[latestSyncedL1Height]; + function getXchainSignalRoot( + uint256 number + ) public view override returns (bytes32) { + uint256 _number = number == 0 ? latestSyncedL1Height : number; + return _l1VerifiedBlocks[_number].signalRoot; } function getBlockHash(uint256 number) public view returns (bytes32) { @@ -173,51 +167,29 @@ contract TaikoL2 is AddressResolver, ReentrancyGuard, IHeaderSync { * Private Functions * **********************/ - function _checkPublicInputs() private { - // Check the latest 256 block hashes (excluding the parent hash). - bytes32[255] memory ancestors; - uint256 number = block.number; - uint256 chainId = block.chainid; - - // put the previous 255 blockhashes (excluding the parent's) into a - // ring buffer. - for (uint256 i = 2; i <= 256 && number >= i; ++i) { - ancestors[(number - i) % 255] = blockhash(number - i); + function _calcPublicInputHash( + uint256 blockNumber + ) private view returns (bytes32 prevPIH, bytes32 currPIH) { + bytes32[256] memory inputs; + unchecked { + // put the previous 255 blockhashes (excluding the parent's) into a + // ring buffer. + for (uint256 i; i < 255 && blockNumber >= i + 1; ++i) { + uint j = blockNumber - i - 1; + inputs[j % 255] = blockhash(j); + } } - uint256 parentHeight = number - 1; - bytes32 parentHash = blockhash(parentHeight); + inputs[255] = bytes32(block.chainid); + // inputs[256] = bytes32(block.basefee); - if ( - _publicInputHash != - _hashPublicInputs({ - chainId: chainId, - number: parentHeight, - baseFee: 0, - ancestors: ancestors - }) - ) { - revert L2_PUBLIC_INPUT_HASH_MISMATCH(); + assembly { + prevPIH := keccak256(inputs, mul(256, 32)) } - // replace the oldest block hash with the parent's blockhash - ancestors[parentHeight % 255] = parentHash; - _publicInputHash = _hashPublicInputs({ - chainId: chainId, - number: number, - baseFee: 0, - ancestors: ancestors - }); - - _l2Hashes[parentHeight] = parentHash; - } - - function _hashPublicInputs( - uint256 chainId, - uint256 number, - uint256 baseFee, - bytes32[255] memory ancestors - ) private pure returns (bytes32) { - return keccak256(abi.encodePacked(chainId, number, baseFee, ancestors)); + inputs[blockNumber % 255] = blockhash(blockNumber); + assembly { + currPIH := keccak256(inputs, mul(256, 32)) + } } } diff --git a/packages/protocol/contracts/libs/LibAnchorSignature.sol b/packages/protocol/contracts/L2/TaikoL2Signer.sol similarity index 71% rename from packages/protocol/contracts/libs/LibAnchorSignature.sol rename to packages/protocol/contracts/L2/TaikoL2Signer.sol index a2a8c3b713e..4a42d6b0b5f 100644 --- a/packages/protocol/contracts/libs/LibAnchorSignature.sol +++ b/packages/protocol/contracts/L2/TaikoL2Signer.sol @@ -6,54 +6,56 @@ pragma solidity ^0.8.18; -import {LibUint512Math} from "./LibUint512Math.sol"; +import {LibUint512Math} from "../libs/LibUint512Math.sol"; -library LibAnchorSignature { - address public constant K_GOLDEN_TOUCH_ADDRESS = +abstract contract TaikoL2Signer { + address public constant GOLDEN_TOUCH_ADDRESS = 0x0000777735367b36bC9B61C50022d9D0700dB4Ec; - uint256 public constant K_GOLDEN_TOUCH_PRIVATEKEY = + uint256 public constant GOLDEN_TOUCH_PRIVATEKEY = 0x92954368afd3caa1f3ce3ead0069c1af414054aefe1ef9aeacc1bf426222ce38; - uint256 public constant GX = + uint256 private constant GX = 0x79BE667EF9DCBBAC55A06295CE870B07029BFCDB2DCE28D959F2815B16F81798; - uint256 public constant GY = + uint256 private constant GY = 0x483ADA7726A3C4655DA4FBFC0E1108A8FD17B448A68554199C47D08FFB10D4B8; - uint256 public constant GX2 = + uint256 private constant GX2 = 0xc6047f9441ed7d6d3045406e95c07cd85c778e4b8cef3ca7abac09b95c709ee5; - uint256 public constant GY2 = + uint256 private constant GY2 = 0x1ae168fea63dc339a3c58419466ceaeef7f632653266d0e1236431a950cfe52a; - uint256 public constant N = + uint256 private constant N = 0xfffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141; // ( // uint256 GX_MUL_GOLDEN_TOUCH_PRIVATEKEY_LOW, // uint256 GX_MUL_GOLDEN_TOUCH_PRIVATEKEY_HIGH - // ) = LibUint512Math.mul(GX, K_GOLDEN_TOUCH_PRIVATEKEY); - uint256 public constant GX_MUL_GOLDEN_TOUCH_PRIVATEKEY_LOW = + // ) = LibUint512Math.mul(GX, GOLDEN_TOUCH_PRIVATEKEY); + uint256 private constant GX_MUL_GOLDEN_TOUCH_PRIVATEKEY_LOW = 0xb4a95509ce05fe8d45987859a067780d16a367c0e2cacf79cd301b93fb717940; - uint256 public constant GX_MUL_GOLDEN_TOUCH_PRIVATEKEY_HIGH = + uint256 private constant GX_MUL_GOLDEN_TOUCH_PRIVATEKEY_HIGH = 0x45b59254b0320fd853f3f38ac574999e91bd75fd5e6cab9c22c5e71fc6d276e4; // ( // uint256 GX2_MUL_GOLDEN_TOUCH_PRIVATEKEY_LOW, // uint256 GX2_MUL_GOLDEN_TOUCH_PRIVATEKEY_HIGH - // ) = LibUint512Math.mul(GX2, K_GOLDEN_TOUCH_PRIVATEKEY); - uint256 public constant GX2_MUL_GOLDEN_TOUCH_PRIVATEKEY_LOW = + // ) = LibUint512Math.mul(GX2, GOLDEN_TOUCH_PRIVATEKEY); + uint256 private constant GX2_MUL_GOLDEN_TOUCH_PRIVATEKEY_LOW = 0xad77eceea844778cb4376153fc8f06f12f1695df4585bf75bfb17ec19ce90818; - uint256 public constant GX2_MUL_GOLDEN_TOUCH_PRIVATEKEY_HIGH = + uint256 private constant GX2_MUL_GOLDEN_TOUCH_PRIVATEKEY_HIGH = 0x71620584f61c57e688bbd3fd7a39a036e588d962c4c830f3dacbc15c917e02f2; // Invert K (= 2) in the field F(N) - uint256 public constant K_2_INVM_N = + uint256 private constant K_2_INVM_N = 0x7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a1; - function signTransaction( + error L2_INVALID_GOLDEN_TOUCH_K(); + + function signAnchor( bytes32 digest, uint8 k - ) internal view returns (uint8 v, uint256 r, uint256 s) { - require(k == 1 || k == 2, "invalid k value"); + ) public view returns (uint8 v, uint256 r, uint256 s) { + if (k != 1 && k != 2) revert L2_INVALID_GOLDEN_TOUCH_K(); r = k == 1 ? GX : GX2; @@ -73,13 +75,13 @@ library LibAnchorSignature { ); if (k == 1) { - s = expmod(low256, high256, 1, N); + s = _expmod(low256, high256, 1, N); } else { (low256, high256) = LibUint512Math.mul( K_2_INVM_N, - expmod(low256, high256, 1, N) + _expmod(low256, high256, 1, N) ); - s = expmod(low256, high256, 1, N); + s = _expmod(low256, high256, 1, N); } if (s > N >> 1) { @@ -88,12 +90,12 @@ library LibAnchorSignature { } } - function expmod( + function _expmod( uint256 baseLow, uint256 baseHigh, uint256 e, uint256 m - ) internal view returns (uint256 o) { + ) private view returns (uint256 o) { assembly { // define pointer let p := mload(0x40) diff --git a/packages/protocol/contracts/bridge/Bridge.sol b/packages/protocol/contracts/bridge/Bridge.sol index 900f7485b3e..681b1b170ce 100644 --- a/packages/protocol/contracts/bridge/Bridge.sol +++ b/packages/protocol/contracts/bridge/Bridge.sol @@ -30,7 +30,6 @@ contract Bridge is EssentialContract, IBridge, BridgeErrors { *********************/ LibBridgeData.State private _state; // 50 slots reserved - uint256[50] private __gap; /********************* * Events * diff --git a/packages/protocol/contracts/bridge/EtherVault.sol b/packages/protocol/contracts/bridge/EtherVault.sol index 60d2f15de0b..b71a2e63d22 100644 --- a/packages/protocol/contracts/bridge/EtherVault.sol +++ b/packages/protocol/contracts/bridge/EtherVault.sol @@ -78,7 +78,9 @@ contract EtherVault is EssentialContract, BridgeErrors { * @param amount Amount of Ether to send. */ function releaseEther(uint256 amount) public onlyAuthorized nonReentrant { - msg.sender.sendEther(amount); + if (amount > 0) { + msg.sender.sendEther(amount); + } emit EtherReleased(msg.sender, amount); } @@ -95,7 +97,9 @@ contract EtherVault is EssentialContract, BridgeErrors { if (recipient == address(0)) { revert B_EV_DO_NOT_BURN(); } - recipient.sendEther(amount); + if (amount > 0) { + recipient.sendEther(amount); + } emit EtherReleased(recipient, amount); } diff --git a/packages/protocol/contracts/bridge/TokenVault.sol b/packages/protocol/contracts/bridge/TokenVault.sol index 2f8a2fb1958..d07e2e24914 100644 --- a/packages/protocol/contracts/bridge/TokenVault.sol +++ b/packages/protocol/contracts/bridge/TokenVault.sol @@ -19,6 +19,7 @@ import {EssentialContract} from "../common/EssentialContract.sol"; import {TaikoToken} from "../L1/TaikoToken.sol"; import {BridgedERC20} from "./BridgedERC20.sol"; import {IBridge} from "./IBridge.sol"; +import {Strings} from "@openzeppelin/contracts/utils/Strings.sol"; /** * This vault holds all ERC20 tokens (but not Ether) that users have deposited. @@ -388,7 +389,10 @@ contract TokenVault is EssentialContract { bridgedToken = Create2Upgradeable.deploy( 0, // amount of Ether to send keccak256( - abi.encodePacked(canonicalToken.chainId, canonicalToken.addr) + bytes.concat( + bytes32(canonicalToken.chainId), + bytes32(uint256(uint160(canonicalToken.addr))) + ) ), type(BridgedERC20).creationCode ); @@ -399,14 +403,11 @@ contract TokenVault is EssentialContract { _srcChainId: canonicalToken.chainId, _decimals: canonicalToken.decimals, _symbol: canonicalToken.symbol, - _name: string( - abi.encodePacked( - canonicalToken.name, - "(bridged", - hex"F09F8C88", // 🌈 - canonicalToken.chainId, - ")" - ) + _name: string.concat( + canonicalToken.name, + unicode"(bridged🌈", + Strings.toString(canonicalToken.chainId), + ")" ) }); diff --git a/packages/protocol/contracts/bridge/libs/LibBridgeData.sol b/packages/protocol/contracts/bridge/libs/LibBridgeData.sol index 0a16cc06a5c..3fc01957803 100644 --- a/packages/protocol/contracts/bridge/libs/LibBridgeData.sol +++ b/packages/protocol/contracts/bridge/libs/LibBridgeData.sol @@ -7,10 +7,10 @@ pragma solidity ^0.8.18; import {AddressResolver} from "../../common/AddressResolver.sol"; +import {BlockHeader, LibBlockHeader} from "../../libs/LibBlockHeader.sol"; +import {IBridge} from "../IBridge.sol"; import {LibAddress} from "../../libs/LibAddress.sol"; -import {LibBlockHeader, BlockHeader} from "../../libs/LibBlockHeader.sol"; import {LibMath} from "../../libs/LibMath.sol"; -import {IBridge} from "../IBridge.sol"; /** * Stores message metadata on the Bridge. diff --git a/packages/protocol/contracts/bridge/libs/LibBridgeInvoke.sol b/packages/protocol/contracts/bridge/libs/LibBridgeInvoke.sol index 5bfff9dc5ce..85501323e7d 100644 --- a/packages/protocol/contracts/bridge/libs/LibBridgeInvoke.sol +++ b/packages/protocol/contracts/bridge/libs/LibBridgeInvoke.sol @@ -6,7 +6,9 @@ pragma solidity ^0.8.18; -import {LibBridgeData, IBridge, LibAddress} from "./LibBridgeData.sol"; +import {IBridge} from "../IBridge.sol"; +import {LibAddress} from "../../libs/LibAddress.sol"; +import {LibBridgeData} from "./LibBridgeData.sol"; library LibBridgeInvoke { using LibAddress for address; diff --git a/packages/protocol/contracts/bridge/libs/LibBridgeProcess.sol b/packages/protocol/contracts/bridge/libs/LibBridgeProcess.sol index f5dcdfeac5d..1ab72780c60 100644 --- a/packages/protocol/contracts/bridge/libs/LibBridgeProcess.sol +++ b/packages/protocol/contracts/bridge/libs/LibBridgeProcess.sol @@ -6,15 +6,15 @@ pragma solidity ^0.8.18; -import {ISignalService} from "../../signal/ISignalService.sol"; +import {AddressResolver} from "../../common/AddressResolver.sol"; import {EtherVault} from "../EtherVault.sol"; +import {IBridge} from "../IBridge.sol"; +import {ISignalService} from "../../signal/ISignalService.sol"; +import {LibAddress} from "../../libs/LibAddress.sol"; import {LibBridgeData} from "./LibBridgeData.sol"; import {LibBridgeInvoke} from "./LibBridgeInvoke.sol"; import {LibBridgeStatus} from "./LibBridgeStatus.sol"; import {LibMath} from "../../libs/LibMath.sol"; -import {LibAddress} from "../../libs/LibAddress.sol"; -import {IBridge} from "../IBridge.sol"; -import {AddressResolver} from "../../common/AddressResolver.sol"; /** * Process bridge messages on the destination chain. @@ -27,8 +27,8 @@ library LibBridgeProcess { using LibBridgeData for LibBridgeData.State; error B_FORBIDDEN(); - error B_STATUS_MISMTACH(); error B_SIGNAL_NOT_RECEIVED(); + error B_STATUS_MISMTACH(); error B_WRONG_CHAIN_ID(); /** @@ -129,7 +129,7 @@ library LibBridgeProcess { status = LibBridgeStatus.MessageStatus.DONE; } else { status = LibBridgeStatus.MessageStatus.RETRIABLE; - if (ethVault != address(0)) { + if (ethVault != address(0) && message.callValue > 0) { ethVault.sendEther(message.callValue); } } @@ -144,13 +144,20 @@ library LibBridgeProcess { // if sender is the refundAddress if (msg.sender == refundAddress) { - refundAddress.sendEther(message.processingFee + refundAmount); + uint256 amount = message.processingFee + refundAmount; + if (amount > 0) { + refundAddress.sendEther(amount); + } } else { // if sender is another address (eg. the relayer) // First attempt relayer is rewarded the processingFee // message.owner has to eat the cost - msg.sender.sendEther(message.processingFee); - refundAddress.sendEther(refundAmount); + if (message.processingFee > 0) { + msg.sender.sendEther(message.processingFee); + } + if (refundAmount > 0) { + refundAddress.sendEther(refundAmount); + } } } } diff --git a/packages/protocol/contracts/bridge/libs/LibBridgeRelease.sol b/packages/protocol/contracts/bridge/libs/LibBridgeRelease.sol index 77314312b18..6be97cb6ed2 100644 --- a/packages/protocol/contracts/bridge/libs/LibBridgeRelease.sol +++ b/packages/protocol/contracts/bridge/libs/LibBridgeRelease.sol @@ -6,20 +6,20 @@ pragma solidity ^0.8.18; +import {AddressResolver} from "../../common/AddressResolver.sol"; import {EtherVault} from "../EtherVault.sol"; +import {IBridge} from "../IBridge.sol"; import {LibBridgeData} from "./LibBridgeData.sol"; import {LibBridgeStatus} from "./LibBridgeStatus.sol"; -import {IBridge} from "../IBridge.sol"; -import {AddressResolver} from "../../common/AddressResolver.sol"; library LibBridgeRelease { using LibBridgeData for IBridge.Message; - error B_OWNER_IS_NULL(); - error B_WRONG_CHAIN_ID(); error B_ETHER_RELEASED_ALREADY(); - error B_MSG_NOT_FAILED(); error B_FAILED_TRANSFER(); + error B_MSG_NOT_FAILED(); + error B_OWNER_IS_NULL(); + error B_WRONG_CHAIN_ID(); event EtherReleased(bytes32 indexed msgHash, address to, uint256 amount); diff --git a/packages/protocol/contracts/bridge/libs/LibBridgeRetry.sol b/packages/protocol/contracts/bridge/libs/LibBridgeRetry.sol index 9bbee27c901..752b2312bdb 100644 --- a/packages/protocol/contracts/bridge/libs/LibBridgeRetry.sol +++ b/packages/protocol/contracts/bridge/libs/LibBridgeRetry.sol @@ -6,13 +6,13 @@ pragma solidity ^0.8.18; +import {AddressResolver} from "../../common/AddressResolver.sol"; import {EtherVault} from "../EtherVault.sol"; -import {LibBridgeInvoke} from "./LibBridgeInvoke.sol"; +import {IBridge} from "../IBridge.sol"; +import {LibAddress} from "../../libs/LibAddress.sol"; import {LibBridgeData} from "./LibBridgeData.sol"; +import {LibBridgeInvoke} from "./LibBridgeInvoke.sol"; import {LibBridgeStatus} from "./LibBridgeStatus.sol"; -import {LibAddress} from "../../libs/LibAddress.sol"; -import {IBridge} from "../IBridge.sol"; -import {AddressResolver} from "../../common/AddressResolver.sol"; /** * Retry bridge messages. @@ -89,9 +89,10 @@ library LibBridgeRetry { address refundAddress = message.refundAddress == address(0) ? message.owner : message.refundAddress; - - refundAddress.sendEther(message.callValue); - } else if (ethVault != address(0)) { + if (message.callValue > 0) { + refundAddress.sendEther(message.callValue); + } + } else if (ethVault != address(0) && message.callValue > 0) { ethVault.sendEther(message.callValue); } } diff --git a/packages/protocol/contracts/bridge/libs/LibBridgeSend.sol b/packages/protocol/contracts/bridge/libs/LibBridgeSend.sol index a38fa0425f7..3fbbba6b0c4 100644 --- a/packages/protocol/contracts/bridge/libs/LibBridgeSend.sol +++ b/packages/protocol/contracts/bridge/libs/LibBridgeSend.sol @@ -7,10 +7,10 @@ pragma solidity ^0.8.18; import {AddressResolver} from "../../common/AddressResolver.sol"; -import {LibAddress} from "../../libs/LibAddress.sol"; +import {IBridge} from "../IBridge.sol"; import {ISignalService} from "../../signal/ISignalService.sol"; +import {LibAddress} from "../../libs/LibAddress.sol"; import {LibBridgeData} from "./LibBridgeData.sol"; -import {IBridge} from "../IBridge.sol"; /** * Entry point for starting a bridge transaction. @@ -21,10 +21,10 @@ library LibBridgeSend { using LibAddress for address; using LibBridgeData for IBridge.Message; + error B_INCORRECT_VALUE(); error B_OWNER_IS_NULL(); error B_WRONG_CHAIN_ID(); error B_WRONG_TO_ADDRESS(); - error B_INCORRECT_VALUE(); /** * Send a message to the Bridge with the details of the request. The Bridge @@ -74,7 +74,7 @@ library LibBridgeSend { // store it here on the Bridge. Processing will release Ether from the // EtherVault or the Bridge on the destination chain. address ethVault = resolver.resolve("ether_vault", true); - if (ethVault != address(0)) { + if (ethVault != address(0) && expectedAmount > 0) { ethVault.sendEther(expectedAmount); } diff --git a/packages/protocol/contracts/bridge/libs/LibBridgeStatus.sol b/packages/protocol/contracts/bridge/libs/LibBridgeStatus.sol index dddff1d5534..c6a91d29b47 100644 --- a/packages/protocol/contracts/bridge/libs/LibBridgeStatus.sol +++ b/packages/protocol/contracts/bridge/libs/LibBridgeStatus.sol @@ -7,10 +7,10 @@ pragma solidity ^0.8.18; import {AddressResolver} from "../../common/AddressResolver.sol"; -import {IHeaderSync} from "../../common/IHeaderSync.sol"; -import {LibBlockHeader, BlockHeader} from "../../libs/LibBlockHeader.sol"; -import {LibTrieProof} from "../../libs/LibTrieProof.sol"; +import {BlockHeader, LibBlockHeader} from "../../libs/LibBlockHeader.sol"; +import {IXchainSync} from "../../common/IXchainSync.sol"; import {LibBridgeData} from "./LibBridgeData.sol"; +import {LibTrieProof} from "../../libs/LibTrieProof.sol"; library LibBridgeStatus { using LibBlockHeader for BlockHeader; @@ -28,8 +28,8 @@ library LibBridgeStatus { address transactor ); - error B_WRONG_CHAIN_ID(); error B_MSG_HASH_NULL(); + error B_WRONG_CHAIN_ID(); /** * @dev If messageStatus is same as in the messageStatus mapping, @@ -75,8 +75,9 @@ library LibBridgeStatus { proof, (LibBridgeData.StatusProof) ); - bytes32 syncedHeaderHash = IHeaderSync(resolver.resolve("taiko", false)) - .getSyncedHeader(sp.header.height); + + bytes32 syncedHeaderHash = IXchainSync(resolver.resolve("taiko", false)) + .getXchainBlockHash(sp.header.height); if ( syncedHeaderHash == 0 || @@ -86,7 +87,7 @@ library LibBridgeStatus { } return - LibTrieProof.verify({ + LibTrieProof.verifyWithAccountProof({ stateRoot: sp.header.stateRoot, addr: resolver.resolve(destChainId, "bridge", false), slot: getMessageStatusSlot(msgHash), @@ -98,7 +99,7 @@ library LibBridgeStatus { function getMessageStatusSlot( bytes32 msgHash ) internal pure returns (bytes32) { - return keccak256(abi.encodePacked("MESSAGE_STATUS", msgHash)); + return keccak256(bytes.concat(bytes("MESSAGE_STATUS"), msgHash)); } function _setMessageStatus(bytes32 msgHash, MessageStatus status) private { diff --git a/packages/protocol/contracts/common/AddressResolver.sol b/packages/protocol/contracts/common/AddressResolver.sol index f9ff185d03f..c690759cca5 100644 --- a/packages/protocol/contracts/common/AddressResolver.sol +++ b/packages/protocol/contracts/common/AddressResolver.sol @@ -6,8 +6,8 @@ pragma solidity ^0.8.18; -import {Strings} from "@openzeppelin/contracts/utils/Strings.sol"; import {IAddressManager} from "./IAddressManager.sol"; +import {Strings} from "@openzeppelin/contracts/utils/Strings.sol"; /** * This abstract contract provides a name-to-address lookup. Under the hood, @@ -69,6 +69,16 @@ abstract contract AddressResolver { return address(_addressManager); } + function keyForName( + uint256 chainId, + string memory name + ) public pure returns (string memory key) { + key = string.concat(Strings.toString(chainId), ".", name); + // TODO: the next line is cheaper in gas but will break + // many Hardhat tests. + // key = string(bytes.concat(bytes32(chainId), bytes(name))); + } + function _init(address addressManager_) internal virtual { if (addressManager_ == address(0)) revert RESOLVER_INVALID_ADDR(); _addressManager = IAddressManager(addressManager_); @@ -79,19 +89,13 @@ abstract contract AddressResolver { string memory name, bool allowZeroAddress ) private view returns (address payable addr) { - bytes memory key = abi.encodePacked( - Strings.toString(chainId), - ".", - name - ); - addr = payable(_addressManager.getAddress(string(key))); + string memory key = keyForName(chainId, name); + + addr = payable(_addressManager.getAddress(key)); if (!allowZeroAddress) { // We do not use custom error so this string-based // error message is more helpful for diagnosis. - require( - addr != address(0), - string(abi.encodePacked("AR:zeroAddr:", key)) - ); + require(addr != address(0), string.concat("AR:zeroAddr:", key)); } } } diff --git a/packages/protocol/contracts/common/IHeaderSync.sol b/packages/protocol/contracts/common/IHeaderSync.sol deleted file mode 100644 index 741d26e1307..00000000000 --- a/packages/protocol/contracts/common/IHeaderSync.sol +++ /dev/null @@ -1,19 +0,0 @@ -// SPDX-License-Identifier: MIT -// _____ _ _ _ _ -// |_ _|_ _(_) |_____ | | __ _| |__ ___ -// | |/ _` | | / / _ \ | |__/ _` | '_ (_-< -// |_|\__,_|_|_\_\___/ |____\__,_|_.__/__/ - -pragma solidity ^0.8.18; - -/** - * Interface implemented by both the TaikoL1 and TaikoL2 contracts. It exposes - * the methods needed to access the block hashes of the other chain. - */ -interface IHeaderSync { - event HeaderSynced(uint256 indexed srcHeight, bytes32 srcHash); - - function getSyncedHeader(uint256 number) external view returns (bytes32); - - function getLatestSyncedHeader() external view returns (bytes32); -} diff --git a/packages/protocol/contracts/common/IXchainSync.sol b/packages/protocol/contracts/common/IXchainSync.sol new file mode 100644 index 00000000000..26a21e375da --- /dev/null +++ b/packages/protocol/contracts/common/IXchainSync.sol @@ -0,0 +1,37 @@ +// SPDX-License-Identifier: MIT +// _____ _ _ _ _ +// |_ _|_ _(_) |_____ | | __ _| |__ ___ +// | |/ _` | | / / _ \ | |__/ _` | '_ (_-< +// |_|\__,_|_|_\_\___/ |____\__,_|_.__/__/ + +pragma solidity ^0.8.18; + +/** + * Interface implemented by both the TaikoL1 and TaikoL2 contracts. It exposes + * the methods needed to access the block hashes of the other chain. + */ + +interface IXchainSync { + event XchainSynced( + uint256 indexed srcHeight, + bytes32 blockHash, + bytes32 signalRoot + ); + + /** + * @notice Returns the cross-chain block hash at the given block number. + * @param number The block number. Use 0 for the latest block. + * @return The cross-chain block hash. + */ + function getXchainBlockHash(uint256 number) external view returns (bytes32); + + /** + * @notice Returns the cross-chain signal service storage root at the given + * block number. + * @param number The block number. Use 0 for the latest block. + * @return The cross-chain signal service storage root. + */ + function getXchainSignalRoot( + uint256 number + ) external view returns (bytes32); +} diff --git a/packages/protocol/contracts/libs/Lib1559Math.sol b/packages/protocol/contracts/libs/Lib1559Math.sol index dc67773aeab..c86196d9e83 100644 --- a/packages/protocol/contracts/libs/Lib1559Math.sol +++ b/packages/protocol/contracts/libs/Lib1559Math.sol @@ -20,20 +20,20 @@ library Lib1559Math { * * @param prevTarget The previous round's target value. * @param prevMeasured The previous round's measured value. It must be in the same unit as `T`. - * @param T The base target value. It must be in the same unit as `prevMeasured`. - * @param A The adjustment factor. Bigger values change the next round's target more slowly. + * @param t The base target value. It must be in the same unit as `prevMeasured`. + * @param a The adjustment factor. Bigger values change the next round's target more slowly. * @return nextTarget The next round's target value. */ function adjustTarget( uint256 prevTarget, uint256 prevMeasured, - uint256 T, - uint256 A + uint256 t, + uint256 a ) internal pure returns (uint256 nextTarget) { - assert(prevTarget != 0 && T != 0 && A > 1); + assert(prevTarget != 0 && t != 0 && a > 1); - uint256 x = prevTarget * ((A - 1) * T + prevMeasured); - uint256 y = A * T; + uint256 x = prevTarget * ((a - 1) * t + prevMeasured); + uint256 y = a * t; nextTarget = x / y; if (nextTarget == 0) { @@ -50,20 +50,20 @@ library Lib1559Math { * * @param prevTarget The previous round's target value. * @param prevMeasured The previous round's measured value. It must be in the same unit as `T`. - * @param T The base target value. It must be in the same unit as `prevMeasured`. - * @param A The adjustment factor. Bigger values change the next round's target more slowly. + * @param t The base target value. It must be in the same unit as `prevMeasured`. + * @param a The adjustment factor. Bigger values change the next round's target more slowly. * @return nextTarget The next round's target value. */ function adjustTargetReverse( uint256 prevTarget, uint256 prevMeasured, - uint256 T, - uint256 A + uint256 t, + uint256 a ) internal pure returns (uint256 nextTarget) { - assert(prevTarget != 0 && T != 0 && A > 1); + assert(prevTarget != 0 && t != 0 && a > 1); - uint256 x = prevTarget * A * T; - uint256 y = (A - 1) * T + prevMeasured; + uint256 x = prevTarget * a * t; + uint256 y = (a - 1) * t + prevMeasured; nextTarget = x / y; if (nextTarget == 0) { diff --git a/packages/protocol/contracts/libs/LibAddress.sol b/packages/protocol/contracts/libs/LibAddress.sol index b1a625dad75..84468a4b693 100644 --- a/packages/protocol/contracts/libs/LibAddress.sol +++ b/packages/protocol/contracts/libs/LibAddress.sol @@ -18,10 +18,8 @@ library LibAddress { * @param amount The amount of Ether to send. */ function sendEther(address to, uint256 amount) internal { - if (amount > 0) { - (bool success, ) = payable(to).call{value: amount}(""); - require(success, "ETH transfer failed"); - } + (bool success, ) = payable(to).call{value: amount}(""); + require(success, "ETH transfer failed"); } function codeHash(address addr) internal view returns (bytes32 codehash) { diff --git a/packages/protocol/contracts/libs/LibBlockHeader.sol b/packages/protocol/contracts/libs/LibBlockHeader.sol index 4525b8cb5fa..697fa11a573 100644 --- a/packages/protocol/contracts/libs/LibBlockHeader.sol +++ b/packages/protocol/contracts/libs/LibBlockHeader.sol @@ -29,7 +29,7 @@ struct BlockHeader { } library LibBlockHeader { - bytes32 private constant EMPTY_OMMERS_HASH = + bytes32 public constant EMPTY_OMMERS_HASH = 0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347; function hashBlockHeader( @@ -81,17 +81,4 @@ library LibBlockHeader { list[16] = LibRLPWriter.writeHash(header.withdrawalsRoot); } } - - function isPartiallyValidForTaiko( - uint256 blockMaxGasLimit, - BlockHeader calldata header - ) internal pure returns (bool) { - return - header.parentHash != 0 && - header.ommersHash == EMPTY_OMMERS_HASH && - header.gasLimit <= blockMaxGasLimit && - header.extraData.length <= 32 && - header.difficulty == 0 && - header.nonce == 0; - } } diff --git a/packages/protocol/contracts/libs/LibInvalidTxList.sol b/packages/protocol/contracts/libs/LibInvalidTxList.sol deleted file mode 100644 index 3ba9aa1e9c3..00000000000 --- a/packages/protocol/contracts/libs/LibInvalidTxList.sol +++ /dev/null @@ -1,106 +0,0 @@ -// SPDX-License-Identifier: MIT -// _____ _ _ _ _ -// |_ _|_ _(_) |_____ | | __ _| |__ ___ -// | |/ _` | | / / _ \ | |__/ _` | '_ (_-< -// |_|\__,_|_|_\_\___/ |____\__,_|_.__/__/ - -pragma solidity ^0.8.18; - -import {TaikoData} from "../L1/TaikoData.sol"; -import {LibTxDecoder} from "../libs/LibTxDecoder.sol"; -import {LibTxUtils} from "../libs/LibTxUtils.sol"; -import {LibRLPReader} from "../thirdparty/LibRLPReader.sol"; -import {LibRLPWriter} from "../thirdparty/LibRLPWriter.sol"; - -/** - * A library to invalidate a txList using the following rules: - * - * A txList is valid if and only if: - * 1. The txList's length is no more than `maxBytesPerTxList`. - * 2. The txList is well-formed RLP, with no additional trailing bytes. - * 3. The total number of transactions is no more than - * `maxTransactionsPerBlock`. - * 4. The sum of all transaction gas limit is no more than - * `blockMaxGasLimit`. - * - * A transaction is valid if and only if: - * 1. The transaction is well-formed RLP, with no additional trailing bytes - * (rule #1 in Ethereum yellow paper). - * 2. The transaction's signature is valid (rule #2 in Ethereum yellow paper). - * 3. The transaction's the gas limit is no smaller than the intrinsic gas - * `minTxGasLimit` (rule #5 in Ethereum yellow paper). - * - * @title LibInvalidTxList - */ -library LibInvalidTxList { - // NOTE: If the order of this enum changes, then some test cases that using - // this enum in generate_genesis.test.ts may also needs to be - // modified accordingly. - error ERR_PARAMS_NOT_DEFAULTS(); - error ERR_INVALID_TX_IDX(); - error ERR_INVALID_HINT(); - error ERR_VERIFICAITON_FAILURE(); - - enum Hint { - NONE, - TX_INVALID_SIG, - TX_GAS_LIMIT_TOO_SMALL - } - - function verifyTxListInvalid( - TaikoData.Config memory config, - bytes calldata encoded, - Hint hint, - uint256 txIdx - ) internal pure { - if (encoded.length > config.maxBytesPerTxList) { - _checkParams(hint, txIdx); - return; - } - - try LibTxDecoder.decodeTxList(config.chainId, encoded) returns ( - LibTxDecoder.TxList memory txList - ) { - if (txList.items.length > config.maxTransactionsPerBlock) { - _checkParams(hint, txIdx); - return; - } - - if (LibTxDecoder.sumGasLimit(txList) > config.blockMaxGasLimit) { - _checkParams(hint, txIdx); - return; - } - - if (txIdx >= txList.items.length) { - revert ERR_INVALID_TX_IDX(); - } - - LibTxDecoder.Tx memory _tx = txList.items[txIdx]; - - if (hint == Hint.TX_INVALID_SIG) { - if ( - LibTxUtils.recoverSender(config.chainId, _tx) != address(0) - ) { - revert ERR_INVALID_HINT(); - } - return; - } - - if (hint == Hint.TX_GAS_LIMIT_TOO_SMALL) { - if (_tx.gasLimit >= config.minTxGasLimit) { - revert ERR_INVALID_HINT(); - } - return; - } - - revert ERR_VERIFICAITON_FAILURE(); - } catch (bytes memory) { - _checkParams(hint, txIdx); - } - } - - // Checks hint and txIdx both have 0 values. - function _checkParams(Hint hint, uint256 txIdx) private pure { - if (hint != Hint.NONE || txIdx != 0) revert ERR_PARAMS_NOT_DEFAULTS(); - } -} diff --git a/packages/protocol/contracts/libs/LibMath.sol b/packages/protocol/contracts/libs/LibMath.sol index da96e245c53..e6f20e92d95 100644 --- a/packages/protocol/contracts/libs/LibMath.sol +++ b/packages/protocol/contracts/libs/LibMath.sol @@ -30,39 +30,4 @@ library LibMath { function max(uint256 a, uint256 b) internal pure returns (uint256) { return a > b ? a : b; } - - /** - * @notice Returns the ceil value. - * @param a The numerator. - * @param b The denominator. - * @return c The ceil value of (a/b). - */ - function divceil(uint256 a, uint256 b) internal pure returns (uint256 c) { - c = a / b; - if (c * b < a) { - c += 1; - } - } - - /** - * @notice Returns the square root of a given uint256. - * This method is taken from: - * https://github.com/Uniswap/v2-core/blob/v1.0.1/contracts/libraries/Math.sol. - * It is based on the Babylonian method: - * https://en.wikipedia.org/wiki/Methods_of_computing_square_roots#Babylonian_method). - * @param y The given number. - * @return z The square root of y. - */ - function sqrt(uint256 y) internal pure returns (uint256 z) { - if (y > 3) { - z = y; - uint256 x = y / 2 + 1; - while (x < z) { - z = x; - x = (y / x + x) / 2; - } - } else if (y != 0) { - z = 1; - } - } } diff --git a/packages/protocol/contracts/libs/LibReceiptDecoder.sol b/packages/protocol/contracts/libs/LibReceiptDecoder.sol deleted file mode 100644 index ea564d6d3a6..00000000000 --- a/packages/protocol/contracts/libs/LibReceiptDecoder.sol +++ /dev/null @@ -1,83 +0,0 @@ -// SPDX-License-Identifier: MIT -// _____ _ _ _ _ -// |_ _|_ _(_) |_____ | | __ _| |__ ___ -// | |/ _` | | / / _ \ | |__/ _` | '_ (_-< -// |_|\__,_|_|_\_\___/ |____\__,_|_.__/__/ - -pragma solidity ^0.8.18; - -import {LibBytesUtils} from "../thirdparty/LibBytesUtils.sol"; -import {LibRLPReader} from "../thirdparty/LibRLPReader.sol"; - -library LibReceiptDecoder { - struct Receipt { - uint64 status; - uint64 cumulativeGasUsed; - bytes32[8] logsBloom; - Log[] logs; - } - - struct Log { - address contractAddress; - bytes32[] topics; - bytes data; - } - - function decodeReceipt( - bytes calldata encoded - ) public pure returns (Receipt memory receipt) { - // Non-legacy transaction receipts should first remove the type prefix. - LibRLPReader.RLPItem[] memory rlpItems = LibRLPReader.readList( - encoded[0] >= 0x0 && encoded[0] <= 0x7f - ? LibBytesUtils.slice(encoded, 1) - : encoded - ); - - require(rlpItems.length == 4, "invalid items length"); - - receipt.status = uint64(LibRLPReader.readUint256(rlpItems[0])); - receipt.cumulativeGasUsed = uint64( - LibRLPReader.readUint256(rlpItems[1]) - ); - receipt.logsBloom = decodeLogsBloom(rlpItems[2]); - receipt.logs = decodeLogs(LibRLPReader.readList(rlpItems[3])); - } - - function decodeLogsBloom( - LibRLPReader.RLPItem memory logsBloomRlp - ) internal pure returns (bytes32[8] memory logsBloom) { - bytes memory bloomBytes = LibRLPReader.readBytes(logsBloomRlp); - require(bloomBytes.length == 256, "invalid logs bloom"); - - return abi.decode(bloomBytes, (bytes32[8])); - } - - function decodeLogs( - LibRLPReader.RLPItem[] memory logsRlp - ) internal pure returns (Log[] memory) { - Log[] memory logs = new Log[](logsRlp.length); - - for (uint256 i; i < logsRlp.length; ++i) { - LibRLPReader.RLPItem[] memory rlpItems = LibRLPReader.readList( - logsRlp[i] - ); - logs[i].contractAddress = LibRLPReader.readAddress(rlpItems[0]); - logs[i].topics = decodeTopics(LibRLPReader.readList(rlpItems[1])); - logs[i].data = LibRLPReader.readBytes(rlpItems[2]); - } - - return logs; - } - - function decodeTopics( - LibRLPReader.RLPItem[] memory topicsRlp - ) internal pure returns (bytes32[] memory) { - bytes32[] memory topics = new bytes32[](topicsRlp.length); - - for (uint256 i; i < topicsRlp.length; ++i) { - topics[i] = LibRLPReader.readBytes32(topicsRlp[i]); - } - - return topics; - } -} diff --git a/packages/protocol/contracts/libs/LibSharedConfig.sol b/packages/protocol/contracts/libs/LibSharedConfig.sol deleted file mode 100644 index 53e028a611b..00000000000 --- a/packages/protocol/contracts/libs/LibSharedConfig.sol +++ /dev/null @@ -1,44 +0,0 @@ -// SPDX-License-Identifier: MIT -// _____ _ _ _ _ -// |_ _|_ _(_) |_____ | | __ _| |__ ___ -// | |/ _` | | / / _ \ | |__/ _` | '_ (_-< -// |_|\__,_|_|_\_\___/ |____\__,_|_.__/__/ - -pragma solidity ^0.8.18; - -import {TaikoData} from "../L1/TaikoData.sol"; - -library LibSharedConfig { - /// Returns shared configs for both TaikoL1 and TaikoL2 for production. - function getConfig() internal pure returns (TaikoData.Config memory) { - return - TaikoData.Config({ - chainId: 167, - maxNumBlocks: 2049, // owner:daniel - blockHashHistory: 40, // owner:daniel - maxVerificationsPerTx: 10, //owner:david. Each time one more block is verified, there will be ~20k more gas cost. - commitConfirmations: 0, // owner:daniel - blockMaxGasLimit: 6000000, // owner:david. Set it to 6M, since its the upper limit of the Alpha-2 testnet's circuits. - maxTransactionsPerBlock: 79, // owner:david. Set it to 79 (+1 TaikoL2.anchor transaction = 80), and 80 is the upper limit of the Alpha-2 testnet's circuits. - maxBytesPerTxList: 120000, // owner:david. Set it to 120KB, since 128KB is the upper size limit of a geth transaction, so using 120KB for the proposed transactions list calldata, 8K for the remaining tx fields. - minTxGasLimit: 21000, // owner:david - anchorTxGasLimit: 250000, // owner:david - slotSmoothingFactor: 946649, // owner:daniel - rewardBurnBips: 100, // owner:daniel. 100 basis points or 1% - proposerDepositPctg: 25, // owner:daniel - 25% - // Moving average factors - feeBaseMAF: 1024, - blockTimeMAF: 1024, - proofTimeMAF: 1024, - rewardMultiplierPctg: 400, // owner:daniel - 400% - feeGracePeriodPctg: 200, // owner:daniel - 200% - feeMaxPeriodPctg: 400, // owner:daniel - 400% - blockTimeCap: 60 seconds, // owner:daniel - proofTimeCap: 30 minutes, // owner:daniel - bootstrapDiscountHalvingPeriod: 1 seconds, // owner:daniel - enableTokenomics: true, - enablePublicInputsCheck: true, - enableAnchorValidation: true - }); - } -} diff --git a/packages/protocol/contracts/libs/LibTrieProof.sol b/packages/protocol/contracts/libs/LibTrieProof.sol index 44c46ea5cd4..2fb19fd254a 100644 --- a/packages/protocol/contracts/libs/LibTrieProof.sol +++ b/packages/protocol/contracts/libs/LibTrieProof.sol @@ -27,18 +27,38 @@ library LibTrieProof { *********************/ /** - * Verifies that the value of a slot in the storage tree of `addr` - * is `value`. + * Verifies that the value of a slot in the storage of an account is value. * - * @param stateRoot The merkle root of state tree. - * @param addr The contract address. * @param slot The slot in the contract. * @param value The value to be verified. - * @param mkproof The proof obtained by encoding state proof and storage - * proof. + * @param storageProof The proof obtained by encoding storage proof. + * @param storageRoot The synced storage root for the given block. * @return verified The verification result. */ function verify( + bytes32 slot, + bytes32 value, + bytes calldata storageProof, + bytes32 storageRoot + ) public pure returns (bool verified) { + verified = LibSecureMerkleTrie.verifyInclusionProof( + abi.encodePacked(slot), + LibRLPWriter.writeBytes32(value), + storageProof, + storageRoot + ); + } + + /** + * Verifies that the value of a slot in the storage of an account is value. + * + * @param stateRoot The merkle root of state tree.. + * @param slot The slot in the contract. + * @param value The value to be verified. + * @param mkproof The proof obtained by encoding storage proof. + * @return verified The verification result. + */ + function verifyWithAccountProof( bytes32 stateRoot, address addr, bytes32 slot, diff --git a/packages/protocol/contracts/libs/LibTxDecoder.sol b/packages/protocol/contracts/libs/LibTxDecoder.sol deleted file mode 100644 index a7660611c82..00000000000 --- a/packages/protocol/contracts/libs/LibTxDecoder.sol +++ /dev/null @@ -1,237 +0,0 @@ -// SPDX-License-Identifier: MIT -// _____ _ _ _ _ -// |_ _|_ _(_) |_____ | | __ _| |__ ___ -// | |/ _` | | / / _ \ | |__/ _` | '_ (_-< -// |_|\__,_|_|_\_\___/ |____\__,_|_.__/__/ - -pragma solidity ^0.8.18; - -import {LibBytesUtils} from "../thirdparty/LibBytesUtils.sol"; -import {LibRLPReader} from "../thirdparty/LibRLPReader.sol"; - -library LibTxDecoder { - struct TransactionLegacy { - uint256 nonce; - uint256 gasPrice; - uint256 gasLimit; - address destination; - uint256 amount; - bytes data; - uint8 v; - uint256 r; - uint256 s; - } - - struct Transaction2930 { - uint256 chainId; - uint256 nonce; - uint256 gasPrice; - uint256 gasLimit; - address destination; - uint256 amount; - bytes data; - AccessItem[] accessList; - uint8 signatureYParity; - uint256 signatureR; - uint256 signatureS; - } - - struct Transaction1559 { - uint256 chainId; - uint256 nonce; - uint256 maxPriorityFeePerGas; - uint256 maxFeePerGas; - uint256 gasLimit; - address destination; - uint256 amount; - bytes data; - AccessItem[] accessList; - uint8 signatureYParity; - uint256 signatureR; - uint256 signatureS; - } - - struct AccessItem { - address addr; - bytes32[] slots; - } - - struct Tx { - uint8 txType; - address destination; - bytes data; - uint256 gasLimit; - uint8 v; - uint256 r; - uint256 s; - bytes txData; - } - - struct TxList { - Tx[] items; - } - - function decodeTxList( - uint256 chainId, - bytes calldata encoded - ) public pure returns (TxList memory txList) { - if (encoded.length == 0) { - return txList; - } - LibRLPReader.RLPItem[] memory txs = LibRLPReader.readList(encoded); - - Tx[] memory _txList = new Tx[](txs.length); - for (uint256 i; i < txs.length; ++i) { - _txList[i] = decodeTx(chainId, LibRLPReader.readBytes(txs[i])); - } - - txList = TxList(_txList); - } - - function decodeTx( - uint256 chainId, - bytes memory txBytes - ) public pure returns (Tx memory _tx) { - uint8 txType; - assembly { - txType := byte(0, mload(add(txBytes, 32))) - } - - _tx.txData = txBytes; - - // @see https://eips.ethereum.org/EIPS/eip-2718#backwards-compatibility - if (txType >= 0xc0 && txType <= 0xfe) { - // Legacy tx: - _tx.txType = 0; - LibRLPReader.RLPItem[] memory txBody = LibRLPReader.readList( - txBytes - ); - TransactionLegacy memory txLegacy = decodeLegacyTx(chainId, txBody); - _tx.gasLimit = txLegacy.gasLimit; - _tx.destination = txLegacy.destination; - _tx.v = txLegacy.v; - _tx.r = txLegacy.r; - _tx.s = txLegacy.s; - _tx.data = txLegacy.data; - } else if (txType <= 0x7f) { - _tx.txType = txType; - LibRLPReader.RLPItem[] memory txBody = LibRLPReader.readList( - LibBytesUtils.slice(txBytes, 1) - ); - - if (txType == 1) { - Transaction2930 memory tx2930 = decodeTx2930(txBody); - _tx.gasLimit = tx2930.gasLimit; - _tx.destination = tx2930.destination; - _tx.v = tx2930.signatureYParity; - _tx.r = tx2930.signatureR; - _tx.s = tx2930.signatureS; - _tx.data = tx2930.data; - } else if (_tx.txType == 2) { - Transaction1559 memory tx1559 = decodeTx1559(txBody); - _tx.gasLimit = tx1559.gasLimit; - _tx.destination = tx1559.destination; - _tx.v = tx1559.signatureYParity; - _tx.r = tx1559.signatureR; - _tx.s = tx1559.signatureS; - _tx.data = tx1559.data; - } else { - revert("invalid txType"); - } - } else { - revert("invalid prefix"); - } - } - - function hashTxList( - bytes calldata encoded - ) internal pure returns (bytes32) { - return keccak256(encoded); - } - - function decodeLegacyTx( - uint256 chainId, - LibRLPReader.RLPItem[] memory body - ) internal pure returns (TransactionLegacy memory txLegacy) { - require(body.length == 9, "invalid items length"); - - txLegacy.nonce = LibRLPReader.readUint256(body[0]); - txLegacy.gasPrice = LibRLPReader.readUint256(body[1]); - txLegacy.gasLimit = LibRLPReader.readUint256(body[2]); - txLegacy.destination = LibRLPReader.readAddress(body[3]); - txLegacy.amount = LibRLPReader.readUint256(body[4]); - txLegacy.data = LibRLPReader.readBytes(body[5]); - // EIP-155 is enabled on L2 - txLegacy.v = uint8( - LibRLPReader.readUint256(body[6]) - chainId * 2 + 35 - ); - txLegacy.r = LibRLPReader.readUint256(body[7]); - txLegacy.s = LibRLPReader.readUint256(body[8]); - } - - function decodeTx2930( - LibRLPReader.RLPItem[] memory body - ) internal pure returns (Transaction2930 memory tx2930) { - require(body.length == 11, "invalid items length"); - - tx2930.chainId = LibRLPReader.readUint256(body[0]); - tx2930.nonce = LibRLPReader.readUint256(body[1]); - tx2930.gasPrice = LibRLPReader.readUint256(body[2]); - tx2930.gasLimit = LibRLPReader.readUint256(body[3]); - tx2930.destination = LibRLPReader.readAddress(body[4]); - tx2930.amount = LibRLPReader.readUint256(body[5]); - tx2930.data = LibRLPReader.readBytes(body[6]); - tx2930.accessList = decodeAccessList(LibRLPReader.readList(body[7])); - tx2930.signatureYParity = uint8(LibRLPReader.readUint256(body[8])); - tx2930.signatureR = LibRLPReader.readUint256(body[9]); - tx2930.signatureS = LibRLPReader.readUint256(body[10]); - } - - function decodeTx1559( - LibRLPReader.RLPItem[] memory body - ) internal pure returns (Transaction1559 memory tx1559) { - require(body.length == 12, "invalid items length"); - - tx1559.chainId = LibRLPReader.readUint256(body[0]); - tx1559.nonce = LibRLPReader.readUint256(body[1]); - tx1559.maxPriorityFeePerGas = LibRLPReader.readUint256(body[2]); - tx1559.maxFeePerGas = LibRLPReader.readUint256(body[3]); - tx1559.gasLimit = LibRLPReader.readUint256(body[4]); - tx1559.destination = LibRLPReader.readAddress(body[5]); - tx1559.amount = LibRLPReader.readUint256(body[6]); - tx1559.data = LibRLPReader.readBytes(body[7]); - tx1559.accessList = decodeAccessList(LibRLPReader.readList(body[8])); - tx1559.signatureYParity = uint8(LibRLPReader.readUint256(body[9])); - tx1559.signatureR = LibRLPReader.readUint256(body[10]); - tx1559.signatureS = LibRLPReader.readUint256(body[11]); - } - - function decodeAccessList( - LibRLPReader.RLPItem[] memory accessListRLP - ) internal pure returns (AccessItem[] memory accessList) { - accessList = new AccessItem[](accessListRLP.length); - for (uint256 i; i < accessListRLP.length; ++i) { - LibRLPReader.RLPItem[] memory items = LibRLPReader.readList( - accessListRLP[i] - ); - address addr = LibRLPReader.readAddress(items[0]); - LibRLPReader.RLPItem[] memory slotListRLP = LibRLPReader.readList( - items[1] - ); - bytes32[] memory slots = new bytes32[](slotListRLP.length); - for (uint256 j; j < slotListRLP.length; ++j) { - slots[j] = LibRLPReader.readBytes32(slotListRLP[j]); - } - accessList[i] = AccessItem(addr, slots); - } - } - - function sumGasLimit( - TxList memory txList - ) internal pure returns (uint256 sum) { - Tx[] memory items = txList.items; - for (uint256 i; i < items.length; ++i) { - sum += items[i].gasLimit; - } - } -} diff --git a/packages/protocol/contracts/libs/LibTxUtils.sol b/packages/protocol/contracts/libs/LibTxUtils.sol deleted file mode 100644 index b99706f92f4..00000000000 --- a/packages/protocol/contracts/libs/LibTxUtils.sol +++ /dev/null @@ -1,104 +0,0 @@ -// SPDX-License-Identifier: MIT -// _____ _ _ _ _ -// |_ _|_ _(_) |_____ | | __ _| |__ ___ -// | |/ _` | | / / _ \ | |__/ _` | '_ (_-< -// |_|\__,_|_|_\_\___/ |____\__,_|_.__/__/ - -pragma solidity ^0.8.18; - -import {ECDSA} from "@openzeppelin/contracts/utils/cryptography/ECDSA.sol"; - -import {LibTxDecoder} from "../libs/LibTxDecoder.sol"; -import {LibBytesUtils} from "../thirdparty/LibBytesUtils.sol"; -import {LibRLPReader} from "../thirdparty/LibRLPReader.sol"; -import {LibRLPWriter} from "../thirdparty/LibRLPWriter.sol"; - -library LibTxUtils { - function hashUnsignedTx( - uint256 chainId, - LibTxDecoder.Tx memory transaction - ) - internal - pure - returns ( - // transaction hash (without singature values) - bytes32 hash - ) - { - LibRLPReader.RLPItem[] memory txRLPItems; - if (transaction.txType == 0) { - // Legacy transactions do not have the EIP-2718 type prefix. - txRLPItems = LibRLPReader.readList(transaction.txData); - } else { - txRLPItems = LibRLPReader.readList( - LibBytesUtils.slice(transaction.txData, 1) - ); - } - - if (transaction.txType == 0) { - // Legacy transactions - require(txRLPItems.length == 9, "invalid rlp items"); - } else if (transaction.txType == 1) { - // EIP-2930 transactions - require(txRLPItems.length == 11, "invalid rlp items"); - } else if (transaction.txType == 2) { - // EIP-1559 transactions - require(txRLPItems.length == 12, "invalid rlp items"); - } else { - revert("invalid txType"); - } - - // Signature values are always last three RLP items for all kinds of - // transactions. - bytes[] memory list = new bytes[]( - transaction.txType == 0 ? txRLPItems.length : txRLPItems.length - 3 - ); - - for (uint256 i; i < list.length; ++i) { - // For Non-legacy transactions, accessList is always the - // fourth to last item. - if (transaction.txType != 0 && i == list.length - 1) { - list[i] = LibRLPReader.readRawBytes(txRLPItems[i]); - continue; - } - - list[i] = LibRLPWriter.writeBytes( - LibRLPReader.readBytes(txRLPItems[i]) - ); - - // For legacy transactions, there are three more RLP items to - // encode defined in EIP-155. - if (transaction.txType == 0 && i == list.length - 4) { - list[i + 1] = LibRLPWriter.writeUint(chainId); - list[i + 2] = LibRLPWriter.writeUint64(0); - list[i + 3] = LibRLPWriter.writeUint64(0); - break; - } - } - - bytes memory unsignedTxRlp = LibRLPWriter.writeList(list); - - // Add the EIP-2718 type prefix for non-legacy transactions. - if (transaction.txType != 0) { - unsignedTxRlp = bytes.concat( - bytes1(transaction.txType), - unsignedTxRlp - ); - } - - hash = keccak256(unsignedTxRlp); - } - - function recoverSender( - uint256 chainId, - LibTxDecoder.Tx memory transaction - ) internal pure returns (address) { - return - ecrecover( - hashUnsignedTx(chainId, transaction), - transaction.v + 27, - bytes32(transaction.r), - bytes32(transaction.s) - ); - } -} diff --git a/packages/protocol/contracts/libs/LibZKP.sol b/packages/protocol/contracts/libs/LibZKP.sol deleted file mode 100644 index c035613dc52..00000000000 --- a/packages/protocol/contracts/libs/LibZKP.sol +++ /dev/null @@ -1,31 +0,0 @@ -// SPDX-License-Identifier: MIT -// _____ _ _ _ _ -// |_ _|_ _(_) |_____ | | __ _| |__ ___ -// | |/ _` | | / / _ \ | |__/ _` | '_ (_-< -// |_|\__,_|_|_\_\___/ |____\__,_|_.__/__/ - -pragma solidity ^0.8.18; - -library LibZKP { - /********************* - * Public Functions * - *********************/ - - function verify( - address plonkVerifier, - bytes calldata zkproof, - bytes32 instance - ) internal view returns (bool verified) { - (bool isCallSuccess, bytes memory response) = plonkVerifier.staticcall( - bytes.concat( - bytes16(0), - bytes16(instance), // left 16 bytes of the given instance - bytes16(0), - bytes16(uint128(uint256(instance))), // right 16 bytes of the given instance - zkproof - ) - ); - - return isCallSuccess && bytes32(response) == keccak256("taiko"); - } -} diff --git a/packages/protocol/contracts/signal/SignalService.sol b/packages/protocol/contracts/signal/SignalService.sol index d5b62b9581b..6815ba2065b 100644 --- a/packages/protocol/contracts/signal/SignalService.sol +++ b/packages/protocol/contracts/signal/SignalService.sol @@ -7,16 +7,13 @@ pragma solidity ^0.8.18; import {EssentialContract} from "../common/EssentialContract.sol"; -import {IHeaderSync} from "../common/IHeaderSync.sol"; -import {LibBlockHeader, BlockHeader} from "../libs/LibBlockHeader.sol"; -import {LibTrieProof} from "../libs/LibTrieProof.sol"; import {ISignalService} from "./ISignalService.sol"; +import {IXchainSync} from "../common/IXchainSync.sol"; +import {LibTrieProof} from "../libs/LibTrieProof.sol"; contract SignalService is ISignalService, EssentialContract { - using LibBlockHeader for BlockHeader; - struct SignalProof { - BlockHeader header; + uint256 height; bytes proof; } @@ -66,32 +63,22 @@ contract SignalService is ISignalService, EssentialContract { bytes32 signal, bytes calldata proof ) public view returns (bool) { - if (srcChainId == block.chainid) { - revert B_WRONG_CHAIN_ID(); - } - - if (app == address(0)) { - revert B_NULL_APP_ADDR(); - } - - if (signal == 0) { - revert B_ZERO_SIGNAL(); - } + if (srcChainId == block.chainid) revert B_WRONG_CHAIN_ID(); + if (app == address(0)) revert B_NULL_APP_ADDR(); + if (signal == 0) revert B_ZERO_SIGNAL(); SignalProof memory sp = abi.decode(proof, (SignalProof)); + // Resolve the TaikoL1 or TaikoL2 contract if on Ethereum or Taiko. - bytes32 syncedHeaderHash = IHeaderSync(resolve("taiko", false)) - .getSyncedHeader(sp.header.height); + bytes32 syncedSignalRoot = IXchainSync(resolve("taiko", false)) + .getXchainSignalRoot(sp.height); return - syncedHeaderHash != 0 && - syncedHeaderHash == sp.header.hashBlockHeader() && LibTrieProof.verify({ - stateRoot: sp.header.stateRoot, - addr: resolve(srcChainId, "signal_service", false), slot: getSignalSlot(app, signal), value: bytes32(uint256(1)), - mkproof: sp.proof + storageProof: sp.proof, + storageRoot: syncedSignalRoot }); } @@ -104,6 +91,20 @@ contract SignalService is ISignalService, EssentialContract { address app, bytes32 signal ) public pure returns (bytes32 signalSlot) { - signalSlot = keccak256(abi.encodePacked(app, signal)); + // Equivilance to `keccak256(abi.encodePacked(app, signal))` + assembly { + // Load the free memory pointer and allocate memory for the concatenated arguments + let ptr := mload(0x40) + + // Store the app address and signal bytes32 value in the allocated memory + mstore(ptr, app) + mstore(add(ptr, 32), signal) + + // Calculate the hash of the concatenated arguments using keccak256 + signalSlot := keccak256(add(ptr, 12), 52) + + // Update free memory pointer + mstore(0x40, add(ptr, 64)) + } } } diff --git a/packages/protocol/contracts/test/L1/TestTaikoL1.sol b/packages/protocol/contracts/test/L1/TestTaikoL1.sol index 8ec2f5d17f4..e4e40490fe3 100644 --- a/packages/protocol/contracts/test/L1/TestTaikoL1.sol +++ b/packages/protocol/contracts/test/L1/TestTaikoL1.sol @@ -6,11 +6,10 @@ pragma solidity ^0.8.18; -import {IProofVerifier} from "../../L1/ProofVerifier.sol"; import {TaikoL1} from "../../L1/TaikoL1.sol"; import {TaikoData} from "../../L1/TaikoData.sol"; -contract TestTaikoL1 is TaikoL1, IProofVerifier { +contract TestTaikoL1 is TaikoL1 { function getConfig() public pure @@ -19,50 +18,39 @@ contract TestTaikoL1 is TaikoL1, IProofVerifier { { config.chainId = 167; // up to 2048 pending blocks - config.maxNumBlocks = 4; - config.blockHashHistory = 3; - // This number is calculated from maxNumBlocks to make + config.maxNumProposedBlocks = 4; + config.maxNumVerifiedBlocks = 3; + // This number is calculated from maxNumProposedBlocks to make // the 'the maximum value of the multiplier' close to 20.0 config.maxVerificationsPerTx = 0; - config.commitConfirmations = 1; - config.blockMaxGasLimit = 30000000; // TODO - config.maxTransactionsPerBlock = 20; // TODO - config.maxBytesPerTxList = 10240; // TODO - config.minTxGasLimit = 21000; // TODO - config.anchorTxGasLimit = 250000; + config.blockMaxGasLimit = 30000000; + config.maxTransactionsPerBlock = 20; + config.maxBytesPerTxList = 120000; + config.minTxGasLimit = 21000; config.slotSmoothingFactor = 590000; + config.anchorTxGasLimit = 180000; config.rewardBurnBips = 100; // 100 basis points or 1% config.proposerDepositPctg = 25; // 25% - // Moving average factors - config.feeBaseMAF = 1024; - config.blockTimeMAF = 64; - config.proofTimeMAF = 64; - - config.rewardMultiplierPctg = 400; // 400% - config.feeGracePeriodPctg = 125; // 125% - config.feeMaxPeriodPctg = 375; // 375% - config.blockTimeCap = 48 seconds; - config.proofTimeCap = 4 seconds; config.bootstrapDiscountHalvingPeriod = 1 seconds; config.enableTokenomics = false; - config.enablePublicInputsCheck = false; - } + config.skipZKPVerification = true; + config.feeBaseMAF = 1024; - function verifyZKP( - string memory /*verifierId*/, - bytes calldata /*zkproof*/, - bytes32 /*instance*/ - ) public pure override returns (bool) { - return true; - } + config.proposingConfig = TaikoData.FeeConfig({ + avgTimeMAF: 64, + avgTimeCap: 48 seconds * 1000, + gracePeriodPctg: 125, + maxPeriodPctg: 375, + multiplerPctg: 300 + }); - function verifyMKP( - bytes memory /*key*/, - bytes memory /*value*/, - bytes memory /*proof*/, - bytes32 /*root*/ - ) public pure override returns (bool) { - return true; + config.provingConfig = TaikoData.FeeConfig({ + avgTimeMAF: 64, + avgTimeCap: 4 seconds * 1000, + gracePeriodPctg: 125, + maxPeriodPctg: 375, + multiplerPctg: 300 + }); } } diff --git a/packages/protocol/contracts/test/L1/TestTaikoL1EnableTokenomics.sol b/packages/protocol/contracts/test/L1/TestTaikoL1EnableTokenomics.sol index 6e5f561eb7c..521fca91f06 100644 --- a/packages/protocol/contracts/test/L1/TestTaikoL1EnableTokenomics.sol +++ b/packages/protocol/contracts/test/L1/TestTaikoL1EnableTokenomics.sol @@ -6,11 +6,10 @@ pragma solidity ^0.8.18; -import {IProofVerifier} from "../../L1/ProofVerifier.sol"; import {TaikoL1} from "../../L1/TaikoL1.sol"; import {TaikoData} from "../../L1/TaikoData.sol"; -contract TestTaikoL1EnableTokenomics is TaikoL1, IProofVerifier { +contract TestTaikoL1EnableTokenomics is TaikoL1 { function getConfig() public pure @@ -19,51 +18,41 @@ contract TestTaikoL1EnableTokenomics is TaikoL1, IProofVerifier { { config.chainId = 167; // up to 2048 pending blocks - config.maxNumBlocks = 6; - config.blockHashHistory = 10; - // This number is calculated from maxNumBlocks to make + config.maxNumProposedBlocks = 6; + config.maxNumVerifiedBlocks = 10; + // This number is calculated from maxNumProposedBlocks to make // the 'the maximum value of the multiplier' close to 20.0 config.maxVerificationsPerTx = 0; // dont verify blocks automatically - config.commitConfirmations = 1; - config.blockMaxGasLimit = 30000000; // TODO - config.maxTransactionsPerBlock = 20; // TODO - config.maxBytesPerTxList = 10240; // TODO - config.minTxGasLimit = 21000; // TODO - config.anchorTxGasLimit = 250000; + config.blockMaxGasLimit = 30000000; + config.maxTransactionsPerBlock = 20; + config.maxBytesPerTxList = 120000; + config.minTxGasLimit = 21000; config.slotSmoothingFactor = 590000; + config.anchorTxGasLimit = 180000; config.rewardBurnBips = 100; // 100 basis points or 1% config.proposerDepositPctg = 25; // 25% // Moving average factors config.feeBaseMAF = 1024; - config.blockTimeMAF = 64; - config.proofTimeMAF = 64; - config.rewardMultiplierPctg = 400; // 400% - config.feeGracePeriodPctg = 125; // 125% - config.feeMaxPeriodPctg = 375; // 375% - config.blockTimeCap = 48 seconds; - config.proofTimeCap = 5 seconds; config.bootstrapDiscountHalvingPeriod = 1 seconds; config.enableTokenomics = true; - config.enablePublicInputsCheck = false; - config.enableAnchorValidation = false; - } + config.skipZKPVerification = true; - function verifyZKP( - string memory /*verifierId*/, - bytes calldata /*zkproof*/, - bytes32 /*instance*/ - ) public pure override returns (bool) { - return true; - } + config.proposingConfig = TaikoData.FeeConfig({ + avgTimeMAF: 64, + avgTimeCap: 48 seconds * 1000, + gracePeriodPctg: 125, + maxPeriodPctg: 375, + multiplerPctg: 300 + }); - function verifyMKP( - bytes memory /*key*/, - bytes memory /*value*/, - bytes memory /*proof*/, - bytes32 /*root*/ - ) public pure override returns (bool) { - return true; + config.provingConfig = TaikoData.FeeConfig({ + avgTimeMAF: 64, + avgTimeCap: 5 seconds * 1000, + gracePeriodPctg: 125, + maxPeriodPctg: 375, + multiplerPctg: 300 + }); } } diff --git a/packages/protocol/contracts/test/L1/TestTaikoL2.sol b/packages/protocol/contracts/test/L1/TestTaikoL2.sol deleted file mode 100644 index 0dc2684e012..00000000000 --- a/packages/protocol/contracts/test/L1/TestTaikoL2.sol +++ /dev/null @@ -1,53 +0,0 @@ -// SPDX-License-Identifier: MIT -// _____ _ _ _ _ -// |_ _|_ _(_) |_____ | | __ _| |__ ___ -// | |/ _` | | / / _ \ | |__/ _` | '_ (_-< -// |_|\__,_|_|_\_\___/ |____\__,_|_.__/__/ - -pragma solidity ^0.8.18; - -import {TaikoL2} from "../../L2/TaikoL2.sol"; -import {TaikoData} from "../../L1/TaikoData.sol"; - -contract TestTaikoL2 is TaikoL2 { - constructor(address _addressManager) TaikoL2(_addressManager) {} - - function getConfig() - public - pure - override - returns (TaikoData.Config memory config) - { - config.chainId = 167; - // up to 2048 pending blocks - config.maxNumBlocks = 4; - config.blockHashHistory = 3; - // This number is calculated from maxNumBlocks to make - // the 'the maximum value of the multiplier' close to 20.0 - config.maxVerificationsPerTx = 2; - config.commitConfirmations = 1; - config.blockMaxGasLimit = 30000000; // TODO - config.maxTransactionsPerBlock = 20; // TODO - config.maxBytesPerTxList = 10240; // TODO - config.minTxGasLimit = 21000; // TODO - config.anchorTxGasLimit = 250000; - config.slotSmoothingFactor = 590000; - config.rewardBurnBips = 100; // 100 basis points or 1% - config.proposerDepositPctg = 25; // 25% - - // Moving average factors - config.feeBaseMAF = 1024; - config.blockTimeMAF = 64; - config.proofTimeMAF = 64; - - config.rewardMultiplierPctg = 400; // 400% - config.feeGracePeriodPctg = 125; // 125% - config.feeMaxPeriodPctg = 375; // 375% - config.blockTimeCap = 48 seconds; - config.proofTimeCap = 60 minutes; - config.bootstrapDiscountHalvingPeriod = 1 seconds; - config.enableTokenomics = true; - config.enablePublicInputsCheck = false; - config.enableAnchorValidation = false; - } -} diff --git a/packages/protocol/contracts/test/L1/TestTaikoL2EnablePublicInputsCheck.sol b/packages/protocol/contracts/test/L1/TestTaikoL2EnablePublicInputsCheck.sol deleted file mode 100644 index 9856a7fe251..00000000000 --- a/packages/protocol/contracts/test/L1/TestTaikoL2EnablePublicInputsCheck.sol +++ /dev/null @@ -1,53 +0,0 @@ -// SPDX-License-Identifier: MIT -// _____ _ _ _ _ -// |_ _|_ _(_) |_____ | | __ _| |__ ___ -// | |/ _` | | / / _ \ | |__/ _` | '_ (_-< -// |_|\__,_|_|_\_\___/ |____\__,_|_.__/__/ - -pragma solidity ^0.8.18; - -import {TaikoL2} from "../../L2/TaikoL2.sol"; -import {TaikoData} from "../../L1/TaikoData.sol"; - -contract TestTaikoL2EnablePublicInputsCheck is TaikoL2 { - constructor(address _addressManager) TaikoL2(_addressManager) {} - - function getConfig() - public - pure - override - returns (TaikoData.Config memory config) - { - config.chainId = 167; - // up to 2048 pending blocks - config.maxNumBlocks = 4; - config.blockHashHistory = 3; - // This number is calculated from maxNumBlocks to make - // the 'the maximum value of the multiplier' close to 20.0 - config.maxVerificationsPerTx = 2; - config.commitConfirmations = 1; - config.blockMaxGasLimit = 30000000; // TODO - config.maxTransactionsPerBlock = 20; // TODO - config.maxBytesPerTxList = 10240; // TODO - config.minTxGasLimit = 21000; // TODO - config.anchorTxGasLimit = 250000; - config.slotSmoothingFactor = 590000; - config.rewardBurnBips = 100; // 100 basis points or 1% - config.proposerDepositPctg = 25; // 25% - - // Moving average factors - config.feeBaseMAF = 1024; - config.blockTimeMAF = 64; - config.proofTimeMAF = 64; - - config.rewardMultiplierPctg = 400; // 400% - config.feeGracePeriodPctg = 125; // 125% - config.feeMaxPeriodPctg = 375; // 375% - config.blockTimeCap = 48 seconds; - config.proofTimeCap = 60 minutes; - config.bootstrapDiscountHalvingPeriod = 1 seconds; - config.enableTokenomics = true; - config.enablePublicInputsCheck = true; - config.enableAnchorValidation = true; - } -} diff --git a/packages/protocol/contracts/test/bridge/TestHeaderSync.sol b/packages/protocol/contracts/test/bridge/TestHeaderSync.sol index 88c2c593f2b..22916ccf4d1 100644 --- a/packages/protocol/contracts/test/bridge/TestHeaderSync.sol +++ b/packages/protocol/contracts/test/bridge/TestHeaderSync.sol @@ -6,23 +6,27 @@ pragma solidity ^0.8.18; -import {IHeaderSync} from "../../common/IHeaderSync.sol"; +import {IXchainSync} from "../../common/IXchainSync.sol"; // TODO(roger): remove this file. If you need extra functionality in // the Bridge contract, create a TestBridge.sol contract instead. -contract TestHeaderSync is IHeaderSync { - bytes32 public headerHash; +contract TestXchainSync is IXchainSync { + bytes32 private _blockHash; + bytes32 private _signalRoot; - function setSyncedHeader(bytes32 header) external { - headerHash = header; + function setXchainBlockHeader(bytes32 blockHash) external { + _blockHash = blockHash; } - function getSyncedHeader(uint256 number) external view returns (bytes32) { - number; - return headerHash; + function setXchainSignalRoot(bytes32 signalRoot) external { + _signalRoot = signalRoot; } - function getLatestSyncedHeader() external view returns (bytes32) { - return headerHash; + function getXchainBlockHash(uint256) external view returns (bytes32) { + return _blockHash; + } + + function getXchainSignalRoot(uint256) external view returns (bytes32) { + return _signalRoot; } } diff --git a/packages/protocol/contracts/test/libs/TestLibAnchorSignature.sol b/packages/protocol/contracts/test/libs/TestLibAnchorSignature.sol deleted file mode 100644 index aeac784ebce..00000000000 --- a/packages/protocol/contracts/test/libs/TestLibAnchorSignature.sol +++ /dev/null @@ -1,34 +0,0 @@ -// SPDX-License-Identifier: MIT -// _____ _ _ _ _ -// |_ _|_ _(_) |_____ | | __ _| |__ ___ -// | |/ _` | | / / _ \ | |__/ _` | '_ (_-< -// |_|\__,_|_|_\_\___/ |____\__,_|_.__/__/ - -pragma solidity ^0.8.18; - -import {LibAnchorSignature} from "../../libs/LibAnchorSignature.sol"; - -library TestLibAnchorSignature { - function signTransaction( - bytes32 digest, - uint8 k - ) public view returns (uint8 v, uint256 r, uint256 s) { - return LibAnchorSignature.signTransaction(digest, k); - } - - function recover( - bytes32 hash, - uint8 v, - bytes32 r, - bytes32 s - ) public pure returns (address) { - return ecrecover(hash, v, r, s); - } - - function goldenTouchAddress() public pure returns (address, uint256) { - return ( - LibAnchorSignature.K_GOLDEN_TOUCH_ADDRESS, - LibAnchorSignature.K_GOLDEN_TOUCH_PRIVATEKEY - ); - } -} diff --git a/packages/protocol/contracts/test/libs/TestLibProving.sol b/packages/protocol/contracts/test/libs/TestLibProving.sol deleted file mode 100644 index b03c84b5712..00000000000 --- a/packages/protocol/contracts/test/libs/TestLibProving.sol +++ /dev/null @@ -1,386 +0,0 @@ -// SPDX-License-Identifier: MIT -// _____ _ _ _ _ -// |_ _|_ _(_) |_____ | | __ _| |__ ___ -// | |/ _` | | / / _ \ | |__/ _` | '_ (_-< -// |_|\__,_|_|_\_\___/ |____\__,_|_.__/__/ - -// This file is an exact copy of LibProving.sol -// except the implementation of the following flags are false: - -// FLAG_VALIDATE_ANCHOR_TX_SIGNATURE -// FLAG_CHECK_METADATA -// FLAG_VALIDATE_HEADER_FOR_METADATA - -// @dev we need to update this when we update LibProving.sol - -pragma solidity ^0.8.18; - -import {LibProving, IProofVerifier} from "../../L1/libs/LibProving.sol"; -import {AddressResolver} from "../../common/AddressResolver.sol"; -import {LibAnchorSignature} from "../../libs/LibAnchorSignature.sol"; -import {LibBlockHeader, BlockHeader} from "../../libs/LibBlockHeader.sol"; -import {LibReceiptDecoder} from "../../libs/LibReceiptDecoder.sol"; -import {LibTxDecoder} from "../../libs/LibTxDecoder.sol"; -import {LibTxUtils} from "../../libs/LibTxUtils.sol"; -import {LibBytesUtils} from "../../thirdparty/LibBytesUtils.sol"; -import {LibRLPWriter} from "../../thirdparty/LibRLPWriter.sol"; -import {LibUtils} from "../../L1/libs/LibUtils.sol"; -import {TaikoData} from "../../L1/TaikoData.sol"; - -library TestLibProving { - using LibBlockHeader for BlockHeader; - using LibUtils for TaikoData.BlockMetadata; - using LibUtils for TaikoData.State; - - bool private constant FLAG_VALIDATE_ANCHOR_TX_SIGNATURE = false; - bool private constant FLAG_CHECK_METADATA = false; - bool private constant FLAG_VALIDATE_HEADER_FOR_METADATA = false; - - bytes32 public constant INVALIDATE_BLOCK_LOG_TOPIC = - keccak256("BlockInvalidated(bytes32)"); - - bytes4 public constant ANCHOR_TX_SELECTOR = - bytes4(keccak256("anchor(uint256,bytes32)")); - - event BlockProven( - uint256 indexed id, - bytes32 parentHash, - bytes32 blockHash, - address prover, - uint64 provenAt - ); - - error L1_ALREADY_PROVEN(); - error L1_ANCHOR_CALLDATA(); - error L1_ANCHOR_DEST(); - error L1_ANCHOR_GAS_LIMIT(); - error L1_ANCHOR_RECEIPT_ADDR(); - error L1_ANCHOR_RECEIPT_DATA(); - error L1_ANCHOR_RECEIPT_LOGS(); - error L1_ANCHOR_RECEIPT_PROOF(); - error L1_ANCHOR_RECEIPT_STATUS(); - error L1_ANCHOR_RECEIPT_TOPICS(); - error L1_ANCHOR_SIG_R(); - error L1_ANCHOR_SIG_S(); - error L1_ANCHOR_TX_PROOF(); - error L1_ANCHOR_TYPE(); - error L1_CANNOT_BE_FIRST_PROVER(); - error L1_CONFLICT_PROOF(); - error L1_ID(); - error L1_INPUT_SIZE(); - error L1_META_MISMATCH(); - error L1_NOT_ORACLE_PROVER(); - error L1_PROOF_LENGTH(); - error L1_PROVER(); - error L1_ZKP(); - - function proveBlock( - TaikoData.State storage state, - TaikoData.Config memory config, - AddressResolver resolver, - uint256 blockId, - bytes[] calldata inputs - ) public { - // Check and decode inputs - if (inputs.length != 3) revert L1_INPUT_SIZE(); - TaikoData.Evidence memory evidence = abi.decode( - inputs[0], - (TaikoData.Evidence) - ); - - // Check evidence - if (evidence.meta.id != blockId) revert L1_ID(); - - if (evidence.proofs.length != 3) revert L1_PROOF_LENGTH(); - - IProofVerifier proofVerifier = IProofVerifier( - resolver.resolve("proof_verifier", false) - ); - - if (config.enableAnchorValidation) { - _proveAnchorForValidBlock({ - config: config, - resolver: resolver, - proofVerifier: proofVerifier, - evidence: evidence, - anchorTx: inputs[1], - anchorReceipt: inputs[2] - }); - } - - // ZK-prove block and mark block proven to be valid. - _proveBlock({ - state: state, - config: config, - resolver: resolver, - proofVerifier: proofVerifier, - evidence: evidence, - target: evidence.meta, - blockHashOverride: 0 - }); - } - - function proveBlockInvalid( - TaikoData.State storage state, - TaikoData.Config memory config, - AddressResolver resolver, - uint256 blockId, - bytes[] calldata inputs - ) public { - // Check and decode inputs - if (inputs.length != 3) revert L1_INPUT_SIZE(); - TaikoData.Evidence memory evidence = abi.decode( - inputs[0], - (TaikoData.Evidence) - ); - TaikoData.BlockMetadata memory target = abi.decode( - inputs[1], - (TaikoData.BlockMetadata) - ); - - // Check evidence - if (evidence.meta.id != blockId) revert L1_ID(); - if (evidence.proofs.length != 2) revert L1_PROOF_LENGTH(); - - IProofVerifier proofVerifier = IProofVerifier( - resolver.resolve("proof_verifier", false) - ); - - if (config.enableAnchorValidation) { - _proveAnchorForInvalidBlock({ - config: config, - resolver: resolver, - target: target, - proofVerifier: proofVerifier, - evidence: evidence, - invalidateBlockReceipt: inputs[2] - }); - } - - // ZK-prove block and mark block proven as invalid. - _proveBlock({ - state: state, - config: config, - resolver: resolver, - proofVerifier: proofVerifier, - evidence: evidence, - target: target, - blockHashOverride: LibUtils.BLOCK_DEADEND_HASH - }); - } - - function _proveBlock( - TaikoData.State storage state, - TaikoData.Config memory config, - AddressResolver resolver, - IProofVerifier proofVerifier, - TaikoData.Evidence memory evidence, - TaikoData.BlockMetadata memory target, - bytes32 blockHashOverride - ) private { - if (evidence.meta.id != target.id) revert L1_ID(); - if (evidence.prover == address(0)) revert L1_PROVER(); - - if (FLAG_CHECK_METADATA) { - if ( - target.id <= state.latestVerifiedId || - target.id >= state.nextBlockId - ) revert L1_ID(); - if ( - state - .getProposedBlock(config.maxNumBlocks, target.id) - .metaHash != target.hashMetadata() - ) revert L1_META_MISMATCH(); - } - - if (FLAG_VALIDATE_HEADER_FOR_METADATA) { - if ( - evidence.header.parentHash == 0 || - evidence.header.beneficiary != evidence.meta.beneficiary || - evidence.header.difficulty != 0 || - evidence.header.gasLimit != - evidence.meta.gasLimit + config.anchorTxGasLimit || - evidence.header.gasUsed == 0 || - evidence.header.timestamp != evidence.meta.timestamp || - evidence.header.extraData.length != - evidence.meta.extraData.length || - keccak256(evidence.header.extraData) != - keccak256(evidence.meta.extraData) || - evidence.header.mixHash != evidence.meta.mixHash - ) revert L1_META_MISMATCH(); - } - - // For alpha-2 testnet, the network allows any address to submit ZKP, - // but a special prover can skip ZKP verification if the ZKP is empty. - - bool oracleProving; - - TaikoData.ForkChoice storage fc = state.forkChoices[target.id][ - evidence.header.parentHash - ]; - - bytes32 blockHash = evidence.header.hashBlockHeader(); - bytes32 _blockHash = blockHashOverride == 0 - ? blockHash - : blockHashOverride; - - if (fc.blockHash == 0) { - address oracleProver = resolver.resolve("oracle_prover", true); - if (msg.sender == oracleProver) { - oracleProving = true; - } else { - if (oracleProver != address(0)) revert L1_NOT_ORACLE_PROVER(); - fc.prover = evidence.prover; - fc.provenAt = uint64(block.timestamp); - } - fc.blockHash = _blockHash; - } else { - if (fc.blockHash != _blockHash) revert L1_CONFLICT_PROOF(); - if (fc.prover != address(0)) revert L1_ALREADY_PROVEN(); - - fc.prover = evidence.prover; - fc.provenAt = uint64(block.timestamp); - } - - if (oracleProving) { - // do not verify zkp - } else { - bool verified = proofVerifier.verifyZKP({ - verifierId: string( - abi.encodePacked("plonk_verifier_", evidence.circuitId) - ), - zkproof: evidence.proofs[0], - instance: _getInstance(evidence) - }); - if (!verified) revert L1_ZKP(); - } - - emit BlockProven({ - id: target.id, - parentHash: evidence.header.parentHash, - blockHash: _blockHash, - prover: fc.prover, - provenAt: fc.provenAt - }); - } - - function _proveAnchorForValidBlock( - TaikoData.Config memory config, - AddressResolver resolver, - IProofVerifier proofVerifier, - TaikoData.Evidence memory evidence, - bytes calldata anchorTx, - bytes calldata anchorReceipt - ) private view { - // Check anchor tx is valid - LibTxDecoder.Tx memory _tx = LibTxDecoder.decodeTx( - config.chainId, - anchorTx - ); - if (_tx.txType != 0) revert L1_ANCHOR_TYPE(); - if (_tx.destination != resolver.resolve(config.chainId, "taiko", false)) - revert L1_ANCHOR_DEST(); - if (_tx.gasLimit != config.anchorTxGasLimit) - revert L1_ANCHOR_GAS_LIMIT(); - - if (FLAG_VALIDATE_ANCHOR_TX_SIGNATURE) { - // Check anchor tx's signature is valid and deterministic - if ( - _tx.r != LibAnchorSignature.GX && - _tx.r != LibAnchorSignature.GX2 - ) revert L1_ANCHOR_SIG_R(); - - if (_tx.r == LibAnchorSignature.GX2) { - (, , uint256 s) = LibAnchorSignature.signTransaction( - LibTxUtils.hashUnsignedTx(config.chainId, _tx), - 1 - ); - if (s != 0) revert L1_ANCHOR_SIG_S(); - } - } - - // Check anchor tx's calldata is valid - if ( - !LibBytesUtils.equal( - _tx.data, - bytes.concat( - ANCHOR_TX_SELECTOR, - bytes32(evidence.meta.l1Height), - evidence.meta.l1Hash - ) - ) - ) revert L1_ANCHOR_CALLDATA(); - - // Check anchor tx is the 1st tx in the block - if ( - !proofVerifier.verifyMKP({ - key: LibRLPWriter.writeUint(0), - value: anchorTx, - proof: evidence.proofs[1], - root: evidence.header.transactionsRoot - }) - ) revert L1_ANCHOR_TX_PROOF(); - // Check anchor tx does not throw - LibReceiptDecoder.Receipt memory receipt = LibReceiptDecoder - .decodeReceipt(anchorReceipt); - if (receipt.status != 1) revert L1_ANCHOR_RECEIPT_STATUS(); - if ( - !proofVerifier.verifyMKP({ - key: LibRLPWriter.writeUint(0), - value: anchorReceipt, - proof: evidence.proofs[2], - root: evidence.header.receiptsRoot - }) - ) revert L1_ANCHOR_RECEIPT_PROOF(); - } - - function _proveAnchorForInvalidBlock( - TaikoData.Config memory config, - AddressResolver resolver, - TaikoData.BlockMetadata memory target, - IProofVerifier proofVerifier, - TaikoData.Evidence memory evidence, - bytes calldata invalidateBlockReceipt - ) private view { - if ( - !proofVerifier.verifyMKP({ - key: LibRLPWriter.writeUint(0), - value: invalidateBlockReceipt, - proof: evidence.proofs[1], - root: evidence.header.receiptsRoot - }) - ) revert L1_ANCHOR_RECEIPT_PROOF(); - // Check the 1st receipt is for an InvalidateBlock tx with - // a BlockInvalidated event - LibReceiptDecoder.Receipt memory receipt = LibReceiptDecoder - .decodeReceipt(invalidateBlockReceipt); - if (receipt.status != 1) revert L1_ANCHOR_RECEIPT_STATUS(); - if (receipt.logs.length != 1) revert L1_ANCHOR_RECEIPT_LOGS(); - LibReceiptDecoder.Log memory log = receipt.logs[0]; - if ( - log.contractAddress != - resolver.resolve(config.chainId, "taiko", false) - ) revert L1_ANCHOR_RECEIPT_ADDR(); - if (log.data.length != 0) revert L1_ANCHOR_RECEIPT_DATA(); - if ( - log.topics.length != 2 || - log.topics[0] != INVALIDATE_BLOCK_LOG_TOPIC || - log.topics[1] != target.txListHash - ) revert L1_ANCHOR_RECEIPT_TOPICS(); - } - - function _getInstance( - TaikoData.Evidence memory evidence - ) internal pure returns (bytes32) { - bytes[] memory list = LibBlockHeader.getBlockHeaderRLPItemsList( - evidence.header, - 2 - ); - - uint256 len = list.length; - list[len - 2] = LibRLPWriter.writeAddress(evidence.prover); - list[len - 1] = LibRLPWriter.writeHash(evidence.meta.txListHash); - - return keccak256(LibRLPWriter.writeList(list)); - } -} diff --git a/packages/protocol/contracts/test/libs/TestLibReceiptDecoder.sol b/packages/protocol/contracts/test/libs/TestLibReceiptDecoder.sol deleted file mode 100644 index 3b5ad45e67d..00000000000 --- a/packages/protocol/contracts/test/libs/TestLibReceiptDecoder.sol +++ /dev/null @@ -1,23 +0,0 @@ -// SPDX-License-Identifier: MIT -// _____ _ _ _ _ -// |_ _|_ _(_) |_____ | | __ _| |__ ___ -// | |/ _` | | / / _ \ | |__/ _` | '_ (_-< -// |_|\__,_|_|_\_\___/ |____\__,_|_.__/__/ - -pragma solidity ^0.8.18; - -import {LibReceiptDecoder} from "../../libs/LibReceiptDecoder.sol"; - -contract TestLibReceiptDecoder { - event TestLibReceiptDecoderEvent(uint256 indexed a, bytes32 b); - - function emitTestEvent(uint256 a, bytes32 b) public { - emit TestLibReceiptDecoderEvent(a, b); - } - - function decodeReceipt( - bytes calldata encoded - ) public pure returns (LibReceiptDecoder.Receipt memory receipt) { - return LibReceiptDecoder.decodeReceipt(encoded); - } -} diff --git a/packages/protocol/contracts/test/libs/TestLibTrieProof.sol b/packages/protocol/contracts/test/libs/TestLibTrieProof.sol index b935445456b..8c1155b0831 100644 --- a/packages/protocol/contracts/test/libs/TestLibTrieProof.sol +++ b/packages/protocol/contracts/test/libs/TestLibTrieProof.sol @@ -16,12 +16,11 @@ contract TestLibTrieProof { } function verify( - bytes32 stateRoot, - address addr, bytes32 slot, bytes32 value, - bytes calldata mkproof + bytes calldata storageProof, + bytes32 storageRoot ) public pure returns (bool) { - return LibTrieProof.verify(stateRoot, addr, slot, value, mkproof); + return LibTrieProof.verify(slot, value, storageProof, storageRoot); } } diff --git a/packages/protocol/contracts/test/libs/TestLibTxUtils.sol b/packages/protocol/contracts/test/libs/TestLibTxUtils.sol deleted file mode 100644 index 5082ccdd57b..00000000000 --- a/packages/protocol/contracts/test/libs/TestLibTxUtils.sol +++ /dev/null @@ -1,26 +0,0 @@ -// SPDX-License-Identifier: MIT -// _____ _ _ _ _ -// |_ _|_ _(_) |_____ | | __ _| |__ ___ -// | |/ _` | | / / _ \ | |__/ _` | '_ (_-< -// |_|\__,_|_|_\_\___/ |____\__,_|_.__/__/ - -pragma solidity ^0.8.18; - -import {LibTxUtils} from "../../libs/LibTxUtils.sol"; -import {LibTxDecoder} from "../../libs/LibTxDecoder.sol"; - -contract TestLibTxUtils { - function hashUnsignedTx( - uint256 chainId, - LibTxDecoder.Tx memory transaction - ) public pure returns (bytes32 hash) { - return LibTxUtils.hashUnsignedTx(chainId, transaction); - } - - function recoverSender( - uint256 chainId, - LibTxDecoder.Tx memory transaction - ) public pure returns (address) { - return LibTxUtils.recoverSender(chainId, transaction); - } -} diff --git a/packages/protocol/contracts/test/libs/TestLibZKP.sol b/packages/protocol/contracts/test/libs/TestLibZKP.sol deleted file mode 100644 index c9e8cef6ec3..00000000000 --- a/packages/protocol/contracts/test/libs/TestLibZKP.sol +++ /dev/null @@ -1,19 +0,0 @@ -// SPDX-License-Identifier: MIT -// _____ _ _ _ _ -// |_ _|_ _(_) |_____ | | __ _| |__ ___ -// | |/ _` | | / / _ \ | |__/ _` | '_ (_-< -// |_|\__,_|_|_\_\___/ |____\__,_|_.__/__/ - -pragma solidity ^0.8.18; - -import {LibZKP} from "../../libs/LibZKP.sol"; - -contract TestLibZKP { - function verify( - address plonkVerifier, - bytes calldata zkproof, - bytes32 instance - ) public view returns (bool verified) { - return LibZKP.verify(plonkVerifier, zkproof, instance); - } -} diff --git a/packages/protocol/contracts/test/thirdparty/TestLibBlockHeaderDecoder.sol b/packages/protocol/contracts/test/thirdparty/TestLibBlockHeaderDecoder.sol deleted file mode 100644 index 44583a40040..00000000000 --- a/packages/protocol/contracts/test/thirdparty/TestLibBlockHeaderDecoder.sol +++ /dev/null @@ -1,35 +0,0 @@ -// SPDX-License-Identifier: MIT -// _____ _ _ _ _ -// |_ _|_ _(_) |_____ | | __ _| |__ ___ -// | |/ _` | | / / _ \ | |__/ _` | '_ (_-< -// |_|\__,_|_|_\_\___/ |____\__,_|_.__/__/ - -pragma solidity ^0.8.18; - -import { - LibBlockHeaderDecoder -} from "../../thirdparty/LibBlockHeaderDecoder.sol"; - -contract TestLibBlockHeaderDecoder { - function decodeBlockHeader( - bytes calldata blockHeader, - bytes32 blockHash, - bool postEIP1559 - ) - public - pure - returns ( - bytes32 _stateRoot, - uint256 _timestamp, - bytes32 _transactionsRoot, - bytes32 _receiptsRoot - ) - { - return - LibBlockHeaderDecoder.decodeBlockHeader( - blockHeader, - blockHash, - postEIP1559 - ); - } -} diff --git a/packages/protocol/contracts/thirdparty/AddressManager.sol b/packages/protocol/contracts/thirdparty/AddressManager.sol index 83a6b102a6f..6662d2ffb73 100644 --- a/packages/protocol/contracts/thirdparty/AddressManager.sol +++ b/packages/protocol/contracts/thirdparty/AddressManager.sol @@ -88,7 +88,6 @@ contract AddressManager is OwnableUpgradeable { * @return Address associated with the given name. */ function getAddress(string memory name) external view returns (address) { - bytes32 nameHash = keccak256(bytes(name)); - return addresses[nameHash]; + return addresses[keccak256(bytes(name))]; } } diff --git a/packages/protocol/contracts/thirdparty/ERC20Upgradeable.sol b/packages/protocol/contracts/thirdparty/ERC20Upgradeable.sol index a758f08c5e8..f218b25b9b1 100644 --- a/packages/protocol/contracts/thirdparty/ERC20Upgradeable.sol +++ b/packages/protocol/contracts/thirdparty/ERC20Upgradeable.sol @@ -28,7 +28,7 @@ // TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE // SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -pragma solidity ^0.8.0; +pragma solidity ^0.8.18; import "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol"; import "@openzeppelin/contracts-upgradeable/token/ERC20/extensions/IERC20MetadataUpgradeable.sol"; diff --git a/packages/protocol/contracts/thirdparty/LibBlockHeaderDecoder.sol b/packages/protocol/contracts/thirdparty/LibBlockHeaderDecoder.sol deleted file mode 100644 index 17215c4b28d..00000000000 --- a/packages/protocol/contracts/thirdparty/LibBlockHeaderDecoder.sol +++ /dev/null @@ -1,234 +0,0 @@ -// SPDX-License-Identifier: MIT -// Taken from https://github.com/privacy-scaling-explorations/zkevm-chain/blob/master/contracts/ZkEvmL2MessageDeliverer.sol#L23 -// NOTE: No MIT license provided at the time, only SPDX-License-Identifier - -pragma solidity ^0.8.18; - -/** - * @title LibBlockHeaderDecoder - */ -library LibBlockHeaderDecoder { - /// @notice This method extracts [stateRoot, timestamp] of a block header. - /// @param blockHeader RLP encoded block header - /// @param blockHash The expected block hash - /// @param postEIP1559 True to check header to have 16 fields, 15 otherwise - /// @return _stateRoot The state root - /// @return _timestamp The timestamp - /// @return _transactionsRoot The transactionsRoot - /// @return _receiptsRoot The receiptsRoot - function decodeBlockHeader( - bytes calldata blockHeader, - bytes32 blockHash, - bool postEIP1559 - ) - public - pure - returns ( - bytes32 _stateRoot, - uint256 _timestamp, - bytes32 _transactionsRoot, - bytes32 _receiptsRoot - ) - { - uint256 numFields = postEIP1559 ? 16 : 15; - assembly { - // TODO: use templating techniques and DRY code (with PatriciaValidator). - - // function Error(string) - function revertWith(msg) { - mstore(0, shl(224, 0x08c379a0)) - mstore(4, 32) - mstore(68, msg) - let msgLen - for { - - } msg { - - } { - msg := shl(8, msg) - msgLen := add(msgLen, 1) - } - mstore(36, msgLen) - revert(0, 100) - } - - // loads and aligns a value from calldata - // given the `len|offset` stored at `memPtr` - function loadValue(memPtr) -> value, len { - let tmp := mload(memPtr) - // assuming 0xffffff is sufficient for storing calldata offset - let offset := and(tmp, 0xffffff) - len := shr(128, tmp) - - if gt(len, 31) { - // special case - truncating the value is intended. - // this matches the behavior in `derivePath` that truncates to 256 bits. - offset := add(offset, sub(len, 32)) - value := calldataload(offset) - leave - } - - // everything else is - // < 32 bytes - align the value - let bits := mul(sub(32, len), 8) - value := calldataload(offset) - value := shr(bits, value) - } - - // returns the `len` of the whole RLP list at `ptr` - // and the offset for the first value inside the list. - function decodeListLength(ptr) -> len, startOffset { - let firstByte := byte(0, calldataload(ptr)) - - // SHORT LIST - // 0 - 55 bytes - // 0xc0 - 0xf7 - if lt(firstByte, 0xf8) { - len := sub(firstByte, 0xbf) - startOffset := add(ptr, 1) - leave - } - - // LONG LIST - // 0xf8 - 0xff - // > 55 bytes - { - let lenOf := sub(firstByte, 0xf7) - - // load the extended length - startOffset := add(ptr, 1) - let extendedLen := calldataload(startOffset) - let bits := sub(256, mul(lenOf, 8)) - extendedLen := shr(bits, extendedLen) - - len := add(extendedLen, lenOf) - len := add(len, 1) - startOffset := add(startOffset, lenOf) - leave - } - } - - // returns the calldata offset of the value and the length in bytes - // for the RLP encoded data item at `ptr`. - // used in `decodeFlat` - function decodeValue(ptr) -> dataLen, valueOffset, isData { - let firstByte := byte(0, calldataload(ptr)) - - // SINGLE BYTE - // 0x00 - 0x7f - if lt(firstByte, 0x80) { - dataLen := 1 - valueOffset := ptr - isData := 1 - leave - } - - // DATA ITEM - // 0 - 55 bytes long - // 0x80 - 0xb7 - if lt(firstByte, 0xb8) { - dataLen := sub(firstByte, 0x80) - valueOffset := add(ptr, 1) - isData := 1 - leave - } - - // LONG DATA ITEM - // > 55 bytes - // 0xb8 - 0xbf - if lt(firstByte, 0xc0) { - // the extended length is ignored - dataLen := sub(firstByte, 0xb7) - - // load the extended length - valueOffset := add(ptr, 1) - let extendedLen := calldataload(valueOffset) - let bits := sub(256, mul(dataLen, 8)) - valueOffset := add(ptr, dataLen) - dataLen := shr(bits, extendedLen) - leave - } - - // everything else is unexpected - revertWith("RLP") - } - - // decodes all RLP encoded data and stores their DATA items - // [length, calldata offset] in a continous memory region. - // Expects that the RLP starts with a list that defines the length - // of the whole RLP region. - function decodeFlat(_ptr) -> ptr, memStart, nItems, hash { - ptr := _ptr - - // load free memory ptr - // doesn't update the ptr and leaves the memory region dirty - memStart := mload(64) - - let payloadLen, startOffset := decodeListLength(ptr) - // reuse memStart region and hash - calldatacopy(memStart, ptr, payloadLen) - hash := keccak256(memStart, payloadLen) - - let memPtr := memStart - let ptrStop := add(ptr, payloadLen) - ptr := startOffset - - // decode until the end of the list - for { - - } lt(ptr, ptrStop) { - - } { - let len, valuePtr, isData := decodeValue(ptr) - ptr := add(len, valuePtr) - - if isData { - // store the length of the data and the calldata offset - let tmp := or(shl(128, len), valuePtr) - mstore(memPtr, tmp) - memPtr := add(memPtr, 32) - } - } - - nItems := div(sub(memPtr, memStart), 32) - } - - // expecting 16 individual items from the block header - let calldataPtr, memStart, nItems, hash := decodeFlat( - blockHeader.offset - ) - - // boundary check - if iszero( - eq(calldataPtr, add(blockHeader.offset, blockHeader.length)) - ) { - revertWith("BOUNDS") - } - if iszero(eq(hash, blockHash)) { - revertWith("HASH") - } - - // Depends on if EIP1559 is enabled, check the item size to be 15 or 16. - if iszero(eq(nItems, numFields)) { - revertWith("ITEMS") - } - - // at position 11 should be the timestamp - let len - _timestamp, len := loadValue(add(memStart, mul(32, 11))) - // sstore(originTimestamp.slot, value) - - // at position 3 should be the stateRoot - _stateRoot, len := loadValue(add(memStart, mul(32, 3))) - // sstore(originStateRoot.slot, value) - - // at position 4 should be transactionsRoot - _transactionsRoot, len := loadValue(add(memStart, mul(32, 4))) - // sstore(originTransactionsRoot.slot, value) - - // at position 5 should be receiptsRoot - _receiptsRoot, len := loadValue(add(memStart, mul(32, 5))) - // sstore(originReceiptsRoot.slot, value) - } - } -} diff --git a/packages/protocol/contracts/thirdparty/LibMerkleTrie.sol b/packages/protocol/contracts/thirdparty/LibMerkleTrie.sol index f00a74a04cc..ce19ee47f97 100644 --- a/packages/protocol/contracts/thirdparty/LibMerkleTrie.sol +++ b/packages/protocol/contracts/thirdparty/LibMerkleTrie.sol @@ -55,24 +55,24 @@ library LibMerkleTrie { **********************/ // TREE_RADIX determines the number of elements per branch node. - uint8 constant TREE_RADIX = 16; + uint8 private constant TREE_RADIX = 16; // Branch nodes have TREE_RADIX elements plus an additional `value` slot. - uint8 constant BRANCH_NODE_LENGTH = TREE_RADIX + 1; + uint8 private constant BRANCH_NODE_LENGTH = TREE_RADIX + 1; // Leaf nodes and extension nodes always have two elements, a `path` and a `value`. - uint8 constant LEAF_OR_EXTENSION_NODE_LENGTH = 2; + uint8 private constant LEAF_OR_EXTENSION_NODE_LENGTH = 2; // Prefixes are prepended to the `path` within a leaf or extension node and // allow us to differentiate between the two node types. `ODD` or `EVEN` is // determined by the number of nibbles within the unprefixed `path`. If the // number of nibbles if even, we need to insert an extra padding nibble so // the resulting prefixed `path` has an even number of nibbles. - uint8 constant PREFIX_EXTENSION_EVEN = 0; - uint8 constant PREFIX_EXTENSION_ODD = 1; - uint8 constant PREFIX_LEAF_EVEN = 2; - uint8 constant PREFIX_LEAF_ODD = 3; + uint8 private constant PREFIX_EXTENSION_EVEN = 0; + uint8 private constant PREFIX_EXTENSION_ODD = 1; + uint8 private constant PREFIX_LEAF_EVEN = 2; + uint8 private constant PREFIX_LEAF_ODD = 3; // Just a utility constant. RLP represents `NULL` as 0x80. - bytes1 constant RLP_NULL = bytes1(0x80); + bytes1 private constant RLP_NULL = bytes1(0x80); /********************** * Internal Functions * diff --git a/packages/protocol/foundry.toml b/packages/protocol/foundry.toml new file mode 100644 index 00000000000..80aacc34bcd --- /dev/null +++ b/packages/protocol/foundry.toml @@ -0,0 +1,10 @@ +[profile.default] +src = 'contracts' +out = 'out' +test = 'test2' +libs = ['lib'] +optimizer = true +optimizer_runs = 200 +gas_reports = ["TaikoL1", "TaikoL1WithConfig", "TaikoL2", "GasComparision", "SignalService", "Bridge", "BridgedERC20", "TaikoToken", "EtherVault", "TokenVault"] + +# See more config options https://github.com/foundry-rs/foundry/tree/master/config diff --git a/packages/protocol/hardhat.config.ts b/packages/protocol/hardhat.config.ts index fc953d6986d..d9ed1b6a8b7 100644 --- a/packages/protocol/hardhat.config.ts +++ b/packages/protocol/hardhat.config.ts @@ -1,6 +1,8 @@ import "@nomiclabs/hardhat-etherscan"; import "@nomiclabs/hardhat-waffle"; +// import "@nomicfoundation/hardhat-foundry"; import "@openzeppelin/hardhat-upgrades"; +import "hardhat-preprocessor"; import "@typechain/hardhat"; import "hardhat-abi-exporter"; import "hardhat-contract-sizer"; @@ -27,6 +29,7 @@ const config: HardhatUserConfig = { pages: "files", templates: "./solidity-docgen/templates", }, + gasReporter: { currency: "USD", enabled: true, diff --git a/packages/protocol/lib/forge-std b/packages/protocol/lib/forge-std new file mode 160000 index 00000000000..b1cf2603743 --- /dev/null +++ b/packages/protocol/lib/forge-std @@ -0,0 +1 @@ +Subproject commit b1cf26037432d18fea6917ba82a6fedbff71c037 diff --git a/packages/protocol/lib/openzeppelin-contracts b/packages/protocol/lib/openzeppelin-contracts new file mode 160000 index 00000000000..d00acef4059 --- /dev/null +++ b/packages/protocol/lib/openzeppelin-contracts @@ -0,0 +1 @@ +Subproject commit d00acef4059807535af0bd0dd0ddf619747a044b diff --git a/packages/protocol/lib/openzeppelin-contracts-upgradeable b/packages/protocol/lib/openzeppelin-contracts-upgradeable new file mode 160000 index 00000000000..f6c4c9c4ec6 --- /dev/null +++ b/packages/protocol/lib/openzeppelin-contracts-upgradeable @@ -0,0 +1 @@ +Subproject commit f6c4c9c4ec601665ca74d2c9dddf547fc425658c diff --git a/packages/protocol/package.json b/packages/protocol/package.json index 59a028dd64b..120f9414c4e 100644 --- a/packages/protocol/package.json +++ b/packages/protocol/package.json @@ -4,6 +4,7 @@ "private": true, "scripts": { "compile": "pnpm hardhat compile", + "compile:foundry": "forge build", "compile:yul": "LOG_LEVEL=debug pnpm hardhat compile_yul", "export:abi": "pnpm hardhat clear-abi && pnpm hardhat export-abi", "export:docs": "pnpm hardhat docgen && pnpm prettier --write ../website/pages/docs/reference/contract-documentation/**/*.md", @@ -14,6 +15,7 @@ "test": "./scripts/download_solc.sh && pnpm hardhat test --grep '^[^integration]'", "coverage": "pnpm hardhat coverage --solcoverjs ./.solcover.js --show-stack-traces", "test:coverage": "pnpm coverage", + "test:foundry": "forge test -vvv --gas-report", "generate:genesis": "ts-node ./utils/generate_genesis/main.ts", "test:genesis": "./test/genesis/generate_genesis.test.sh", "test:bridge": "TEST_TYPE=integrationbridge ./test/test_integration.sh", @@ -39,54 +41,56 @@ "author": "Taiko Labs", "license": "MIT", "devDependencies": { - "@defi-wonderland/smock": "^2.3.3", - "@nomicfoundation/hardhat-network-helpers": "^1.0.6", - "@nomiclabs/hardhat-ethers": "^2.0.0", - "@nomiclabs/hardhat-etherscan": "^3.1.0", - "@nomiclabs/hardhat-waffle": "^2.0.0", - "@openzeppelin/hardhat-upgrades": "^1.14.0", + "@defi-wonderland/smock": "^2.3.4", + "@foundry-rs/hardhat-forge": "^0.1.17", + "@nomicfoundation/hardhat-network-helpers": "^1.0.8", + "@nomiclabs/hardhat-ethers": "^2.2.2", + "@nomiclabs/hardhat-etherscan": "^3.1.7", + "@nomiclabs/hardhat-waffle": "^2.0.5", + "@openzeppelin/hardhat-upgrades": "^1.22.1", "@typechain/ethers-v5": "^7.2.0", "@typechain/hardhat": "^2.3.1", - "@types/chai": "^4.3.0", - "@types/glob": "^8.0.1", - "@types/mocha": "^9.1.0", - "@types/node": "^12.20.45", + "@types/chai": "^4.3.4", + "@types/glob": "^8.1.0", + "@types/mocha": "^9.1.1", + "@types/node": "^12.20.55", "@typescript-eslint/eslint-plugin": "^4.33.0", "@typescript-eslint/parser": "^4.33.0", - "chai": "^4.2.0", + "chai": "^4.3.7", "chalk": "4.1.2", "dotenv": "^10.0.0", "eslint": "^7.32.0", - "eslint-config-prettier": "^8.3.0", + "eslint-config-prettier": "^8.6.0", "eslint-config-standard": "^16.0.3", - "eslint-plugin-import": "^2.25.4", + "eslint-plugin-import": "^2.27.5", "eslint-plugin-node": "^11.1.0", "eslint-plugin-prettier": "^3.4.1", "eslint-plugin-promise": "^5.2.0", - "ethereum-waffle": "^3.0.0", - "ethers": "^5.0.0", + "ethereum-waffle": "^3.4.4", + "ethers": "^5.7.2", "glob": "^8.1.0", - "hardhat": "^2.8.3", - "hardhat-abi-exporter": "^2.10.0", + "hardhat": "^2.13.0", + "hardhat-abi-exporter": "^2.10.1", "hardhat-contract-sizer": "^2.8.0", "hardhat-docgen": "^1.3.0", - "hardhat-gas-reporter": "^1.0.7", - "lint-staged": "^12.3.4", + "hardhat-gas-reporter": "^1.0.9", + "hardhat-preprocessor": "^0.1.5", + "lint-staged": "^12.5.0", "merkle-patricia-tree": "^4.2.4", - "prettier": "^2.5.1", - "prettier-plugin-solidity": "^1.1.2", + "prettier": "^2.8.4", + "prettier-plugin-solidity": "^1.1.3", "rlp": "^3.0.0", "solhint": "^3.4.0", "solidity-coverage": "github:taikoxyz/solidity-coverage", - "solidity-docgen": "^0.6.0-beta.34", - "ts-node": "^10.5.0", + "solidity-docgen": "0.6.0-beta.35", + "ts-node": "^10.9.1", "typechain": "^5.2.0", - "typescript": "^4.5.5" + "typescript": "^4.9.5" }, "dependencies": { - "@gnosis.pm/zodiac": "^1.0.7", - "@openzeppelin/contracts": "^4.5.0", - "@openzeppelin/contracts-upgradeable": "^4.5.1", + "@gnosis.pm/zodiac": "^1.1.9", + "@openzeppelin/contracts": "^4.8.2", + "@openzeppelin/contracts-upgradeable": "^4.8.2", "channel-ts": "^0.1.2" } } diff --git a/packages/protocol/remappings.txt b/packages/protocol/remappings.txt new file mode 100644 index 00000000000..271c7272700 --- /dev/null +++ b/packages/protocol/remappings.txt @@ -0,0 +1,5 @@ +forge-std/=lib/forge-std/src/ +solmate/=lib/solmate/src/ +ds-test/=lib/forge-std/lib/ds-test/src/ +@openzeppelin/contracts/=lib/openzeppelin-contracts/contracts/ +@openzeppelin/contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/contracts/ \ No newline at end of file diff --git a/packages/protocol/tasks/deploy_L1.ts b/packages/protocol/tasks/deploy_L1.ts index 35525abb218..f3e4c6a9e2e 100644 --- a/packages/protocol/tasks/deploy_L1.ts +++ b/packages/protocol/tasks/deploy_L1.ts @@ -98,16 +98,6 @@ export async function deployContracts(hre: any) { const AddressManager = await utils.deployContract(hre, "AddressManager"); await utils.waitTx(hre, await AddressManager.init()); - const ProofVerifier = await utils.deployContract(hre, "ProofVerifier"); - await utils.waitTx(hre, await ProofVerifier.init(AddressManager.address)); - await utils.waitTx( - hre, - await AddressManager.setAddress( - `${chainId}.proof_verifier`, - ProofVerifier.address - ) - ); - await utils.waitTx( hre, await AddressManager.setAddress(`${chainId}.dao_vault`, daoVault) @@ -127,15 +117,17 @@ export async function deployContracts(hre: any) { await utils.waitTx( hre, await TaikoToken.init( + AddressManager.address, "Test Taiko Token", "TTKO", - AddressManager.address + [], + [] ) ); await utils.waitTx( hre, await AddressManager.setAddress( - `${chainId}.tko_token`, + `${chainId}.taiko_token`, TaikoToken.address ) ); @@ -157,8 +149,8 @@ export async function deployContracts(hre: any) { // TaikoL1 const TaikoL1 = await utils.deployContract( hre, - "TaikoL1", - await deployBaseLibs(hre) + "TaikoL1" + // await deployBaseLibs(hre) ); const feeBase = hre.ethers.BigNumber.from(10).pow(18); @@ -248,7 +240,7 @@ export async function deployContracts(hre: any) { ethers.utils.arrayify( ethers.utils.solidityPack( ["string", "uint16"], - ["plonk_verifier_", i] + ["verifier_", i] ) ) ).toString()}`, @@ -300,28 +292,6 @@ export async function deployContracts(hre: any) { return deployments; } -async function deployBaseLibs(hre: any) { - const libReceiptDecoder = await utils.deployContract( - hre, - "LibReceiptDecoder" - ); - const libTxDecoder = await utils.deployContract(hre, "LibTxDecoder"); - - const libVerifying = await utils.deployContract(hre, "LibVerifying", {}); - const libProposing = await utils.deployContract(hre, "LibProposing", {}); - - const libProving = await utils.deployContract(hre, "LibProving", { - LibReceiptDecoder: libReceiptDecoder.address, - LibTxDecoder: libTxDecoder.address, - }); - - return { - LibVerifying: libVerifying.address, - LibProposing: libProposing.address, - LibProving: libProving.address, - }; -} - async function deployBridge(hre: any, addressManager: string): Promise { const libTrieProof = await utils.deployContract(hre, "LibTrieProof"); diff --git a/packages/protocol/test/L1/TaikoL1.integration.test.ts b/packages/protocol/test/L1/TaikoL1.integration.test.ts index c60d55e0807..52f606ac14e 100644 --- a/packages/protocol/test/L1/TaikoL1.integration.test.ts +++ b/packages/protocol/test/L1/TaikoL1.integration.test.ts @@ -1,15 +1,11 @@ import { expect } from "chai"; import { SimpleChannel } from "channel-ts"; -import { BigNumber, ethers as ethersLib } from "ethers"; +import { ethers as ethersLib } from "ethers"; import { ethers } from "hardhat"; import { TaikoL1, TestTaikoToken } from "../../typechain"; import blockListener from "../utils/blockListener"; import { BlockMetadata } from "../utils/block_metadata"; -import { - commitAndProposeLatestBlock, - commitBlock, - generateCommitHash, -} from "../utils/commit"; +import { proposeLatestBlock } from "../utils/commit"; import { encodeEvidence } from "../utils/encoding"; import { readShouldRevertWithCustomError, @@ -17,15 +13,14 @@ import { } from "../utils/errors"; import Evidence from "../utils/evidence"; import { initIntegrationFixture } from "../utils/fixture"; -import { buildProposeBlockInputs } from "../utils/propose"; import Proposer from "../utils/proposer"; import { buildProveBlockInputs, proveBlock } from "../utils/prove"; import Prover from "../utils/prover"; import { getBlockHeader } from "../utils/rpc"; -import { seedTko, sendTinyEtherToZeroAddress } from "../utils/seed"; -import { commitProposeProveAndVerify, verifyBlocks } from "../utils/verify"; +import { seedTko } from "../utils/seed"; +import { proposeProveAndVerify, verifyBlocks } from "../utils/verify"; -describe("integration:TaikoL1", function () { +describe("integ-----disabled-----ration:TaikoL1", function () { let taikoL1: TaikoL1; let l1Provider: ethersLib.providers.JsonRpcProvider; let l2Provider: ethersLib.providers.JsonRpcProvider; @@ -58,8 +53,7 @@ describe("integration:TaikoL1", function () { proposer = new Proposer( taikoL1.connect(proposerSigner), l2Provider, - config.commitConfirmations.toNumber(), - config.maxNumBlocks.toNumber(), + config.maxNumProposedBlocks.toNumber(), 0, proposerSigner ); @@ -73,64 +67,23 @@ describe("integration:TaikoL1", function () { chan.close(); }); - describe("isCommitValid()", async function () { - it("should not be valid if it has not been committed", async function () { - const block = await l2Provider.getBlock("latest"); - const commit = generateCommitHash(block); - - const isCommitValid = await taikoL1.isCommitValid( - 1, - 1, - commit.hash - ); - - expect(isCommitValid).to.be.false; - }); - - it("should be valid if it has been committed", async function () { - const block = await l2Provider.getBlock("latest"); - const commitSlot = 0; - const { commit, blockCommittedEvent } = await commitBlock( - taikoL1, - block, - commitSlot - ); - expect(blockCommittedEvent).not.to.be.undefined; - - for (let i = 0; i < config.commitConfirmations.toNumber(); i++) { - await sendTinyEtherToZeroAddress(l1Signer); - } - - const isCommitValid = await taikoL1.isCommitValid( - commitSlot, - blockCommittedEvent!.blockNumber, - commit.hash - ); - - expect(isCommitValid).to.be.true; - }); - }); - - describe("getProposedBlock()", function () { + describe("getBlock()", function () { it("should revert if block is out of range and not a valid proposed block", async function () { await readShouldRevertWithCustomError( - taikoL1.getProposedBlock(123), + taikoL1.getBlock(123), "L1_ID()" ); }); it("should return valid block if it's been commmited and proposed", async function () { - const commitSlot = 0; - const { proposedEvent } = await commitAndProposeLatestBlock( + const { proposedEvent } = await proposeLatestBlock( taikoL1, l1Signer, - l2Provider, - commitSlot + l2Provider ); expect(proposedEvent).not.to.be.undefined; - expect(proposedEvent.args.meta.commitSlot).to.be.eq(commitSlot); - const proposedBlock = await taikoL1.getProposedBlock( + const proposedBlock = await taikoL1.getBlock( proposedEvent.args.meta.id ); expect(proposedBlock).not.to.be.undefined; @@ -151,7 +104,7 @@ describe("integration:TaikoL1", function () { }); it("returns populated data for submitted fork choice", async function () { - const { proposedEvent, block } = await commitAndProposeLatestBlock( + const { proposedEvent, block } = await proposeLatestBlock( taikoL1, l1Signer, l2Provider, @@ -184,10 +137,8 @@ describe("integration:TaikoL1", function () { /* eslint-disable-next-line */ const block = await l2Provider.getBlock(blockNumber); - // commit and propose block, so our provers can prove it. - const { proposedEvent } = await proposer.commitThenProposeBlock( - block - ); + // propose block, so our provers can prove it. + const { proposedEvent } = await proposer.proposeBlock(block); await prover.prove( proposedEvent.args.id.toNumber(), @@ -215,212 +166,22 @@ describe("integration:TaikoL1", function () { }); }); - describe("commitBlock() -> proposeBlock() integration", async function () { - it("should fail if a proposed block's placeholder field values are not default", async function () { - const block = await l2Provider.getBlock("latest"); - const commitSlot = 0; - const { tx, commit } = await commitBlock( - taikoL1, - block, - commitSlot - ); - - const receipt = await tx.wait(1); - - const meta: BlockMetadata = { - id: 1, - l1Height: 0, - l1Hash: ethers.constants.HashZero, - beneficiary: commit.beneficiary, - txListHash: commit.txListHash, - mixHash: ethers.constants.HashZero, - extraData: block.extraData, - gasLimit: block.gasLimit, - timestamp: 0, - commitSlot: commitSlot, - commitHeight: receipt.blockNumber as number, - }; - - const inputs = buildProposeBlockInputs(block, meta); - const txPromise = ( - await taikoL1.proposeBlock(inputs, { gasLimit: 500000 }) - ).wait(1); - await txShouldRevertWithCustomError( - txPromise, - - l1Provider, - "L1_METADATA_FIELD()" - ); - }); - - it("should revert with invalid gasLimit", async function () { - const block = await l2Provider.getBlock("latest"); - const config = await taikoL1.getConfig(); - const gasLimit = config.blockMaxGasLimit; - - const { tx, commit } = await commitBlock(taikoL1, block); - - const receipt = await tx.wait(1); - const meta: BlockMetadata = { - id: 0, - l1Height: 0, - l1Hash: ethers.constants.HashZero, - beneficiary: commit.beneficiary, - txListHash: commit.txListHash, - mixHash: ethers.constants.HashZero, - extraData: block.extraData, - gasLimit: gasLimit.add(1), - timestamp: 0, - commitSlot: 0, - commitHeight: receipt.blockNumber as number, - }; - - const inputs = buildProposeBlockInputs(block, meta); - - const txPromise = ( - await taikoL1.proposeBlock(inputs, { gasLimit: 250000 }) - ).wait(1); - await txShouldRevertWithCustomError( - txPromise, - l1Provider, - "L1_GAS_LIMIT()" - ); - }); - - it("should revert with invalid extraData", async function () { - const block = await l2Provider.getBlock("latest"); - const { tx, commit } = await commitBlock(taikoL1, block); - - const meta: BlockMetadata = { - id: 0, - l1Height: 0, - l1Hash: ethers.constants.HashZero, - beneficiary: commit.beneficiary, - txListHash: commit.txListHash, - mixHash: ethers.constants.HashZero, - extraData: ethers.utils.hexlify(ethers.utils.randomBytes(33)), // invalid extradata - gasLimit: block.gasLimit, - timestamp: 0, - commitSlot: 0, - commitHeight: tx.blockNumber as number, - }; - - const inputs = buildProposeBlockInputs(block, meta); - - const txPromise = ( - await taikoL1.proposeBlock(inputs, { gasLimit: 500000 }) - ).wait(1); - await txShouldRevertWithCustomError( - txPromise, - l1Provider, - "L1_EXTRA_DATA()" - ); - }); - - it("should commit and be able to propose", async function () { - await commitAndProposeLatestBlock(taikoL1, l1Signer, l2Provider, 0); - - const stateVariables = await taikoL1.getStateVariables(); - const nextBlockId = stateVariables.nextBlockId; - const proposedBlock = await taikoL1.getProposedBlock( - nextBlockId.sub(1) - ); - - expect(proposedBlock.metaHash).not.to.be.eq( - ethers.constants.HashZero - ); - expect(proposedBlock.proposer).not.to.be.eq( - ethers.constants.AddressZero - ); - expect(proposedBlock.proposedAt).not.to.be.eq(BigNumber.from(0)); - }); - - it("should commit and be able to propose for all available slots, then revert when all slots are taken", async function () { - // propose blocks and fill up maxNumBlocks number of slots, - // expect each one to be successful. - for (let i = 0; i < config.maxNumBlocks.toNumber() - 1; i++) { - await commitAndProposeLatestBlock( - taikoL1, - l1Signer, - l2Provider, - 0 - ); - - const stateVariables = await taikoL1.getStateVariables(); - const nextBlockId = stateVariables.nextBlockId; - const proposedBlock = await taikoL1.getProposedBlock( - nextBlockId.sub(1) - ); - - expect(proposedBlock.metaHash).not.to.be.eq( - ethers.constants.HashZero - ); - expect(proposedBlock.proposer).not.to.be.eq( - ethers.constants.AddressZero - ); - expect(proposedBlock.proposedAt).not.to.be.eq( - BigNumber.from(0) - ); - } - - // now expect another proposed block to be invalid since all slots are full and none have - // been proven. - const { commitConfirmations } = await taikoL1.getConfig(); - const block = await l2Provider.getBlock("latest"); - const { tx: commitBlockTx, commit } = await commitBlock( - taikoL1.connect(l1Signer), - block, - 0 - ); - const commitReceipt = await commitBlockTx.wait(1); - - for (let i = 0; i < commitConfirmations.toNumber() + 5; i++) { - await sendTinyEtherToZeroAddress(l1Signer); - } - - const meta: BlockMetadata = { - id: 0, - l1Height: 0, - l1Hash: ethers.constants.HashZero, - beneficiary: commit.beneficiary, - txListHash: commit.txListHash, - mixHash: ethers.constants.HashZero, - extraData: ethers.utils.hexlify(ethers.utils.randomBytes(32)), - gasLimit: block.gasLimit, - timestamp: 0, - commitSlot: 0, - commitHeight: commitReceipt.blockNumber, - }; - - await txShouldRevertWithCustomError( - ( - await taikoL1.proposeBlock( - buildProposeBlockInputs(block, meta), - { gasLimit: 500000 } - ) - ).wait(), - l1Provider, - "L1_TOO_MANY_BLOCKS()" - ); - }); - }); - - describe("getLatestSyncedHeader", function () { - it("iterates through blockHashHistory length and asserts getLatestSyncedHeader returns correct value", async function () { + describe("getXchainBlockHash(0)", function () { + it("iterates through maxNumVerifiedBlocks length and asserts getXchainBlockHash(0) returns correct value", async function () { l2Provider.on("block", blockListener(chan, genesisHeight)); let blocks: number = 0; - // iterate through blockHashHistory twice and try to get latest synced header each time. - // we modulo the header height by blockHashHistory in the protocol, so + // iterate through maxNumVerifiedBlocks twice and try to get latest synced header each time. + // we modulo the header height by maxNumVerifiedBlocks in the protocol, so // this test ensures that logic is sound. /* eslint-disable-next-line */ for await (const blockNumber of chan) { - if (blocks > config.blockHashHistory.toNumber() * 2 + 1) { + if (blocks > config.maxNumVerifiedBlocks.toNumber() * 2 + 1) { chan.close(); return; } - const { verifyEvent } = await commitProposeProveAndVerify( + const { verifyEvent } = await proposeProveAndVerify( taikoL1, l2Provider, blockNumber, @@ -431,7 +192,7 @@ describe("integration:TaikoL1", function () { expect(verifyEvent).not.to.be.undefined; - const header = await taikoL1.getLatestSyncedHeader(); + const header = await taikoL1.getXchainBlockHash(0); expect(header).to.be.eq(verifyEvent.args.blockHash); blocks++; } @@ -439,25 +200,6 @@ describe("integration:TaikoL1", function () { }); describe("proveBlock", function () { - it("reverts when inputs is incorrect length", async function () { - for (let i = 1; i <= 2; i++) { - const txPromise = ( - await taikoL1.proveBlock( - 1, - new Array(i).fill(ethers.constants.HashZero), - { - gasLimit: 1000000, - } - ) - ).wait(1); - await txShouldRevertWithCustomError( - txPromise, - l1Provider, - "L1_INPUT_SIZE()" - ); - } - }); - it("reverts when evidence meta id is not the same as the blockId", async function () { l2Provider.on("block", blockListener(chan, genesisHeight)); @@ -466,25 +208,23 @@ describe("integration:TaikoL1", function () { for await (const blockNumber of chan) { if ( blockNumber > - genesisHeight + config.maxNumBlocks.toNumber() - 1 + genesisHeight + config.maxNumProposedBlocks.toNumber() - 1 ) { break; } const block = await l2Provider.getBlock(blockNumber); - // commit and propose block, so our provers can prove it. - const { proposedEvent } = await proposer.commitThenProposeBlock( - block - ); + // propose block, so our provers can prove it. + const { proposedEvent } = await proposer.proposeBlock(block); const header = await getBlockHeader(l2Provider, blockNumber); const inputs = buildProveBlockInputs( proposedEvent.args.meta as any as BlockMetadata, header.blockHeader, - await prover.getSigner().getAddress(), - "0x", - "0x" + await prover.getSigner().getAddress() + // "0x", + // "0x" ); const txPromise = ( @@ -513,17 +253,15 @@ describe("integration:TaikoL1", function () { for await (const blockNumber of chan) { if ( blockNumber > - genesisHeight + config.maxNumBlocks.toNumber() - 1 + genesisHeight + config.maxNumProposedBlocks.toNumber() - 1 ) { break; } const block = await l2Provider.getBlock(blockNumber); - // commit and propose block, so our provers can prove it. - const { proposedEvent } = await proposer.commitThenProposeBlock( - block - ); + // propose block, so our provers can prove it. + const { proposedEvent } = await proposer.proposeBlock(block); const header = await getBlockHeader(l2Provider, blockNumber); const inputs = []; @@ -542,8 +280,8 @@ describe("integration:TaikoL1", function () { } inputs[0] = encodeEvidence(evidence); - inputs[1] = "0x"; - inputs[2] = "0x"; + // inputs[1] = "0x"; + // inputs[2] = "0x"; const txPromise = ( await taikoL1.proveBlock( diff --git a/packages/protocol/test/L1/TaikoL1.test.ts b/packages/protocol/test/L1/TaikoL1.test.ts index 1625adbad8d..c317dc123ea 100644 --- a/packages/protocol/test/L1/TaikoL1.test.ts +++ b/packages/protocol/test/L1/TaikoL1.test.ts @@ -16,39 +16,23 @@ describe("TaikoL1", function () { taikoL1 = await deployTaikoL1(addressManager, genesisHash, false); }); - describe("getLatestSyncedHeader()", async function () { + describe("getXchainBlockHash(0)", async function () { it("should be genesisHash because no headers have been synced", async function () { - const hash = await taikoL1.getLatestSyncedHeader(); + const hash = await taikoL1.getXchainBlockHash(0); expect(hash).to.be.eq(genesisHash); }); }); - describe("getSyncedHeader()", async function () { + describe("getXchainBlockHash()", async function () { it("should revert because header number has not been synced", async function () { - await expect(taikoL1.getSyncedHeader(1)).to.be.revertedWith( + await expect(taikoL1.getXchainBlockHash(1)).to.be.revertedWith( "L1_BLOCK_NUMBER()" ); }); it("should return appropraite hash for header", async function () { - const hash = await taikoL1.getSyncedHeader(0); + const hash = await taikoL1.getXchainBlockHash(0); expect(hash).to.be.eq(genesisHash); }); }); - - describe("proposeBlock()", async function () { - it("should revert when size of inputs is les than 2", async function () { - await expect( - taikoL1.proposeBlock([randomBytes32()]) - ).to.be.revertedWith("L1_INPUT_SIZE()"); - }); - }); - - describe("commitBlock()", async function () { - it("should revert when size of inputs is les than 2", async function () { - await expect( - taikoL1.proposeBlock([randomBytes32()]) - ).to.be.revertedWith("L1_INPUT_SIZE()"); - }); - }); }); diff --git a/packages/protocol/test/L1/TaikoToken.test.ts b/packages/protocol/test/L1/TaikoToken.test.ts index 103876510ab..003cc032eae 100644 --- a/packages/protocol/test/L1/TaikoToken.test.ts +++ b/packages/protocol/test/L1/TaikoToken.test.ts @@ -6,14 +6,14 @@ import { } from "../constants/errors"; import { BigNumber } from "ethers"; import deployTaikoToken from "../utils/taikoToken"; -import { TestTaikoToken } from "../../typechain/TestTaikoToken"; +import { TaikoToken } from "../../typechain/TaikoToken"; import deployAddressManager from "../utils/addressManager"; describe("TaikoToken", function () { let owner: any; let nonOwner: any; let protoBroker: any; - let token: TestTaikoToken; + let token: TaikoToken; let amountMinted: BigNumber; before(async function () { diff --git a/packages/protocol/test/L2/TaikoL2.test.ts b/packages/protocol/test/L2/TaikoL2.test.ts deleted file mode 100644 index f69d228a5cc..00000000000 --- a/packages/protocol/test/L2/TaikoL2.test.ts +++ /dev/null @@ -1,38 +0,0 @@ -import { expect } from "chai"; -import { ethers } from "hardhat"; -import { TaikoL2 } from "../../typechain"; -import deployAddressManager from "../utils/addressManager"; -import { randomBytes32 } from "../utils/bytes"; -import { deployTaikoL2 } from "../utils/taikoL2"; - -describe("TaikoL2", function () { - let taikoL2: TaikoL2; - - beforeEach(async function () { - const signer = (await ethers.getSigners())[0]; - const addressManager = await deployAddressManager(signer); - taikoL2 = await deployTaikoL2(signer, addressManager); - }); - - describe("anchor()", async function () { - it("should revert since ancestor hashes not written", async function () { - await expect( - taikoL2.anchor(Math.ceil(Math.random() * 1024), randomBytes32()) - ).to.be.revertedWith("L2_PUBLIC_INPUT_HASH_MISMATCH()"); - }); - }); - - describe("getLatestSyncedHeader()", async function () { - it("should be 0 because no headers have been synced", async function () { - const hash = await taikoL2.getLatestSyncedHeader(); - expect(hash).to.be.eq(ethers.constants.HashZero); - }); - }); - - describe("getSyncedHeader()", async function () { - it("should be 0 because header number has not been synced", async function () { - const hash = await taikoL2.getSyncedHeader(1); - expect(hash).to.be.eq(ethers.constants.HashZero); - }); - }); -}); diff --git a/packages/protocol/test/bridge/Bridge.integration.test.ts b/packages/protocol/test/bridge/Bridge.integration.test.ts index 86d1a880aea..c4f0a0d2cd1 100644 --- a/packages/protocol/test/bridge/Bridge.integration.test.ts +++ b/packages/protocol/test/bridge/Bridge.integration.test.ts @@ -7,7 +7,7 @@ import { Bridge, SignalService, TestBadReceiver, - TestHeaderSync, + TestXchainSync, } from "../../typechain"; import deployAddressManager from "../utils/addressManager"; import { @@ -25,7 +25,11 @@ import { getL2Provider, } from "../utils/provider"; import { Block, getBlockHeader } from "../utils/rpc"; -import { deploySignalService, getSignalProof } from "../utils/signal"; +import { + deploySignalService, + getSignalProof, + getSignalProofWithAccountProof, +} from "../utils/signal"; describe("integrationbridge:Bridge", function () { let owner: SignerWithAddress; @@ -40,8 +44,8 @@ describe("integrationbridge:Bridge", function () { let l1Bridge: Bridge; let l2Bridge: Bridge; let m: Message; - let l1HeaderSync: TestHeaderSync; - let l2HeaderSync: TestHeaderSync; + let l1XchainSync: TestXchainSync; + let l2XchainSync: TestXchainSync; beforeEach(async () => { [owner] = await ethers.getSigners(); @@ -85,6 +89,7 @@ describe("integrationbridge:Bridge", function () { enabledDestChainId )); + // TODO(): {ethers.utils.solidityPack(chainId, 'dao_vault') await addressManager.setAddress( `${enabledDestChainId}.signal_service`, l2SignalService.address @@ -116,21 +121,21 @@ describe("integrationbridge:Bridge", function () { .connect(l2Signer) .setAddress(`${srcChainId}.bridge`, l1Bridge.address); - l1HeaderSync = await (await ethers.getContractFactory("TestHeaderSync")) + l1XchainSync = await (await ethers.getContractFactory("TestXchainSync")) .connect(owner) .deploy(); await addressManager .connect(owner) - .setAddress(`${srcChainId}.taiko`, l1HeaderSync.address); + .setAddress(`${srcChainId}.taiko`, l1XchainSync.address); - l2HeaderSync = await (await ethers.getContractFactory("TestHeaderSync")) + l2XchainSync = await (await ethers.getContractFactory("TestXchainSync")) .connect(l2Signer) .deploy(); await l2AddressManager .connect(l2Signer) - .setAddress(`${enabledDestChainId}.taiko`, l2HeaderSync.address); + .setAddress(`${enabledDestChainId}.taiko`, l2XchainSync.address); m = { id: 1, @@ -217,7 +222,7 @@ describe("integrationbridge:Bridge", function () { it("should throw if messageStatus of message is != NEW", async function () { const { message, signalProof } = await sendAndProcessMessage( hre.ethers.provider, - l2HeaderSync, + l2XchainSync, m, l1SignalService, l1Bridge, @@ -244,9 +249,9 @@ describe("integrationbridge:Bridge", function () { hre.ethers.provider ); - await l2HeaderSync.setSyncedHeader(ethers.constants.HashZero); + await l2XchainSync.setXchainBlockHeader(ethers.constants.HashZero); - const signalProof = await getSignalProof( + const signalProof = await getSignalProofWithAccountProof( hre.ethers.provider, l1SignalService.address, await l1SignalService.getSignalSlot(l1Bridge.address, msgHash), @@ -282,7 +287,7 @@ describe("integrationbridge:Bridge", function () { hre.ethers.provider ); - await l2HeaderSync.setSyncedHeader(ethers.constants.HashZero); + await l2XchainSync.setXchainBlockHeader(ethers.constants.HashZero); const slot = await l1SignalService.getSignalSlot(sender, msgHash); @@ -297,7 +302,7 @@ describe("integrationbridge:Bridge", function () { "0x0000000000000000000000000000000000000000000000000000000000000001" ); - const signalProof = await getSignalProof( + const signalProof = await getSignalProofWithAccountProof( hre.ethers.provider, l1SignalService.address, slot, @@ -334,7 +339,7 @@ describe("integrationbridge:Bridge", function () { l2Bridge, msgHash, hre.ethers.provider, - l2HeaderSync, + l2XchainSync, message )) ).to.emit(l2Bridge, "MessageStatusChanged"); @@ -396,7 +401,7 @@ describe("integrationbridge:Bridge", function () { hre.ethers.provider ); - await l2HeaderSync.setSyncedHeader(block.hash); + await l2XchainSync.setXchainBlockHeader(block.hash); // get storageValue for the key const storageValue = await ethers.provider.getStorageAt( @@ -409,7 +414,7 @@ describe("integrationbridge:Bridge", function () { "0x0000000000000000000000000000000000000000000000000000000000000001" ); - const signalProof = await getSignalProof( + const { signalProof, signalRoot } = await getSignalProof( hre.ethers.provider, l1SignalService.address, slot, @@ -417,6 +422,8 @@ describe("integrationbridge:Bridge", function () { blockHeader ); + await l2XchainSync.setXchainSignalRoot(signalRoot); + await expect( l2Bridge.isMessageReceived(msgHash, srcChainId, signalProof) ).to.be.reverted; @@ -433,7 +440,7 @@ describe("integrationbridge:Bridge", function () { hre.ethers.provider ); - await l2HeaderSync.setSyncedHeader(block.hash); + await l2XchainSync.setXchainBlockHeader(block.hash); // get storageValue for the key const storageValue = await ethers.provider.getStorageAt( @@ -446,13 +453,14 @@ describe("integrationbridge:Bridge", function () { "0x0000000000000000000000000000000000000000000000000000000000000001" ); - const signalProof = await getSignalProof( + const { signalProof, signalRoot } = await getSignalProof( hre.ethers.provider, l1SignalService.address, slot, block.number, blockHeader ); + await l2XchainSync.setXchainSignalRoot(signalRoot); expect( await l2Bridge.isMessageReceived( @@ -544,7 +552,7 @@ describe("integrationbridge:Bridge", function () { l1Bridge, msgHash, l2Provider, - l1HeaderSync, + l1XchainSync, message ); expect(messageStatusChangedEvent.args.msgHash).to.be.eq(msgHash); @@ -564,7 +572,7 @@ describe("integrationbridge:Bridge", function () { const slot = await l1Bridge.getMessageStatusSlot(msgHash); - const signalProof = await getSignalProof( + const signalProof = await getSignalProofWithAccountProof( l1Provider, l1Bridge.address, slot, @@ -613,7 +621,7 @@ describe("integrationbridge:Bridge", function () { l1Bridge, msgHash, l2Provider, - l1HeaderSync, + l1XchainSync, message ); expect(messageStatusChangedEvent.args.msgHash).to.be.eq(msgHash); @@ -631,11 +639,11 @@ describe("integrationbridge:Bridge", function () { const { block, blockHeader } = await getBlockHeader(l1Provider); - await l2HeaderSync.setSyncedHeader(block.hash); + await l2XchainSync.setXchainBlockHeader(block.hash); const slot = await l1Bridge.getMessageStatusSlot(msgHash); - const signalProof = await getSignalProof( + const signalProof = await getSignalProofWithAccountProof( l1Provider, l1Bridge.address, slot, diff --git a/packages/protocol/test/genesis/generate_genesis.test.ts b/packages/protocol/test/genesis/generate_genesis.test.ts index 654f33335ef..93e49bd578d 100644 --- a/packages/protocol/test/genesis/generate_genesis.test.ts +++ b/packages/protocol/test/genesis/generate_genesis.test.ts @@ -142,104 +142,6 @@ action("Generate Genesis", function () { ); }); - it("LibTxDecoder", async function () { - const TaikoL2Alloc = getContractAlloc("TaikoL2"); - const TaikoL2 = new hre.ethers.Contract( - TaikoL2Alloc.address, - require("../../artifacts/contracts/L2/TaikoL2.sol/TaikoL2.json").abi, - signer - ); - const config = await TaikoL2.getConfig(); - const LibTxDecoderAlloc = getContractAlloc("LibTxDecoder"); - - const LibTxDecoder = new hre.ethers.Contract( - LibTxDecoderAlloc.address, - require("../../artifacts/contracts/libs/LibTxDecoder.sol/LibTxDecoder.json").abi, - signer - ); - - const decoded = await LibTxDecoder.callStatic.decodeTxList( - config.chainId, - ethers.utils.RLP.encode([]) - ); - - expect(decoded.items.length).to.be.eql(0); - }); - - it("TaikoL2", async function () { - const TaikoL2Alloc = getContractAlloc("TaikoL2"); - - const TaikoL2 = new hre.ethers.Contract( - TaikoL2Alloc.address, - require("../../artifacts/contracts/L2/TaikoL2.sol/TaikoL2.json").abi, - signer - ); - - let latestL1Height = 1; - for (let i = 0; i < 300; i++) { - const tx = await TaikoL2.anchor( - latestL1Height++, - ethers.utils.hexlify(ethers.utils.randomBytes(32)), - { gasLimit: 1000000 } - ); - - const receipt = await tx.wait(); - - expect(receipt.status).to.be.equal(1); - - if (i === 299) { - console.log({ - message: "TaikoL2.anchor gas cost after 256 L2 blocks", - gasUsed: receipt.gasUsed, - }); - } - } - - const [bytes, txNums] = await generateMaxSizeInvalidTxList(TaikoL2); - - const taikoL2WithGoldenTouchSigner = new hre.ethers.Contract( - TaikoL2Alloc.address, - require("../../artifacts/contracts/L2/TaikoL2.sol/TaikoL2.json").abi, - new hre.ethers.Wallet( - "92954368afd3caa1f3ce3ead0069c1af414054aefe1ef9aeacc1bf426222ce38", - provider - ) - ); - - const tx = await taikoL2WithGoldenTouchSigner.invalidateBlock( - bytes, - 1, // hint: TX_INVALID_SIG - 0, - { gasPrice: 0 } - ); - - const receipt = await tx.wait(); - - expect(receipt.status).to.be.equal(1); - - console.log({ - message: "TaikoL2.invalidateBlock gas cost after 256 L2 blocks", - TxListBytes: ethers.utils.arrayify(bytes).length, - txNums, - hint: "TX_INVALID_SIG", - gasUsed: receipt.gasUsed, - }); - - const txPromise = ( - await TaikoL2.invalidateBlock( - bytes, - 1, // hint: TX_INVALID_SIG - 0, - { gasLimit: 500000 } - ) - ).wait(1); - await txShouldRevertWithCustomError( - txPromise, - provider, - "L2_INVALID_SENDER()" - ); - }); - it("Bridge", async function () { const BridgeAlloc = getContractAlloc("Bridge"); const Bridge = new hre.ethers.Contract( @@ -416,51 +318,6 @@ action("Generate Genesis", function () { } }); -async function generateMaxSizeInvalidTxList(TaikoL2: any) { - const config = await TaikoL2.getConfig(); - - const chainId = config.chainId; - const maxTransactionsPerBlock = config.maxTransactionsPerBlock; - const maxBytesPerTxList = config.maxBytesPerTxList; - - const tx = { - type: 2, - chainId, - nonce: Math.ceil(Math.random() * 1024), - to: ethers.Wallet.createRandom().address, - value: ethers.utils.parseEther("1024"), - maxPriorityFeePerGas: Math.ceil(Math.random() * 1024000), - maxFeePerGas: Math.ceil(Math.random() * 1024000), - gasLimit: Math.ceil(Math.random() * 1024000), - accessList: [], - data: ethers.utils.randomBytes( - Math.floor(maxBytesPerTxList / maxTransactionsPerBlock) - ), - }; - - const invalidSig = { - v: 75, - r: "0xb14e3f5eab11cd2c459b04a91a9db8bd6f5acccfbd830c9693c84f8d21187eef", - s: "0x5cf4b3b2b3957e7016366d180493c2c226ea8ad12aed7faddbc0ce3a6789256d", - }; - - const txs = new Array(maxTransactionsPerBlock).fill(tx); - - let txListBytes = ethers.utils.RLP.encode( - txs.map((tx) => ethers.utils.serializeTransaction(tx, invalidSig)) - ); - - while (ethers.utils.arrayify(txListBytes).length > maxBytesPerTxList) { - txs[0] = Object.assign(txs[0], { data: txs[0].data.slice(10) }); - - txListBytes = ethers.utils.RLP.encode( - txs.map((tx) => ethers.utils.serializeTransaction(tx, invalidSig)) - ); - } - - return [txListBytes, txs.length]; -} - function sleep(ms: number) { return new Promise((resolve) => { setTimeout(resolve, ms); diff --git a/packages/protocol/test/libs/LibAnchorSignature.test.ts b/packages/protocol/test/libs/LibAnchorSignature.test.ts deleted file mode 100644 index ae779a46ad3..00000000000 --- a/packages/protocol/test/libs/LibAnchorSignature.test.ts +++ /dev/null @@ -1,46 +0,0 @@ -import { expect } from "chai"; -import { UnsignedTransaction } from "ethers"; -import { ethers } from "hardhat"; - -describe("LibAnchorSignature", function () { - const unsignedLegacyTx: UnsignedTransaction = { - type: 0, - chainId: Math.floor(Math.random() * 1024), - nonce: Math.floor(Math.random() * 1024), - gasPrice: randomBigInt(), - gasLimit: randomBigInt(), - to: ethers.Wallet.createRandom().address, - value: randomBigInt(), - data: ethers.utils.randomBytes(32), - }; - - it("should calculate correct signature values", async function () { - const libAnchorSignature: any = await ( - await ethers.getContractFactory("TestLibAnchorSignature") - ).deploy(); - - const validKs = [1, 2]; - - for (const k of validKs) { - const hash = ethers.utils.keccak256( - ethers.utils.serializeTransaction(unsignedLegacyTx) - ); - - const [v, r, s] = await libAnchorSignature.signTransaction(hash, k); - - const [addr] = await libAnchorSignature.goldenTouchAddress(); - expect( - await libAnchorSignature.recover( - hash, - v + 27, - ethers.utils.hexZeroPad(r, 32), - ethers.utils.hexZeroPad(s, 32) - ) - ).to.be.equal(addr); - } - }); - - function randomBigInt() { - return ethers.BigNumber.from(ethers.utils.randomBytes(32)); - } -}); diff --git a/packages/protocol/test/libs/LibReceiptDecoder.test.ts b/packages/protocol/test/libs/LibReceiptDecoder.test.ts deleted file mode 100644 index 137df93683f..00000000000 --- a/packages/protocol/test/libs/LibReceiptDecoder.test.ts +++ /dev/null @@ -1,83 +0,0 @@ -import { expect } from "chai"; -// eslint-disable-next-line import/no-named-default -import { default as hre, ethers } from "hardhat"; - -describe("integration:LibReceiptDecoder", function () { - let libReceiptDecoder: any; - - before(async function () { - if (hre.network.name === "hardhat") { - throw new Error( - `hardhat: debug_getRawReceipts - Method not supported` - ); - } - - const baseLibReceiptDecoder = await ( - await ethers.getContractFactory("LibReceiptDecoder") - ).deploy(); - - libReceiptDecoder = await ( - await ethers.getContractFactory("TestLibReceiptDecoder", { - libraries: { - LibReceiptDecoder: baseLibReceiptDecoder.address, - }, - }) - ).deploy(); - }); - - it("should decode RLP encoded transaction receipts", async function () { - for (const txType of [0, 1, 2]) { - const { maxFeePerGas, gasPrice } = - await hre.ethers.provider.getFeeData(); - - let txOptions = {}; - - if (txType === 0) txOptions = { gasPrice }; - else if (txType === 1) txOptions = { gasPrice, accessList: [] }; - else txOptions = { maxFeePerGas }; - - const tx = await libReceiptDecoder.emitTestEvent( - ethers.BigNumber.from(ethers.utils.randomBytes(32)), - ethers.utils.randomBytes(32), - txOptions - ); - - expect(tx.type).to.be.equal(txType); - - const expectedReceipt = await tx.wait(); - - // Retrieves the RLP-encoded raw receipts from node - const [encodedReceipt] = await hre.ethers.provider.send( - "debug_getRawReceipts", - [tx.blockHash] - ); - - const receipt = await libReceiptDecoder.decodeReceipt( - encodedReceipt - ); - - // Status - expect(receipt.status).to.be.equal(expectedReceipt.status); - // CumulativeGasUsed - expect(receipt.cumulativeGasUsed).to.be.equal( - expectedReceipt.cumulativeGasUsed - ); - // LogsBloom - expect( - `0x${receipt.logsBloom.map((s: any) => s.slice(2)).join("")}` - ).to.be.equal(expectedReceipt.logsBloom); - // Logs - expect(receipt.logs.length).to.be.equal( - expectedReceipt.logs.length - ); - for (let i = 0; i < receipt.logs.length; i++) { - const log = receipt.logs[i]; - const expectedLog = expectedReceipt.logs[i]; - - expect(log.contractAddress).to.be.equal(expectedLog.address); - expect(log.topics).to.be.eql(expectedLog.topics); - expect(log.data).to.be.equal(expectedLog.data); - } - } - }); -}); diff --git a/packages/protocol/test/libs/LibTrieProof.test.ts b/packages/protocol/test/libs/LibTrieProof.test.ts index 097b339d751..b3c7717f4b5 100644 --- a/packages/protocol/test/libs/LibTrieProof.test.ts +++ b/packages/protocol/test/libs/LibTrieProof.test.ts @@ -114,11 +114,14 @@ describe("integration:LibTrieProof", function () { // use this instead of ethers.provider.getBlock() beccause it doesnt have stateRoot // in the response - const block: { stateRoot: string; number: string; hash: string } = - await ethers.provider.send("eth_getBlockByNumber", [ - "latest", - false, - ]); + const block: { + stateRoot: string; + number: string; + hash: string; + } = await ethers.provider.send("eth_getBlockByNumber", [ + "latest", + false, + ]); // get storageValue for the slot const storageValue = await ethers.provider.getStorageAt( @@ -136,23 +139,12 @@ describe("integration:LibTrieProof", function () { [signalService.address, [slot], block.hash] ); - const stateRoot = block.stateRoot; - - // RLP encode the proof together for LibTrieProof to decode - const encodedProof = ethers.utils.defaultAbiCoder.encode( - ["bytes", "bytes"], - [ - RLP.encode(proof.accountProof), - RLP.encode(proof.storageProof[0].proof), - ] - ); // proof verifies the storageValue at slot is 1 await testLibTrieProof.verify( - stateRoot, - signalService.address, slot, "0x0000000000000000000000000000000000000000000000000000000000000001", - encodedProof + RLP.encode(proof.storageProof[0].proof), + proof.storageHash ); }); }); diff --git a/packages/protocol/test/libs/LibTxDecoder.test.ts b/packages/protocol/test/libs/LibTxDecoder.test.ts deleted file mode 100644 index 2e70cf3f3ac..00000000000 --- a/packages/protocol/test/libs/LibTxDecoder.test.ts +++ /dev/null @@ -1,220 +0,0 @@ -import { expect } from "chai"; -import { UnsignedTransaction } from "ethers"; -import { ethers } from "hardhat"; -import * as log from "../../tasks/log"; - -describe("LibTxDecoder", function () { - let rlpWriter: any; - let libTxDecoder: any; - let signer0: any; - - const chainId = 167; - - before(async function () { - rlpWriter = await ( - await ethers.getContractFactory("TestLibRLPWriter") - ).deploy(); - libTxDecoder = await ( - await ethers.getContractFactory("LibTxDecoder") - ).deploy(); - - signer0 = (await ethers.getSigners())[0]; - }); - - async function rlpEncodeTxList(txList: string[]) { - const rlpEncodedBytes = []; - for (const tx of txList) { - const txRlp = await rlpWriter.writeBytes(tx); - rlpEncodedBytes.push(txRlp); - } - const txListBytes = await rlpWriter.writeList(rlpEncodedBytes); - return txListBytes; - } - - describe("decodeTxList", function () { - it("should not revert if tx list is empty", async function () { - const txList: string[] = []; - const txListBytes = await rlpEncodeTxList(txList); - - let decoded = await libTxDecoder.callStatic.decodeTxList( - chainId, - txListBytes - ); - - expect(decoded.items.length).to.be.eql(0); - decoded = await libTxDecoder.callStatic.decodeTxList(chainId, []); - expect(decoded.items.length).to.be.eql(0); - }); - - it("should revert with random bytes", async function () { - const randomBytes = ethers.utils.hexlify( - ethers.utils.randomBytes(73) - ); - - await expect( - libTxDecoder.callStatic.decodeTxList(chainId, randomBytes) - ).to.be.reverted; - }); - - it("can decode txList with legacy transaction", async function () { - const txLegacy: UnsignedTransaction = { - nonce: 1, - chainId: chainId, - gasPrice: 11e9, - gasLimit: 123456, - to: ethers.Wallet.createRandom().address, - value: ethers.utils.parseEther("1.23"), - data: ethers.utils.randomBytes(10), - }; - - const signature = await signer0.signMessage("abc123"); - // log.debug('signature: ', signature) - - const txLegacyBytes = ethers.utils.serializeTransaction( - txLegacy, - signature - ); - log.debug("txLegacyBytes: ", txLegacyBytes); - const txListBytes = await rlpEncodeTxList([txLegacyBytes]); - log.debug("txListBytes: ", txListBytes); - - const decodedTxList = await libTxDecoder.callStatic.decodeTxList( - chainId, - txListBytes - ); - // log.debug('decodedT: ', decodedTxList) - expect(decodedTxList.items.length).to.equal(1); - const decodedTx1 = decodedTxList.items[0]; - expect(decodedTx1.gasLimit.toNumber()).to.equal(txLegacy.gasLimit); - }); - - it("can decode txList with 2930 transaction", async function () { - const tx2930: UnsignedTransaction = { - type: 1, - chainId: 12345, - nonce: 123, - gasPrice: 11e9, - gasLimit: 123, - to: ethers.Wallet.createRandom().address, - value: ethers.utils.parseEther("10.23"), - accessList: [], - data: ethers.utils.randomBytes(20), - }; - - const signature = await signer0.signMessage( - tx2930.data?.toString() - ); - log.debug("signature: ", signature); - - const txBytes = ethers.utils.serializeTransaction( - tx2930, - signature - ); - log.debug("txBytes: ", txBytes); - const txListBytes = await rlpEncodeTxList([txBytes]); - log.debug("txListBytes: ", txListBytes); - - const decodedTxList = await libTxDecoder.callStatic.decodeTxList( - chainId, - txListBytes - ); - expect(decodedTxList.items.length).to.equal(1); - const decodedTx1 = decodedTxList.items[0]; - expect(decodedTx1.gasLimit.toNumber()).to.equal(tx2930.gasLimit); - }); - - it("can decode txList with 1559 transaction", async function () { - const tx1559: UnsignedTransaction = { - type: 2, - chainId: 12345, - nonce: 123, - maxPriorityFeePerGas: 2e9, - maxFeePerGas: 22e9, - gasLimit: 1234567, - to: ethers.Wallet.createRandom().address, - value: ethers.utils.parseEther("10.123"), - accessList: [], - data: ethers.utils.randomBytes(20), - }; - - const signature = await signer0.signMessage( - tx1559.data?.toString() - ); - log.debug("signature: ", signature); - - const txBytes = ethers.utils.serializeTransaction( - tx1559, - signature - ); - log.debug("txBytes: ", txBytes); - const txListBytes = await rlpEncodeTxList([txBytes]); - log.debug("txListBytes: ", txListBytes); - - const decodedTxList = await libTxDecoder.callStatic.decodeTxList( - chainId, - txListBytes - ); - expect(decodedTxList.items.length).to.equal(1); - const decodedTx1 = decodedTxList.items[0]; - expect(decodedTx1.gasLimit.toNumber()).to.equal(tx1559.gasLimit); - }); - }); - - it("can decode txList with multiple types", async function () { - const signature = await signer0.signMessage("123456abcdef"); - const txLegacy: UnsignedTransaction = { - nonce: 1, - chainId: chainId, - gasPrice: 11e9, - gasLimit: 123456, - to: ethers.Wallet.createRandom().address, - value: ethers.utils.parseEther("1.23"), - data: ethers.utils.randomBytes(10), - }; - - const tx2930: UnsignedTransaction = { - type: 1, - chainId: 12345, - nonce: 123, - gasPrice: 11e9, - gasLimit: 123, - to: ethers.Wallet.createRandom().address, - value: ethers.utils.parseEther("10.23"), - accessList: [], - data: ethers.utils.randomBytes(20), - }; - - const tx1559: UnsignedTransaction = { - type: 2, - chainId: 12345, - nonce: 123, - maxPriorityFeePerGas: 2e9, - maxFeePerGas: 22e9, - gasLimit: 1234567, - to: ethers.Wallet.createRandom().address, - value: ethers.utils.parseEther("10.123"), - accessList: [], - data: ethers.utils.randomBytes(20), - }; - - const txObjArr = [txLegacy, tx2930, tx1559]; - const txRawBytesArr = []; - for (const txObj of txObjArr) { - const txBytes = ethers.utils.serializeTransaction(txObj, signature); - txRawBytesArr.push(txBytes); - } - const txListBytes = await rlpEncodeTxList(txRawBytesArr); - - const decodedTxList = await libTxDecoder.callStatic.decodeTxList( - chainId, - txListBytes - ); - // log.debug('decodedT: ', decodedTxList) - expect(decodedTxList.items.length).to.equal(txObjArr.length); - for (let i = 0; i < txObjArr.length; i++) { - const txObj = txObjArr[i]; - const decodedTx = decodedTxList.items[i]; - expect(decodedTx.gasLimit.toNumber()).to.equal(txObj.gasLimit); - } - }); -}); diff --git a/packages/protocol/test/libs/LibTxUtils.test.ts b/packages/protocol/test/libs/LibTxUtils.test.ts deleted file mode 100644 index 88285dd5c01..00000000000 --- a/packages/protocol/test/libs/LibTxUtils.test.ts +++ /dev/null @@ -1,200 +0,0 @@ -import { expect } from "chai"; -import { UnsignedTransaction } from "ethers"; -import { ethers } from "hardhat"; - -describe("LibTxUtils", function () { - let libTxUtils: any; - let libRLPWriter: any; - let libRLPReader: any; - let testUnsignedTxs: Array; - const chainId = 167; - - const signingKey = new ethers.utils.SigningKey( - ethers.utils.randomBytes(32) - ); - const signerAddress = new ethers.Wallet(signingKey.privateKey).address; - - before(async function () { - libTxUtils = await ( - await ethers.getContractFactory("TestLibTxUtils") - ).deploy(); - - libRLPReader = await ( - await ethers.getContractFactory("TestLibRLPReader") - ).deploy(); - - libRLPWriter = await ( - await ethers.getContractFactory("TestLibRLPWriter") - ).deploy(); - - const unsignedLegacyTx: UnsignedTransaction = { - type: 0, - // if chainId is defined, ether.js will automatically use EIP-155 - // signature - chainId, - nonce: Math.floor(Math.random() * 1024), - gasPrice: randomBigInt(), - gasLimit: randomBigInt(), - to: ethers.Wallet.createRandom().address, - value: randomBigInt(), - data: ethers.utils.randomBytes(32), - }; - - const unsigned2930Tx: UnsignedTransaction = { - type: 1, - chainId, - nonce: Math.floor(Math.random() * 1024), - gasPrice: randomBigInt(), - gasLimit: randomBigInt(), - to: ethers.Wallet.createRandom().address, - value: randomBigInt(), - accessList: [ - [ - ethers.Wallet.createRandom().address, - [ethers.utils.hexlify(ethers.utils.randomBytes(32))], - ], - ], - data: ethers.utils.randomBytes(32), - }; - - const unsigned1559Tx: UnsignedTransaction = { - type: 2, - chainId, - nonce: Math.floor(Math.random() * 1024), - maxPriorityFeePerGas: randomBigInt(), - maxFeePerGas: randomBigInt(), - gasLimit: randomBigInt(), - to: ethers.Wallet.createRandom().address, - value: randomBigInt(), - accessList: [ - [ - ethers.Wallet.createRandom().address, - [ethers.utils.hexlify(ethers.utils.randomBytes(32))], - ], - ], - data: ethers.utils.randomBytes(32), - }; - - testUnsignedTxs = [unsignedLegacyTx, unsigned2930Tx, unsigned1559Tx]; - }); - - it("should hash the unsigned tx payloads correctly", async function () { - for (const unsignedTx of testUnsignedTxs) { - const expectedHash = ethers.utils.keccak256( - ethers.utils.serializeTransaction(unsignedTx) - ); - - const signature = signingKey.signDigest(expectedHash); - - const hash = await libTxUtils.hashUnsignedTx( - chainId, - - { - txType: unsignedTx.type, - destination: unsignedTx.to, - data: unsignedTx.data, - gasLimit: unsignedTx.gasLimit, - v: signature.v, - r: signature.r, - s: signature.s, - txData: ethers.utils.serializeTransaction( - unsignedTx, - signature - ), - } - ); - - expect(hash).to.be.equal(expectedHash); - } - }); - - it("should verify valid transaction signatures", async function () { - for (const unsignedTx of testUnsignedTxs) { - const expectedHash = ethers.utils.keccak256( - ethers.utils.serializeTransaction(unsignedTx) - ); - const signature = signingKey.signDigest(expectedHash); - - expect( - await libTxUtils.recoverSender(chainId, { - txType: unsignedTx.type, - destination: unsignedTx.to, - data: unsignedTx.data, - gasLimit: unsignedTx.gasLimit, - v: signature.v - 27, - r: signature.r, - s: signature.s, - txData: ethers.utils.serializeTransaction( - unsignedTx, - signature - ), - }) - ).to.be.equal(signerAddress); - } - }); - - it("should verify invalid transaction signatures", async function () { - for (const unsignedTx of testUnsignedTxs) { - const expectedHash = ethers.utils.keccak256( - ethers.utils.serializeTransaction(unsignedTx) - ); - const signature = signingKey.signDigest(expectedHash); - - const invalidSignature = { - v: 75, - r: "0xb14e3f5eab11cd2c459b04a91a9db8bd6f5acccfbd830c9693c84f8d21187eef", - s: "0x5cf4b3b2b3957e7016366d180493c2c226ea8ad12aed7faddbc0ce3a6789256d", - }; - - const txData = await changeSignature( - unsignedTx.type, - ethers.utils.arrayify( - ethers.utils.serializeTransaction(unsignedTx, signature) - ), - invalidSignature - ); - - expect( - await libTxUtils.recoverSender(chainId, { - txType: unsignedTx.type, - destination: unsignedTx.to, - data: unsignedTx.data, - gasLimit: unsignedTx.gasLimit, - v: invalidSignature.v, - r: invalidSignature.r, - s: invalidSignature.s, - txData, - }) - ).to.be.equal(ethers.constants.AddressZero); - } - }); - - async function changeSignature( - type: any, - encoded: Uint8Array, - signature: any - ) { - if (type !== 0) encoded = encoded.slice(1); - - const rlpItemsList = (await libRLPReader.readList(encoded)).slice( - 0, - -3 - ); - - let result = await libRLPWriter.writeList( - rlpItemsList.concat([ - await libRLPWriter.writeUint(signature.v), - await libRLPWriter.writeBytes(signature.r), - await libRLPWriter.writeBytes(signature.s), - ]) - ); - - if (type !== 0) result = ethers.utils.concat([[type], result]); - - return ethers.utils.hexlify(result); - } - - function randomBigInt() { - return ethers.BigNumber.from(ethers.utils.randomBytes(32)); - } -}); diff --git a/packages/protocol/test/libs/LibZKP.test.ts b/packages/protocol/test/libs/LibZKP.test.ts deleted file mode 100644 index 00faddf299a..00000000000 --- a/packages/protocol/test/libs/LibZKP.test.ts +++ /dev/null @@ -1,62 +0,0 @@ -// eslint-disable-next-line import/no-named-default -import { expect } from "chai"; -import hre, { ethers } from "hardhat"; -import * as utils from "../../tasks/utils"; -const testProof = require("../data/test_proof.json"); - -describe("LibZKP", function () { - let libZKP: any; - let plonkVerifierAddress: any; - before(async function () { - libZKP = await (await ethers.getContractFactory("TestLibZKP")).deploy(); - plonkVerifierAddress = await utils.deployBytecode( - hre, - utils.compileYulContract( - "../contracts/libs/yul/PlonkVerifier_10_txs.yulp" - ), - "PlonkVerifier_10_txs" - ); - }); - - it("should successfully verifiy the given zkp and instance", async function () { - const result = await libZKP.verify( - plonkVerifierAddress, - testProof.result.circuit.proof, - ethers.utils.hexConcat([ - testProof.result.circuit.instance[0], - testProof.result.circuit.instance[1], - ]) - ); - - expect(result).to.be.true; - }); - - it("should not successfully verifiy the given zkp and instance when the given contract address is not PlonkVerifier", async function () { - // random EOA address - let result = await libZKP.verify( - ethers.Wallet.createRandom().address, - testProof.result.circuit.proof, - ethers.utils.hexConcat([ - testProof.result.circuit.instance[0], - testProof.result.circuit.instance[1], - ]) - ); - - expect(result).to.be.false; - - // another smart contract - const testERC20 = await utils.deployContract(hre, "TestERC20", {}, [ - 1024, - ]); - result = await libZKP.verify( - testERC20.address, - testProof.result.circuit.proof, - ethers.utils.hexConcat([ - testProof.result.circuit.instance[0], - testProof.result.circuit.instance[1], - ]) - ); - - expect(result).to.be.false; - }); -}); diff --git a/packages/protocol/test/signal/SignalService.integration.test.ts b/packages/protocol/test/signal/SignalService.integration.test.ts index 0d527a020b2..9a01fdad528 100644 --- a/packages/protocol/test/signal/SignalService.integration.test.ts +++ b/packages/protocol/test/signal/SignalService.integration.test.ts @@ -1,6 +1,6 @@ import { expect } from "chai"; import { ethers } from "hardhat"; -import { TestHeaderSync } from "../../typechain"; +import { TestXchainSync } from "../../typechain"; import { deploySignalService, getSignalProof } from "../utils/signal"; import deployAddressManager from "../utils/addressManager"; import { getBlockHeader } from "../utils/rpc"; @@ -54,15 +54,15 @@ describe("integration:SignalService", function () { l1SignalService.address ); - const headerSync: TestHeaderSync = await ( - await ethers.getContractFactory("TestHeaderSync") + const xchainSync: TestXchainSync = await ( + await ethers.getContractFactory("TestXchainSync") ) .connect(l2Signer) .deploy(); await l2AddressManager.setAddress( `${enabledDestChainId}.taiko`, - headerSync.address + xchainSync.address ); return { @@ -72,7 +72,7 @@ describe("integration:SignalService", function () { l2SignalService, srcChainId, enabledDestChainId, - headerSync, + xchainSync, }; } @@ -83,7 +83,7 @@ describe("integration:SignalService", function () { l1SignalService, l2SignalService, enabledDestChainId, - headerSync, + xchainSync, } = await deployIntegrationSignalService(); const signal = ethers.utils.hexlify(ethers.utils.randomBytes(32)); @@ -95,7 +95,7 @@ describe("integration:SignalService", function () { const slot = await l1SignalService.getSignalSlot(app, signal); const { block, blockHeader } = await getBlockHeader(l1Provider); - await headerSync.setSyncedHeader(block.hash); + await xchainSync.setXchainBlockHeader(block.hash); const signalProof = await getSignalProof( l1Provider, @@ -110,7 +110,7 @@ describe("integration:SignalService", function () { enabledDestChainId, app, signal, - signalProof + signalProof.signalProof ) ).to.be.revertedWith("B_WRONG_CHAIN_ID()"); }); @@ -122,7 +122,7 @@ describe("integration:SignalService", function () { l1SignalService, l2SignalService, srcChainId, - headerSync, + xchainSync, } = await deployIntegrationSignalService(); const signal = ethers.utils.hexlify(ethers.utils.randomBytes(32)); @@ -134,7 +134,7 @@ describe("integration:SignalService", function () { const slot = await l1SignalService.getSignalSlot(app, signal); const { block, blockHeader } = await getBlockHeader(l1Provider); - await headerSync.setSyncedHeader(block.hash); + await xchainSync.setXchainBlockHeader(block.hash); const signalProof = await getSignalProof( l1Provider, @@ -149,7 +149,7 @@ describe("integration:SignalService", function () { srcChainId, app, signal, - signalProof + signalProof.signalProof ) ).to.be.revertedWith("B_NULL_APP_ADDR()"); }); @@ -161,7 +161,7 @@ describe("integration:SignalService", function () { l1SignalService, l2SignalService, srcChainId, - headerSync, + xchainSync, } = await deployIntegrationSignalService(); const signal = ethers.utils.hexlify(ethers.utils.randomBytes(32)); @@ -173,7 +173,7 @@ describe("integration:SignalService", function () { const slot = await l1SignalService.getSignalSlot(app, signal); const { block, blockHeader } = await getBlockHeader(l1Provider); - await headerSync.setSyncedHeader(block.hash); + await xchainSync.setXchainBlockHeader(block.hash); const signalProof = await getSignalProof( l1Provider, @@ -188,7 +188,7 @@ describe("integration:SignalService", function () { srcChainId, app, ethers.constants.HashZero, - signalProof + signalProof.signalProof ) ).to.be.revertedWith("B_ZERO_SIGNAL()"); }); @@ -200,7 +200,7 @@ describe("integration:SignalService", function () { l1SignalService, l2SignalService, srcChainId, - headerSync, + xchainSync, } = await deployIntegrationSignalService(); const signal = ethers.utils.hexlify(ethers.utils.randomBytes(32)); @@ -213,26 +213,10 @@ describe("integration:SignalService", function () { const { block, blockHeader } = await getBlockHeader(l1Provider); - const failProof = await getSignalProof( - l1Provider, - l1SignalService.address, - slot, - block.number, - blockHeader - ); - // should return false since header has not been synced yet. - expect( - await l2SignalService.isSignalReceived( - srcChainId, - app, - signal, - failProof - ) - ).to.be.equal(false); - - await headerSync.setSyncedHeader(block.hash); + console.log(blockHeader); + await xchainSync.setXchainBlockHeader(block.hash); - const signalProof = await getSignalProof( + const { signalProof, signalRoot } = await getSignalProof( l1Provider, l1SignalService.address, slot, @@ -240,6 +224,8 @@ describe("integration:SignalService", function () { blockHeader ); + await xchainSync.setXchainSignalRoot(signalRoot); + expect( await l2SignalService.isSignalReceived( srcChainId, diff --git a/packages/protocol/test/thirdparty/LibBlockHeaderDecoder.test.ts b/packages/protocol/test/thirdparty/LibBlockHeaderDecoder.test.ts deleted file mode 100644 index 865dd00a96d..00000000000 --- a/packages/protocol/test/thirdparty/LibBlockHeaderDecoder.test.ts +++ /dev/null @@ -1,169 +0,0 @@ -// eslint-disable-next-line no-unused-vars -import { expect } from "chai"; -import { keccak256 } from "ethers/lib/utils"; -import { LibBlockHeaderDecoder, TestLibBlockHeader } from "../../typechain"; -const hre = require("hardhat"); -const ethers = hre.ethers; -const EBN = ethers.BigNumber; - -describe("LibBlockHeaderDecoder", async function () { - // eslint-disable-next-line no-unused-vars - let blockHeaderDecoder: LibBlockHeaderDecoder; - let hashBlockHeader: TestLibBlockHeader; - - before(async function () { - // Deploying Lib to Link - const blkHdrDcdrLib = await ( - await ethers.getContractFactory("LibBlockHeaderDecoder") - ).deploy(); - - // Deploying Library - blockHeaderDecoder = await ( - await ethers.getContractFactory("TestLibBlockHeaderDecoder", { - libraries: { - LibBlockHeaderDecoder: blkHdrDcdrLib.address, - }, - }) - ).deploy(); - - hashBlockHeader = await ( - await ethers.getContractFactory("TestLibBlockHeader") - ).deploy(); - }); - - it("Decode should return stateRoot and timeStamp", async function () { - const parentHash = - "0xa7881266ca0a344c43cb24175d9dbd243b58d45d6ae6ad71310a273a3d1d3afb"; - const blockHeader: any = { - parentHash: parentHash, - ommersHash: - "0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347", - beneficiary: "0xea674fdde714fd979de3edf0f56aa9716b898ec8", - stateRoot: - "0xc0dcf937b3f6136dd70a1ad11cc57b040fd410f3c49a5146f20c732895a3cc21", - transactionsRoot: - "0x7273ade6b6ed865a9975ac281da23b90b141a8b607d874d2cd95e65e81336f8e", - receiptsRoot: - "0x74bb61e381e9238a08b169580f3cbf9b8b79d7d5ee708d3e286103eb291dfd08", - logsBloom: - "112d60abc05141f1302248e0f4329627f002380f1413820692911863e7d0871261aa07e90cc01a10c3ce589153570dc2db27b8783aa52bc19a5a4a836722e813190401b4214c3908cb8b468b510c3fe482603b00ca694c806206bf099279919c334541094bd2e085210373c0b064083242d727790d2eecdb2e0b90353b66461050447626366328f0965602e8a9802d25740ad4a33162142b08a1b15292952de423fac45d235622bb0ef3b2d2d4c21690d280a0b948a8a3012136542c1c4d0955a501a022e1a1a4582220d1ae50ba475d88ce0310721a9076702d29a27283e68c2278b93a1c60d8f812069c250042cc3180a8fd54f034a2da9a03098c32b03445" - .match(/.{1,64}/g)! - .map((s) => "0x" + s), - difficulty: EBN.from("0x1aedf59a4bc180"), - height: EBN.from("0xc5ad78"), - gasLimit: EBN.from("0xe4e1c0"), - gasUsed: EBN.from("0xe4a463"), - timestamp: EBN.from("0x6109c56e"), - extraData: "0x65746865726d696e652d75732d7765737431", - mixHash: - "0xf5ba25df1e92e89a09e0b32063b81795f631100801158f5fa733f2ba26843bd0", - nonce: EBN.from("0x738b7e38476abe98"), - baseFeePerGas: 0, - withdrawalsRoot: ethers.constants.HashZero, - }; - - const encodedBlockHeader = await hashBlockHeader.rlpBlockHeader( - blockHeader - ); - - const [_stateRoot, _timeStamp, _transactionsRoot, _receiptsRoot] = - await blockHeaderDecoder.decodeBlockHeader( - encodedBlockHeader, - keccak256(encodedBlockHeader), - false - ); - - expect(_stateRoot).to.equal(blockHeader.stateRoot); - expect(_timeStamp).to.equal(blockHeader.timestamp); - expect(_transactionsRoot).to.equal(blockHeader.transactionsRoot); - expect(_receiptsRoot).to.equal(blockHeader.receiptsRoot); - }); - - it("Same as above, using latest blockHeader", async function () { - const block = await hre.ethers.provider.send("eth_getBlockByNumber", [ - "latest", - false, - ]); - const logsBloom = block.logsBloom.toString().substring(2); - const blockHeader = { - parentHash: block.parentHash, - ommersHash: block.sha3Uncles, - beneficiary: block.miner, - stateRoot: block.stateRoot, - transactionsRoot: block.transactionsRoot, - receiptsRoot: block.receiptsRoot, - logsBloom: logsBloom - .match(/.{1,64}/g)! - .map((s: string) => "0x" + s), - difficulty: block.difficulty, - height: block.number, - gasLimit: block.gasLimit, - gasUsed: block.gasUsed, - timestamp: block.timestamp, - extraData: block.extraData, - mixHash: block.mixHash, - nonce: block.nonce, - baseFeePerGas: 0, - withdrawalsRoot: ethers.constants.HashZero, - }; - const encodedBlockHeader = await hashBlockHeader.rlpBlockHeader( - blockHeader - ); - - const [_stateRoot, _timeStamp, _transactionsRoot, _receiptsRoot] = - await blockHeaderDecoder.decodeBlockHeader( - encodedBlockHeader, - keccak256(encodedBlockHeader), - false - ); - - expect(_stateRoot).to.equal(blockHeader.stateRoot); - expect(_timeStamp).to.equal(blockHeader.timestamp); - expect(_transactionsRoot).to.equal(blockHeader.transactionsRoot); - expect(_receiptsRoot).to.equal(blockHeader.receiptsRoot); - }); - - it("Same as above, using earliest blockHeader", async function () { - const block = await hre.ethers.provider.send("eth_getBlockByNumber", [ - "earliest", - false, - ]); - const logsBloom = block.logsBloom.toString().substring(2); - const blockHeader = { - parentHash: block.parentHash, - ommersHash: block.sha3Uncles, - beneficiary: block.miner, - stateRoot: block.stateRoot, - transactionsRoot: block.transactionsRoot, - receiptsRoot: block.receiptsRoot, - logsBloom: logsBloom - .match(/.{1,64}/g)! - .map((s: string) => "0x" + s), - difficulty: block.difficulty, - height: block.number, - gasLimit: block.gasLimit, - gasUsed: block.gasUsed, - timestamp: block.timestamp, - extraData: block.extraData, - mixHash: block.mixHash, - nonce: block.nonce, - baseFeePerGas: 0, - withdrawalsRoot: ethers.constants.HashZero, - }; - const encodedBlockHeader = await hashBlockHeader.rlpBlockHeader( - blockHeader - ); - - const [_stateRoot, _timeStamp, _transactionsRoot, _receiptsRoot] = - await blockHeaderDecoder.decodeBlockHeader( - encodedBlockHeader, - keccak256(encodedBlockHeader), - false - ); - - expect(_stateRoot).to.equal(blockHeader.stateRoot); - expect(_timeStamp).to.equal(blockHeader.timestamp); - expect(_transactionsRoot).to.equal(blockHeader.transactionsRoot); - expect(_receiptsRoot).to.equal(blockHeader.receiptsRoot); - }); -}); diff --git a/packages/protocol/test/tokenomics/blockFee.test.ts b/packages/protocol/test/tokenomics/blockFee.test.ts index e9b1451fe4a..98a37f5f490 100644 --- a/packages/protocol/test/tokenomics/blockFee.test.ts +++ b/packages/protocol/test/tokenomics/blockFee.test.ts @@ -89,7 +89,7 @@ describe("tokenomics: blockFee", function () { for await (const blockNumber of chan) { if ( blockNumber > - genesisHeight + (config.maxNumBlocks.toNumber() - 1) + genesisHeight + (config.maxNumProposedBlocks.toNumber() - 1) ) { break; } @@ -103,13 +103,19 @@ describe("tokenomics: blockFee", function () { taikoTokenL1 ); - console.log("lastProposerBalance", lastProposerBalance); - console.log("newProposerBalance", newProposerBalance); + // console.log("lastProposerBalance", lastProposerBalance); + // console.log("newProposerBalance", newProposerBalance); expect(newProposerBalance).to.be.lt(lastProposerBalance); - console.log("lastProofReward", lastProofReward); - console.log("newProofReward", newProofReward); + // console.log("lastBlockFee", lastBlockFee); + // console.log("newBlockFee", newBlockFee); + + // expect(newBlockFee).to.be.gt(lastBlockFee); + + // console.log("lastProofReward", lastProofReward); + // console.log("newProofReward", newProofReward); + expect(newProofReward).to.be.gt(lastProofReward); lastProofReward = newProofReward; diff --git a/packages/protocol/test/tokenomics/proofReward.test.ts b/packages/protocol/test/tokenomics/proofReward.test.ts index fbd200392db..0c63740b205 100644 --- a/packages/protocol/test/tokenomics/proofReward.test.ts +++ b/packages/protocol/test/tokenomics/proofReward.test.ts @@ -8,7 +8,7 @@ import { initIntegrationFixture } from "../utils/fixture"; import Proposer from "../utils/proposer"; import Prover from "../utils/prover"; import { seedTko } from "../utils/seed"; -import { commitProposeProveAndVerify } from "../utils/verify"; +import { proposeProveAndVerify } from "../utils/verify"; describe("tokenomics: proofReward", function () { let taikoL1: TaikoL1; @@ -46,7 +46,7 @@ describe("tokenomics: proofReward", function () { }); it(`single prover, single proposer. - propose blocks, wait til maxNumBlocks is filled. + propose blocks, wait til maxNumProposedBlocks is filled. proverReward should decline should increase as blocks are proved then verified. the provers TKO balance should increase as the blocks are verified and they receive the proofReward. @@ -61,7 +61,7 @@ describe("tokenomics: proofReward", function () { for await (const blockNumber of chan) { if ( blockNumber > - genesisHeight + (config.maxNumBlocks.toNumber() - 1) + genesisHeight + (config.maxNumProposedBlocks.toNumber() - 1) ) { break; } @@ -70,7 +70,7 @@ describe("tokenomics: proofReward", function () { ); const { provedEvent, proposedBlock, verifyEvent } = - await commitProposeProveAndVerify( + await proposeProveAndVerify( taikoL1, l2Provider, blockNumber, @@ -88,7 +88,7 @@ describe("tokenomics: proofReward", function () { // proof reward can be 0. make sure there is a proof reward first if (proofReward.gt(0)) { - const rewardBalance = await taikoL1.getRewardBalance( + const rewardBalance = await taikoL1.getBalance( await prover.getSigner().getAddress() ); diff --git a/packages/protocol/test/utils/blockListener.ts b/packages/protocol/test/utils/blockListener.ts index ab33abca642..a9937686320 100644 --- a/packages/protocol/test/utils/blockListener.ts +++ b/packages/protocol/test/utils/blockListener.ts @@ -5,7 +5,7 @@ import type { SimpleChannel } from "channel-ts"; // it will send incoming blockNumbers, generated from the l2 provider on a new block, // through a Golang-style channel, which can then be waited on like such: // for await (const blockNumber of chan) -// so we can then run a commit, propose, prove, and verify flow in our test cases +// so we can then run a propose, prove, and verify flow in our test cases // in the main javascript event loop, instead of in the event handler of the l2Provider // itself. diff --git a/packages/protocol/test/utils/block_metadata.ts b/packages/protocol/test/utils/block_metadata.ts index c1ee3b2865a..9b1c20b06c0 100644 --- a/packages/protocol/test/utils/block_metadata.ts +++ b/packages/protocol/test/utils/block_metadata.ts @@ -10,8 +10,6 @@ type BlockMetadata = { extraData: string; gasLimit: BigNumberish; timestamp: number; - commitSlot: number; - commitHeight: number; }; type ForkChoice = { diff --git a/packages/protocol/test/utils/bridge.ts b/packages/protocol/test/utils/bridge.ts index e8adcd0298f..d3e16a3979f 100644 --- a/packages/protocol/test/utils/bridge.ts +++ b/packages/protocol/test/utils/bridge.ts @@ -5,7 +5,7 @@ import { Bridge, SignalService, EtherVault, - TestHeaderSync, + TestXchainSync, LibTrieProof, } from "../../typechain"; import { MessageStatusChangedEvent } from "../../typechain/LibBridgeStatus"; @@ -94,7 +94,7 @@ async function processMessage( l2Bridge: Bridge, signal: string, provider: ethers.providers.JsonRpcProvider, - headerSync: TestHeaderSync, + xchainSync: TestXchainSync, message: Message ): Promise<{ tx: ethers.ContractTransaction; @@ -109,9 +109,9 @@ async function processMessage( const { block, blockHeader } = await getBlockHeader(provider); - await headerSync.setSyncedHeader(block.hash); + await xchainSync.setXchainBlockHeader(block.hash); - const signalProof = await getSignalProof( + const { signalProof, signalRoot } = await getSignalProof( provider, l1SignalService.address, slot, @@ -119,6 +119,8 @@ async function processMessage( blockHeader ); + await xchainSync.setXchainSignalRoot(signalRoot); + const tx = await l2Bridge.processMessage(message, signalProof); const receipt = await tx.wait(1); const messageStatusChangedEvent = (receipt.events || []).find( @@ -129,7 +131,7 @@ async function processMessage( async function sendAndProcessMessage( provider: ethers.providers.JsonRpcProvider, - headerSync: TestHeaderSync, + xchainSync: TestXchainSync, m: Message, l1SignalService: SignalService, l1Bridge: Bridge, @@ -147,7 +149,7 @@ async function sendAndProcessMessage( l2Bridge, msgHash, provider, - headerSync, + xchainSync, message ); return { tx, msgHash, message, signalProof }; diff --git a/packages/protocol/test/utils/commit.ts b/packages/protocol/test/utils/commit.ts index 417faf9da07..796649e1659 100644 --- a/packages/protocol/test/utils/commit.ts +++ b/packages/protocol/test/utils/commit.ts @@ -1,85 +1,26 @@ import { ethers } from "ethers"; -import RLP from "rlp"; import { TaikoL1 } from "../../typechain"; import { BlockProposedEvent } from "../../typechain/LibProposing"; -import { BlockCommittedEvent } from "../../typechain/TaikoEvents"; import { proposeBlock } from "./propose"; -import { sendTinyEtherToZeroAddress } from "./seed"; -const generateCommitHash = ( - block: ethers.providers.Block -): { hash: string; txListHash: string; beneficiary: string } => { - const txListHash = ethers.utils.keccak256(RLP.encode(block.transactions)); - const beneficiary = - block.miner === ethers.constants.AddressZero - ? ethers.Wallet.createRandom().address - : block.miner; - - const hash = ethers.utils.keccak256( - ethers.utils.solidityPack( - ["address", "bytes32"], - [beneficiary, txListHash] - ) - ); - - return { hash, txListHash, beneficiary }; -}; - -const commitBlock = async ( - taikoL1: TaikoL1, - block: ethers.providers.Block, - commitSlot: number = 0 -): Promise<{ - tx: ethers.ContractTransaction; - commit: { hash: string; txListHash: string; beneficiary: string }; - blockCommittedEvent: BlockCommittedEvent | undefined; - receipt: ethers.ContractReceipt; -}> => { - const commit = generateCommitHash(block); - const tx = await taikoL1.commitBlock(commitSlot, commit.hash, { - gasLimit: 200000, - }); - const receipt = await tx.wait(1); - const blockCommittedEvent = receipt.events!.find( - (e) => e.event === "BlockCommitted" - ) as any as BlockCommittedEvent; - return { tx, commit, blockCommittedEvent, receipt }; -}; - -const commitAndProposeLatestBlock = async ( +const proposeLatestBlock = async ( taikoL1: TaikoL1, l1Signer: any, - l2Provider: ethers.providers.JsonRpcProvider, - commitSlot: number = 0 + l2Provider: ethers.providers.JsonRpcProvider ) => { - const { commitConfirmations } = await taikoL1.getConfig(); const block = await l2Provider.getBlock("latest"); - const { tx, commit } = await commitBlock( - taikoL1.connect(l1Signer), - block, - commitSlot - ); - const commitReceipt = await tx.wait(1); - - for (let i = 0; i < commitConfirmations.toNumber() + 5; i++) { - await sendTinyEtherToZeroAddress(l1Signer); - } const proposeReceipt = await proposeBlock( taikoL1.connect(l1Signer), block, - commit.txListHash, - commitReceipt.blockNumber as number, - block.gasLimit, - commitSlot, - commit.beneficiary + block.gasLimit ); const proposedEvent: BlockProposedEvent = ( proposeReceipt.events as any[] ).find((e) => e.event === "BlockProposed"); - return { proposedEvent, proposeReceipt, commitReceipt, commit, block }; + return { proposedEvent, proposeReceipt, block }; }; -export { generateCommitHash, commitBlock, commitAndProposeLatestBlock }; +export { proposeLatestBlock }; diff --git a/packages/protocol/test/utils/encoding.ts b/packages/protocol/test/utils/encoding.ts index 4661733e7cd..e6dd68b6d44 100644 --- a/packages/protocol/test/utils/encoding.ts +++ b/packages/protocol/test/utils/encoding.ts @@ -5,7 +5,7 @@ import Evidence from "./evidence"; function encodeBlockMetadata(meta: BlockMetadata) { return ethers.utils.defaultAbiCoder.encode( [ - "tuple(uint256 id, uint256 l1Height, bytes32 l1Hash, address beneficiary, bytes32 txListHash, bytes32 mixHash, bytes extraData, uint64 gasLimit, uint64 timestamp, uint64 commitHeight, uint64 commitSlot)", + "tuple(uint64 id,uint32 gasLimit,uint64 timestamp,uint64 l1Height,bytes32 l1Hash,bytes32 mixHash,bytes32 txListHash,uint24 txListByteStart,uint24 txListByteEnd,address beneficiary}", ], [meta] ); @@ -14,7 +14,7 @@ function encodeBlockMetadata(meta: BlockMetadata) { function encodeEvidence(evidence: Evidence) { return ethers.utils.defaultAbiCoder.encode( [ - "tuple(tuple(uint256 id, uint256 l1Height, bytes32 l1Hash, address beneficiary, bytes32 txListHash, bytes32 mixHash, bytes extraData, uint64 gasLimit, uint64 timestamp, uint64 commitHeight, uint64 commitSlot) meta, tuple(bytes32 parentHash, bytes32 ommersHash, address beneficiary, bytes32 stateRoot, bytes32 transactionsRoot, bytes32 receiptsRoot, bytes32[8] logsBloom, uint256 difficulty, uint128 height, uint64 gasLimit, uint64 gasUsed, uint64 timestamp, bytes extraData, bytes32 mixHash, uint64 nonce, uint256 baseFeePerGas) header, address prover, bytes[] proofs, uint16[] circuits)", + "tuple(tuple(uint64 id,uint32 gasLimit,uint64 timestamp,uint64 l1Height,bytes32 l1Hash,bytes32 mixHash,bytes32 txListHash,uint24 txListByteStart,uint24 txListByteEnd,address beneficiary) meta,tuple(bytes data,uint16 verifierId) zkproof,bytes32 parentHash,bytes32 blockHash,bytes32 signalRoot,address prover)", ], [evidence] ); diff --git a/packages/protocol/test/utils/fixture.ts b/packages/protocol/test/utils/fixture.ts index 31c068fdbdb..ea9ca26d145 100644 --- a/packages/protocol/test/utils/fixture.ts +++ b/packages/protocol/test/utils/fixture.ts @@ -36,11 +36,9 @@ async function initIntegrationFixture( await Promise.all([l1Signer.unlock(""), l2Signer.unlock("")]); } catch (_) {} - const l2AddressManager = await deployAddressManager(l2Signer); + // const l2AddressManager = await deployAddressManager(l2Signer); const taikoL2 = await deployTaikoL2( l2Signer, - l2AddressManager, - false, 5000000 // Note: need to explicitly set gasLimit here, otherwise the deployment transaction may fail. ); const taikoL2DeployReceipt = await taikoL2.deployTransaction.wait(); @@ -70,7 +68,7 @@ async function initIntegrationFixture( await ( await l1AddressManager.setAddress( - `${chainId}.tko_token`, + `${chainId}.taiko_token`, taikoTokenL1.address ) ).wait(1); @@ -123,8 +121,7 @@ async function initIntegrationFixture( const proposer = new Proposer( taikoL1.connect(proposerSigner), l2Provider, - config.commitConfirmations.toNumber(), - config.maxNumBlocks.toNumber(), + config.maxNumProposedBlocks.toNumber(), 0, proposerSigner ); diff --git a/packages/protocol/test/utils/onNewL2Block.ts b/packages/protocol/test/utils/onNewL2Block.ts index eed86f73775..dea3097801e 100644 --- a/packages/protocol/test/utils/onNewL2Block.ts +++ b/packages/protocol/test/utils/onNewL2Block.ts @@ -6,7 +6,7 @@ import sleep from "./sleep"; // onNewL2Block should be called from a tokenomics test case when a new block // is generated from the l2Provider. -// It will commit then propose the block to the TaikoL1 contract, +// It will propose the block to the TaikoL1 contract, // and then return the latest fee information and the proposal event, // which can then be asserted on depending on your test case. async function onNewL2Block( @@ -25,7 +25,7 @@ async function onNewL2Block( const config = await taikoL1.getConfig(); const block = await l2Provider.getBlock(blockNumber); - const { proposedEvent } = await proposer.commitThenProposeBlock(block); + const { proposedEvent } = await proposer.proposeBlock(block); const { id, meta } = proposedEvent.args; const { enableTokenomics } = await taikoL1.getConfig(); diff --git a/packages/protocol/test/utils/propose.ts b/packages/protocol/test/utils/propose.ts index 04f94df1ac1..6de0f964739 100644 --- a/packages/protocol/test/utils/propose.ts +++ b/packages/protocol/test/utils/propose.ts @@ -19,9 +19,7 @@ const proposeBlock = async ( taikoL1: TaikoL1, block: ethers.providers.Block, txListHash: string, - commitHeight: number, gasLimit: BigNumber, - commitSlot: number = 0, beneficiary: string ) => { const meta: BlockMetadata = { @@ -34,8 +32,6 @@ const proposeBlock = async ( extraData: ethers.utils.hexlify(ethers.utils.randomBytes(32)), gasLimit: gasLimit, timestamp: 0, - commitSlot: commitSlot, - commitHeight: commitHeight, }; const inputs = buildProposeBlockInputs(block, meta); diff --git a/packages/protocol/test/utils/proposer.ts b/packages/protocol/test/utils/proposer.ts index 45d7907dedd..fe89fe40429 100644 --- a/packages/protocol/test/utils/proposer.ts +++ b/packages/protocol/test/utils/proposer.ts @@ -1,16 +1,13 @@ import { ethers } from "ethers"; import { TaikoL1 } from "../../typechain"; import { BlockProposedEvent } from "../../typechain/LibProposing"; -import { commitBlock } from "./commit"; import { proposeBlock } from "./propose"; import sleep from "./sleep"; class Proposer { private readonly taikoL1: TaikoL1; private readonly l2Provider: ethers.providers.JsonRpcProvider; - private readonly commitConfirms: number; - private readonly maxNumBlocks: number; - private nextCommitSlot: number; + private readonly maxNumProposedBlocks: number; private signer: ethers.Wallet; private proposingMutex: boolean = false; @@ -18,16 +15,12 @@ class Proposer { constructor( taikoL1: TaikoL1, l2Provider: ethers.providers.JsonRpcProvider, - commitConfirms: number, - maxNumBlocks: number, - initialCommitSlot: number, + maxNumProposedBlocks: number, signer: ethers.Wallet ) { this.taikoL1 = taikoL1; this.l2Provider = l2Provider; - this.commitConfirms = commitConfirms; - this.maxNumBlocks = maxNumBlocks; - this.nextCommitSlot = initialCommitSlot; + this.maxNumProposedBlocks = maxNumProposedBlocks; this.signer = signer; } @@ -35,29 +28,18 @@ class Proposer { return this.signer; } - async commitThenProposeBlock(block?: ethers.providers.Block) { + async proposeBlock(block?: ethers.providers.Block) { try { while (this.proposingMutex) { await sleep(500); } this.proposingMutex = true; if (!block) block = await this.l2Provider.getBlock("latest"); - const commitSlot = this.nextCommitSlot++; - const { tx, commit } = await commitBlock( - this.taikoL1, - block, - commitSlot - ); - const commitReceipt = await tx.wait(this.commitConfirms ?? 1); const receipt = await proposeBlock( this.taikoL1, block, - commit.txListHash, - commitReceipt.blockNumber as number, - block.gasLimit, - commitSlot, - commit.beneficiary + block.gasLimit ); const proposedEvent: BlockProposedEvent = ( diff --git a/packages/protocol/test/utils/prove.ts b/packages/protocol/test/utils/prove.ts index c2c2fec505d..603922d5ec8 100644 --- a/packages/protocol/test/utils/prove.ts +++ b/packages/protocol/test/utils/prove.ts @@ -9,9 +9,9 @@ import { BlockHeader, getBlockHeader } from "./rpc"; const buildProveBlockInputs = ( meta: BlockMetadata, header: BlockHeader, - prover: string, - anchorTx: Uint8Array | string, - anchorReceipt: Uint8Array | string + prover: string + // anchorTx: Uint8Array | string, + // anchorReceipt: Uint8Array | string ) => { const inputs = []; const evidence: Evidence = { @@ -34,8 +34,8 @@ const buildProveBlockInputs = ( } inputs[0] = encodeEvidence(evidence); - inputs[1] = anchorTx; - inputs[2] = anchorReceipt; + // inputs[1] = anchorTx; + // inputs[2] = anchorReceipt; return inputs; }; @@ -51,9 +51,9 @@ const proveBlock = async ( const inputs = buildProveBlockInputs( meta, header.blockHeader, - proverAddress, - "0x", - "0x" + proverAddress + // "0x", + // "0x" ); const tx = await taikoL1.proveBlock(blockId, inputs, { gasLimit: 1000000 }); const receipt = await tx.wait(1); diff --git a/packages/protocol/test/utils/signal.ts b/packages/protocol/test/utils/signal.ts index e6ce33179ad..2070d403c47 100644 --- a/packages/protocol/test/utils/signal.ts +++ b/packages/protocol/test/utils/signal.ts @@ -37,7 +37,7 @@ async function deploySignalService( return { signalService }; } -async function getSignalProof( +async function getSignalProofWithAccountProof( provider: ethers.providers.JsonRpcProvider, contractAddress: string, slot: string, @@ -69,4 +69,30 @@ async function getSignalProof( return signalProof; } -export { deploySignalService, getSignalProof }; +async function getSignalProof( + provider: ethers.providers.JsonRpcProvider, + contractAddress: string, + slot: string, + blockNumber: number, + blockHeader: BlockHeader +) { + const proof: EthGetProofResponse = await provider.send("eth_getProof", [ + contractAddress, + [slot], + blockNumber, + ]); + + // RLP encode the proof together for LibTrieProof to decode + const encodedProof = RLP.encode(proof.storageProof[0].proof); + // encode the SignalProof struct from LibBridgeSignal + const signalProof = ethers.utils.defaultAbiCoder.encode( + [ + "tuple(tuple(bytes32 parentHash, bytes32 ommersHash, address beneficiary, bytes32 stateRoot, bytes32 transactionsRoot, bytes32 receiptsRoot, bytes32[8] logsBloom, uint256 difficulty, uint128 height, uint64 gasLimit, uint64 gasUsed, uint64 timestamp, bytes extraData, bytes32 mixHash, uint64 nonce, uint256 baseFeePerGas, bytes32 withdrawalsRoot) header, bytes proof)", + ], + [{ header: blockHeader, proof: encodedProof }] + ); + + return { signalProof: signalProof, signalRoot: proof.storageHash }; +} + +export { deploySignalService, getSignalProof, getSignalProofWithAccountProof }; diff --git a/packages/protocol/test/utils/taikoL1.ts b/packages/protocol/test/utils/taikoL1.ts index c5ded6ffca8..71974305b20 100644 --- a/packages/protocol/test/utils/taikoL1.ts +++ b/packages/protocol/test/utils/taikoL1.ts @@ -10,41 +10,28 @@ async function deployTaikoL1( enableTokenomics: boolean, feeBase?: BigNumber ): Promise { - const libReceiptDecoder = await ( - await ethers.getContractFactory("LibReceiptDecoder") - ).deploy(); - - const libTxDecoder = await ( - await ethers.getContractFactory("LibTxDecoder") - ).deploy(); + // const libProposing = await ( + // await ethers.getContractFactory("LibProposing") + // ).deploy(); - const libProposing = await ( - await ethers.getContractFactory("LibProposing") - ).deploy(); + // const libProving = await ( + // await ethers.getContractFactory("LibProving") + // ).deploy(); - const testLibProving = await ( - await ethers.getContractFactory("TestLibProving", { - libraries: { - LibReceiptDecoder: libReceiptDecoder.address, - LibTxDecoder: libTxDecoder.address, - }, - }) - ).deploy(); - - const libVerifying = await ( - await ethers.getContractFactory("LibVerifying") - ).deploy(); + // const libVerifying = await ( + // await ethers.getContractFactory("LibVerifying") + // ).deploy(); const taikoL1 = await ( await ethers.getContractFactory( - enableTokenomics ? "TestTaikoL1EnableTokenomics" : "TestTaikoL1", - { - libraries: { - LibVerifying: libVerifying.address, - LibProposing: libProposing.address, - LibProving: testLibProving.address, - }, - } + enableTokenomics ? "TestTaikoL1EnableTokenomics" : "TestTaikoL1" + // { + // libraries: { + // LibVerifying: libVerifying.address, + // LibProposing: libProposing.address, + // LibProving: libProving.address, + // }, + // } ) ).deploy(); diff --git a/packages/protocol/test/utils/taikoL2.ts b/packages/protocol/test/utils/taikoL2.ts index 83092dabb81..2d9b374fe08 100644 --- a/packages/protocol/test/utils/taikoL2.ts +++ b/packages/protocol/test/utils/taikoL2.ts @@ -1,34 +1,14 @@ import { ethers } from "ethers"; import { ethers as hardhatEthers } from "hardhat"; -import { AddressManager, TaikoL2 } from "../../typechain"; +import { TaikoL2 } from "../../typechain"; async function deployTaikoL2( signer: ethers.Signer, - addressManager: AddressManager, - enablePublicInputsCheck: boolean = true, gasLimit: number | undefined = undefined ): Promise { - // Deploying TaikoL2 Contract linked with LibTxDecoder (throws error otherwise) - const l2LibTxDecoder = await ( - await hardhatEthers.getContractFactory("LibTxDecoder") - ) + const taikoL2 = await (await hardhatEthers.getContractFactory("TaikoL2")) .connect(signer) - .deploy(); - - const taikoL2 = await ( - await hardhatEthers.getContractFactory( - enablePublicInputsCheck - ? "TestTaikoL2EnablePublicInputsCheck" - : "TestTaikoL2", - { - libraries: { - LibTxDecoder: l2LibTxDecoder.address, - }, - } - ) - ) - .connect(signer) - .deploy(addressManager.address, { gasLimit }); + .deploy({ gasLimit }); return taikoL2 as TaikoL2; } diff --git a/packages/protocol/test/utils/taikoToken.ts b/packages/protocol/test/utils/taikoToken.ts index 6c23ede0e97..b6ccdaab556 100644 --- a/packages/protocol/test/utils/taikoToken.ts +++ b/packages/protocol/test/utils/taikoToken.ts @@ -7,12 +7,10 @@ const deployTaikoToken = async ( addressManager: AddressManager, protoBroker: string ) => { - const token = await ( - await hardhatEthers.getContractFactory("TestTaikoToken") - ) + const token = await (await hardhatEthers.getContractFactory("TaikoToken")) .connect(signer) .deploy(); - await token.init("Taiko Token", "TKO", addressManager.address); + await token.init(addressManager.address, "Taiko Token", "TKO", [], []); const network = await signer.provider?.getNetwork(); diff --git a/packages/protocol/test/utils/verify.ts b/packages/protocol/test/utils/verify.ts index 5a27ea1878d..aa4359533e7 100644 --- a/packages/protocol/test/utils/verify.ts +++ b/packages/protocol/test/utils/verify.ts @@ -68,7 +68,7 @@ async function verifyBlockAndAssert( } // latest synced header should be our just-verified block hash. - const latestHash = await taikoL1.getLatestSyncedHeader(); + const latestHash = await taikoL1.getXchainBlockHash(0); expect(latestHash).to.be.eq(block.blockHash); // fork choice should be nullified via _cleanUp in LibVerifying @@ -82,7 +82,7 @@ async function verifyBlockAndAssert( return { newProofReward }; } -async function commitProposeProveAndVerify( +async function proposeProveAndVerify( taikoL1: TaikoL1, l2Provider: ethersLib.providers.JsonRpcProvider, blockNumber: number, @@ -111,7 +111,7 @@ async function commitProposeProveAndVerify( const { args } = provedEvent; const { blockHash, id: blockId, parentHash } = args; - const proposedBlock = await taikoL1.getProposedBlock( + const proposedBlock = await taikoL1.getBlock( proposedEvent.args.id.toNumber() ); @@ -132,4 +132,4 @@ async function commitProposeProveAndVerify( return { verifyEvent, proposedEvent, provedEvent, proposedBlock }; } -export { verifyBlocks, verifyBlockAndAssert, commitProposeProveAndVerify }; +export { verifyBlocks, verifyBlockAndAssert, proposeProveAndVerify }; diff --git a/packages/protocol/test2/GasComparison.t.sol b/packages/protocol/test2/GasComparison.t.sol new file mode 100644 index 00000000000..d20e7c15b48 --- /dev/null +++ b/packages/protocol/test2/GasComparison.t.sol @@ -0,0 +1,268 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.18; + +import "forge-std/Test.sol"; +import "forge-std/console2.sol"; +import "../contracts/L1/TaikoData.sol"; +import {Strings} from "@openzeppelin/contracts/utils/Strings.sol"; + +struct MyStruct { + uint256 id; + uint256 l1Height; + bytes32 l1Hash; + uint64 gasLimit; + uint64 timestamp; +} + +contract FooBar { + function loadBlockMetadata_1(bytes memory data) public { + MyStruct memory meta = abi.decode(data, (MyStruct)); + } + + function loadBlockMetadata_2(bytes calldata data) public { + MyStruct memory meta = abi.decode(data, (MyStruct)); + } + + function loadBlockMetadata_3(MyStruct memory data) public {} + + function loadBlockMetadata_4(MyStruct calldata data) public {} + + function loadBlockMetadata_5(bytes calldata data) public { + MyStruct memory meta; + meta.id = uint256(bytes32(data[0:32])); + meta.l1Height = uint256(bytes32(data[32:64])); + meta.l1Hash = bytes32(data[64:96]); + meta.gasLimit = uint64(bytes8(data[96:104])); + meta.timestamp = uint64(bytes8(data[104:112])); + } + + function loadBlockMetadata_6() public { + MyStruct memory meta; + uint256 a; + assembly { + a := calldatasize() + } + require(a == 84 + 32, "aaa"); + + assembly { + a := calldataload(4) + } + meta.id = a; + assembly { + a := calldataload(36) + } + meta.l1Height = a; + assembly { + a := calldataload(68) + } + meta.l1Hash = bytes32(a); + assembly { + a := calldataload(84) + } + meta.gasLimit = uint64(uint256((a << 128) >> (128 + 64))); + meta.timestamp = uint64(uint256((a << (128 + 64)) >> (128 + 64))); + } + + function return_1() public returns (TaikoData.BlockMetadata memory meta) { + meta = TaikoData.BlockMetadata({ + id: 1, + l1Height: 1, + l1Hash: bytes32(uint256(1)), + beneficiary: address(this), + txListHash: bytes32(uint256(1)), + txListByteStart: 0, + txListByteEnd: 1000, + gasLimit: 1, + mixHash: bytes32(uint256(1)), + timestamp: 1 + }); + } + + function return_2() public { + TaikoData.BlockMetadata memory meta = TaikoData.BlockMetadata({ + id: 1, + l1Height: 1, + l1Hash: bytes32(uint256(1)), + beneficiary: address(this), + txListHash: bytes32(uint256(1)), + txListByteStart: 0, + txListByteEnd: 1000, + gasLimit: 1, + mixHash: bytes32(uint256(1)), + timestamp: 1 + }); + } + + //------ + function hashString_1(string memory str) public returns (bytes32 hash) { + assembly { + hash := keccak256(add(str, 32), mload(str)) + } + } + + function hashString_2(string memory str) public returns (bytes32 hash) { + hash = keccak256(bytes(str)); + } + + //------ + + function hashTwo_1(address a, bytes32 b) public returns (bytes32 hash) { + assembly { + // Load the free memory pointer and allocate memory for the concatenated arguments + let input := mload(64) + + // Store the app address and signal bytes32 value in the allocated memory + mstore(input, a) + mstore(add(input, 32), b) + + hash := keccak256(add(input, 12), 52) + + // Free the memory allocated for the input + mstore(0x40, add(input, 64)) + } + } + + function hashTwo_2(address a, bytes32 b) public returns (bytes32 hash) { + hash = keccak256(bytes.concat(bytes20(uint160(a)), b)); + // the following will work too. + // hash = keccak256(abi.encodePacked(a, b)); + } + + //------ + + function increment_1(uint count) public { + uint a; + for (uint i = 0; i < count; i++) { + a += i; + } + } + + function increment_2(uint count) public { + uint a; + for (uint i = 0; i < count; ++i) { + a += i; + } + } + + function increment_3(uint count) public { + uint a; + for (uint i = 0; i < count; ) { + a += i; + unchecked { + i++; + } + } + } + + function increment_4(uint count) public { + uint a; + for (uint i = 0; i < count; ) { + a += i; + unchecked { + ++i; + } + } + } + + // ------ + function hashKey_1( + uint chainId, + string memory name + ) public view returns (bytes32) { + return keccak256(bytes(string.concat(Strings.toString(chainId), name))); + } + + function hashKey_2( + uint chainId, + string memory name + ) public view returns (bytes32) { + return keccak256(abi.encodePacked(chainId, name)); + } + + // ------ + function send0Ether_check(address to, uint256 amount) public { + if (amount > 0) { + (bool success, ) = payable(to).call{value: amount}(""); + require(success, "ETH transfer failed"); + } + } + + function send0Ether_noCheck(address to, uint256 amount) public { + (bool success, ) = payable(to).call{value: amount}(""); + require(success, "ETH transfer failed"); + } +} + +contract GasComparisonTest is Test { + FooBar foobar; + + function setUp() public { + foobar = new FooBar(); + } + + function testCompareHashString(uint count) external { + vm.assume(count > 10 && count < 1000); + string memory str = string(new bytes(count)); + assertEq( + foobar.hashString_1(str), + foobar.hashString_2(str) //best + ); + + address a = address(this); + bytes32 b = blockhash(block.number - 1); + assertEq( + foobar.hashTwo_1(a, b), //best + foobar.hashTwo_2(a, b) + ); + + foobar.increment_1(count); + foobar.increment_2(count); + foobar.increment_3(count); // best + foobar.increment_4(count); + + foobar.return_1(); + foobar.return_2(); // cheaper + + foobar.hashKey_1(123, "abc"); + foobar.hashKey_2(123, "abc"); + + MyStruct memory meta = MyStruct({ + id: 123, + l1Height: 456, + l1Hash: blockhash(block.number - 1), + gasLimit: 333, + timestamp: 999 + }); + { + bytes memory b = abi.encode(meta); + foobar.loadBlockMetadata_1(b); + foobar.loadBlockMetadata_2(b); + foobar.loadBlockMetadata_3(meta); + foobar.loadBlockMetadata_4(meta); // best + } + { + bytes memory b = bytes.concat( + bytes32(meta.id), + bytes32(meta.l1Height), + meta.l1Hash, + bytes8(meta.gasLimit), + bytes8(meta.timestamp) + ); + + foobar.loadBlockMetadata_5(b); + + bytes memory c = bytes.concat( + FooBar.loadBlockMetadata_6.selector, + b + ); + + address(foobar).call(c); + } + + { + address to = 0x50081b12838240B1bA02b3177153Bca678a86078; + foobar.send0Ether_check(to, 0); + foobar.send0Ether_noCheck(to, 0); + } + } +} diff --git a/packages/protocol/test2/LibTokenomics.t.sol b/packages/protocol/test2/LibTokenomics.t.sol new file mode 100644 index 00000000000..5c20e840c4e --- /dev/null +++ b/packages/protocol/test2/LibTokenomics.t.sol @@ -0,0 +1,45 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity ^0.8.18; + +import {Test} from "forge-std/Test.sol"; +import {console2} from "forge-std/console2.sol"; +import {TaikoData} from "../contracts/L1/TaikoData.sol"; +import {LibTokenomics} from "../contracts/L1/libs/LibTokenomics.sol"; + +contract TaikoL1WithConfig is Test { + struct FeeConfig { + uint64 avgTimeMAF; + uint64 avgTimeCap; + uint64 gracePeriodPctg; + uint64 maxPeriodPctg; + // extra fee/reward on top of baseFee + uint64 multiplerPctg; + } + + function test_getTimeAdjustedFee() public { + uint256 feeBase = 10 ether; + uint256 tLast = 100000; + uint256 tAvg = 40; + uint256 tNow = tLast + tAvg; + + TaikoData.FeeConfig memory feeConfig = TaikoData.FeeConfig({ + avgTimeMAF: 1024, + avgTimeCap: uint16(tAvg * 1000), + gracePeriodPctg: 100, + maxPeriodPctg: 400, + multiplerPctg: 200 + }); + + (uint256 newFeeBase, uint256 tRelBp) = LibTokenomics.getTimeAdjustedFee( + feeConfig, + feeBase, + true, + tNow, // seconds + tLast, // seconds + (tAvg * 1000) // miliseconds + ); + + assertEq(newFeeBase, feeBase); + assertEq(tRelBp, 0); + } +} diff --git a/packages/protocol/test2/TaikoL1.t.sol b/packages/protocol/test2/TaikoL1.t.sol new file mode 100644 index 00000000000..f811b7c48e8 --- /dev/null +++ b/packages/protocol/test2/TaikoL1.t.sol @@ -0,0 +1,201 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity ^0.8.18; + +import {Test} from "forge-std/Test.sol"; +import {console2} from "forge-std/console2.sol"; +import {AddressManager} from "../contracts/thirdparty/AddressManager.sol"; +import {TaikoConfig} from "../contracts/L1/TaikoConfig.sol"; +import {TaikoData} from "../contracts/L1/TaikoData.sol"; +import {TaikoL1} from "../contracts/L1/TaikoL1.sol"; +import {TaikoToken} from "../contracts/L1/TaikoToken.sol"; +import {SignalService} from "../contracts/signal/SignalService.sol"; +import {Strings} from "@openzeppelin/contracts/utils/Strings.sol"; +import {TaikoL1TestBase} from "./TaikoL1TestBase.sol"; + +contract TaikoL1WithConfig is TaikoL1 { + function getConfig() + public + pure + override + returns (TaikoData.Config memory config) + { + config = TaikoConfig.getConfig(); + + config.enableTokenomics = true; + config.bootstrapDiscountHalvingPeriod = 0; + config.constantFeeRewardBlocks = 0; + config.txListCacheExpiry = 5 minutes; + config.proposerDepositPctg = 0; + config.maxVerificationsPerTx = 0; + config.enableSoloProposer = false; + config.enableOracleProver = false; + config.maxNumProposedBlocks = 11; + config.maxNumVerifiedBlocks = 40; + // this value must be changed if `maxNumProposedBlocks` is changed. + config.slotSmoothingFactor = 4160; + config.anchorTxGasLimit = 180000; + + config.proposingConfig = TaikoData.FeeConfig({ + avgTimeMAF: 64, + avgTimeCap: 10 minutes * 1000, + gracePeriodPctg: 100, + maxPeriodPctg: 400, + multiplerPctg: 400 + }); + + config.provingConfig = TaikoData.FeeConfig({ + avgTimeMAF: 64, + avgTimeCap: 10 minutes * 1000, + gracePeriodPctg: 100, + maxPeriodPctg: 400, + multiplerPctg: 400 + }); + } +} + +contract Verifier { + fallback(bytes calldata) external returns (bytes memory) { + return bytes.concat(keccak256("taiko")); + } +} + +contract TaikoL1Test is TaikoL1TestBase { + function deployTaikoL1() internal override returns (TaikoL1 taikoL1) { + taikoL1 = new TaikoL1WithConfig(); + } + + function setUp() public override { + TaikoL1TestBase.setUp(); + _registerAddress( + string(abi.encodePacked("verifier_", uint16(100))), + address(new Verifier()) + ); + } + + /// @dev Test we can propose, prove, then verify more blocks than 'maxNumProposedBlocks' + function test_more_blocks_than_ring_buffer_size() external { + _depositTaikoToken(Alice, 1E6, 100); + _depositTaikoToken(Bob, 1E6, 100); + _depositTaikoToken(Carol, 1E6, 100); + + bytes32 parentHash = GENESIS_BLOCK_HASH; + + for ( + uint blockId = 1; + blockId < conf.maxNumProposedBlocks * 10; + blockId++ + ) { + printVariables("before propose"); + TaikoData.BlockMetadata memory meta = proposeBlock(Alice, 1024); + printVariables("after propose"); + mine(1); + + bytes32 blockHash = bytes32(1E10 + blockId); + bytes32 signalRoot = bytes32(1E9 + blockId); + proveBlock(Bob, meta, parentHash, blockHash, signalRoot); + verifyBlock(Carol, 1); + parentHash = blockHash; + } + printVariables(""); + } + + /// @dev Test more than one block can be proposed, proven, & verified in the + /// same L1 block. + function test_multiple_blocks_in_one_L1_block() external { + _depositTaikoToken(Alice, 1000, 1000); + + bytes32 parentHash = GENESIS_BLOCK_HASH; + + for (uint blockId = 1; blockId <= 2; blockId++) { + printVariables("before propose"); + TaikoData.BlockMetadata memory meta = proposeBlock(Alice, 1024); + printVariables("after propose"); + + bytes32 blockHash = bytes32(1E10 + blockId); + bytes32 signalRoot = bytes32(1E9 + blockId); + proveBlock(Alice, meta, parentHash, blockHash, signalRoot); + verifyBlock(Alice, 2); + parentHash = blockHash; + } + printVariables(""); + } + + /// @dev Test verifying multiple blocks in one transaction + function test_verifying_multiple_blocks_once() external { + _depositTaikoToken(Alice, 1E6, 100); + + bytes32 parentHash = GENESIS_BLOCK_HASH; + + for ( + uint blockId = 1; + blockId <= conf.maxNumProposedBlocks - 1; + blockId++ + ) { + printVariables("before propose"); + TaikoData.BlockMetadata memory meta = proposeBlock(Alice, 1024); + printVariables("after propose"); + + bytes32 blockHash = bytes32(1E10 + blockId); + bytes32 signalRoot = bytes32(1E9 + blockId); + proveBlock(Alice, meta, parentHash, blockHash, signalRoot); + parentHash = blockHash; + } + verifyBlock(Alice, conf.maxNumProposedBlocks - 2); + printVariables("after verify"); + verifyBlock(Alice, conf.maxNumProposedBlocks); + printVariables("after verify"); + } + + /// @dev Test block timeincrease and fee shall decrease. + function test_block_time_increases_but_fee_decreases() external { + _depositTaikoToken(Alice, 1E6, 100); + _depositTaikoToken(Bob, 1E6, 100); + _depositTaikoToken(Carol, 1E6, 100); + + bytes32 parentHash = GENESIS_BLOCK_HASH; + + for ( + uint blockId = 1; + blockId < conf.maxNumProposedBlocks * 10; + blockId++ + ) { + printVariables("before propose"); + TaikoData.BlockMetadata memory meta = proposeBlock(Alice, 1024); + mine(1); + + bytes32 blockHash = bytes32(1E10 + blockId); + bytes32 signalRoot = bytes32(1E9 + blockId); + proveBlock(Bob, meta, parentHash, blockHash, signalRoot); + verifyBlock(Carol, 1); + mine(blockId); + parentHash = blockHash; + } + printVariables(""); + } + + /// @dev Test block time goes down lover time and the fee should remain + // the same. + function test_block_time_decreases_but_fee_remains() external { + _depositTaikoToken(Alice, 1E6, 100); + _depositTaikoToken(Bob, 1E6, 100); + _depositTaikoToken(Carol, 1E6, 100); + + bytes32 parentHash = GENESIS_BLOCK_HASH; + + uint total = conf.maxNumProposedBlocks * 10; + + for (uint blockId = 1; blockId < total; blockId++) { + printVariables("before propose"); + TaikoData.BlockMetadata memory meta = proposeBlock(Alice, 1024); + mine(1); + + bytes32 blockHash = bytes32(1E10 + blockId); + bytes32 signalRoot = bytes32(1E9 + blockId); + proveBlock(Bob, meta, parentHash, blockHash, signalRoot); + verifyBlock(Carol, 1); + mine(total + 1 - blockId); + parentHash = blockHash; + } + printVariables(""); + } +} diff --git a/packages/protocol/test2/TaikoL1TestBase.sol b/packages/protocol/test2/TaikoL1TestBase.sol new file mode 100644 index 00000000000..2c43831f7ff --- /dev/null +++ b/packages/protocol/test2/TaikoL1TestBase.sol @@ -0,0 +1,194 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity ^0.8.18; + +import {Test} from "forge-std/Test.sol"; +import {console2} from "forge-std/console2.sol"; +import {AddressManager} from "../contracts/thirdparty/AddressManager.sol"; +import {TaikoConfig} from "../contracts/L1/TaikoConfig.sol"; +import {TaikoData} from "../contracts/L1/TaikoData.sol"; +import {TaikoL1} from "../contracts/L1/TaikoL1.sol"; +import {TaikoToken} from "../contracts/L1/TaikoToken.sol"; +import {SignalService} from "../contracts/signal/SignalService.sol"; +import {Strings} from "@openzeppelin/contracts/utils/Strings.sol"; + +abstract contract TaikoL1TestBase is Test { + AddressManager public addressManager; + TaikoToken public tko; + SignalService public ss; + TaikoL1 public L1; + TaikoData.Config conf; + uint256 internal logCount; + + bytes32 public constant GENESIS_BLOCK_HASH = + keccak256("GENESIS_BLOCK_HASH"); + uint64 feeBaseTwei = 1000000; // 1 TKO + + address public constant L2SS = 0xa008AE5Ba00656a3Cc384de589579e3E52aC030C; + address public constant L2TaikoL2 = + 0x0082D90249342980d011C58105a03b35cCb4A315; + + address public constant Alice = 0x10020FCb72e27650651B05eD2CEcA493bC807Ba4; + address public constant Bob = 0x200708D76eB1B69761c23821809d53F65049939e; + address public constant Carol = 0x300C9b60E19634e12FC6D68B7FEa7bFB26c2E419; + address public constant Dave = 0x400147C0Eb43D8D71b2B03037bB7B31f8f78EF5F; + address public constant Eve = 0x50081b12838240B1bA02b3177153Bca678a86078; + + function deployTaikoL1() internal virtual returns (TaikoL1 taikoL1); + + function setUp() public virtual { + // vm.warp(1000000); + addressManager = new AddressManager(); + addressManager.init(); + + L1 = deployTaikoL1(); + L1.init(address(addressManager), GENESIS_BLOCK_HASH, feeBaseTwei); + conf = L1.getConfig(); + + tko = new TaikoToken(); + address[] memory premintRecipients; + uint256[] memory premintAmounts; + tko.init( + address(addressManager), + "TaikoToken", + "TKO", + premintRecipients, + premintAmounts + ); + + ss = new SignalService(); + ss.init(address(addressManager)); + + // set proto_broker to this address to mint some TKO + _registerAddress("proto_broker", address(this)); + tko.mint(address(this), 1E12 ether); + + // register all addresses + _registerAddress("taiko_token", address(tko)); + _registerAddress("proto_broker", address(L1)); + _registerAddress("signal_service", address(ss)); + _registerL2Address("signal_service", address(L2SS)); + _registerL2Address("taiko_l2", address(L2TaikoL2)); + + printVariables("init "); + } + + function proposeBlock( + address proposer, + uint24 txListSize + ) internal returns (TaikoData.BlockMetadata memory meta) { + uint32 gasLimit = 1000000; + bytes memory txList = new bytes(txListSize); + TaikoData.BlockMetadataInput memory input = TaikoData + .BlockMetadataInput({ + beneficiary: proposer, + gasLimit: gasLimit, + txListHash: keccak256(txList), + txListByteStart: 0, + txListByteEnd: txListSize, + cacheTxListInfo: 0 + }); + + TaikoData.StateVariables memory variables = L1.getStateVariables(); + + uint256 _mixHash; + unchecked { + _mixHash = block.prevrandao * variables.nextBlockId; + } + + meta.id = variables.nextBlockId; + meta.l1Height = uint64(block.number - 1); + meta.l1Hash = blockhash(block.number - 1); + meta.beneficiary = proposer; + meta.txListHash = keccak256(txList); + meta.mixHash = bytes32(_mixHash); + meta.gasLimit = gasLimit; + meta.timestamp = uint64(block.timestamp); + + vm.prank(proposer, proposer); + L1.proposeBlock(abi.encode(input), txList); + } + + function proveBlock( + address prover, + TaikoData.BlockMetadata memory meta, + bytes32 parentHash, + bytes32 blockHash, + bytes32 signalRoot + ) internal { + TaikoData.ZKProof memory zkproof = TaikoData.ZKProof({ + data: new bytes(100), + verifierId: 100 + }); + + TaikoData.BlockEvidence memory evidence = TaikoData.BlockEvidence({ + meta: meta, + zkproof: zkproof, + parentHash: parentHash, + blockHash: blockHash, + signalRoot: signalRoot, + prover: prover + }); + + vm.prank(prover, prover); + L1.proveBlock(meta.id, abi.encode(evidence)); + } + + function verifyBlock(address verifier, uint256 count) internal { + vm.prank(verifier, verifier); + L1.verifyBlocks(count); + } + + function _registerAddress(string memory name, address addr) internal { + string memory key = L1.keyForName(block.chainid, name); + addressManager.setAddress(key, addr); + console2.log(key, unicode"→", addr); + } + + function _registerL2Address(string memory name, address addr) internal { + string memory key = L1.keyForName(conf.chainId, name); + addressManager.setAddress(key, addr); + console2.log(key, unicode"→", addr); + } + + function _depositTaikoToken( + address who, + uint256 amountTko, + uint amountEth + ) internal { + vm.deal(who, amountEth * 1 ether); + tko.transfer(who, amountTko * 1 ether); + vm.prank(who, who); + L1.deposit(amountTko * 1 ether); + } + + function printVariables(string memory comment) internal { + TaikoData.StateVariables memory vars = L1.getStateVariables(); + (uint256 fee, ) = L1.getBlockFee(); + fee /= 1E12; + string memory str = string.concat( + Strings.toString(logCount++), + ":[", + Strings.toString(vars.lastBlockId), + unicode"→", + Strings.toString(vars.nextBlockId), + "] feeBase(twei):", + Strings.toString(vars.feeBaseTwei), + " fee(twei):", + Strings.toString(fee), + " avgBlockTime:", + Strings.toString(vars.avgBlockTime), + " avgProofTime:", + Strings.toString(vars.avgProofTime), + " lastProposedAt:", + Strings.toString(vars.lastProposedAt), + " // ", + comment + ); + console2.log(str); + } + + function mine(uint256 counts) internal { + vm.warp(block.timestamp + 20 * counts); + vm.roll(block.number + counts); + } +} diff --git a/packages/protocol/test2/TaikoL2.t.sol b/packages/protocol/test2/TaikoL2.t.sol new file mode 100644 index 00000000000..02e37a5f036 --- /dev/null +++ b/packages/protocol/test2/TaikoL2.t.sol @@ -0,0 +1,56 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.18; + +import "forge-std/Test.sol"; +import "forge-std/console2.sol"; +import "../contracts/L2/TaikoL2.sol"; + +contract ReadBlockhashVsCalldata is Test { + TaikoL2 public L2; + + function setUp() public { + L2 = new TaikoL2(); + L2.init(address(1)); // Dummy address manager address. + vm.roll(block.number + 1); + } + + function testAnchorTxs() external { + for (uint256 i = 0; i < 1000; i++) { + vm.prank(L2.GOLDEN_TOUCH_ADDRESS()); + L2.anchor(12345, keccak256("a"), keccak256("b")); + vm.roll(block.number + 1); + } + } + + // calling anchor in the same block more than once should fail + function testAnchorTxsFailInTheSameBlock() external { + vm.prank(L2.GOLDEN_TOUCH_ADDRESS()); + L2.anchor(12345, keccak256("a"), keccak256("b")); + + vm.prank(L2.GOLDEN_TOUCH_ADDRESS()); + vm.expectRevert(); + L2.anchor(12345, keccak256("a"), keccak256("b")); + } + + // calling anchor in the same block more than once should fail + function testAnchorTxsFailByNonTaikoL2Signer() external { + vm.expectRevert(); + L2.anchor(12345, keccak256("a"), keccak256("b")); + } + + function testAnchorSigning(bytes32 digest) external { + (uint8 v, uint256 r, uint256 s) = L2.signAnchor(digest, uint8(1)); + address signer = ecrecover(digest, v + 27, bytes32(r), bytes32(s)); + assertEq(signer, L2.GOLDEN_TOUCH_ADDRESS()); + + (v, r, s) = L2.signAnchor(digest, uint8(2)); + signer = ecrecover(digest, v + 27, bytes32(r), bytes32(s)); + assertEq(signer, L2.GOLDEN_TOUCH_ADDRESS()); + + vm.expectRevert(); + L2.signAnchor(digest, uint8(0)); + + vm.expectRevert(); + L2.signAnchor(digest, uint8(3)); + } +} diff --git a/packages/protocol/utils/generate_config/main.py b/packages/protocol/utils/generate_config/main.py index e0449f0fc45..160dba63e12 100644 --- a/packages/protocol/utils/generate_config/main.py +++ b/packages/protocol/utils/generate_config/main.py @@ -38,5 +38,5 @@ # print(1.0*(f+n*1000)*(f+n*1000-1000)/((f+1000)*f)) print("---------") - print("maxNumBlocks:", max_num_slots) + print("maxNumProposedBlocks:", max_num_slots) print("slotSmoothingFactor:", fee_smoothing_factor) diff --git a/packages/protocol/utils/generate_genesis/taikoL2.ts b/packages/protocol/utils/generate_genesis/taikoL2.ts index 2853c6f0ad4..f2b3dd9b812 100644 --- a/packages/protocol/utils/generate_genesis/taikoL2.ts +++ b/packages/protocol/utils/generate_genesis/taikoL2.ts @@ -109,10 +109,6 @@ async function generateContractConfigs( ARTIFACTS_PATH, "./bridge/libs/LibBridgeProcess.sol/LibBridgeProcess.json" )), - LibTxDecoder: require(path.join( - ARTIFACTS_PATH, - "./libs/LibTxDecoder.sol/LibTxDecoder.json" - )), // Contracts AddressManager: require(path.join( ARTIFACTS_PATH, @@ -147,10 +143,6 @@ async function generateContractConfigs( switch (contractName) { case "TaikoL2": - if (!addressMap.LibTxDecoder) { - throw new Error("LibTxDecoder not initialized"); - } - bytecode = linkContractLibs( contractArtifacts.TaikoL2, addressMap @@ -235,11 +227,6 @@ async function generateContractConfigs( ), variables: {}, }, - LibTxDecoder: { - address: addressMap.LibTxDecoder, - deployedBytecode: contractArtifacts.LibTxDecoder.deployedBytecode, - variables: {}, - }, AddressManager: { address: addressMap.AddressManager, deployedBytecode: contractArtifacts.AddressManager.deployedBytecode, @@ -282,19 +269,19 @@ async function generateContractConfigs( addressMap ), variables: { - // ReentrancyGuardUpgradeable - _status: 1, // _NOT_ENTERED - // AddressResolver - _addressManager: addressMap.AddressManager, // TaikoL2 // keccak256(abi.encodePacked(block.chainid, basefee, ancestors)) - _publicInputHash: `${ethers.utils.solidityKeccak256( - ["uint256", "uint256", "uint256", "bytes32[255]"], + publicInputHash: `${ethers.utils.solidityKeccak256( + ["bytes32[256]"], [ - chainId, - 0, - 0, - new Array(255).fill(ethers.constants.HashZero), + new Array(255) + .fill(ethers.constants.HashZero) + .concat([ + ethers.utils.hexZeroPad( + ethers.utils.hexlify(chainId), + 32 + ), + ]), ] )}`, }, diff --git a/packages/relayer/TaikoL1.json b/packages/relayer/TaikoL1.json index f04a963da2d..a52b5f49163 100644 --- a/packages/relayer/TaikoL1.json +++ b/packages/relayer/TaikoL1.json @@ -473,12 +473,12 @@ }, { "internalType": "uint256", - "name": "maxNumBlocks", + "name": "maxNumProposedBlocks", "type": "uint256" }, { "internalType": "uint256", - "name": "blockHashHistory", + "name": "maxNumVerifiedBlocks", "type": "uint256" }, { @@ -548,7 +548,7 @@ }, { "internalType": "uint64", - "name": "rewardMultiplierPctg", + "name": "feeMultiplierPctg", "type": "uint64" }, { @@ -558,7 +558,7 @@ }, { "internalType": "uint64", - "name": "feeMaxPeriodPctg", + "name": "feeMaxPctg", "type": "uint64" }, { @@ -727,7 +727,7 @@ "type": "address" } ], - "name": "getRewardBalance", + "name": "getBalance", "outputs": [ { "internalType": "uint256", @@ -781,7 +781,7 @@ }, { "internalType": "uint64", - "name": "latestVerifiedId", + "name": "lastBlockId", "type": "uint64" }, { @@ -1081,7 +1081,7 @@ }, { "internalType": "uint64", - "name": "latestVerifiedId", + "name": "lastBlockId", "type": "uint64" }, { diff --git a/packages/relayer/contracts/taikol1/TaikoL1.go b/packages/relayer/contracts/taikol1/TaikoL1.go index 536a40aa63a..e90754ac72d 100644 --- a/packages/relayer/contracts/taikol1/TaikoL1.go +++ b/packages/relayer/contracts/taikol1/TaikoL1.go @@ -103,7 +103,7 @@ type TaikoDataProposedBlock struct { // TaikoL1MetaData contains all meta data concerning the TaikoL1 contract. var TaikoL1MetaData = &bind.MetaData{ - ABI: "[{\"inputs\":[],\"name\":\"L1_0_FEE_BASE\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"L1_0_FEE_BASE\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"L1_ALREADY_PROVEN\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"L1_ANCHOR_CALLDATA\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"L1_ANCHOR_DEST\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"L1_ANCHOR_GAS_LIMIT\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"L1_ANCHOR_RECEIPT_ADDR\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"L1_ANCHOR_RECEIPT_DATA\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"L1_ANCHOR_RECEIPT_LOGS\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"L1_ANCHOR_RECEIPT_PROOF\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"L1_ANCHOR_RECEIPT_STATUS\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"L1_ANCHOR_RECEIPT_TOPICS\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"L1_ANCHOR_SIG_R\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"L1_ANCHOR_SIG_S\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"L1_ANCHOR_TX_PROOF\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"L1_ANCHOR_TYPE\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"L1_BLOCK_NUMBER\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"L1_BLOCK_NUMBER\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"L1_CANNOT_BE_FIRST_PROVER\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"L1_COMMITTED\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"L1_CONFLICT_PROOF\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"L1_CONTRACT_NOT_ALLOWED\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"L1_DUP_PROVERS\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"L1_EXTRA_DATA\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"L1_GAS_LIMIT\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"L1_ID\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"L1_ID\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"L1_INPUT_SIZE\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"L1_INVALID_CONFIG\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"L1_INVALID_CONFIG\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"L1_INVALID_PARAM\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"L1_METADATA_FIELD\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"L1_META_MISMATCH\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"L1_NOT_COMMITTED\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"L1_NOT_ORACLE_PROVER\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"L1_PROOF_LENGTH\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"L1_PROVER\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"L1_SOLO_PROPOSER\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"L1_TOO_MANY_BLOCKS\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"L1_TX_LIST\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"L1_ZKP\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"RESOLVER_DENIED\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"RESOLVER_INVALID_ADDR\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"commitSlot\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"commitHash\",\"type\":\"bytes32\"}],\"name\":\"BlockCommitted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"l1Height\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"l1Hash\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"beneficiary\",\"type\":\"address\"},{\"internalType\":\"bytes32\",\"name\":\"txListHash\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"mixHash\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"extraData\",\"type\":\"bytes\"},{\"internalType\":\"uint64\",\"name\":\"gasLimit\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"timestamp\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"commitHeight\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"commitSlot\",\"type\":\"uint64\"}],\"indexed\":false,\"internalType\":\"structTaikoData.BlockMetadata\",\"name\":\"meta\",\"type\":\"tuple\"}],\"name\":\"BlockProposed\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"parentHash\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"blockHash\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"prover\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"provenAt\",\"type\":\"uint64\"}],\"name\":\"BlockProven\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"blockHash\",\"type\":\"bytes32\"}],\"name\":\"BlockVerified\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"srcHeight\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"srcHash\",\"type\":\"bytes32\"}],\"name\":\"HeaderSynced\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"version\",\"type\":\"uint8\"}],\"name\":\"Initialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"addressManager\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"commitSlot\",\"type\":\"uint64\"},{\"internalType\":\"bytes32\",\"name\":\"commitHash\",\"type\":\"bytes32\"}],\"name\":\"commitBlock\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getBlockFee\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getConfig\",\"outputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"chainId\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxNumBlocks\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"blockHashHistory\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxVerificationsPerTx\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"commitConfirmations\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"blockMaxGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxTransactionsPerBlock\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxBytesPerTxList\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"minTxGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"anchorTxGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"slotSmoothingFactor\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"rewardBurnBips\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"proposerDepositPctg\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"feeBaseMAF\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"blockTimeMAF\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"proofTimeMAF\",\"type\":\"uint256\"},{\"internalType\":\"uint64\",\"name\":\"rewardMultiplierPctg\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"feeGracePeriodPctg\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"feeMaxPeriodPctg\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"blockTimeCap\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"proofTimeCap\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"bootstrapDiscountHalvingPeriod\",\"type\":\"uint64\"},{\"internalType\":\"bool\",\"name\":\"enableTokenomics\",\"type\":\"bool\"},{\"internalType\":\"bool\",\"name\":\"enablePublicInputsCheck\",\"type\":\"bool\"},{\"internalType\":\"bool\",\"name\":\"enableAnchorValidation\",\"type\":\"bool\"}],\"internalType\":\"structTaikoData.Config\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"parentHash\",\"type\":\"bytes32\"}],\"name\":\"getForkChoice\",\"outputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"blockHash\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"prover\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"provenAt\",\"type\":\"uint64\"}],\"internalType\":\"structTaikoData.ForkChoice\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getLatestSyncedHeader\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"provenAt\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"proposedAt\",\"type\":\"uint64\"}],\"name\":\"getProofReward\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"reward\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"}],\"name\":\"getProposedBlock\",\"outputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"metaHash\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"deposit\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"proposer\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"proposedAt\",\"type\":\"uint64\"}],\"internalType\":\"structTaikoData.ProposedBlock\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"addr\",\"type\":\"address\"}],\"name\":\"getRewardBalance\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getStateVariables\",\"outputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"feeBase\",\"type\":\"uint256\"},{\"internalType\":\"uint64\",\"name\":\"genesisHeight\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"genesisTimestamp\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"nextBlockId\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"lastProposedAt\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"avgBlockTime\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"latestVerifiedHeight\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"latestVerifiedId\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"avgProofTime\",\"type\":\"uint64\"}],\"internalType\":\"structLibUtils.StateVariables\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"number\",\"type\":\"uint256\"}],\"name\":\"getSyncedHeader\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_addressManager\",\"type\":\"address\"},{\"internalType\":\"bytes32\",\"name\":\"_genesisBlockHash\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"_feeBase\",\"type\":\"uint256\"}],\"name\":\"init\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"commitSlot\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"commitHeight\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"commitHash\",\"type\":\"bytes32\"}],\"name\":\"isCommitValid\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes[]\",\"name\":\"inputs\",\"type\":\"bytes[]\"}],\"name\":\"proposeBlock\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"blockId\",\"type\":\"uint256\"},{\"internalType\":\"bytes[]\",\"name\":\"inputs\",\"type\":\"bytes[]\"}],\"name\":\"proveBlock\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"blockId\",\"type\":\"uint256\"},{\"internalType\":\"bytes[]\",\"name\":\"inputs\",\"type\":\"bytes[]\"}],\"name\":\"proveBlockInvalid\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"name\",\"type\":\"string\"},{\"internalType\":\"bool\",\"name\":\"allowZeroAddress\",\"type\":\"bool\"}],\"name\":\"resolve\",\"outputs\":[{\"internalType\":\"addresspayable\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"chainId\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"name\",\"type\":\"string\"},{\"internalType\":\"bool\",\"name\":\"allowZeroAddress\",\"type\":\"bool\"}],\"name\":\"resolve\",\"outputs\":[{\"internalType\":\"addresspayable\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"hash\",\"type\":\"bytes32\"},{\"internalType\":\"uint8\",\"name\":\"k\",\"type\":\"uint8\"}],\"name\":\"signWithGoldenTouch\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"v\",\"type\":\"uint8\"},{\"internalType\":\"uint256\",\"name\":\"r\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"s\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"state\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"genesisHeight\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"genesisTimestamp\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"__reservedA1\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"__reservedA2\",\"type\":\"uint64\"},{\"internalType\":\"uint256\",\"name\":\"feeBase\",\"type\":\"uint256\"},{\"internalType\":\"uint64\",\"name\":\"nextBlockId\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"lastProposedAt\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"avgBlockTime\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"__avgGasLimit\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"latestVerifiedHeight\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"latestVerifiedId\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"avgProofTime\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"__reservedC1\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"maxBlocks\",\"type\":\"uint256\"}],\"name\":\"verifyBlocks\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"withdrawBalance\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]", + ABI: "[{\"inputs\":[],\"name\":\"L1_0_FEE_BASE\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"L1_ALREADY_PROVEN\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"L1_ANCHOR_CALLDATA\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"L1_ANCHOR_DEST\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"L1_ANCHOR_GAS_LIMIT\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"L1_ANCHOR_RECEIPT_ADDR\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"L1_ANCHOR_RECEIPT_DATA\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"L1_ANCHOR_RECEIPT_LOGS\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"L1_ANCHOR_RECEIPT_PROOF\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"L1_ANCHOR_RECEIPT_STATUS\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"L1_ANCHOR_RECEIPT_TOPICS\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"L1_ANCHOR_SIG_R\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"L1_ANCHOR_SIG_S\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"L1_ANCHOR_TX_PROOF\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"L1_ANCHOR_TYPE\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"L1_BLOCK_NUMBER\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"L1_BLOCK_NUMBER\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"L1_CANNOT_BE_FIRST_PROVER\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"L1_COMMITTED\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"L1_CONFLICT_PROOF\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"L1_CONTRACT_NOT_ALLOWED\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"L1_DUP_PROVERS\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"L1_EXTRA_DATA\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"L1_GAS_LIMIT\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"L1_ID\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"L1_ID\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"L1_INPUT_SIZE\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"L1_INVALID_PARAM\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"L1_METADATA_FIELD\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"L1_META_MISMATCH\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"L1_NOT_COMMITTED\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"L1_NOT_ORACLE_PROVER\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"L1_PROOF_LENGTH\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"L1_PROVER\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"L1_SOLO_PROPOSER\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"L1_TOO_MANY_BLOCKS\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"L1_TX_LIST\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"L1_ZKP\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"RESOLVER_DENIED\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"RESOLVER_INVALID_ADDR\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"commitSlot\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"commitHash\",\"type\":\"bytes32\"}],\"name\":\"BlockCommitted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"l1Height\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"l1Hash\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"beneficiary\",\"type\":\"address\"},{\"internalType\":\"bytes32\",\"name\":\"txListHash\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"mixHash\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"extraData\",\"type\":\"bytes\"},{\"internalType\":\"uint64\",\"name\":\"gasLimit\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"timestamp\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"commitHeight\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"commitSlot\",\"type\":\"uint64\"}],\"indexed\":false,\"internalType\":\"structTaikoData.BlockMetadata\",\"name\":\"meta\",\"type\":\"tuple\"}],\"name\":\"BlockProposed\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"parentHash\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"blockHash\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"prover\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"provenAt\",\"type\":\"uint64\"}],\"name\":\"BlockProven\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"blockHash\",\"type\":\"bytes32\"}],\"name\":\"BlockVerified\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"srcHeight\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"srcHash\",\"type\":\"bytes32\"}],\"name\":\"HeaderSynced\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"version\",\"type\":\"uint8\"}],\"name\":\"Initialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"addressManager\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"commitSlot\",\"type\":\"uint64\"},{\"internalType\":\"bytes32\",\"name\":\"commitHash\",\"type\":\"bytes32\"}],\"name\":\"commitBlock\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getBlockFee\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getConfig\",\"outputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"chainId\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxNumProposedBlocks\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxNumVerifiedBlocks\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxVerificationsPerTx\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"commitConfirmations\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"blockMaxGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxTransactionsPerBlock\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxBytesPerTxList\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"minTxGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"anchorTxGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"slotSmoothingFactor\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"rewardBurnBips\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"proposerDepositPctg\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"feeBaseMAF\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"blockTimeMAF\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"proofTimeMAF\",\"type\":\"uint256\"},{\"internalType\":\"uint64\",\"name\":\"feeMultiplierPctg\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"feeGracePeriodPctg\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"feeMaxPctg\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"blockTimeCap\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"proofTimeCap\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"bootstrapDiscountHalvingPeriod\",\"type\":\"uint64\"},{\"internalType\":\"bool\",\"name\":\"enableTokenomics\",\"type\":\"bool\"},{\"internalType\":\"bool\",\"name\":\"enablePublicInputsCheck\",\"type\":\"bool\"},{\"internalType\":\"bool\",\"name\":\"enableAnchorValidation\",\"type\":\"bool\"}],\"internalType\":\"structTaikoData.Config\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"parentHash\",\"type\":\"bytes32\"}],\"name\":\"getForkChoice\",\"outputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"blockHash\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"prover\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"provenAt\",\"type\":\"uint64\"}],\"internalType\":\"structTaikoData.ForkChoice\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getLatestSyncedHeader\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"provenAt\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"proposedAt\",\"type\":\"uint64\"}],\"name\":\"getProofReward\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"reward\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"}],\"name\":\"getProposedBlock\",\"outputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"metaHash\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"deposit\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"proposer\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"proposedAt\",\"type\":\"uint64\"}],\"internalType\":\"structTaikoData.ProposedBlock\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"addr\",\"type\":\"address\"}],\"name\":\"getBalance\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getStateVariables\",\"outputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"feeBase\",\"type\":\"uint256\"},{\"internalType\":\"uint64\",\"name\":\"genesisHeight\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"genesisTimestamp\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"nextBlockId\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"lastProposedAt\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"avgBlockTime\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"latestVerifiedHeight\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"lastBlockId\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"avgProofTime\",\"type\":\"uint64\"}],\"internalType\":\"structLibUtils.StateVariables\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"number\",\"type\":\"uint256\"}],\"name\":\"getSyncedHeader\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_addressManager\",\"type\":\"address\"},{\"internalType\":\"bytes32\",\"name\":\"_genesisBlockHash\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"_feeBase\",\"type\":\"uint256\"}],\"name\":\"init\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"commitSlot\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"commitHeight\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"commitHash\",\"type\":\"bytes32\"}],\"name\":\"isCommitValid\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes[]\",\"name\":\"inputs\",\"type\":\"bytes[]\"}],\"name\":\"proposeBlock\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"blockId\",\"type\":\"uint256\"},{\"internalType\":\"bytes[]\",\"name\":\"inputs\",\"type\":\"bytes[]\"}],\"name\":\"proveBlock\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"blockId\",\"type\":\"uint256\"},{\"internalType\":\"bytes[]\",\"name\":\"inputs\",\"type\":\"bytes[]\"}],\"name\":\"proveBlockInvalid\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"name\",\"type\":\"string\"},{\"internalType\":\"bool\",\"name\":\"allowZeroAddress\",\"type\":\"bool\"}],\"name\":\"resolve\",\"outputs\":[{\"internalType\":\"addresspayable\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"chainId\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"name\",\"type\":\"string\"},{\"internalType\":\"bool\",\"name\":\"allowZeroAddress\",\"type\":\"bool\"}],\"name\":\"resolve\",\"outputs\":[{\"internalType\":\"addresspayable\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"hash\",\"type\":\"bytes32\"},{\"internalType\":\"uint8\",\"name\":\"k\",\"type\":\"uint8\"}],\"name\":\"signWithGoldenTouch\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"v\",\"type\":\"uint8\"},{\"internalType\":\"uint256\",\"name\":\"r\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"s\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"state\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"genesisHeight\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"genesisTimestamp\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"__reservedA1\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"__reservedA2\",\"type\":\"uint64\"},{\"internalType\":\"uint256\",\"name\":\"feeBase\",\"type\":\"uint256\"},{\"internalType\":\"uint64\",\"name\":\"nextBlockId\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"lastProposedAt\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"avgBlockTime\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"__avgGasLimit\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"latestVerifiedHeight\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"lastBlockId\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"avgProofTime\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"__reservedC1\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"maxBlocks\",\"type\":\"uint256\"}],\"name\":\"verifyBlocks\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"withdrawBalance\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]", } // TaikoL1ABI is the input ABI used to generate the binding from. @@ -471,10 +471,10 @@ func (_TaikoL1 *TaikoL1CallerSession) GetProposedBlock(id *big.Int) (TaikoDataPr // GetRewardBalance is a free data retrieval call binding the contract method 0xd5a849e9. // -// Solidity: function getRewardBalance(address addr) view returns(uint256) +// Solidity: function getBalance(address addr) view returns(uint256) func (_TaikoL1 *TaikoL1Caller) GetRewardBalance(opts *bind.CallOpts, addr common.Address) (*big.Int, error) { var out []interface{} - err := _TaikoL1.contract.Call(opts, &out, "getRewardBalance", addr) + err := _TaikoL1.contract.Call(opts, &out, "getBalance", addr) if err != nil { return *new(*big.Int), err @@ -488,14 +488,14 @@ func (_TaikoL1 *TaikoL1Caller) GetRewardBalance(opts *bind.CallOpts, addr common // GetRewardBalance is a free data retrieval call binding the contract method 0xd5a849e9. // -// Solidity: function getRewardBalance(address addr) view returns(uint256) +// Solidity: function getBalance(address addr) view returns(uint256) func (_TaikoL1 *TaikoL1Session) GetRewardBalance(addr common.Address) (*big.Int, error) { return _TaikoL1.Contract.GetRewardBalance(&_TaikoL1.CallOpts, addr) } // GetRewardBalance is a free data retrieval call binding the contract method 0xd5a849e9. // -// Solidity: function getRewardBalance(address addr) view returns(uint256) +// Solidity: function getBalance(address addr) view returns(uint256) func (_TaikoL1 *TaikoL1CallerSession) GetRewardBalance(addr common.Address) (*big.Int, error) { return _TaikoL1.Contract.GetRewardBalance(&_TaikoL1.CallOpts, addr) } @@ -738,7 +738,7 @@ func (_TaikoL1 *TaikoL1CallerSession) SignWithGoldenTouch(hash [32]byte, k uint8 // State is a free data retrieval call binding the contract method 0xc19d93fb. // -// Solidity: function state() view returns(uint64 genesisHeight, uint64 genesisTimestamp, uint64 __reservedA1, uint64 __reservedA2, uint256 feeBase, uint64 nextBlockId, uint64 lastProposedAt, uint64 avgBlockTime, uint64 __avgGasLimit, uint64 latestVerifiedHeight, uint64 latestVerifiedId, uint64 avgProofTime, uint64 __reservedC1) +// Solidity: function state() view returns(uint64 genesisHeight, uint64 genesisTimestamp, uint64 __reservedA1, uint64 __reservedA2, uint256 feeBase, uint64 nextBlockId, uint64 lastProposedAt, uint64 avgBlockTime, uint64 __avgGasLimit, uint64 latestVerifiedHeight, uint64 lastBlockId, uint64 avgProofTime, uint64 __reservedC1) func (_TaikoL1 *TaikoL1Caller) State(opts *bind.CallOpts) (struct { GenesisHeight uint64 GenesisTimestamp uint64 @@ -796,7 +796,7 @@ func (_TaikoL1 *TaikoL1Caller) State(opts *bind.CallOpts) (struct { // State is a free data retrieval call binding the contract method 0xc19d93fb. // -// Solidity: function state() view returns(uint64 genesisHeight, uint64 genesisTimestamp, uint64 __reservedA1, uint64 __reservedA2, uint256 feeBase, uint64 nextBlockId, uint64 lastProposedAt, uint64 avgBlockTime, uint64 __avgGasLimit, uint64 latestVerifiedHeight, uint64 latestVerifiedId, uint64 avgProofTime, uint64 __reservedC1) +// Solidity: function state() view returns(uint64 genesisHeight, uint64 genesisTimestamp, uint64 __reservedA1, uint64 __reservedA2, uint256 feeBase, uint64 nextBlockId, uint64 lastProposedAt, uint64 avgBlockTime, uint64 __avgGasLimit, uint64 latestVerifiedHeight, uint64 lastBlockId, uint64 avgProofTime, uint64 __reservedC1) func (_TaikoL1 *TaikoL1Session) State() (struct { GenesisHeight uint64 GenesisTimestamp uint64 @@ -817,7 +817,7 @@ func (_TaikoL1 *TaikoL1Session) State() (struct { // State is a free data retrieval call binding the contract method 0xc19d93fb. // -// Solidity: function state() view returns(uint64 genesisHeight, uint64 genesisTimestamp, uint64 __reservedA1, uint64 __reservedA2, uint256 feeBase, uint64 nextBlockId, uint64 lastProposedAt, uint64 avgBlockTime, uint64 __avgGasLimit, uint64 latestVerifiedHeight, uint64 latestVerifiedId, uint64 avgProofTime, uint64 __reservedC1) +// Solidity: function state() view returns(uint64 genesisHeight, uint64 genesisTimestamp, uint64 __reservedA1, uint64 __reservedA2, uint256 feeBase, uint64 nextBlockId, uint64 lastProposedAt, uint64 avgBlockTime, uint64 __avgGasLimit, uint64 latestVerifiedHeight, uint64 lastBlockId, uint64 avgProofTime, uint64 __reservedC1) func (_TaikoL1 *TaikoL1CallerSession) State() (struct { GenesisHeight uint64 GenesisTimestamp uint64 diff --git a/packages/relayer/contracts/taikol2/TaikoL2.go b/packages/relayer/contracts/taikol2/TaikoL2.go index f9c6d49c45d..efd19a7c899 100644 --- a/packages/relayer/contracts/taikol2/TaikoL2.go +++ b/packages/relayer/contracts/taikol2/TaikoL2.go @@ -60,12 +60,11 @@ type TaikoDataConfig struct { // TaikoL2MetaData contains all meta data concerning the TaikoL2 contract. var TaikoL2MetaData = &bind.MetaData{ - ABI: "[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_addressManager\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"ERR_INVALID_HINT\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ERR_INVALID_TX_IDX\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ERR_PARAMS_NOT_DEFAULTS\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ERR_VERIFICAITON_FAILURE\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"L2_INVALID_CHAIN_ID\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"L2_INVALID_GAS_PRICE\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"L2_INVALID_SENDER\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"L2_PUBLIC_INPUT_HASH_MISMATCH\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"RESOLVER_DENIED\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"RESOLVER_INVALID_ADDR\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"txListHash\",\"type\":\"bytes32\"}],\"name\":\"BlockInvalidated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"srcHeight\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"srcHash\",\"type\":\"bytes32\"}],\"name\":\"HeaderSynced\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"addressManager\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"l1Height\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"l1Hash\",\"type\":\"bytes32\"}],\"name\":\"anchor\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"number\",\"type\":\"uint256\"}],\"name\":\"getBlockHash\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getConfig\",\"outputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"chainId\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxNumBlocks\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"blockHashHistory\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxVerificationsPerTx\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"commitConfirmations\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"blockMaxGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxTransactionsPerBlock\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxBytesPerTxList\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"minTxGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"anchorTxGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"slotSmoothingFactor\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"rewardBurnBips\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"proposerDepositPctg\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"feeBaseMAF\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"blockTimeMAF\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"proofTimeMAF\",\"type\":\"uint256\"},{\"internalType\":\"uint64\",\"name\":\"rewardMultiplierPctg\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"feeGracePeriodPctg\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"feeMaxPeriodPctg\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"blockTimeCap\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"proofTimeCap\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"bootstrapDiscountHalvingPeriod\",\"type\":\"uint64\"},{\"internalType\":\"bool\",\"name\":\"enableTokenomics\",\"type\":\"bool\"},{\"internalType\":\"bool\",\"name\":\"enablePublicInputsCheck\",\"type\":\"bool\"},{\"internalType\":\"bool\",\"name\":\"enableAnchorValidation\",\"type\":\"bool\"}],\"internalType\":\"structTaikoData.Config\",\"name\":\"config\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getLatestSyncedHeader\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"number\",\"type\":\"uint256\"}],\"name\":\"getSyncedHeader\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"txList\",\"type\":\"bytes\"},{\"internalType\":\"enumLibInvalidTxList.Hint\",\"name\":\"hint\",\"type\":\"uint8\"},{\"internalType\":\"uint256\",\"name\":\"txIdx\",\"type\":\"uint256\"}],\"name\":\"invalidateBlock\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"latestSyncedL1Height\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"name\",\"type\":\"string\"},{\"internalType\":\"bool\",\"name\":\"allowZeroAddress\",\"type\":\"bool\"}],\"name\":\"resolve\",\"outputs\":[{\"internalType\":\"addresspayable\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"chainId\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"name\",\"type\":\"string\"},{\"internalType\":\"bool\",\"name\":\"allowZeroAddress\",\"type\":\"bool\"}],\"name\":\"resolve\",\"outputs\":[{\"internalType\":\"addresspayable\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"}]", + ABI: "[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_addressManager\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"ERR_INVALID_HINT\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ERR_INVALID_TX_IDX\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ERR_PARAMS_NOT_DEFAULTS\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ERR_VERIFICAITON_FAILURE\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"L2_INVALID_CHAIN_ID\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"L2_INVALID_GAS_PRICE\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"L2_INVALID_SENDER\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"L2_PUBLIC_INPUT_HASH_MISMATCH\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"RESOLVER_DENIED\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"RESOLVER_INVALID_ADDR\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"txListHash\",\"type\":\"bytes32\"}],\"name\":\"BlockInvalidated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"srcHeight\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"srcHash\",\"type\":\"bytes32\"}],\"name\":\"HeaderSynced\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"addressManager\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"l1Height\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"l1Hash\",\"type\":\"bytes32\"}],\"name\":\"anchor\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"number\",\"type\":\"uint256\"}],\"name\":\"getBlockHash\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getConfig\",\"outputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"chainId\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxNumProposedBlocks\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxNumVerifiedBlocks\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxVerificationsPerTx\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"commitConfirmations\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"blockMaxGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxTransactionsPerBlock\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxBytesPerTxList\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"minTxGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"anchorTxGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"slotSmoothingFactor\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"rewardBurnBips\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"proposerDepositPctg\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"feeBaseMAF\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"blockTimeMAF\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"proofTimeMAF\",\"type\":\"uint256\"},{\"internalType\":\"uint64\",\"name\":\"rewardMultiplierPctg\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"feeGracePeriodPctg\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"feeMaxPeriodPctg\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"blockTimeCap\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"proofTimeCap\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"bootstrapDiscountHalvingPeriod\",\"type\":\"uint64\"},{\"internalType\":\"bool\",\"name\":\"enableTokenomics\",\"type\":\"bool\"},{\"internalType\":\"bool\",\"name\":\"enablePublicInputsCheck\",\"type\":\"bool\"},{\"internalType\":\"bool\",\"name\":\"enableAnchorValidation\",\"type\":\"bool\"}],\"internalType\":\"structTaikoData.Config\",\"name\":\"config\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getLatestSyncedHeader\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"number\",\"type\":\"uint256\"}],\"name\":\"getSyncedHeader\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"txList\",\"type\":\"bytes\"},{\"internalType\":\"enumLibInvalidTxList.Hint\",\"name\":\"hint\",\"type\":\"uint8\"},{\"internalType\":\"uint256\",\"name\":\"txIdx\",\"type\":\"uint256\"}],\"name\":\"invalidateBlock\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"latestSyncedL1Height\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"name\",\"type\":\"string\"},{\"internalType\":\"bool\",\"name\":\"allowZeroAddress\",\"type\":\"bool\"}],\"name\":\"resolve\",\"outputs\":[{\"internalType\":\"addresspayable\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"chainId\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"name\",\"type\":\"string\"},{\"internalType\":\"bool\",\"name\":\"allowZeroAddress\",\"type\":\"bool\"}],\"name\":\"resolve\",\"outputs\":[{\"internalType\":\"addresspayable\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"}]", } // TaikoL2ABI is the input ABI used to generate the binding from. -// Deprecated: Use TaikoL2MetaData.ABI instead. -var TaikoL2ABI = TaikoL2MetaData.ABI +const TaikoL2ABI = "[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_addressManager\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"txListHash\",\"type\":\"bytes32\"}],\"name\":\"BlockInvalidated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"height\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"srcHeight\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"srcHash\",\"type\":\"bytes32\"}],\"name\":\"HeaderSynced\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"addressManager\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"l1Height\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"l1Hash\",\"type\":\"bytes32\"}],\"name\":\"anchor\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"number\",\"type\":\"uint256\"}],\"name\":\"getBlockHash\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getConfig\",\"outputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"chainId\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxNumProposedBlocks\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxNumVerifiedBlocks\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"zkProofsPerBlock\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxVerificationsPerTx\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"commitConfirmations\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxProofsPerForkChoice\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"blockMaxGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxTransactionsPerBlock\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxBytesPerTxList\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"minTxGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"anchorTxGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"feePremiumLamda\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"rewardBurnBips\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"proposerDepositPctg\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"feeBaseMAF\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"blockTimeMAF\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"proofTimeMAF\",\"type\":\"uint256\"},{\"internalType\":\"uint64\",\"name\":\"feeMultiplierPctg\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"feeGracePeriodPctg\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"feeMaxPctg\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"blockTimeCap\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"proofTimeCap\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"bootstrapDiscountHalvingPeriod\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"initialUncleDelay\",\"type\":\"uint64\"},{\"internalType\":\"bool\",\"name\":\"enableTokenomics\",\"type\":\"bool\"},{\"internalType\":\"bool\",\"name\":\"enablePublicInputsCheck\",\"type\":\"bool\"},{\"internalType\":\"bool\",\"name\":\"enableAnchorValidation\",\"type\":\"bool\"}],\"internalType\":\"structTaikoData.Config\",\"name\":\"config\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getLatestSyncedHeader\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"number\",\"type\":\"uint256\"}],\"name\":\"getSyncedHeader\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"txList\",\"type\":\"bytes\"},{\"internalType\":\"enumLibInvalidTxList.Reason\",\"name\":\"hint\",\"type\":\"uint8\"},{\"internalType\":\"uint256\",\"name\":\"txIdx\",\"type\":\"uint256\"}],\"name\":\"invalidateBlock\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"latestSyncedL1Height\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"publicInputHash\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"name\",\"type\":\"string\"},{\"internalType\":\"bool\",\"name\":\"allowZeroAddress\",\"type\":\"bool\"}],\"name\":\"resolve\",\"outputs\":[{\"internalType\":\"addresspayable\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"chainId\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"name\",\"type\":\"string\"},{\"internalType\":\"bool\",\"name\":\"allowZeroAddress\",\"type\":\"bool\"}],\"name\":\"resolve\",\"outputs\":[{\"internalType\":\"addresspayable\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"}]" // TaikoL2 is an auto generated Go binding around an Ethereum contract. type TaikoL2 struct { diff --git a/packages/relayer/encoding/storage_proof.go b/packages/relayer/encoding/storage_proof.go deleted file mode 100644 index aa4d35bf2be..00000000000 --- a/packages/relayer/encoding/storage_proof.go +++ /dev/null @@ -1,24 +0,0 @@ -package encoding - -import ( - "github.com/ethereum/go-ethereum/accounts/abi" - "github.com/pkg/errors" -) - -func EncodeStorageProof(accountProof []byte, storageProof []byte) ([]byte, error) { - args := abi.Arguments{ - { - Type: bytesT, - }, - { - Type: bytesT, - }, - } - - encodedStorageProof, err := args.Pack(accountProof, storageProof) - if err != nil { - return nil, errors.Wrap(err, "args.Pack") - } - - return encodedStorageProof, nil -} diff --git a/packages/relayer/encoding/storage_proof_test.go b/packages/relayer/encoding/storage_proof_test.go deleted file mode 100644 index d850b5d7d44..00000000000 --- a/packages/relayer/encoding/storage_proof_test.go +++ /dev/null @@ -1,20 +0,0 @@ -package encoding - -import ( - "testing" - - "github.com/ethereum/go-ethereum/common/hexutil" - "gopkg.in/go-playground/assert.v1" -) - -func Test_EncodeStorageProof(t *testing.T) { - // nolint: lll - accountProof := "0x00edb9377a94f02e691ea208a80a7bd13dcb51dfae3a389d3001a55c5fdf3f3ae70807df1d8ffcaeefa5dc56875a03dae3494d93bbf3074018fea52137a098433d9795f455fcfaf89b6456b970605bd0f70bec98418ef322fa5bba9874ab2277225a38c19f99275cd6d25d9cd4259c366c02b750056a6b71810034f95d34ae12c1298a95e6ba03de90dbbfacc5c8edbeb6ed93a0e01c08f3435b1ca944e9229a176804445432795c14dc315925fe2480084d6b0729c30fb1c2e50e481df5d7daa25769a0c74baf362ff02f2a934538cd11bf939f64377489255aa60a12628b130f4bddd30664d6b5f91d17cc110bee38a7ce5c629585e57d777bfbb2eaf09e15" - // nolint: lll - storageProof := "0xfdb3b1c60d5e8417c0c2c1023544837fb73612bbc7511bf30dd0b2e282f1618a7b39a9baa238904acf33a97b1617f4a971da22ac40faf828ceb651f76be9df259f91037b93fcc1e8c9c8004f84aff0fafa4e446c30a4cef66a5a9cf529541d40d49ba6c2c64311cb221d3b80c622e886ec3d6780a6bdb6c47fe4f2d9a8704ccdb9bb29feb58e79b81b5e24d39be45c32d9161b1b36fb49f36404c9bea5c505862a463b07c178e6b28ff53f23ecaa5f2ae02f2db4e57a2fc2aa4a014dc0fa6f835881dc0f1cda6ee66f32141e5a421731ce5e19d875aad61284a33b9e1bc6c895098b1f347063109403551360b675a443b06c6675fd6554e7245ee95036928665" - // nolint: lll - want := "0x00000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000160000000000000000000000000000000000000000000000000000000000000010000edb9377a94f02e691ea208a80a7bd13dcb51dfae3a389d3001a55c5fdf3f3ae70807df1d8ffcaeefa5dc56875a03dae3494d93bbf3074018fea52137a098433d9795f455fcfaf89b6456b970605bd0f70bec98418ef322fa5bba9874ab2277225a38c19f99275cd6d25d9cd4259c366c02b750056a6b71810034f95d34ae12c1298a95e6ba03de90dbbfacc5c8edbeb6ed93a0e01c08f3435b1ca944e9229a176804445432795c14dc315925fe2480084d6b0729c30fb1c2e50e481df5d7daa25769a0c74baf362ff02f2a934538cd11bf939f64377489255aa60a12628b130f4bddd30664d6b5f91d17cc110bee38a7ce5c629585e57d777bfbb2eaf09e150000000000000000000000000000000000000000000000000000000000000100fdb3b1c60d5e8417c0c2c1023544837fb73612bbc7511bf30dd0b2e282f1618a7b39a9baa238904acf33a97b1617f4a971da22ac40faf828ceb651f76be9df259f91037b93fcc1e8c9c8004f84aff0fafa4e446c30a4cef66a5a9cf529541d40d49ba6c2c64311cb221d3b80c622e886ec3d6780a6bdb6c47fe4f2d9a8704ccdb9bb29feb58e79b81b5e24d39be45c32d9161b1b36fb49f36404c9bea5c505862a463b07c178e6b28ff53f23ecaa5f2ae02f2db4e57a2fc2aa4a014dc0fa6f835881dc0f1cda6ee66f32141e5a421731ce5e19d875aad61284a33b9e1bc6c895098b1f347063109403551360b675a443b06c6675fd6554e7245ee95036928665" - proof, err := EncodeStorageProof(hexutil.MustDecode(accountProof), hexutil.MustDecode(storageProof)) - assert.Equal(t, nil, err) - assert.Equal(t, hexutil.Encode(proof), want) -} diff --git a/packages/relayer/encoding/types.go b/packages/relayer/encoding/types.go index c6bfad5843a..7b8ed26c921 100644 --- a/packages/relayer/encoding/types.go +++ b/packages/relayer/encoding/types.go @@ -117,5 +117,3 @@ var signalProofT, _ = abi.NewType("tuple", "", []abi.ArgumentMarshaling{ Type: "bytes", }, }) - -var bytesT, _ = abi.NewType("bytes", "", nil) diff --git a/packages/relayer/proof/encoded_signal_proof.go b/packages/relayer/proof/encoded_signal_proof.go index 4e7d26681e0..83aaf4af3a7 100644 --- a/packages/relayer/proof/encoded_signal_proof.go +++ b/packages/relayer/proof/encoded_signal_proof.go @@ -77,20 +77,10 @@ func (p *Prover) encodedStorageProof( return nil, errors.New("proof will not be valid, expected storageProof to be 1 but was not") } - rlpEncodedAccountProof, err := rlp.EncodeToBytes(ethProof.AccountProof) - if err != nil { - return nil, errors.Wrap(err, "rlp.EncodeToBytes(proof.AccountProof") - } - rlpEncodedStorageProof, err := rlp.EncodeToBytes(ethProof.StorageProof[0].Proof) if err != nil { return nil, errors.Wrap(err, "rlp.EncodeToBytes(proof.StorageProof[0].Proof") } - encodedStorageProof, err := encoding.EncodeStorageProof(rlpEncodedAccountProof, rlpEncodedStorageProof) - if err != nil { - return nil, errors.Wrap(err, "encoding.EncodeStorageProof") - } - - return encodedStorageProof, nil + return rlpEncodedStorageProof, nil } diff --git a/packages/relayer/proof/encoded_signal_proof_test.go b/packages/relayer/proof/encoded_signal_proof_test.go index bf375c4942c..f1845faa48e 100644 --- a/packages/relayer/proof/encoded_signal_proof_test.go +++ b/packages/relayer/proof/encoded_signal_proof_test.go @@ -12,7 +12,7 @@ import ( var ( // nolint: lll - wantEncoded = "0x0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000003803a537c89809712367218bb171b3b1c46aa95df3dee7200ae9dc78f40520240681dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d4934700000000000000000000000000000000000000000000000000000000000000001dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d493471dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d493471dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000186a000000000000000000000000000000000000000000000000000000000000007d000000000000000000000000000000000000000000000000000000000000004d200000000000000000000000000000000000000000000000000000000000003001dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d4934700000000000000000000000000000000000000000000000013000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000017f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000001c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001c000000000000000000000000000000000000000000000000000000000000000" + wantEncoded = "0x0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000003803a537c89809712367218bb171b3b1c46aa95df3dee7200ae9dc78f40520240681dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d4934700000000000000000000000000000000000000000000000000000000000000001dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d493471dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d493471dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000186a000000000000000000000000000000000000000000000000000000000000007d000000000000000000000000000000000000000000000000000000000000004d200000000000000000000000000000000000000000000000000000000000003001dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d4934700000000000000000000000000000000000000000000000013000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000017f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001c000000000000000000000000000000000000000000000000000000000000000" ) func Test_EncodedSignalProof(t *testing.T) { diff --git a/packages/status-page/src/constants/abi/TaikoL1.ts b/packages/status-page/src/constants/abi/TaikoL1.ts index 72b441cd597..555ddec6060 100644 --- a/packages/status-page/src/constants/abi/TaikoL1.ts +++ b/packages/status-page/src/constants/abi/TaikoL1.ts @@ -473,12 +473,12 @@ export default [ }, { internalType: "uint256", - name: "maxNumBlocks", + name: "maxNumProposedBlocks", type: "uint256", }, { internalType: "uint256", - name: "blockHashHistory", + name: "maxNumVerifiedBlocks", type: "uint256", }, { @@ -548,7 +548,7 @@ export default [ }, { internalType: "uint64", - name: "rewardMultiplierPctg", + name: "feeMultiplierPctg", type: "uint64", }, { @@ -558,7 +558,7 @@ export default [ }, { internalType: "uint64", - name: "feeMaxPeriodPctg", + name: "feeMaxPctg", type: "uint64", }, { diff --git a/packages/status-page/src/utils/getAvailableSlots.ts b/packages/status-page/src/utils/getAvailableSlots.ts index 6aaa5a41047..0aa3082a461 100644 --- a/packages/status-page/src/utils/getAvailableSlots.ts +++ b/packages/status-page/src/utils/getAvailableSlots.ts @@ -8,7 +8,7 @@ export const getAvailableSlots = async ( const contract: Contract = new Contract(contractAddress, TaikoL1, provider); const stateVariables = await contract.getStateVariables(); const nextBlockId = stateVariables.nextBlockId; - const latestVerifiedId = stateVariables.latestVerifiedId; - const pendingBlocks = nextBlockId - latestVerifiedId - 1; + const lastBlockId = stateVariables.lastBlockId; + const pendingBlocks = nextBlockId - lastBlockId - 1; return Math.abs(pendingBlocks - 2048); }; diff --git a/packages/status-page/src/utils/getLastVerifiedBlockId.ts b/packages/status-page/src/utils/getLastVerifiedBlockId.ts index 1a5e9aa4659..a8a3564420d 100644 --- a/packages/status-page/src/utils/getLastVerifiedBlockId.ts +++ b/packages/status-page/src/utils/getLastVerifiedBlockId.ts @@ -7,6 +7,6 @@ export const getLastVerifiedBlockId = async ( ): Promise => { const contract: Contract = new Contract(contractAddress, TaikoL1, provider); const stateVariables = await contract.getStateVariables(); - const latestVerifiedId = stateVariables.latestVerifiedId; - return BigNumber.from(latestVerifiedId).toNumber(); + const lastBlockId = stateVariables.lastBlockId; + return BigNumber.from(lastBlockId).toNumber(); }; diff --git a/packages/status-page/src/utils/getPendingBlocks.ts b/packages/status-page/src/utils/getPendingBlocks.ts index 40a22fd064d..fcaa01a9468 100644 --- a/packages/status-page/src/utils/getPendingBlocks.ts +++ b/packages/status-page/src/utils/getPendingBlocks.ts @@ -8,6 +8,6 @@ export const getPendingBlocks = async ( const contract: Contract = new Contract(contractAddress, TaikoL1, provider); const stateVariables = await contract.getStateVariables(); const nextBlockId = stateVariables.nextBlockId; - const latestVerifiedId = stateVariables.latestVerifiedId; - return nextBlockId - latestVerifiedId - 1; + const lastBlockId = stateVariables.lastBlockId; + return nextBlockId - lastBlockId - 1; }; diff --git a/packages/website/pages/docs/reference/contract-documentation/L1/ProofVerifier.md b/packages/website/pages/docs/reference/contract-documentation/L1/ProofVerifier.md deleted file mode 100644 index d4790fd2a48..00000000000 --- a/packages/website/pages/docs/reference/contract-documentation/L1/ProofVerifier.md +++ /dev/null @@ -1,41 +0,0 @@ ---- -title: IProofVerifier ---- - -## IProofVerifier - -### verifyZKP - -```solidity -function verifyZKP(string verifierId, bytes zkproof, bytes32 instance) external view returns (bool verified) -``` - -### verifyMKP - -```solidity -function verifyMKP(bytes key, bytes value, bytes proof, bytes32 root) external pure returns (bool verified) -``` - ---- - -## title: ProofVerifier - -## ProofVerifier - -### init - -```solidity -function init(address addressManager) external -``` - -### verifyZKP - -```solidity -function verifyZKP(string verifierId, bytes zkproof, bytes32 instance) external view returns (bool) -``` - -### verifyMKP - -```solidity -function verifyMKP(bytes key, bytes value, bytes proof, bytes32 root) external pure returns (bool) -``` diff --git a/packages/website/pages/docs/reference/contract-documentation/L1/TaikoConfig.md b/packages/website/pages/docs/reference/contract-documentation/L1/TaikoConfig.md new file mode 100644 index 00000000000..2d7603215ee --- /dev/null +++ b/packages/website/pages/docs/reference/contract-documentation/L1/TaikoConfig.md @@ -0,0 +1,11 @@ +--- +title: TaikoConfig +--- + +## TaikoConfig + +### getConfig + +```solidity +function getConfig() internal pure returns (struct TaikoData.Config) +``` diff --git a/packages/website/pages/docs/reference/contract-documentation/L1/TaikoCustomErrors.md b/packages/website/pages/docs/reference/contract-documentation/L1/TaikoCustomErrors.md deleted file mode 100644 index 11961f15341..00000000000 --- a/packages/website/pages/docs/reference/contract-documentation/L1/TaikoCustomErrors.md +++ /dev/null @@ -1,227 +0,0 @@ ---- -title: TaikoCustomErrors ---- - -## TaikoCustomErrors - -### L1_0_FEE_BASE - -```solidity -error L1_0_FEE_BASE() -``` - -### L1_ALREADY_PROVEN - -```solidity -error L1_ALREADY_PROVEN() -``` - -### L1_ANCHOR_CALLDATA - -```solidity -error L1_ANCHOR_CALLDATA() -``` - -### L1_ANCHOR_DEST - -```solidity -error L1_ANCHOR_DEST() -``` - -### L1_ANCHOR_GAS_LIMIT - -```solidity -error L1_ANCHOR_GAS_LIMIT() -``` - -### L1_ANCHOR_RECEIPT_ADDR - -```solidity -error L1_ANCHOR_RECEIPT_ADDR() -``` - -### L1_ANCHOR_RECEIPT_DATA - -```solidity -error L1_ANCHOR_RECEIPT_DATA() -``` - -### L1_ANCHOR_RECEIPT_LOGS - -```solidity -error L1_ANCHOR_RECEIPT_LOGS() -``` - -### L1_ANCHOR_RECEIPT_PROOF - -```solidity -error L1_ANCHOR_RECEIPT_PROOF() -``` - -### L1_ANCHOR_RECEIPT_STATUS - -```solidity -error L1_ANCHOR_RECEIPT_STATUS() -``` - -### L1_ANCHOR_RECEIPT_TOPICS - -```solidity -error L1_ANCHOR_RECEIPT_TOPICS() -``` - -### L1_ANCHOR_SIG_R - -```solidity -error L1_ANCHOR_SIG_R() -``` - -### L1_ANCHOR_SIG_S - -```solidity -error L1_ANCHOR_SIG_S() -``` - -### L1_ANCHOR_TX_PROOF - -```solidity -error L1_ANCHOR_TX_PROOF() -``` - -### L1_ANCHOR_TYPE - -```solidity -error L1_ANCHOR_TYPE() -``` - -### L1_BLOCK_NUMBER - -```solidity -error L1_BLOCK_NUMBER() -``` - -### L1_CANNOT_BE_FIRST_PROVER - -```solidity -error L1_CANNOT_BE_FIRST_PROVER() -``` - -### L1_COMMITTED - -```solidity -error L1_COMMITTED() -``` - -### L1_CONFLICT_PROOF - -```solidity -error L1_CONFLICT_PROOF() -``` - -### L1_CONTRACT_NOT_ALLOWED - -```solidity -error L1_CONTRACT_NOT_ALLOWED() -``` - -### L1_DUP_PROVERS - -```solidity -error L1_DUP_PROVERS() -``` - -### L1_EXTRA_DATA - -```solidity -error L1_EXTRA_DATA() -``` - -### L1_GAS_LIMIT - -```solidity -error L1_GAS_LIMIT() -``` - -### L1_ID - -```solidity -error L1_ID() -``` - -### L1_INPUT_SIZE - -```solidity -error L1_INPUT_SIZE() -``` - -### L1_INVALID_CONFIG - -```solidity -error L1_INVALID_CONFIG() -``` - -### L1_INVALID_PARAM - -```solidity -error L1_INVALID_PARAM() -``` - -### L1_METADATA_FIELD - -```solidity -error L1_METADATA_FIELD() -``` - -### L1_META_MISMATCH - -```solidity -error L1_META_MISMATCH() -``` - -### L1_NOT_COMMITTED - -```solidity -error L1_NOT_COMMITTED() -``` - -### L1_NOT_ORACLE_PROVER - -```solidity -error L1_NOT_ORACLE_PROVER() -``` - -### L1_PROOF_LENGTH - -```solidity -error L1_PROOF_LENGTH() -``` - -### L1_PROVER - -```solidity -error L1_PROVER() -``` - -### L1_SOLO_PROPOSER - -```solidity -error L1_SOLO_PROPOSER() -``` - -### L1_TOO_MANY_BLOCKS - -```solidity -error L1_TOO_MANY_BLOCKS() -``` - -### L1_TX_LIST - -```solidity -error L1_TX_LIST() -``` - -### L1_ZKP - -```solidity -error L1_ZKP() -``` diff --git a/packages/website/pages/docs/reference/contract-documentation/L1/TaikoData.md b/packages/website/pages/docs/reference/contract-documentation/L1/TaikoData.md index e17be308bd3..5bdcde55c64 100644 --- a/packages/website/pages/docs/reference/contract-documentation/L1/TaikoData.md +++ b/packages/website/pages/docs/reference/contract-documentation/L1/TaikoData.md @@ -4,35 +4,72 @@ title: TaikoData ## TaikoData +### FeeConfig + +```solidity +struct FeeConfig { + uint16 avgTimeMAF; + uint64 avgTimeCap; + uint16 gracePeriodPctg; + uint16 maxPeriodPctg; + uint16 multiplerPctg; +} +``` + ### Config ```solidity struct Config { uint256 chainId; - uint256 maxNumBlocks; - uint256 blockHashHistory; + uint256 maxNumProposedBlocks; + uint256 maxNumVerifiedBlocks; uint256 maxVerificationsPerTx; - uint256 commitConfirmations; uint256 blockMaxGasLimit; uint256 maxTransactionsPerBlock; uint256 maxBytesPerTxList; uint256 minTxGasLimit; - uint256 anchorTxGasLimit; uint256 slotSmoothingFactor; + uint256 anchorTxGasLimit; uint256 rewardBurnBips; uint256 proposerDepositPctg; uint256 feeBaseMAF; - uint256 blockTimeMAF; - uint256 proofTimeMAF; - uint64 rewardMultiplierPctg; - uint64 feeGracePeriodPctg; - uint64 feeMaxPeriodPctg; - uint64 blockTimeCap; - uint64 proofTimeCap; uint64 bootstrapDiscountHalvingPeriod; + uint64 constantFeeRewardBlocks; + uint64 txListCacheExpiry; + bool enableSoloProposer; + bool enableOracleProver; bool enableTokenomics; - bool enablePublicInputsCheck; - bool enableAnchorValidation; + bool skipZKPVerification; + struct TaikoData.FeeConfig proposingConfig; + struct TaikoData.FeeConfig provingConfig; +} +``` + +### StateVariables + +```solidity +struct StateVariables { + uint64 feeBaseTwei; + uint64 genesisHeight; + uint64 genesisTimestamp; + uint64 nextBlockId; + uint64 lastBlockId; + uint64 avgBlockTime; + uint64 avgProofTime; + uint64 lastProposedAt; +} +``` + +### BlockMetadataInput + +```solidity +struct BlockMetadataInput { + bytes32 txListHash; + address beneficiary; + uint32 gasLimit; + uint24 txListByteStart; + uint24 txListByteEnd; + uint8 cacheTxListInfo; } ``` @@ -40,29 +77,49 @@ struct Config { ```solidity struct BlockMetadata { - uint256 id; - uint256 l1Height; + uint64 id; + uint32 gasLimit; + uint64 timestamp; + uint64 l1Height; bytes32 l1Hash; - address beneficiary; - bytes32 txListHash; bytes32 mixHash; - bytes extraData; - uint64 gasLimit; - uint64 timestamp; - uint64 commitHeight; - uint64 commitSlot; + bytes32 txListHash; + uint24 txListByteStart; + uint24 txListByteEnd; + address beneficiary; +} +``` + +### ZKProof + +```solidity +struct ZKProof { + bytes data; + uint16 verifierId; } ``` -### Evidence +### BlockEvidence ```solidity -struct Evidence { +struct BlockEvidence { struct TaikoData.BlockMetadata meta; - struct BlockHeader header; + struct TaikoData.ZKProof zkproof; + bytes32 parentHash; + bytes32 blockHash; + bytes32 signalRoot; + address prover; +} +``` + +### ForkChoice + +```solidity +struct ForkChoice { + bytes32 blockHash; + bytes32 signalRoot; address prover; - bytes[] proofs; - uint16 circuitId; + uint64 provenAt; } ``` @@ -74,16 +131,27 @@ struct ProposedBlock { uint256 deposit; address proposer; uint64 proposedAt; + uint24 nextForkChoiceId; + mapping(uint256 => struct TaikoData.ForkChoice) forkChoices; } ``` -### ForkChoice +### VerifiedBlock ```solidity -struct ForkChoice { +struct VerifiedBlock { + uint64 blockId; bytes32 blockHash; - address prover; - uint64 provenAt; + bytes32 signalRoot; +} +``` + +### TxListInfo + +```solidity +struct TxListInfo { + uint64 validSince; + uint24 size; } ``` @@ -91,24 +159,23 @@ struct ForkChoice { ```solidity struct State { - mapping(uint256 => bytes32) l2Hashes; mapping(uint256 => struct TaikoData.ProposedBlock) proposedBlocks; - mapping(uint256 => mapping(bytes32 => struct TaikoData.ForkChoice)) forkChoices; - mapping(address => mapping(uint256 => bytes32)) commits; + mapping(uint256 => struct TaikoData.VerifiedBlock) verifiedBlocks; + mapping(uint256 => mapping(bytes32 => uint256)) forkChoiceIds; mapping(address => uint256) balances; + mapping(bytes32 => struct TaikoData.TxListInfo) txListInfo; uint64 genesisHeight; uint64 genesisTimestamp; - uint64 __reservedA1; - uint64 __reservedA2; - uint256 feeBase; + uint64 __reserved1; + uint64 __reserved2; uint64 nextBlockId; uint64 lastProposedAt; uint64 avgBlockTime; - uint64 __avgGasLimit; - uint64 latestVerifiedHeight; - uint64 latestVerifiedId; + uint64 __reserved3; + uint64 __reserved4; + uint64 lastBlockId; uint64 avgProofTime; - uint64 __reservedC1; + uint64 feeBaseTwei; uint256[42] __gap; } ``` diff --git a/packages/website/pages/docs/reference/contract-documentation/L1/TaikoErrors.md b/packages/website/pages/docs/reference/contract-documentation/L1/TaikoErrors.md new file mode 100644 index 00000000000..ae1eeefb681 --- /dev/null +++ b/packages/website/pages/docs/reference/contract-documentation/L1/TaikoErrors.md @@ -0,0 +1,125 @@ +--- +title: TaikoErrors +--- + +## TaikoErrors + +### L1_ALREADY_PROVEN + +```solidity +error L1_ALREADY_PROVEN() +``` + +### L1_BLOCK_NUMBER + +```solidity +error L1_BLOCK_NUMBER() +``` + +### L1_CONFLICT_PROOF + +```solidity +error L1_CONFLICT_PROOF() +``` + +### L1_CONTRACT_NOT_ALLOWED + +```solidity +error L1_CONTRACT_NOT_ALLOWED() +``` + +### L1_EVIDENCE_MISMATCH + +```solidity +error L1_EVIDENCE_MISMATCH() +``` + +### L1_FORK_CHOICE_ID + +```solidity +error L1_FORK_CHOICE_ID() +``` + +### L1_ID + +```solidity +error L1_ID() +``` + +### L1_INSUFFICIENT_TOKEN + +```solidity +error L1_INSUFFICIENT_TOKEN() +``` + +### L1_INVALID_CONFIG + +```solidity +error L1_INVALID_CONFIG() +``` + +### L1_INVALID_EVIDENCE + +```solidity +error L1_INVALID_EVIDENCE() +``` + +### L1_INVALID_METADATA + +```solidity +error L1_INVALID_METADATA() +``` + +### L1_INVALID_PARAM + +```solidity +error L1_INVALID_PARAM() +``` + +### L1_INVALID_PROOF + +```solidity +error L1_INVALID_PROOF() +``` + +### L1_NOT_ORACLE_PROVER + +```solidity +error L1_NOT_ORACLE_PROVER() +``` + +### L1_NOT_SOLO_PROPOSER + +```solidity +error L1_NOT_SOLO_PROPOSER() +``` + +### L1_TOO_MANY_BLOCKS + +```solidity +error L1_TOO_MANY_BLOCKS() +``` + +### L1_TX_LIST_NOT_EXIST + +```solidity +error L1_TX_LIST_NOT_EXIST() +``` + +### L1_TX_LIST_HASH + +```solidity +error L1_TX_LIST_HASH() +``` + +### L1_TX_LIST_RANGE + +```solidity +error L1_TX_LIST_RANGE() +``` + +### L1_TX_LIST + +```solidity +error L1_TX_LIST() +``` diff --git a/packages/website/pages/docs/reference/contract-documentation/L1/TaikoEvents.md b/packages/website/pages/docs/reference/contract-documentation/L1/TaikoEvents.md index 119dc77917e..0fe2a1627e8 100644 --- a/packages/website/pages/docs/reference/contract-documentation/L1/TaikoEvents.md +++ b/packages/website/pages/docs/reference/contract-documentation/L1/TaikoEvents.md @@ -4,26 +4,20 @@ title: TaikoEvents ## TaikoEvents -### BlockVerified - -```solidity -event BlockVerified(uint256 id, bytes32 blockHash) -``` - -### BlockCommitted +### BlockProposed ```solidity -event BlockCommitted(uint64 commitSlot, bytes32 commitHash) +event BlockProposed(uint256 id, struct TaikoData.BlockMetadata meta, bool txListCached) ``` -### BlockProposed +### BlockProven ```solidity -event BlockProposed(uint256 id, struct TaikoData.BlockMetadata meta) +event BlockProven(uint256 id, bytes32 parentHash, bytes32 blockHash, bytes32 signalRoot, address prover) ``` -### BlockProven +### BlockVerified ```solidity -event BlockProven(uint256 id, bytes32 parentHash, bytes32 blockHash, address prover, uint64 provenAt) +event BlockVerified(uint256 id, bytes32 blockHash) ``` diff --git a/packages/website/pages/docs/reference/contract-documentation/L1/TaikoL1.md b/packages/website/pages/docs/reference/contract-documentation/L1/TaikoL1.md index aab1821ccf6..8cec6299cb2 100644 --- a/packages/website/pages/docs/reference/contract-documentation/L1/TaikoL1.md +++ b/packages/website/pages/docs/reference/contract-documentation/L1/TaikoL1.md @@ -10,53 +10,31 @@ title: TaikoL1 struct TaikoData.State state ``` -### onlyFromEOA - -```solidity -modifier onlyFromEOA() -``` - ### init ```solidity -function init(address _addressManager, bytes32 _genesisBlockHash, uint256 _feeBase) external +function init(address _addressManager, bytes32 _genesisBlockHash, uint64 _feeBaseTwei) external ``` -### commitBlock - -```solidity -function commitBlock(uint64 commitSlot, bytes32 commitHash) external -``` - -Write a _commit hash_ so a few blocks later a L2 block can be proposed -such that `calculateCommitHash(meta.beneficiary, meta.txListHash)` equals -to this commit hash. - -#### Parameters - -| Name | Type | Description | -| ---------- | ------- | --------------------------------------------------------------------------- | -| commitSlot | uint64 | A slot to save this commit. Slot 0 will always be reset to zero for refund. | -| commitHash | bytes32 | Calculated with: `calculateCommitHash(beneficiary, txListHash)`. | - ### proposeBlock ```solidity -function proposeBlock(bytes[] inputs) external +function proposeBlock(bytes input, bytes txList) external ``` Propose a Taiko L2 block. #### Parameters -| Name | Type | Description | -| ------ | ------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| inputs | bytes[] | A list of data input: - inputs[0] is abi-encoded BlockMetadata that the actual L2 block header must satisfy. Note the following fields in the provided meta object must be zeros -- their actual values will be provisioned by Ethereum. - id - l1Height - l1Hash - mixHash - timestamp - inputs[1] is a list of transactions in this block, encoded with RLP. Note, in the corresponding L2 block an _anchor transaction_ will be the first transaction in the block -- if there are n transactions in `txList`, then there will be up to n+1 transactions in the L2 block. | +| Name | Type | Description | +| ------ | ----- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| input | bytes | An abi-encoded BlockMetadataInput that the actual L2 block header must satisfy. | +| txList | bytes | A list of transactions in this block, encoded with RLP. Note, in the corresponding L2 block an _anchor transaction_ will be the first transaction in the block -- if there are `n` transactions in `txList`, then there will be up to `n + 1` transactions in the L2 block. | ### proveBlock ```solidity -function proveBlock(uint256 blockId, bytes[] inputs) external +function proveBlock(uint256 blockId, bytes input) external ``` Prove a block is valid with a zero-knowledge proof, a transaction @@ -64,26 +42,10 @@ merkel proof, and a receipt merkel proof. #### Parameters -| Name | Type | Description | -| ------- | ------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| blockId | uint256 | The index of the block to prove. This is also used to select the right implementation version. | -| inputs | bytes[] | A list of data input: - inputs[0] is an abi-encoded object with various information regarding the block to be proven and the actual proofs. - inputs[1] is the actual anchor transaction in this L2 block. Note that the anchor transaction is always the first transaction in the block. - inputs[2] is the receipt of the anchor transaction. | - -### proveBlockInvalid - -```solidity -function proveBlockInvalid(uint256 blockId, bytes[] inputs) external -``` - -Prove a block is invalid with a zero-knowledge proof and a receipt -merkel proof. - -#### Parameters - -| Name | Type | Description | -| ------- | ------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| blockId | uint256 | The index of the block to prove. This is also used to select the right implementation version. | -| inputs | bytes[] | A list of data input: - inputs[0] An Evidence object with various information regarding the block to be proven and the actual proofs. - inputs[1] The target block to be proven invalid. - inputs[2] The receipt for the `invalidBlock` transaction on L2. Note that the `invalidBlock` transaction is supposed to be the only transaction in the L2 block. | +| Name | Type | Description | +| ------- | ------- | ---------------------------------------------------------------------------------------------- | +| blockId | uint256 | The index of the block to prove. This is also used to select the right implementation version. | +| input | bytes | An abi-encoded TaikoData.ValidBlockEvidence object. | ### verifyBlocks @@ -99,70 +61,64 @@ Verify up to N blocks. | --------- | ------- | ------------------------------- | | maxBlocks | uint256 | Max number of blocks to verify. | -### withdrawBalance +### deposit ```solidity -function withdrawBalance() external +function deposit(uint256 amount) external ``` -### getRewardBalance +### withdraw ```solidity -function getRewardBalance(address addr) public view returns (uint256) +function withdraw(uint256 amount) external ``` -### getBlockFee +### getBalance ```solidity -function getBlockFee() public view returns (uint256) -``` - -### getProofReward - -```solidity -function getProofReward(uint64 provenAt, uint64 proposedAt) public view returns (uint256 reward) +function getBalance(address addr) public view returns (uint256) ``` -### isCommitValid +### getBlockFee ```solidity -function isCommitValid(uint256 commitSlot, uint256 commitHeight, bytes32 commitHash) public view returns (bool) +function getBlockFee() public view returns (uint256 feeAmount, uint256 depositAmount) ``` -### getProposedBlock +### getProofReward ```solidity -function getProposedBlock(uint256 id) public view returns (struct TaikoData.ProposedBlock) +function getProofReward(uint64 provenAt, uint64 proposedAt) public view returns (uint256 reward) ``` -### getSyncedHeader +### getBlock ```solidity -function getSyncedHeader(uint256 number) public view returns (bytes32) +function getBlock(uint256 id) public view returns (bytes32 _metaHash, uint256 _deposit, address _proposer, uint64 _proposedAt) ``` -### getLatestSyncedHeader +### getForkChoice ```solidity -function getLatestSyncedHeader() public view returns (bytes32) +function getForkChoice(uint256 id, bytes32 parentHash) public view returns (struct TaikoData.ForkChoice) ``` -### getStateVariables +### getXchainBlockHash ```solidity -function getStateVariables() public view returns (struct LibUtils.StateVariables) +function getXchainBlockHash(uint256 blockId) public view returns (bytes32) ``` -### signWithGoldenTouch +### getXchainSignalRoot ```solidity -function signWithGoldenTouch(bytes32 hash, uint8 k) public view returns (uint8 v, uint256 r, uint256 s) +function getXchainSignalRoot(uint256 blockId) public view returns (bytes32) ``` -### getForkChoice +### getStateVariables ```solidity -function getForkChoice(uint256 id, bytes32 parentHash) public view returns (struct TaikoData.ForkChoice) +function getStateVariables() public view returns (struct TaikoData.StateVariables) ``` ### getConfig diff --git a/packages/website/pages/docs/reference/contract-documentation/L1/TaikoToken.md b/packages/website/pages/docs/reference/contract-documentation/L1/TaikoToken.md index b7a083af748..deff05bf36e 100644 --- a/packages/website/pages/docs/reference/contract-documentation/L1/TaikoToken.md +++ b/packages/website/pages/docs/reference/contract-documentation/L1/TaikoToken.md @@ -24,10 +24,16 @@ event Burn(address account, uint256 amount) error TKO_INVALID_ADDR() ``` +### TKO_INVALID_PREMINT_PARAMS + +```solidity +error TKO_INVALID_PREMINT_PARAMS() +``` + ### init ```solidity -function init(string _name, string _symbol, address _addressManager) external +function init(address _addressManager, string _name, string _symbol, address[] _premintRecipients, uint256[] _premintAmounts) external ``` _Initializer to be called after being deployed behind a proxy. diff --git a/packages/website/pages/docs/reference/contract-documentation/L2/TaikoL2.md b/packages/website/pages/docs/reference/contract-documentation/L2/TaikoL2.md index b6656f19616..7f8e5c23eb8 100644 --- a/packages/website/pages/docs/reference/contract-documentation/L2/TaikoL2.md +++ b/packages/website/pages/docs/reference/contract-documentation/L2/TaikoL2.md @@ -4,22 +4,31 @@ title: TaikoL2 ## TaikoL2 -### latestSyncedL1Height +### VerifiedBlock ```solidity -uint256 latestSyncedL1Height +struct VerifiedBlock { + bytes32 blockHash; + bytes32 signalRoot; +} ``` -### BlockInvalidated +### publicInputHash ```solidity -event BlockInvalidated(bytes32 txListHash) +bytes32 publicInputHash ``` -### L2_INVALID_SENDER +### latestSyncedL1Height ```solidity -error L2_INVALID_SENDER() +uint256 latestSyncedL1Height +``` + +### BlockVars + +```solidity +event BlockVars(uint256 number, bytes32 parentHash, uint256 timestamp, uint256 basefee, uint256 prevrandao, address coinbase, uint256 gaslimit, uint256 chainid) ``` ### L2_INVALID_CHAIN_ID @@ -28,10 +37,10 @@ error L2_INVALID_SENDER() error L2_INVALID_CHAIN_ID() ``` -### L2_INVALID_GAS_PRICE +### L2_INVALID_SENDER ```solidity -error L2_INVALID_GAS_PRICE() +error L2_INVALID_SENDER() ``` ### L2_PUBLIC_INPUT_HASH_MISMATCH @@ -40,16 +49,22 @@ error L2_INVALID_GAS_PRICE() error L2_PUBLIC_INPUT_HASH_MISMATCH() ``` -### constructor +### L2_TOO_LATE + +```solidity +error L2_TOO_LATE() +``` + +### init ```solidity -constructor(address _addressManager) public +function init(address _addressManager) external ``` ### anchor ```solidity -function anchor(uint256 l1Height, bytes32 l1Hash) external +function anchor(uint256 l1Height, bytes32 l1Hash, bytes32 l1SignalRoot) external ``` Persist the latest L1 block height and hash to L2 for cross-layer @@ -57,48 +72,62 @@ message verification (eg. bridging). This function will also check certain block-level global variables because they are not part of the Trie structure. -Note: This transaction shall be the first transaction in every L2 block. +A circuit will verify the integratity among: + +- l1Hash, l1SignalRoot, and l1SignalServiceAddress +- (l1Hash and l1SignalServiceAddress) are both hased into of the + ZKP's instance. + +This transaction shall be the first transaction in every L2 block. #### Parameters -| Name | Type | Description | -| -------- | ------- | -------------------------------------------------------- | -| l1Height | uint256 | The latest L1 block height when this block was proposed. | -| l1Hash | bytes32 | The latest L1 block hash when this block was proposed. | +| Name | Type | Description | +| ------------ | ------- | --------------------------------------------------------- | +| l1Height | uint256 | The latest L1 block height when this block was proposed. | +| l1Hash | bytes32 | The latest L1 block hash when this block was proposed. | +| l1SignalRoot | bytes32 | The latest value of the L1 "signal service storage root". | -### invalidateBlock +### getXchainBlockHash ```solidity -function invalidateBlock(bytes txList, enum LibInvalidTxList.Hint hint, uint256 txIdx) external +function getXchainBlockHash(uint256 number) public view returns (bytes32) ``` -Invalidate a L2 block by verifying its txList is not intrinsically valid. +Returns the cross-chain block hash at the given block number. #### Parameters -| Name | Type | Description | -| ------ | -------------------------- | ------------------------------------------------------------------------------------------------ | -| txList | bytes | The L2 block's txlist. | -| hint | enum LibInvalidTxList.Hint | A hint for this method to invalidate the txList. | -| txIdx | uint256 | If the hint is for a specific transaction in txList, txIdx specifies which transaction to check. | +| Name | Type | Description | +| ------ | ------- | --------------------------------------------- | +| number | uint256 | The block number. Use 0 for the latest block. | -### getConfig +#### Return Values -```solidity -function getConfig() public view virtual returns (struct TaikoData.Config config) -``` +| Name | Type | Description | +| ---- | ------- | --------------------------- | +| [0] | bytes32 | The cross-chain block hash. | -### getSyncedHeader +### getXchainSignalRoot ```solidity -function getSyncedHeader(uint256 number) public view returns (bytes32) +function getXchainSignalRoot(uint256 number) public view returns (bytes32) ``` -### getLatestSyncedHeader +Returns the cross-chain signal service storage root at the given +block number. -```solidity -function getLatestSyncedHeader() public view returns (bytes32) -``` +#### Parameters + +| Name | Type | Description | +| ------ | ------- | --------------------------------------------- | +| number | uint256 | The block number. Use 0 for the latest block. | + +#### Return Values + +| Name | Type | Description | +| ---- | ------- | -------------------------------------------- | +| [0] | bytes32 | The cross-chain signal service storage root. | ### getBlockHash diff --git a/packages/website/pages/docs/reference/contract-documentation/L2/TaikoL2Signer.md b/packages/website/pages/docs/reference/contract-documentation/L2/TaikoL2Signer.md new file mode 100644 index 00000000000..f918f32a6e2 --- /dev/null +++ b/packages/website/pages/docs/reference/contract-documentation/L2/TaikoL2Signer.md @@ -0,0 +1,29 @@ +--- +title: TaikoL2Signer +--- + +## TaikoL2Signer + +### GOLDEN_TOUCH_ADDRESS + +```solidity +address GOLDEN_TOUCH_ADDRESS +``` + +### GOLDEN_TOUCH_PRIVATEKEY + +```solidity +uint256 GOLDEN_TOUCH_PRIVATEKEY +``` + +### L2_INVALID_GOLDEN_TOUCH_K + +```solidity +error L2_INVALID_GOLDEN_TOUCH_K() +``` + +### signAnchor + +```solidity +function signAnchor(bytes32 digest, uint8 k) public view returns (uint8 v, uint256 r, uint256 s) +``` diff --git a/packages/website/pages/docs/reference/contract-documentation/_meta.json b/packages/website/pages/docs/reference/contract-documentation/_meta.json deleted file mode 100644 index aef85b496d2..00000000000 --- a/packages/website/pages/docs/reference/contract-documentation/_meta.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "L1": { - "title": "L1" - }, - "L2": { - "title": "L2" - }, - "common": { - "title": "Common" - }, - "signal": { - "title": "Signal" - }, - "bridge": { - "title": "Bridge" - } -} diff --git a/packages/website/pages/docs/reference/contract-documentation/common/AddressResolver.md b/packages/website/pages/docs/reference/contract-documentation/common/AddressResolver.md index 94bf6628bbc..496d3e13d2b 100644 --- a/packages/website/pages/docs/reference/contract-documentation/common/AddressResolver.md +++ b/packages/website/pages/docs/reference/contract-documentation/common/AddressResolver.md @@ -92,6 +92,12 @@ Returns the AddressManager's address. | ---- | ------- | ----------------------------- | | [0] | address | The AddressManager's address. | +### keyForName + +```solidity +function keyForName(uint256 chainId, string name) public pure returns (string key) +``` + ### \_init ```solidity diff --git a/packages/website/pages/docs/reference/contract-documentation/common/IHeaderSync.md b/packages/website/pages/docs/reference/contract-documentation/common/IHeaderSync.md deleted file mode 100644 index 4c5f827a760..00000000000 --- a/packages/website/pages/docs/reference/contract-documentation/common/IHeaderSync.md +++ /dev/null @@ -1,26 +0,0 @@ ---- -title: IHeaderSync ---- - -## IHeaderSync - -Interface implemented by both the TaikoL1 and TaikoL2 contracts. It exposes -the methods needed to access the block hashes of the other chain. - -### HeaderSynced - -```solidity -event HeaderSynced(uint256 srcHeight, bytes32 srcHash) -``` - -### getSyncedHeader - -```solidity -function getSyncedHeader(uint256 number) external view returns (bytes32) -``` - -### getLatestSyncedHeader - -```solidity -function getLatestSyncedHeader() external view returns (bytes32) -``` diff --git a/packages/website/pages/docs/reference/contract-documentation/common/IXchainSync.md b/packages/website/pages/docs/reference/contract-documentation/common/IXchainSync.md new file mode 100644 index 00000000000..f704bb9afec --- /dev/null +++ b/packages/website/pages/docs/reference/contract-documentation/common/IXchainSync.md @@ -0,0 +1,55 @@ +--- +title: IXchainSync +--- + +## IXchainSync + +Interface implemented by both the TaikoL1 and TaikoL2 contracts. It exposes +the methods needed to access the block hashes of the other chain. + +### XchainSynced + +```solidity +event XchainSynced(uint256 srcHeight, bytes32 blockHash, bytes32 signalRoot) +``` + +### getXchainBlockHash + +```solidity +function getXchainBlockHash(uint256 number) external view returns (bytes32) +``` + +Returns the cross-chain block hash at the given block number. + +#### Parameters + +| Name | Type | Description | +| ------ | ------- | --------------------------------------------- | +| number | uint256 | The block number. Use 0 for the latest block. | + +#### Return Values + +| Name | Type | Description | +| ---- | ------- | --------------------------- | +| [0] | bytes32 | The cross-chain block hash. | + +### getXchainSignalRoot + +```solidity +function getXchainSignalRoot(uint256 number) external view returns (bytes32) +``` + +Returns the cross-chain signal service storage root at the given +block number. + +#### Parameters + +| Name | Type | Description | +| ------ | ------- | --------------------------------------------- | +| number | uint256 | The block number. Use 0 for the latest block. | + +#### Return Values + +| Name | Type | Description | +| ---- | ------- | -------------------------------------------- | +| [0] | bytes32 | The cross-chain signal service storage root. | diff --git a/packages/whitepaper/main.tex b/packages/whitepaper/main.tex index 85c0a0ea7a4..71b4cf266e8 100644 --- a/packages/whitepaper/main.tex +++ b/packages/whitepaper/main.tex @@ -78,7 +78,7 @@ \pagecolor{pagecolor} \begin{abstract} -An Ethereum-equivalent ZK-Rollup allows for scaling Ethereum without sacrificing security or compatibility. Advancements in Zero-Knowledge Proof cryptography and its application towards proving Ethereum Virtual Machine (EVM) execution have led to a flourishing of ZK-EVMs, now with further design decisions to choose from. Taiko aims to be a decentralized ZK-Rollup, prioritizing Ethereum-equivalence. Supporting all existing Ethereum applications, tooling, and infrastructure is the primary goal and benefit of this path. Besides the maximally compatible ZK-EVM component, which proves the correctness of EVM computation on the rollup, Taiko must implement a layer-2 blockchain architecture to support it. This architecture seeks to be as lightweight, decentralized, and permissionless as possible, and consists of Taiko nodes, provers, and smart contracts. Taiko nodes construct rollup blocks from users' L2 transactions and commit them to L1. Provers generate ZK-SNARK proofs asserting the validity of L2 transactions and blocks. A set of smart contracts deployed on Ethereum L1 acts as the data availability mechanism and verifier of the ZKPs. +An Ethereum-equivalent ZK-Rollup allows for scaling Ethereum without sacrificing security or compatibility. Advancements in Zero-Knowledge Proof cryptography and its application towards proving Ethereum Virtual Machine (EVM) execution have led to a flourishing of ZK-EVMs, now with further design decisions to choose from. Taiko aims to be a decentralized ZK-Rollup, prioritizing Ethereum-equivalence. Supporting all existing Ethereum applications, tooling, and infrastructure is the primary goal and benefit of this path. Besides the maximally compatible ZK-EVM component, which proves the correctness of EVM computation on the rollup, Taiko must implement a layer-2 blockchain architecture to support it. This architecture seeks to be as lightweight, decentralized, and permissionless as possible, and consists of Taiko nodes, provers, and smart contracts. Taiko nodes construct rollup blocks from users' L2 transactions and propose them to L1. Provers generate ZK-SNARK proofs asserting the validity of L2 transactions and blocks. A set of smart contracts deployed on Ethereum L1 acts as the data availability mechanism and verifier of the ZKPs. \end{abstract} @@ -150,7 +150,6 @@ \subsubsection{TaikoL1} Deployed on Ethereum. This contract on L1 is used to pro \item[numProposedBlocks] The total number of proposed blocks, and the ID for the next proposed block, formally $R_\mathrm{i}$. \item[proposedBlocks] The list of proposed blocks, formally $R_\mathrm{b}$. \item[lastVerifiedBlockId] The ID of the last verified block, formally $R_\mathrm{f}$. -\item [blockCommits] The mapping from the committed blocks' \emph{commit hashes} to their enclosed L1 blocks' block numbers, formally $R_\mathrm{c}$. If a block's commit hash is $h$, its number is $R_\mathrm{c}[h]$ (see Section \ref{sec:commit}). \item[forkChoices] The mapping from proposed block IDs to their \emph{Fork Choices}, formally $R_\mathrm{f}$. The fork choices for the $i$-th block is $R_\mathrm{f}[i]$. Fork Choices are discussed in detail in Section \ref{sec:proving}. \end{description} @@ -203,18 +202,11 @@ \subsubsection{Proposed Block Intrinsic Validity} \nonumber& & C_{\mathbf{t}} \ne 0 \quad \wedge \\ \nonumber& & C_{\mathbf{t}} = \texttt{KEC}(L) \quad \wedge \\ \nonumber& & C_{\mathbf{a}} = \texttt{NUMBER} - 1 \quad \wedge \\ -\nonumber& & C_{\mathbf{h}} = \texttt{BLOCKHASH}(C_{\mathbf{a}}) \quad \wedge \\ -\nonumber& & R_{\mathbf{c}}[\texttt{KEC}((C_{\mathbf{c}}, C_{\mathbf{t}}))] \ne 0 \quad \wedge \\ -\nonumber& & R_{\mathbf{c}}[\texttt{KEC}((C_{\mathbf{c}}, C_{\mathbf{t}}))] \le \\ -\nonumber& & \texttt{NUMBER} - K_{\mathrm{CommitDelayConfirms}} +\nonumber& & C_{\mathbf{h}} = \texttt{BLOCKHASH}(C_{\mathbf{a}}) \end{eqnarray} -Where $\texttt{KEC}((C_{\mathbf{c}}, C_{\mathbf{t}}))$ is called the block's \emph{Commit Hash}. - After passing the test, the proposed block is appended to the proposed block list $R_\mathrm{b}$ and $R_\mathrm{i}$ is incremented by one. -\subsubsection{Commit Hash}\label{sec:commit} The commit hash is the Keccak-256 hash of a proposed block's \textbf{beneficiary} and \textbf{txListHash}. The protocol requires that a block can be proposed only $K_{\mathrm{CommitDelayConfirms}}$ confirmations after its commit hash has been committed to \underline{TaikoL1}, which prevents other parties from inspecting the L1 mempool and submitting the same or a similar block, allowing them to collect the transaction fees and/or MEV \cite{mev}. - \subsection{Block Validation and Mapping } \label{sec:filtermap} The protocol filters proposed blocks using a \emph{txList Intrinsic Validity Function} $V^l$ on each block's txList $L$. If $V^l(L)$ returns \texttt{False}, the proposed block is dropped and ignored by L2 nodes; otherwise, the proposed block will map to an actual Taiko L2 block using the \emph{Block Mapping Function} $M(\dot{B})$. @@ -840,9 +832,6 @@ \section{Future Improvements}\label{sec:improvements} \subsection{Ethereum Data Blobs}\label{sec:datablobs} EIP-4844 \cite{eip4844} (or similar) on Ethereum will, once enabled, allow data to be stored on L1 in a more efficient manner. Instead of storing the txList data in the L1 transaction data we will instead be able to store the data in a data blob. This data will be read directly from the KZG commitment in the ZK-EVM circuits without ever needing to access the data in an L1 smart contract. -\subsection{VDF instead of Block Commitments}\label{sec:vdf} -A \emph{Verifiable Delay Function} (VDF) can be used to protect pending block proposals (see Section \ref{sec:commit}). This achieves the same goal as the block commitment scheme but without requiring an additional Ethereum transaction. Instead, some computational work is required before the block can be proposed. - \subsection{Block Validity Verification at Proposal Time}\label{sec:propose-proof} Currently we accept blocks at proposal time even if the transaction data is invalid. Afterwards, we depend on provers to generate a proof that shows the block is invalid (see Section \ref{sec:proving-invalid}). We do this because the work required to verify all requirements imposed on the transaction data is expensive to verify on L1. Instead, we can require a proof together with the proposed block attesting that the block data is valid. This requires computing a proof, and so the requirement for this improvement is that this proof can be generated efficiently enough so that it is not a potential bottleneck for proposing blocks. Because verifying a proof is still quite expensive, this proof should not be verified immediately at block proposal time but should be verified as part of the block proof. @@ -969,8 +958,6 @@ \section{Protocol Constants}\label{sec:constants1} $K_{\mathrm{MaxNumBlocks}}$ & The maximum number of slots for proposed blocks. \\ $K_{\mathrm{MaxVerificationsPerTx}}$ & The number of proven blocks that can be verified when a new block is\\ & proposed or a block is proven. \\ -$K_{\mathrm{CommitDelayConfirms}}$ & The number of confirmations to wait for before a block can be proposed\\ -& after its commit-hash has been written on Ethereum.\\ $K_{\mathrm{MaxProofsPerForkChoice}}$ & The maximum number of proofs per fork choice. \\ $K_{\mathrm{BlockMaxGasLimit}}$ & A Taiko block's max gas limit besides $K_{\mathrm{AnchorTxGasLimit}}$. \\ $K_{\mathrm{BlockMaxTxs}}$ & The maximum number of transactions in a Taiko block besides the anchor\\ diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 14ed6978413..881472a3f0c 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -126,102 +126,106 @@ importers: packages/protocol: specifiers: - '@defi-wonderland/smock': ^2.3.3 - '@gnosis.pm/zodiac': ^1.0.7 - '@nomicfoundation/hardhat-network-helpers': ^1.0.6 - '@nomiclabs/hardhat-ethers': ^2.0.0 - '@nomiclabs/hardhat-etherscan': ^3.1.0 - '@nomiclabs/hardhat-waffle': ^2.0.0 - '@openzeppelin/contracts': ^4.5.0 - '@openzeppelin/contracts-upgradeable': ^4.5.1 - '@openzeppelin/hardhat-upgrades': ^1.14.0 + '@defi-wonderland/smock': ^2.3.4 + '@foundry-rs/hardhat-forge': ^0.1.17 + '@gnosis.pm/zodiac': ^1.1.9 + '@nomicfoundation/hardhat-network-helpers': ^1.0.8 + '@nomiclabs/hardhat-ethers': ^2.2.2 + '@nomiclabs/hardhat-etherscan': ^3.1.7 + '@nomiclabs/hardhat-waffle': ^2.0.5 + '@openzeppelin/contracts': ^4.8.2 + '@openzeppelin/contracts-upgradeable': ^4.8.2 + '@openzeppelin/hardhat-upgrades': ^1.22.1 '@typechain/ethers-v5': ^7.2.0 '@typechain/hardhat': ^2.3.1 - '@types/chai': ^4.3.0 - '@types/glob': ^8.0.1 - '@types/mocha': ^9.1.0 - '@types/node': ^12.20.45 + '@types/chai': ^4.3.4 + '@types/glob': ^8.1.0 + '@types/mocha': ^9.1.1 + '@types/node': ^12.20.55 '@typescript-eslint/eslint-plugin': ^4.33.0 '@typescript-eslint/parser': ^4.33.0 - chai: ^4.2.0 + chai: ^4.3.7 chalk: 4.1.2 channel-ts: ^0.1.2 dotenv: ^10.0.0 eslint: ^7.32.0 - eslint-config-prettier: ^8.3.0 + eslint-config-prettier: ^8.6.0 eslint-config-standard: ^16.0.3 - eslint-plugin-import: ^2.25.4 + eslint-plugin-import: ^2.27.5 eslint-plugin-node: ^11.1.0 eslint-plugin-prettier: ^3.4.1 eslint-plugin-promise: ^5.2.0 - ethereum-waffle: ^3.0.0 - ethers: ^5.0.0 + ethereum-waffle: ^3.4.4 + ethers: ^5.7.2 glob: ^8.1.0 - hardhat: ^2.8.3 - hardhat-abi-exporter: ^2.10.0 + hardhat: ^2.13.0 + hardhat-abi-exporter: ^2.10.1 hardhat-contract-sizer: ^2.8.0 hardhat-docgen: ^1.3.0 - hardhat-gas-reporter: ^1.0.7 - lint-staged: ^12.3.4 + hardhat-gas-reporter: ^1.0.9 + hardhat-preprocessor: ^0.1.5 + lint-staged: ^12.5.0 merkle-patricia-tree: ^4.2.4 - prettier: ^2.5.1 - prettier-plugin-solidity: ^1.1.2 + prettier: ^2.8.4 + prettier-plugin-solidity: ^1.1.3 rlp: ^3.0.0 solhint: ^3.4.0 solidity-coverage: github:taikoxyz/solidity-coverage - solidity-docgen: ^0.6.0-beta.34 - ts-node: ^10.5.0 + solidity-docgen: 0.6.0-beta.35 + ts-node: ^10.9.1 typechain: ^5.2.0 - typescript: ^4.5.5 + typescript: ^4.9.5 dependencies: '@gnosis.pm/zodiac': 1.1.9 - '@openzeppelin/contracts': 4.8.0 - '@openzeppelin/contracts-upgradeable': 4.8.0 + '@openzeppelin/contracts': 4.8.2 + '@openzeppelin/contracts-upgradeable': 4.8.2 channel-ts: 0.1.2 devDependencies: - '@defi-wonderland/smock': 2.3.4_d44p6lx7t3c2oeudc2zxbd5d54 - '@nomicfoundation/hardhat-network-helpers': 1.0.6_hardhat@2.12.2 - '@nomiclabs/hardhat-ethers': 2.2.1_3uaf6nt3qt6cyh5fx3fc5i4mn4 - '@nomiclabs/hardhat-etherscan': 3.1.2_hardhat@2.12.2 - '@nomiclabs/hardhat-waffle': 2.0.3_wzgqb2xh4egjkdzuv52bfmbi24 - '@openzeppelin/hardhat-upgrades': 1.21.0_43thxqwvphwusq7frx7sx2tjf4 - '@typechain/ethers-v5': 7.2.0_rqgsou2umo6ifhsmtcb3krjbfm - '@typechain/hardhat': 2.3.1_i3sbpo4srhduw7xvdsryjfwk5e + '@defi-wonderland/smock': 2.3.4_u3rpjeimcwsavv62fpribvk5fm + '@foundry-rs/hardhat-forge': 0.1.17_fwz6j6oy647sr4tch7c5jpqkoq + '@nomicfoundation/hardhat-network-helpers': 1.0.8_hardhat@2.13.0 + '@nomiclabs/hardhat-ethers': 2.2.2_wknqauzjtp3mhprkntsmqpccee + '@nomiclabs/hardhat-etherscan': 3.1.7_hardhat@2.13.0 + '@nomiclabs/hardhat-waffle': 2.0.5_fwz6j6oy647sr4tch7c5jpqkoq + '@openzeppelin/hardhat-upgrades': 1.22.1_3tghbxmzql23z7wrs7ihu6h3ki + '@typechain/ethers-v5': 7.2.0_jcns4h3uqvirgzfg2h4tj32z6y + '@typechain/hardhat': 2.3.1_72qu7yerczljvjdavmwb3bv7oy '@types/chai': 4.3.4 - '@types/glob': 8.0.1 + '@types/glob': 8.1.0 '@types/mocha': 9.1.1 '@types/node': 12.20.55 - '@typescript-eslint/eslint-plugin': 4.33.0_b437dje45jwsli5vlhomcei76i - '@typescript-eslint/parser': 4.33.0_77fvizpdb3y4icyeo2mf4eo7em + '@typescript-eslint/eslint-plugin': 4.33.0_s2qqtxhzmb7vugvfoyripfgp7i + '@typescript-eslint/parser': 4.33.0_jofidmxrjzhj7l6vknpw5ecvfe chai: 4.3.7 chalk: 4.1.2 dotenv: 10.0.0 eslint: 7.32.0 - eslint-config-prettier: 8.5.0_eslint@7.32.0 - eslint-config-standard: 16.0.3_wnerebu6rbpsve3qx7qqwvcqtq - eslint-plugin-import: 2.26.0_ffi3uiz42rv3jyhs6cr7p7qqry + eslint-config-prettier: 8.6.0_eslint@7.32.0 + eslint-config-standard: 16.0.3_s3p4dyzitdtgac5nictnavtxa4 + eslint-plugin-import: 2.27.5_ffi3uiz42rv3jyhs6cr7p7qqry eslint-plugin-node: 11.1.0_eslint@7.32.0 - eslint-plugin-prettier: 3.4.1_uxd3uwca74b5prxme7kige3a7y + eslint-plugin-prettier: 3.4.1_2fbugv7hbzbahj5qm3ztcno6by eslint-plugin-promise: 5.2.0_eslint@7.32.0 - ethereum-waffle: 3.4.4_typescript@4.9.3 + ethereum-waffle: 3.4.4_typescript@4.9.5 ethers: 5.7.2 glob: 8.1.0 - hardhat: 2.12.2_2dtigtkb225m7ii7q45utxqwgi - hardhat-abi-exporter: 2.10.1_hardhat@2.12.2 - hardhat-contract-sizer: 2.8.0_hardhat@2.12.2 - hardhat-docgen: 1.3.0_lfwxduevmqdtswpjkbv2koayie - hardhat-gas-reporter: 1.0.9_hardhat@2.12.2 + hardhat: 2.13.0_6qtx7vkbdhwvdm4crzlegk4mvi + hardhat-abi-exporter: 2.10.1_hardhat@2.13.0 + hardhat-contract-sizer: 2.8.0_hardhat@2.13.0 + hardhat-docgen: 1.3.0_hardhat@2.13.0 + hardhat-gas-reporter: 1.0.9_hardhat@2.13.0 + hardhat-preprocessor: 0.1.5_hardhat@2.13.0 lint-staged: 12.5.0 merkle-patricia-tree: 4.2.4 - prettier: 2.8.0 - prettier-plugin-solidity: 1.1.2_prettier@2.8.0 + prettier: 2.8.4 + prettier-plugin-solidity: 1.1.3_prettier@2.8.4 rlp: 3.0.0 solhint: 3.4.0 - solidity-coverage: github.com/taikoxyz/solidity-coverage/ceb49fd1f6041e4fcd26079dfb0d3b0f58c812e5_hardhat@2.12.2 - solidity-docgen: 0.6.0-beta.34_hardhat@2.12.2 - ts-node: 10.9.1_vw4thnff6td543szquzqpxymti - typechain: 5.2.0_typescript@4.9.3 - typescript: 4.9.3 + solidity-coverage: github.com/taikoxyz/solidity-coverage/ceb49fd1f6041e4fcd26079dfb0d3b0f58c812e5_hardhat@2.13.0 + solidity-docgen: 0.6.0-beta.35_hardhat@2.13.0 + ts-node: 10.9.1_prfxyxghnskheluimpb6dvby4q + typechain: 5.2.0_typescript@4.9.5 + typescript: 4.9.5 packages/relayer: specifiers: {} @@ -279,12 +283,12 @@ importers: vite: ^3.0.0 vite-plugin-static-copy: ^0.12.0 dependencies: - '@coinbase/wallet-sdk': 3.6.3_@babel+core@7.20.2 + '@coinbase/wallet-sdk': 3.6.3 '@ethersproject/experimental': 5.7.0 '@lottiefiles/svelte-lottie-player': 0.2.0 '@sveltestack/svelte-query': 1.6.0 - '@wagmi/connectors': 0.1.1_wklos3touta4goq4ye6zjwurtq - '@wagmi/core': 0.8.4_gexomxxtwfnmlvmj4reuwmegee + '@wagmi/connectors': 0.1.1_qumsokfsavwbqmluzzd5y4jcfa + '@wagmi/core': 0.8.4_km5vcydjtqolcouev6sh7bgmoy axios: 1.2.0 buffer: 6.0.3 ethers: 5.7.2 @@ -292,7 +296,7 @@ importers: svelte-i18n: 3.5.2_svelte@3.53.1 svelte-spa-router: 3.3.0 devDependencies: - '@babel/preset-env': 7.20.2_@babel+core@7.20.2 + '@babel/preset-env': 7.20.2 '@sveltejs/vite-plugin-svelte': 1.3.1_svelte@3.53.1+vite@3.2.4 '@tsconfig/svelte': 3.0.0 '@types/eslint': 8.4.10 @@ -300,32 +304,32 @@ importers: '@types/jest': 27.5.2 '@types/mixpanel': 2.14.4 '@types/sanitize-html': 2.6.2 - '@typescript-eslint/eslint-plugin': 5.44.0_wn2lldm33jszzpptq7r22sqksi - '@typescript-eslint/parser': 5.44.0_jofidmxrjzhj7l6vknpw5ecvfe + '@typescript-eslint/eslint-plugin': 5.44.0_7kywactpvjpcexyctx5cege4cm + '@typescript-eslint/parser': 5.44.0_typescript@4.9.5 '@zerodevx/svelte-toast': 0.6.3 autoprefixer: 10.4.13_postcss@8.4.21 - babel-jest: 27.5.1_@babel+core@7.20.2 + babel-jest: 27.5.1 babel-plugin-transform-es2015-modules-commonjs: 6.26.2 daisyui: 1.16.6 jest: 27.5.1 node-sass: 7.0.3 postcss: 8.4.21 postcss-cli: 7.1.2 - postcss-loader: 6.2.1_6jdsrmfenkuhhw3gx4zvjlznce + postcss-loader: 6.2.1_postcss@8.4.21 prettier: 2.7.1 rollup-plugin-node-builtins: 2.1.2 - rollup-plugin-polyfill-node: 0.10.2_rollup@2.79.1 + rollup-plugin-polyfill-node: 0.10.2 svelte: 3.53.1 - svelte-check: 2.9.2_qusgu27jzmoklr7jjlsel7vazu + svelte-check: 2.9.2_zerbpdatqmtl23l4lmflabtkhm svelte-heros-v2: 0.3.10 svelte-jester: 2.3.2_jest@27.5.1+svelte@3.53.1 svelte-loader: 3.1.4_svelte@3.53.1 - svelte-preprocess: 4.10.7_y4sunccvtjgz4dr3g3pzi7kmze + svelte-preprocess: 4.10.7_urj4ueeh3k3dx7qcxhluquyqdy tailwindcss: 3.2.6_postcss@8.4.21 theme-change: 2.2.0 - ts-jest: 27.1.5_tr6btbnawl4wz6is4v2fl47ayu + ts-jest: 27.1.5_gy2w2unevcycrhih2qxqkdetla ts-jest-mock-import-meta: 0.12.0_ts-jest@27.1.5 - ts-loader: 9.4.1_hhrrucqyg4eysmfpujvov2ym5u + ts-loader: 9.4.1_typescript@4.9.5 tslib: 2.5.0 typescript: 4.9.5 vite: 3.2.4 @@ -384,12 +388,12 @@ importers: vite: ^3.0.0 vite-plugin-static-copy: ^0.12.0 dependencies: - '@coinbase/wallet-sdk': 3.6.3_@babel+core@7.20.2 + '@coinbase/wallet-sdk': 3.6.3 '@ethersproject/experimental': 5.7.0 '@lottiefiles/svelte-lottie-player': 0.2.0 '@sveltestack/svelte-query': 1.6.0 - '@wagmi/connectors': 0.1.1_igzkohdkbvuxwssjqsbqwxprka - '@wagmi/core': 0.8.4_xvrh6f4niupavonwizjzh3wv4q + '@wagmi/connectors': 0.1.1_lpbbub423epmm6q3g5mjjnmjwe + '@wagmi/core': 0.8.4_5mvh6ls5vdjonfqgvwoj34otni axios: 1.2.0 buffer: 6.0.3 ethers: 5.7.2 @@ -397,7 +401,7 @@ importers: svelte-i18n: 3.5.2_svelte@3.53.1 svelte-spa-router: 3.3.0 devDependencies: - '@babel/preset-env': 7.20.2_@babel+core@7.20.2 + '@babel/preset-env': 7.20.2 '@sveltejs/vite-plugin-svelte': 1.3.1_svelte@3.53.1+vite@3.2.4 '@tsconfig/svelte': 3.0.0 '@types/eslint': 8.4.10 @@ -405,32 +409,32 @@ importers: '@types/jest': 27.5.2 '@types/mixpanel': 2.14.4 '@types/sanitize-html': 2.6.2 - '@typescript-eslint/eslint-plugin': 5.44.0_e2lvjb2eg2mgv3h5oqf6kw3to4 - '@typescript-eslint/parser': 5.44.0_77fvizpdb3y4icyeo2mf4eo7em + '@typescript-eslint/eslint-plugin': 5.44.0_c5rgyxfozmk6acmvyot27wcp74 + '@typescript-eslint/parser': 5.44.0_typescript@4.9.3 '@zerodevx/svelte-toast': 0.6.3 autoprefixer: 10.4.13_postcss@8.4.19 - babel-jest: 27.5.1_@babel+core@7.20.2 + babel-jest: 27.5.1 babel-plugin-transform-es2015-modules-commonjs: 6.26.2 daisyui: 1.16.6 jest: 27.5.1 node-sass: 7.0.3 postcss: 8.4.19 postcss-cli: 7.1.2 - postcss-loader: 6.2.1_upg3rk2kpasnbk27hkqapxaxfq + postcss-loader: 6.2.1_postcss@8.4.19 prettier: 2.7.1 rollup-plugin-node-builtins: 2.1.2 - rollup-plugin-polyfill-node: 0.10.2_rollup@2.79.1 + rollup-plugin-polyfill-node: 0.10.2 svelte: 3.53.1 - svelte-check: 2.9.2_abcb4yglsprjylcfcbep3tcqgq + svelte-check: 2.9.2_dfqi3dk7soqznqtir4fhqm6z5i svelte-heros-v2: 0.3.10 svelte-jester: 2.3.2_jest@27.5.1+svelte@3.53.1 svelte-loader: 3.1.4_svelte@3.53.1 - svelte-preprocess: 4.10.7_axwq5llc4jwkf7awicvy3hu32q + svelte-preprocess: 4.10.7_d6lifvqr42ebgwtwt2nbwt433a tailwindcss: 3.2.4_postcss@8.4.19 theme-change: 2.2.0 - ts-jest: 27.1.5_hf2lt5tikeukj66wl5cvus5z2u + ts-jest: 27.1.5_ucbcg4iu5zhznj2s67mybtqili ts-jest-mock-import-meta: 0.12.0_ts-jest@27.1.5 - ts-loader: 9.4.1_vfotqvx6lgcbf3upbs6hgaza4q + ts-loader: 9.4.1_typescript@4.9.3 tslib: 2.4.1 typescript: 4.9.3 vite: 3.2.4 @@ -483,6 +487,7 @@ packages: dependencies: '@jridgewell/gen-mapping': 0.1.1 '@jridgewell/trace-mapping': 0.3.17 + dev: true /@babel/code-frame/7.12.11: resolution: {integrity: sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==} @@ -495,6 +500,7 @@ packages: engines: {node: '>=6.9.0'} dependencies: '@babel/highlight': 7.18.6 + dev: true /@babel/compat-data/7.20.1: resolution: {integrity: sha512-EWZ4mE2diW3QALKvDMiXnbZpRvlj+nayZ112nK93SnhqOtpdsbVD4W+2tEoT3YNBAG9RBR0ISY758ZkOgsn6pQ==} @@ -521,6 +527,7 @@ packages: semver: 6.3.0 transitivePeerDependencies: - supports-color + dev: true /@babel/generator/7.20.4: resolution: {integrity: sha512-luCf7yk/cm7yab6CAW1aiFnmEfBJplb/JojV56MYEK7ziWfGmFlTfmL9Ehwfy4gFhbjBfWO1wj7/TuSbVNEEtA==} @@ -529,6 +536,7 @@ packages: '@babel/types': 7.20.2 '@jridgewell/gen-mapping': 0.3.2 jsesc: 2.5.2 + dev: true /@babel/helper-annotate-as-pure/7.18.6: resolution: {integrity: sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA==} @@ -567,31 +575,14 @@ packages: '@babel/helper-validator-option': 7.18.6 browserslist: 4.21.5 semver: 6.3.0 - - /@babel/helper-create-class-features-plugin/7.20.2: - resolution: {integrity: sha512-k22GoYRAHPYr9I+Gvy2ZQlAe5mGy8BqWst2wRt8cwIufWTxrsVshhIBvYNqC80N0GSFWTsqRVexOtfzlgOEDvA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - dependencies: - '@babel/helper-annotate-as-pure': 7.18.6 - '@babel/helper-environment-visitor': 7.18.9 - '@babel/helper-function-name': 7.19.0 - '@babel/helper-member-expression-to-functions': 7.18.9 - '@babel/helper-optimise-call-expression': 7.18.6 - '@babel/helper-replace-supers': 7.19.1 - '@babel/helper-split-export-declaration': 7.18.6 - transitivePeerDependencies: - - supports-color dev: true - /@babel/helper-create-class-features-plugin/7.20.2_@babel+core@7.20.2: + /@babel/helper-create-class-features-plugin/7.20.2: resolution: {integrity: sha512-k22GoYRAHPYr9I+Gvy2ZQlAe5mGy8BqWst2wRt8cwIufWTxrsVshhIBvYNqC80N0GSFWTsqRVexOtfzlgOEDvA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.20.2 '@babel/helper-annotate-as-pure': 7.18.6 '@babel/helper-environment-visitor': 7.18.9 '@babel/helper-function-name': 7.19.0 @@ -613,17 +604,6 @@ packages: regexpu-core: 5.2.2 dev: true - /@babel/helper-create-regexp-features-plugin/7.19.0_@babel+core@7.20.2: - resolution: {integrity: sha512-htnV+mHX32DF81amCDrwIDr8nrp1PTm+3wfBN9/v8QJOLEioOCOG7qNyq0nHeFiWbT3Eb7gsPwEmV64UCQ1jzw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - dependencies: - '@babel/core': 7.20.2 - '@babel/helper-annotate-as-pure': 7.18.6 - regexpu-core: 5.2.2 - dev: true - /@babel/helper-define-polyfill-provider/0.3.3: resolution: {integrity: sha512-z5aQKU4IzbqCC1XH0nAqfsFLMVSo22SBKUc0BxGrLkolTdPTructy0ToNnlO2zA4j9Q/7pjMZf0DSY+DSTYzww==} peerDependencies: @@ -638,24 +618,10 @@ packages: transitivePeerDependencies: - supports-color - /@babel/helper-define-polyfill-provider/0.3.3_@babel+core@7.20.2: - resolution: {integrity: sha512-z5aQKU4IzbqCC1XH0nAqfsFLMVSo22SBKUc0BxGrLkolTdPTructy0ToNnlO2zA4j9Q/7pjMZf0DSY+DSTYzww==} - peerDependencies: - '@babel/core': ^7.4.0-0 - dependencies: - '@babel/core': 7.20.2 - '@babel/helper-compilation-targets': 7.20.0_@babel+core@7.20.2 - '@babel/helper-plugin-utils': 7.20.2 - debug: 4.3.4 - lodash.debounce: 4.0.8 - resolve: 1.22.1 - semver: 6.3.0 - transitivePeerDependencies: - - supports-color - /@babel/helper-environment-visitor/7.18.9: resolution: {integrity: sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==} engines: {node: '>=6.9.0'} + dev: true /@babel/helper-explode-assignable-expression/7.18.6: resolution: {integrity: sha512-eyAYAsQmB80jNfg4baAtLeWAQHfHFiR483rzFK+BhETlGZaQC9bsfrugfXDCbRHLQbIA7U5NxhhOxN7p/dWIcg==} @@ -670,12 +636,14 @@ packages: dependencies: '@babel/template': 7.18.10 '@babel/types': 7.20.2 + dev: true /@babel/helper-hoist-variables/7.18.6: resolution: {integrity: sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==} engines: {node: '>=6.9.0'} dependencies: '@babel/types': 7.20.2 + dev: true /@babel/helper-member-expression-to-functions/7.18.9: resolution: {integrity: sha512-RxifAh2ZoVU67PyKIO4AMi1wTenGfMR/O/ae0CCRqwgBAt5v7xjdtRw7UoSbsreKrQn5t7r89eruK/9JjYHuDg==} @@ -704,6 +672,7 @@ packages: '@babel/types': 7.20.2 transitivePeerDependencies: - supports-color + dev: true /@babel/helper-optimise-call-expression/7.18.6: resolution: {integrity: sha512-HP59oD9/fEHQkdcbgFCnbmgH5vIQTJbxh2yf+CdM89/glUNnuzr87Q8GIjGEnOktTROemO0Pe0iPAYbqZuOUiA==} @@ -730,21 +699,6 @@ packages: - supports-color dev: true - /@babel/helper-remap-async-to-generator/7.18.9_@babel+core@7.20.2: - resolution: {integrity: sha512-dI7q50YKd8BAv3VEfgg7PS7yD3Rtbi2J1XMXaalXO0W0164hYLnh8zpjRS0mte9MfVp/tltvr/cfdXPvJr1opA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - dependencies: - '@babel/core': 7.20.2 - '@babel/helper-annotate-as-pure': 7.18.6 - '@babel/helper-environment-visitor': 7.18.9 - '@babel/helper-wrap-function': 7.19.0 - '@babel/types': 7.20.2 - transitivePeerDependencies: - - supports-color - dev: true - /@babel/helper-replace-supers/7.19.1: resolution: {integrity: sha512-T7ahH7wV0Hfs46SFh5Jz3s0B6+o8g3c+7TMxu7xKfmHikg7EAZ3I2Qk9LFhjxXq8sL7UkP5JflezNwoZa8WvWw==} engines: {node: '>=6.9.0'} @@ -763,6 +717,7 @@ packages: engines: {node: '>=6.9.0'} dependencies: '@babel/types': 7.20.2 + dev: true /@babel/helper-skip-transparent-expression-wrappers/7.20.0: resolution: {integrity: sha512-5y1JYeNKfvnT8sZcK9DVRtpTbGiomYIHviSP3OQWmDPU3DeH4a1ZlT/N2lyQ5P8egjcRaT/Y9aNqUxK0WsnIIg==} @@ -776,6 +731,7 @@ packages: engines: {node: '>=6.9.0'} dependencies: '@babel/types': 7.20.2 + dev: true /@babel/helper-string-parser/7.19.4: resolution: {integrity: sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==} @@ -810,6 +766,7 @@ packages: '@babel/types': 7.20.2 transitivePeerDependencies: - supports-color + dev: true /@babel/highlight/7.18.6: resolution: {integrity: sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==} @@ -818,6 +775,7 @@ packages: '@babel/helper-validator-identifier': 7.19.1 chalk: 2.4.2 js-tokens: 4.0.0 + dev: true /@babel/parser/7.20.3: resolution: {integrity: sha512-OP/s5a94frIPXwjzEcv5S/tpQfc6XhxYUnmWpgdqMWGgYCuErA3SzozaRAMQgSZWKeTJxht9aWAkUY+0UzvOFg==} @@ -825,23 +783,22 @@ packages: hasBin: true dependencies: '@babel/types': 7.20.2 + dev: true - /@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/7.18.6: - resolution: {integrity: sha512-Dgxsyg54Fx1d4Nge8UnvTrED63vrwOdPmyvPzlNN/boaliRP54pm3pGzZD1SJUwrBA+Cs/xdG8kXX6Mn/RfISQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 + /@babel/parser/7.21.2: + resolution: {integrity: sha512-URpaIJQwEkEC2T9Kn+Ai6Xe/02iNaVCuT/PtoRz3GPVJVDpPd7mLo+VddTbhCRU9TXqW5mSrQfXZyi8kDKOVpQ==} + engines: {node: '>=6.0.0'} + hasBin: true dependencies: - '@babel/helper-plugin-utils': 7.20.2 + '@babel/types': 7.21.2 dev: true - /@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/7.18.6_@babel+core@7.20.2: + /@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/7.18.6: resolution: {integrity: sha512-Dgxsyg54Fx1d4Nge8UnvTrED63vrwOdPmyvPzlNN/boaliRP54pm3pGzZD1SJUwrBA+Cs/xdG8kXX6Mn/RfISQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.20.2 '@babel/helper-plugin-utils': 7.20.2 dev: true @@ -856,18 +813,6 @@ packages: '@babel/plugin-proposal-optional-chaining': 7.18.9 dev: true - /@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/7.18.9_@babel+core@7.20.2: - resolution: {integrity: sha512-AHrP9jadvH7qlOj6PINbgSuphjQUAK7AOT7DPjBo9EHoLhQTnnK5u45e1Hd4DbSQEO9nqPWtQ89r+XEOWFScKg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.13.0 - dependencies: - '@babel/core': 7.20.2 - '@babel/helper-plugin-utils': 7.20.2 - '@babel/helper-skip-transparent-expression-wrappers': 7.20.0 - '@babel/plugin-proposal-optional-chaining': 7.18.9_@babel+core@7.20.2 - dev: true - /@babel/plugin-proposal-async-generator-functions/7.20.1: resolution: {integrity: sha512-Gh5rchzSwE4kC+o/6T8waD0WHEQIsDmjltY8WnWRXHUdH8axZhuH86Ov9M72YhJfDrZseQwuuWaaIT/TmePp3g==} engines: {node: '>=6.9.0'} @@ -882,21 +827,6 @@ packages: - supports-color dev: true - /@babel/plugin-proposal-async-generator-functions/7.20.1_@babel+core@7.20.2: - resolution: {integrity: sha512-Gh5rchzSwE4kC+o/6T8waD0WHEQIsDmjltY8WnWRXHUdH8axZhuH86Ov9M72YhJfDrZseQwuuWaaIT/TmePp3g==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.20.2 - '@babel/helper-environment-visitor': 7.18.9 - '@babel/helper-plugin-utils': 7.20.2 - '@babel/helper-remap-async-to-generator': 7.18.9_@babel+core@7.20.2 - '@babel/plugin-syntax-async-generators': 7.8.4_@babel+core@7.20.2 - transitivePeerDependencies: - - supports-color - dev: true - /@babel/plugin-proposal-class-properties/7.18.6: resolution: {integrity: sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==} engines: {node: '>=6.9.0'} @@ -909,19 +839,6 @@ packages: - supports-color dev: true - /@babel/plugin-proposal-class-properties/7.18.6_@babel+core@7.20.2: - resolution: {integrity: sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.20.2 - '@babel/helper-create-class-features-plugin': 7.20.2_@babel+core@7.20.2 - '@babel/helper-plugin-utils': 7.20.2 - transitivePeerDependencies: - - supports-color - dev: true - /@babel/plugin-proposal-class-static-block/7.18.6: resolution: {integrity: sha512-+I3oIiNxrCpup3Gi8n5IGMwj0gOCAjcJUSQEcotNnCCPMEnixawOQ+KeJPlgfjzx+FKQ1QSyZOWe7wmoJp7vhw==} engines: {node: '>=6.9.0'} @@ -935,20 +852,6 @@ packages: - supports-color dev: true - /@babel/plugin-proposal-class-static-block/7.18.6_@babel+core@7.20.2: - resolution: {integrity: sha512-+I3oIiNxrCpup3Gi8n5IGMwj0gOCAjcJUSQEcotNnCCPMEnixawOQ+KeJPlgfjzx+FKQ1QSyZOWe7wmoJp7vhw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.12.0 - dependencies: - '@babel/core': 7.20.2 - '@babel/helper-create-class-features-plugin': 7.20.2_@babel+core@7.20.2 - '@babel/helper-plugin-utils': 7.20.2 - '@babel/plugin-syntax-class-static-block': 7.14.5_@babel+core@7.20.2 - transitivePeerDependencies: - - supports-color - dev: true - /@babel/plugin-proposal-dynamic-import/7.18.6: resolution: {integrity: sha512-1auuwmK+Rz13SJj36R+jqFPMJWyKEDd7lLSdOj4oJK0UTgGueSAtkrCvz9ewmgyU/P941Rv2fQwZJN8s6QruXw==} engines: {node: '>=6.9.0'} @@ -959,17 +862,6 @@ packages: '@babel/plugin-syntax-dynamic-import': 7.8.3 dev: true - /@babel/plugin-proposal-dynamic-import/7.18.6_@babel+core@7.20.2: - resolution: {integrity: sha512-1auuwmK+Rz13SJj36R+jqFPMJWyKEDd7lLSdOj4oJK0UTgGueSAtkrCvz9ewmgyU/P941Rv2fQwZJN8s6QruXw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.20.2 - '@babel/helper-plugin-utils': 7.20.2 - '@babel/plugin-syntax-dynamic-import': 7.8.3_@babel+core@7.20.2 - dev: true - /@babel/plugin-proposal-export-namespace-from/7.18.9: resolution: {integrity: sha512-k1NtHyOMvlDDFeb9G5PhUXuGj8m/wiwojgQVEhJ/fsVsMCpLyOP4h0uGEjYJKrRI+EVPlb5Jk+Gt9P97lOGwtA==} engines: {node: '>=6.9.0'} @@ -980,17 +872,6 @@ packages: '@babel/plugin-syntax-export-namespace-from': 7.8.3 dev: true - /@babel/plugin-proposal-export-namespace-from/7.18.9_@babel+core@7.20.2: - resolution: {integrity: sha512-k1NtHyOMvlDDFeb9G5PhUXuGj8m/wiwojgQVEhJ/fsVsMCpLyOP4h0uGEjYJKrRI+EVPlb5Jk+Gt9P97lOGwtA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.20.2 - '@babel/helper-plugin-utils': 7.20.2 - '@babel/plugin-syntax-export-namespace-from': 7.8.3_@babel+core@7.20.2 - dev: true - /@babel/plugin-proposal-json-strings/7.18.6: resolution: {integrity: sha512-lr1peyn9kOdbYc0xr0OdHTZ5FMqS6Di+H0Fz2I/JwMzGmzJETNeOFq2pBySw6X/KFL5EWDjlJuMsUGRFb8fQgQ==} engines: {node: '>=6.9.0'} @@ -1001,17 +882,6 @@ packages: '@babel/plugin-syntax-json-strings': 7.8.3 dev: true - /@babel/plugin-proposal-json-strings/7.18.6_@babel+core@7.20.2: - resolution: {integrity: sha512-lr1peyn9kOdbYc0xr0OdHTZ5FMqS6Di+H0Fz2I/JwMzGmzJETNeOFq2pBySw6X/KFL5EWDjlJuMsUGRFb8fQgQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.20.2 - '@babel/helper-plugin-utils': 7.20.2 - '@babel/plugin-syntax-json-strings': 7.8.3_@babel+core@7.20.2 - dev: true - /@babel/plugin-proposal-logical-assignment-operators/7.18.9: resolution: {integrity: sha512-128YbMpjCrP35IOExw2Fq+x55LMP42DzhOhX2aNNIdI9avSWl2PI0yuBWarr3RYpZBSPtabfadkH2yeRiMD61Q==} engines: {node: '>=6.9.0'} @@ -1022,17 +892,6 @@ packages: '@babel/plugin-syntax-logical-assignment-operators': 7.10.4 dev: true - /@babel/plugin-proposal-logical-assignment-operators/7.18.9_@babel+core@7.20.2: - resolution: {integrity: sha512-128YbMpjCrP35IOExw2Fq+x55LMP42DzhOhX2aNNIdI9avSWl2PI0yuBWarr3RYpZBSPtabfadkH2yeRiMD61Q==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.20.2 - '@babel/helper-plugin-utils': 7.20.2 - '@babel/plugin-syntax-logical-assignment-operators': 7.10.4_@babel+core@7.20.2 - dev: true - /@babel/plugin-proposal-nullish-coalescing-operator/7.18.6: resolution: {integrity: sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA==} engines: {node: '>=6.9.0'} @@ -1043,17 +902,6 @@ packages: '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3 dev: true - /@babel/plugin-proposal-nullish-coalescing-operator/7.18.6_@babel+core@7.20.2: - resolution: {integrity: sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.20.2 - '@babel/helper-plugin-utils': 7.20.2 - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3_@babel+core@7.20.2 - dev: true - /@babel/plugin-proposal-numeric-separator/7.18.6: resolution: {integrity: sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q==} engines: {node: '>=6.9.0'} @@ -1064,17 +912,6 @@ packages: '@babel/plugin-syntax-numeric-separator': 7.10.4 dev: true - /@babel/plugin-proposal-numeric-separator/7.18.6_@babel+core@7.20.2: - resolution: {integrity: sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.20.2 - '@babel/helper-plugin-utils': 7.20.2 - '@babel/plugin-syntax-numeric-separator': 7.10.4_@babel+core@7.20.2 - dev: true - /@babel/plugin-proposal-object-rest-spread/7.20.2: resolution: {integrity: sha512-Ks6uej9WFK+fvIMesSqbAto5dD8Dz4VuuFvGJFKgIGSkJuRGcrwGECPA1fDgQK3/DbExBJpEkTeYeB8geIFCSQ==} engines: {node: '>=6.9.0'} @@ -1088,20 +925,6 @@ packages: '@babel/plugin-transform-parameters': 7.20.3 dev: true - /@babel/plugin-proposal-object-rest-spread/7.20.2_@babel+core@7.20.2: - resolution: {integrity: sha512-Ks6uej9WFK+fvIMesSqbAto5dD8Dz4VuuFvGJFKgIGSkJuRGcrwGECPA1fDgQK3/DbExBJpEkTeYeB8geIFCSQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/compat-data': 7.20.1 - '@babel/core': 7.20.2 - '@babel/helper-compilation-targets': 7.20.0_@babel+core@7.20.2 - '@babel/helper-plugin-utils': 7.20.2 - '@babel/plugin-syntax-object-rest-spread': 7.8.3_@babel+core@7.20.2 - '@babel/plugin-transform-parameters': 7.20.3_@babel+core@7.20.2 - dev: true - /@babel/plugin-proposal-optional-catch-binding/7.18.6: resolution: {integrity: sha512-Q40HEhs9DJQyaZfUjjn6vE8Cv4GmMHCYuMGIWUnlxH6400VGxOuwWsPt4FxXxJkC/5eOzgn0z21M9gMT4MOhbw==} engines: {node: '>=6.9.0'} @@ -1112,17 +935,6 @@ packages: '@babel/plugin-syntax-optional-catch-binding': 7.8.3 dev: true - /@babel/plugin-proposal-optional-catch-binding/7.18.6_@babel+core@7.20.2: - resolution: {integrity: sha512-Q40HEhs9DJQyaZfUjjn6vE8Cv4GmMHCYuMGIWUnlxH6400VGxOuwWsPt4FxXxJkC/5eOzgn0z21M9gMT4MOhbw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.20.2 - '@babel/helper-plugin-utils': 7.20.2 - '@babel/plugin-syntax-optional-catch-binding': 7.8.3_@babel+core@7.20.2 - dev: true - /@babel/plugin-proposal-optional-chaining/7.18.9: resolution: {integrity: sha512-v5nwt4IqBXihxGsW2QmCWMDS3B3bzGIk/EQVZz2ei7f3NJl8NzAJVvUmpDW5q1CRNY+Beb/k58UAH1Km1N411w==} engines: {node: '>=6.9.0'} @@ -1134,18 +946,6 @@ packages: '@babel/plugin-syntax-optional-chaining': 7.8.3 dev: true - /@babel/plugin-proposal-optional-chaining/7.18.9_@babel+core@7.20.2: - resolution: {integrity: sha512-v5nwt4IqBXihxGsW2QmCWMDS3B3bzGIk/EQVZz2ei7f3NJl8NzAJVvUmpDW5q1CRNY+Beb/k58UAH1Km1N411w==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.20.2 - '@babel/helper-plugin-utils': 7.20.2 - '@babel/helper-skip-transparent-expression-wrappers': 7.20.0 - '@babel/plugin-syntax-optional-chaining': 7.8.3_@babel+core@7.20.2 - dev: true - /@babel/plugin-proposal-private-methods/7.18.6: resolution: {integrity: sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA==} engines: {node: '>=6.9.0'} @@ -1158,19 +958,6 @@ packages: - supports-color dev: true - /@babel/plugin-proposal-private-methods/7.18.6_@babel+core@7.20.2: - resolution: {integrity: sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.20.2 - '@babel/helper-create-class-features-plugin': 7.20.2_@babel+core@7.20.2 - '@babel/helper-plugin-utils': 7.20.2 - transitivePeerDependencies: - - supports-color - dev: true - /@babel/plugin-proposal-private-property-in-object/7.18.6: resolution: {integrity: sha512-9Rysx7FOctvT5ouj5JODjAFAkgGoudQuLPamZb0v1TGLpapdNaftzifU8NTWQm0IRjqoYypdrSmyWgkocDQ8Dw==} engines: {node: '>=6.9.0'} @@ -1185,21 +972,6 @@ packages: - supports-color dev: true - /@babel/plugin-proposal-private-property-in-object/7.18.6_@babel+core@7.20.2: - resolution: {integrity: sha512-9Rysx7FOctvT5ouj5JODjAFAkgGoudQuLPamZb0v1TGLpapdNaftzifU8NTWQm0IRjqoYypdrSmyWgkocDQ8Dw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.20.2 - '@babel/helper-annotate-as-pure': 7.18.6 - '@babel/helper-create-class-features-plugin': 7.20.2_@babel+core@7.20.2 - '@babel/helper-plugin-utils': 7.20.2 - '@babel/plugin-syntax-private-property-in-object': 7.14.5_@babel+core@7.20.2 - transitivePeerDependencies: - - supports-color - dev: true - /@babel/plugin-proposal-unicode-property-regex/7.18.6: resolution: {integrity: sha512-2BShG/d5yoZyXZfVePH91urL5wTG6ASZU9M4o03lKK8u8UW1y08OMttBSOADTcJrnPMpvDXRG3G8fyLh4ovs8w==} engines: {node: '>=4'} @@ -1210,17 +982,6 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-proposal-unicode-property-regex/7.18.6_@babel+core@7.20.2: - resolution: {integrity: sha512-2BShG/d5yoZyXZfVePH91urL5wTG6ASZU9M4o03lKK8u8UW1y08OMttBSOADTcJrnPMpvDXRG3G8fyLh4ovs8w==} - engines: {node: '>=4'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.20.2 - '@babel/helper-create-regexp-features-plugin': 7.19.0_@babel+core@7.20.2 - '@babel/helper-plugin-utils': 7.20.2 - dev: true - /@babel/plugin-syntax-async-generators/7.8.4: resolution: {integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==} peerDependencies: @@ -1281,16 +1042,6 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-syntax-class-static-block/7.14.5_@babel+core@7.20.2: - resolution: {integrity: sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.20.2 - '@babel/helper-plugin-utils': 7.20.2 - dev: true - /@babel/plugin-syntax-dynamic-import/7.8.3: resolution: {integrity: sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==} peerDependencies: @@ -1299,15 +1050,6 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-syntax-dynamic-import/7.8.3_@babel+core@7.20.2: - resolution: {integrity: sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.20.2 - '@babel/helper-plugin-utils': 7.20.2 - dev: true - /@babel/plugin-syntax-export-namespace-from/7.8.3: resolution: {integrity: sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==} peerDependencies: @@ -1316,15 +1058,6 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-syntax-export-namespace-from/7.8.3_@babel+core@7.20.2: - resolution: {integrity: sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.20.2 - '@babel/helper-plugin-utils': 7.20.2 - dev: true - /@babel/plugin-syntax-import-assertions/7.20.0: resolution: {integrity: sha512-IUh1vakzNoWalR8ch/areW7qFopR2AEw03JlG7BbrDqmQ4X3q9uuipQwSGrUn7oGiemKjtSLDhNtQHzMHr1JdQ==} engines: {node: '>=6.9.0'} @@ -1334,16 +1067,6 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-syntax-import-assertions/7.20.0_@babel+core@7.20.2: - resolution: {integrity: sha512-IUh1vakzNoWalR8ch/areW7qFopR2AEw03JlG7BbrDqmQ4X3q9uuipQwSGrUn7oGiemKjtSLDhNtQHzMHr1JdQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.20.2 - '@babel/helper-plugin-utils': 7.20.2 - dev: true - /@babel/plugin-syntax-import-meta/7.10.4: resolution: {integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==} peerDependencies: @@ -1489,16 +1212,6 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-syntax-private-property-in-object/7.14.5_@babel+core@7.20.2: - resolution: {integrity: sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.20.2 - '@babel/helper-plugin-utils': 7.20.2 - dev: true - /@babel/plugin-syntax-top-level-await/7.14.5: resolution: {integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==} engines: {node: '>=6.9.0'} @@ -1537,16 +1250,6 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-transform-arrow-functions/7.18.6_@babel+core@7.20.2: - resolution: {integrity: sha512-9S9X9RUefzrsHZmKMbDXxweEH+YlE8JJEuat9FdvW9Qh1cw7W64jELCtWNkPBPX5En45uy28KGvA/AySqUh8CQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.20.2 - '@babel/helper-plugin-utils': 7.20.2 - dev: true - /@babel/plugin-transform-async-to-generator/7.18.6: resolution: {integrity: sha512-ARE5wZLKnTgPW7/1ftQmSi1CmkqqHo2DNmtztFhvgtOWSDfq0Cq9/9L+KnZNYSNrydBekhW3rwShduf59RoXag==} engines: {node: '>=6.9.0'} @@ -1560,20 +1263,6 @@ packages: - supports-color dev: true - /@babel/plugin-transform-async-to-generator/7.18.6_@babel+core@7.20.2: - resolution: {integrity: sha512-ARE5wZLKnTgPW7/1ftQmSi1CmkqqHo2DNmtztFhvgtOWSDfq0Cq9/9L+KnZNYSNrydBekhW3rwShduf59RoXag==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.20.2 - '@babel/helper-module-imports': 7.18.6 - '@babel/helper-plugin-utils': 7.20.2 - '@babel/helper-remap-async-to-generator': 7.18.9_@babel+core@7.20.2 - transitivePeerDependencies: - - supports-color - dev: true - /@babel/plugin-transform-block-scoped-functions/7.18.6: resolution: {integrity: sha512-ExUcOqpPWnliRcPqves5HJcJOvHvIIWfuS4sroBUenPuMdmW+SMHDakmtS7qOo13sVppmUijqeTv7qqGsvURpQ==} engines: {node: '>=6.9.0'} @@ -1583,16 +1272,6 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-transform-block-scoped-functions/7.18.6_@babel+core@7.20.2: - resolution: {integrity: sha512-ExUcOqpPWnliRcPqves5HJcJOvHvIIWfuS4sroBUenPuMdmW+SMHDakmtS7qOo13sVppmUijqeTv7qqGsvURpQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.20.2 - '@babel/helper-plugin-utils': 7.20.2 - dev: true - /@babel/plugin-transform-block-scoping/7.20.2: resolution: {integrity: sha512-y5V15+04ry69OV2wULmwhEA6jwSWXO1TwAtIwiPXcvHcoOQUqpyMVd2bDsQJMW8AurjulIyUV8kDqtjSwHy1uQ==} engines: {node: '>=6.9.0'} @@ -1602,16 +1281,6 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-transform-block-scoping/7.20.2_@babel+core@7.20.2: - resolution: {integrity: sha512-y5V15+04ry69OV2wULmwhEA6jwSWXO1TwAtIwiPXcvHcoOQUqpyMVd2bDsQJMW8AurjulIyUV8kDqtjSwHy1uQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.20.2 - '@babel/helper-plugin-utils': 7.20.2 - dev: true - /@babel/plugin-transform-classes/7.20.2: resolution: {integrity: sha512-9rbPp0lCVVoagvtEyQKSo5L8oo0nQS/iif+lwlAz29MccX2642vWDlSZK+2T2buxbopotId2ld7zZAzRfz9j1g==} engines: {node: '>=6.9.0'} @@ -1631,26 +1300,6 @@ packages: - supports-color dev: true - /@babel/plugin-transform-classes/7.20.2_@babel+core@7.20.2: - resolution: {integrity: sha512-9rbPp0lCVVoagvtEyQKSo5L8oo0nQS/iif+lwlAz29MccX2642vWDlSZK+2T2buxbopotId2ld7zZAzRfz9j1g==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.20.2 - '@babel/helper-annotate-as-pure': 7.18.6 - '@babel/helper-compilation-targets': 7.20.0_@babel+core@7.20.2 - '@babel/helper-environment-visitor': 7.18.9 - '@babel/helper-function-name': 7.19.0 - '@babel/helper-optimise-call-expression': 7.18.6 - '@babel/helper-plugin-utils': 7.20.2 - '@babel/helper-replace-supers': 7.19.1 - '@babel/helper-split-export-declaration': 7.18.6 - globals: 11.12.0 - transitivePeerDependencies: - - supports-color - dev: true - /@babel/plugin-transform-computed-properties/7.18.9: resolution: {integrity: sha512-+i0ZU1bCDymKakLxn5srGHrsAPRELC2WIbzwjLhHW9SIE1cPYkLCL0NlnXMZaM1vhfgA2+M7hySk42VBvrkBRw==} engines: {node: '>=6.9.0'} @@ -1660,16 +1309,6 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-transform-computed-properties/7.18.9_@babel+core@7.20.2: - resolution: {integrity: sha512-+i0ZU1bCDymKakLxn5srGHrsAPRELC2WIbzwjLhHW9SIE1cPYkLCL0NlnXMZaM1vhfgA2+M7hySk42VBvrkBRw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.20.2 - '@babel/helper-plugin-utils': 7.20.2 - dev: true - /@babel/plugin-transform-destructuring/7.20.2: resolution: {integrity: sha512-mENM+ZHrvEgxLTBXUiQ621rRXZes3KWUv6NdQlrnr1TkWVw+hUjQBZuP2X32qKlrlG2BzgR95gkuCRSkJl8vIw==} engines: {node: '>=6.9.0'} @@ -1679,16 +1318,6 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-transform-destructuring/7.20.2_@babel+core@7.20.2: - resolution: {integrity: sha512-mENM+ZHrvEgxLTBXUiQ621rRXZes3KWUv6NdQlrnr1TkWVw+hUjQBZuP2X32qKlrlG2BzgR95gkuCRSkJl8vIw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.20.2 - '@babel/helper-plugin-utils': 7.20.2 - dev: true - /@babel/plugin-transform-dotall-regex/7.18.6: resolution: {integrity: sha512-6S3jpun1eEbAxq7TdjLotAsl4WpQI9DxfkycRcKrjhQYzU87qpXdknpBg/e+TdcMehqGnLFi7tnFUBR02Vq6wg==} engines: {node: '>=6.9.0'} @@ -1699,17 +1328,6 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-transform-dotall-regex/7.18.6_@babel+core@7.20.2: - resolution: {integrity: sha512-6S3jpun1eEbAxq7TdjLotAsl4WpQI9DxfkycRcKrjhQYzU87qpXdknpBg/e+TdcMehqGnLFi7tnFUBR02Vq6wg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.20.2 - '@babel/helper-create-regexp-features-plugin': 7.19.0_@babel+core@7.20.2 - '@babel/helper-plugin-utils': 7.20.2 - dev: true - /@babel/plugin-transform-duplicate-keys/7.18.9: resolution: {integrity: sha512-d2bmXCtZXYc59/0SanQKbiWINadaJXqtvIQIzd4+hNwkWBgyCd5F/2t1kXoUdvPMrxzPvhK6EMQRROxsue+mfw==} engines: {node: '>=6.9.0'} @@ -1719,16 +1337,6 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-transform-duplicate-keys/7.18.9_@babel+core@7.20.2: - resolution: {integrity: sha512-d2bmXCtZXYc59/0SanQKbiWINadaJXqtvIQIzd4+hNwkWBgyCd5F/2t1kXoUdvPMrxzPvhK6EMQRROxsue+mfw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.20.2 - '@babel/helper-plugin-utils': 7.20.2 - dev: true - /@babel/plugin-transform-exponentiation-operator/7.18.6: resolution: {integrity: sha512-wzEtc0+2c88FVR34aQmiz56dxEkxr2g8DQb/KfaFa1JYXOFVsbhvAonFN6PwVWj++fKmku8NP80plJ5Et4wqHw==} engines: {node: '>=6.9.0'} @@ -1739,17 +1347,6 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-transform-exponentiation-operator/7.18.6_@babel+core@7.20.2: - resolution: {integrity: sha512-wzEtc0+2c88FVR34aQmiz56dxEkxr2g8DQb/KfaFa1JYXOFVsbhvAonFN6PwVWj++fKmku8NP80plJ5Et4wqHw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.20.2 - '@babel/helper-builder-binary-assignment-operator-visitor': 7.18.9 - '@babel/helper-plugin-utils': 7.20.2 - dev: true - /@babel/plugin-transform-for-of/7.18.8: resolution: {integrity: sha512-yEfTRnjuskWYo0k1mHUqrVWaZwrdq8AYbfrpqULOJOaucGSp4mNMVps+YtA8byoevxS/urwU75vyhQIxcCgiBQ==} engines: {node: '>=6.9.0'} @@ -1759,16 +1356,6 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-transform-for-of/7.18.8_@babel+core@7.20.2: - resolution: {integrity: sha512-yEfTRnjuskWYo0k1mHUqrVWaZwrdq8AYbfrpqULOJOaucGSp4mNMVps+YtA8byoevxS/urwU75vyhQIxcCgiBQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.20.2 - '@babel/helper-plugin-utils': 7.20.2 - dev: true - /@babel/plugin-transform-function-name/7.18.9: resolution: {integrity: sha512-WvIBoRPaJQ5yVHzcnJFor7oS5Ls0PYixlTYE63lCj2RtdQEl15M68FXQlxnG6wdraJIXRdR7KI+hQ7q/9QjrCQ==} engines: {node: '>=6.9.0'} @@ -1780,18 +1367,6 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-transform-function-name/7.18.9_@babel+core@7.20.2: - resolution: {integrity: sha512-WvIBoRPaJQ5yVHzcnJFor7oS5Ls0PYixlTYE63lCj2RtdQEl15M68FXQlxnG6wdraJIXRdR7KI+hQ7q/9QjrCQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.20.2 - '@babel/helper-compilation-targets': 7.20.0_@babel+core@7.20.2 - '@babel/helper-function-name': 7.19.0 - '@babel/helper-plugin-utils': 7.20.2 - dev: true - /@babel/plugin-transform-literals/7.18.9: resolution: {integrity: sha512-IFQDSRoTPnrAIrI5zoZv73IFeZu2dhu6irxQjY9rNjTT53VmKg9fenjvoiOWOkJ6mm4jKVPtdMzBY98Fp4Z4cg==} engines: {node: '>=6.9.0'} @@ -1801,164 +1376,8 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-transform-literals/7.18.9_@babel+core@7.20.2: - resolution: {integrity: sha512-IFQDSRoTPnrAIrI5zoZv73IFeZu2dhu6irxQjY9rNjTT53VmKg9fenjvoiOWOkJ6mm4jKVPtdMzBY98Fp4Z4cg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.20.2 - '@babel/helper-plugin-utils': 7.20.2 - dev: true - - /@babel/plugin-transform-member-expression-literals/7.18.6: - resolution: {integrity: sha512-qSF1ihLGO3q+/g48k85tUjD033C29TNTVB2paCwZPVmOsjn9pClvYYrM2VeJpBY2bcNkuny0YUyTNRyRxJ54KA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/helper-plugin-utils': 7.20.2 - dev: true - - /@babel/plugin-transform-member-expression-literals/7.18.6_@babel+core@7.20.2: - resolution: {integrity: sha512-qSF1ihLGO3q+/g48k85tUjD033C29TNTVB2paCwZPVmOsjn9pClvYYrM2VeJpBY2bcNkuny0YUyTNRyRxJ54KA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.20.2 - '@babel/helper-plugin-utils': 7.20.2 - dev: true - - /@babel/plugin-transform-modules-amd/7.19.6: - resolution: {integrity: sha512-uG3od2mXvAtIFQIh0xrpLH6r5fpSQN04gIVovl+ODLdUMANokxQLZnPBHcjmv3GxRjnqwLuHvppjjcelqUFZvg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/helper-module-transforms': 7.20.2 - '@babel/helper-plugin-utils': 7.20.2 - transitivePeerDependencies: - - supports-color - dev: true - - /@babel/plugin-transform-modules-amd/7.19.6_@babel+core@7.20.2: - resolution: {integrity: sha512-uG3od2mXvAtIFQIh0xrpLH6r5fpSQN04gIVovl+ODLdUMANokxQLZnPBHcjmv3GxRjnqwLuHvppjjcelqUFZvg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.20.2 - '@babel/helper-module-transforms': 7.20.2 - '@babel/helper-plugin-utils': 7.20.2 - transitivePeerDependencies: - - supports-color - dev: true - - /@babel/plugin-transform-modules-commonjs/7.19.6: - resolution: {integrity: sha512-8PIa1ym4XRTKuSsOUXqDG0YaOlEuTVvHMe5JCfgBMOtHvJKw/4NGovEGN33viISshG/rZNVrACiBmPQLvWN8xQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/helper-module-transforms': 7.20.2 - '@babel/helper-plugin-utils': 7.20.2 - '@babel/helper-simple-access': 7.20.2 - transitivePeerDependencies: - - supports-color - dev: true - - /@babel/plugin-transform-modules-commonjs/7.19.6_@babel+core@7.20.2: - resolution: {integrity: sha512-8PIa1ym4XRTKuSsOUXqDG0YaOlEuTVvHMe5JCfgBMOtHvJKw/4NGovEGN33viISshG/rZNVrACiBmPQLvWN8xQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.20.2 - '@babel/helper-module-transforms': 7.20.2 - '@babel/helper-plugin-utils': 7.20.2 - '@babel/helper-simple-access': 7.20.2 - transitivePeerDependencies: - - supports-color - dev: true - - /@babel/plugin-transform-modules-systemjs/7.19.6: - resolution: {integrity: sha512-fqGLBepcc3kErfR9R3DnVpURmckXP7gj7bAlrTQyBxrigFqszZCkFkcoxzCp2v32XmwXLvbw+8Yq9/b+QqksjQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/helper-hoist-variables': 7.18.6 - '@babel/helper-module-transforms': 7.20.2 - '@babel/helper-plugin-utils': 7.20.2 - '@babel/helper-validator-identifier': 7.19.1 - transitivePeerDependencies: - - supports-color - dev: true - - /@babel/plugin-transform-modules-systemjs/7.19.6_@babel+core@7.20.2: - resolution: {integrity: sha512-fqGLBepcc3kErfR9R3DnVpURmckXP7gj7bAlrTQyBxrigFqszZCkFkcoxzCp2v32XmwXLvbw+8Yq9/b+QqksjQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.20.2 - '@babel/helper-hoist-variables': 7.18.6 - '@babel/helper-module-transforms': 7.20.2 - '@babel/helper-plugin-utils': 7.20.2 - '@babel/helper-validator-identifier': 7.19.1 - transitivePeerDependencies: - - supports-color - dev: true - - /@babel/plugin-transform-modules-umd/7.18.6: - resolution: {integrity: sha512-dcegErExVeXcRqNtkRU/z8WlBLnvD4MRnHgNs3MytRO1Mn1sHRyhbcpYbVMGclAqOjdW+9cfkdZno9dFdfKLfQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/helper-module-transforms': 7.20.2 - '@babel/helper-plugin-utils': 7.20.2 - transitivePeerDependencies: - - supports-color - dev: true - - /@babel/plugin-transform-modules-umd/7.18.6_@babel+core@7.20.2: - resolution: {integrity: sha512-dcegErExVeXcRqNtkRU/z8WlBLnvD4MRnHgNs3MytRO1Mn1sHRyhbcpYbVMGclAqOjdW+9cfkdZno9dFdfKLfQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.20.2 - '@babel/helper-module-transforms': 7.20.2 - '@babel/helper-plugin-utils': 7.20.2 - transitivePeerDependencies: - - supports-color - dev: true - - /@babel/plugin-transform-named-capturing-groups-regex/7.19.1: - resolution: {integrity: sha512-oWk9l9WItWBQYS4FgXD4Uyy5kq898lvkXpXQxoJEY1RnvPk4R/Dvu2ebXU9q8lP+rlMwUQTFf2Ok6d78ODa0kw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - dependencies: - '@babel/helper-create-regexp-features-plugin': 7.19.0 - '@babel/helper-plugin-utils': 7.20.2 - dev: true - - /@babel/plugin-transform-named-capturing-groups-regex/7.19.1_@babel+core@7.20.2: - resolution: {integrity: sha512-oWk9l9WItWBQYS4FgXD4Uyy5kq898lvkXpXQxoJEY1RnvPk4R/Dvu2ebXU9q8lP+rlMwUQTFf2Ok6d78ODa0kw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - dependencies: - '@babel/core': 7.20.2 - '@babel/helper-create-regexp-features-plugin': 7.19.0_@babel+core@7.20.2 - '@babel/helper-plugin-utils': 7.20.2 - dev: true - - /@babel/plugin-transform-new-target/7.18.6: - resolution: {integrity: sha512-DjwFA/9Iu3Z+vrAn+8pBUGcjhxKguSMlsFqeCKbhb9BAV756v0krzVK04CRDi/4aqmk8BsHb4a/gFcaA5joXRw==} + /@babel/plugin-transform-member-expression-literals/7.18.6: + resolution: {integrity: sha512-qSF1ihLGO3q+/g48k85tUjD033C29TNTVB2paCwZPVmOsjn9pClvYYrM2VeJpBY2bcNkuny0YUyTNRyRxJ54KA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -1966,62 +1385,69 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-transform-new-target/7.18.6_@babel+core@7.20.2: - resolution: {integrity: sha512-DjwFA/9Iu3Z+vrAn+8pBUGcjhxKguSMlsFqeCKbhb9BAV756v0krzVK04CRDi/4aqmk8BsHb4a/gFcaA5joXRw==} + /@babel/plugin-transform-modules-amd/7.19.6: + resolution: {integrity: sha512-uG3od2mXvAtIFQIh0xrpLH6r5fpSQN04gIVovl+ODLdUMANokxQLZnPBHcjmv3GxRjnqwLuHvppjjcelqUFZvg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.20.2 + '@babel/helper-module-transforms': 7.20.2 '@babel/helper-plugin-utils': 7.20.2 + transitivePeerDependencies: + - supports-color dev: true - /@babel/plugin-transform-object-super/7.18.6: - resolution: {integrity: sha512-uvGz6zk+pZoS1aTZrOvrbj6Pp/kK2mp45t2B+bTDre2UgsZZ8EZLSJtUg7m/no0zOJUWgFONpB7Zv9W2tSaFlA==} + /@babel/plugin-transform-modules-commonjs/7.19.6: + resolution: {integrity: sha512-8PIa1ym4XRTKuSsOUXqDG0YaOlEuTVvHMe5JCfgBMOtHvJKw/4NGovEGN33viISshG/rZNVrACiBmPQLvWN8xQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: + '@babel/helper-module-transforms': 7.20.2 '@babel/helper-plugin-utils': 7.20.2 - '@babel/helper-replace-supers': 7.19.1 + '@babel/helper-simple-access': 7.20.2 transitivePeerDependencies: - supports-color dev: true - /@babel/plugin-transform-object-super/7.18.6_@babel+core@7.20.2: - resolution: {integrity: sha512-uvGz6zk+pZoS1aTZrOvrbj6Pp/kK2mp45t2B+bTDre2UgsZZ8EZLSJtUg7m/no0zOJUWgFONpB7Zv9W2tSaFlA==} + /@babel/plugin-transform-modules-systemjs/7.19.6: + resolution: {integrity: sha512-fqGLBepcc3kErfR9R3DnVpURmckXP7gj7bAlrTQyBxrigFqszZCkFkcoxzCp2v32XmwXLvbw+8Yq9/b+QqksjQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.20.2 + '@babel/helper-hoist-variables': 7.18.6 + '@babel/helper-module-transforms': 7.20.2 '@babel/helper-plugin-utils': 7.20.2 - '@babel/helper-replace-supers': 7.19.1 + '@babel/helper-validator-identifier': 7.19.1 transitivePeerDependencies: - supports-color dev: true - /@babel/plugin-transform-parameters/7.20.3: - resolution: {integrity: sha512-oZg/Fpx0YDrj13KsLyO8I/CX3Zdw7z0O9qOd95SqcoIzuqy/WTGWvePeHAnZCN54SfdyjHcb1S30gc8zlzlHcA==} + /@babel/plugin-transform-modules-umd/7.18.6: + resolution: {integrity: sha512-dcegErExVeXcRqNtkRU/z8WlBLnvD4MRnHgNs3MytRO1Mn1sHRyhbcpYbVMGclAqOjdW+9cfkdZno9dFdfKLfQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: + '@babel/helper-module-transforms': 7.20.2 '@babel/helper-plugin-utils': 7.20.2 + transitivePeerDependencies: + - supports-color dev: true - /@babel/plugin-transform-parameters/7.20.3_@babel+core@7.20.2: - resolution: {integrity: sha512-oZg/Fpx0YDrj13KsLyO8I/CX3Zdw7z0O9qOd95SqcoIzuqy/WTGWvePeHAnZCN54SfdyjHcb1S30gc8zlzlHcA==} + /@babel/plugin-transform-named-capturing-groups-regex/7.19.1: + resolution: {integrity: sha512-oWk9l9WItWBQYS4FgXD4Uyy5kq898lvkXpXQxoJEY1RnvPk4R/Dvu2ebXU9q8lP+rlMwUQTFf2Ok6d78ODa0kw==} engines: {node: '>=6.9.0'} peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.20.2 + '@babel/helper-create-regexp-features-plugin': 7.19.0 '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-transform-property-literals/7.18.6: - resolution: {integrity: sha512-cYcs6qlgafTud3PAzrrRNbQtfpQ8+y/+M5tKmksS9+M1ckbH6kzY8MrexEM9mcA6JDsukE19iIRvAyYl463sMg==} + /@babel/plugin-transform-new-target/7.18.6: + resolution: {integrity: sha512-DjwFA/9Iu3Z+vrAn+8pBUGcjhxKguSMlsFqeCKbhb9BAV756v0krzVK04CRDi/4aqmk8BsHb4a/gFcaA5joXRw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -2029,53 +1455,52 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-transform-property-literals/7.18.6_@babel+core@7.20.2: - resolution: {integrity: sha512-cYcs6qlgafTud3PAzrrRNbQtfpQ8+y/+M5tKmksS9+M1ckbH6kzY8MrexEM9mcA6JDsukE19iIRvAyYl463sMg==} + /@babel/plugin-transform-object-super/7.18.6: + resolution: {integrity: sha512-uvGz6zk+pZoS1aTZrOvrbj6Pp/kK2mp45t2B+bTDre2UgsZZ8EZLSJtUg7m/no0zOJUWgFONpB7Zv9W2tSaFlA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.20.2 '@babel/helper-plugin-utils': 7.20.2 + '@babel/helper-replace-supers': 7.19.1 + transitivePeerDependencies: + - supports-color dev: true - /@babel/plugin-transform-regenerator/7.18.6: - resolution: {integrity: sha512-poqRI2+qiSdeldcz4wTSTXBRryoq3Gc70ye7m7UD5Ww0nE29IXqMl6r7Nd15WBgRd74vloEMlShtH6CKxVzfmQ==} + /@babel/plugin-transform-parameters/7.20.3: + resolution: {integrity: sha512-oZg/Fpx0YDrj13KsLyO8I/CX3Zdw7z0O9qOd95SqcoIzuqy/WTGWvePeHAnZCN54SfdyjHcb1S30gc8zlzlHcA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: '@babel/helper-plugin-utils': 7.20.2 - regenerator-transform: 0.15.1 dev: true - /@babel/plugin-transform-regenerator/7.18.6_@babel+core@7.20.2: - resolution: {integrity: sha512-poqRI2+qiSdeldcz4wTSTXBRryoq3Gc70ye7m7UD5Ww0nE29IXqMl6r7Nd15WBgRd74vloEMlShtH6CKxVzfmQ==} + /@babel/plugin-transform-property-literals/7.18.6: + resolution: {integrity: sha512-cYcs6qlgafTud3PAzrrRNbQtfpQ8+y/+M5tKmksS9+M1ckbH6kzY8MrexEM9mcA6JDsukE19iIRvAyYl463sMg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.20.2 '@babel/helper-plugin-utils': 7.20.2 - regenerator-transform: 0.15.1 dev: true - /@babel/plugin-transform-reserved-words/7.18.6: - resolution: {integrity: sha512-oX/4MyMoypzHjFrT1CdivfKZ+XvIPMFXwwxHp/r0Ddy2Vuomt4HDFGmft1TAY2yiTKiNSsh3kjBAzcM8kSdsjA==} + /@babel/plugin-transform-regenerator/7.18.6: + resolution: {integrity: sha512-poqRI2+qiSdeldcz4wTSTXBRryoq3Gc70ye7m7UD5Ww0nE29IXqMl6r7Nd15WBgRd74vloEMlShtH6CKxVzfmQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: '@babel/helper-plugin-utils': 7.20.2 + regenerator-transform: 0.15.1 dev: true - /@babel/plugin-transform-reserved-words/7.18.6_@babel+core@7.20.2: + /@babel/plugin-transform-reserved-words/7.18.6: resolution: {integrity: sha512-oX/4MyMoypzHjFrT1CdivfKZ+XvIPMFXwwxHp/r0Ddy2Vuomt4HDFGmft1TAY2yiTKiNSsh3kjBAzcM8kSdsjA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.20.2 '@babel/helper-plugin-utils': 7.20.2 dev: true @@ -2095,23 +1520,6 @@ packages: - supports-color dev: false - /@babel/plugin-transform-runtime/7.19.6_@babel+core@7.20.2: - resolution: {integrity: sha512-PRH37lz4JU156lYFW1p8OxE5i7d6Sl/zV58ooyr+q1J1lnQPyg5tIiXlIwNVhJaY4W3TmOtdc8jqdXQcB1v5Yw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.20.2 - '@babel/helper-module-imports': 7.18.6 - '@babel/helper-plugin-utils': 7.20.2 - babel-plugin-polyfill-corejs2: 0.3.3_@babel+core@7.20.2 - babel-plugin-polyfill-corejs3: 0.6.0_@babel+core@7.20.2 - babel-plugin-polyfill-regenerator: 0.4.1_@babel+core@7.20.2 - semver: 6.3.0 - transitivePeerDependencies: - - supports-color - dev: false - /@babel/plugin-transform-shorthand-properties/7.18.6: resolution: {integrity: sha512-eCLXXJqv8okzg86ywZJbRn19YJHU4XUa55oz2wbHhaQVn/MM+XhukiT7SYqp/7o00dg52Rj51Ny+Ecw4oyoygw==} engines: {node: '>=6.9.0'} @@ -2121,16 +1529,6 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-transform-shorthand-properties/7.18.6_@babel+core@7.20.2: - resolution: {integrity: sha512-eCLXXJqv8okzg86ywZJbRn19YJHU4XUa55oz2wbHhaQVn/MM+XhukiT7SYqp/7o00dg52Rj51Ny+Ecw4oyoygw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.20.2 - '@babel/helper-plugin-utils': 7.20.2 - dev: true - /@babel/plugin-transform-spread/7.19.0: resolution: {integrity: sha512-RsuMk7j6n+r752EtzyScnWkQyuJdli6LdO5Klv8Yx0OfPVTcQkIUfS8clx5e9yHXzlnhOZF3CbQ8C2uP5j074w==} engines: {node: '>=6.9.0'} @@ -2141,17 +1539,6 @@ packages: '@babel/helper-skip-transparent-expression-wrappers': 7.20.0 dev: true - /@babel/plugin-transform-spread/7.19.0_@babel+core@7.20.2: - resolution: {integrity: sha512-RsuMk7j6n+r752EtzyScnWkQyuJdli6LdO5Klv8Yx0OfPVTcQkIUfS8clx5e9yHXzlnhOZF3CbQ8C2uP5j074w==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.20.2 - '@babel/helper-plugin-utils': 7.20.2 - '@babel/helper-skip-transparent-expression-wrappers': 7.20.0 - dev: true - /@babel/plugin-transform-sticky-regex/7.18.6: resolution: {integrity: sha512-kfiDrDQ+PBsQDO85yj1icueWMfGfJFKN1KCkndygtu/C9+XUfydLC8Iv5UYJqRwy4zk8EcplRxEOeLyjq1gm6Q==} engines: {node: '>=6.9.0'} @@ -2161,16 +1548,6 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-transform-sticky-regex/7.18.6_@babel+core@7.20.2: - resolution: {integrity: sha512-kfiDrDQ+PBsQDO85yj1icueWMfGfJFKN1KCkndygtu/C9+XUfydLC8Iv5UYJqRwy4zk8EcplRxEOeLyjq1gm6Q==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.20.2 - '@babel/helper-plugin-utils': 7.20.2 - dev: true - /@babel/plugin-transform-template-literals/7.18.9: resolution: {integrity: sha512-S8cOWfT82gTezpYOiVaGHrCbhlHgKhQt8XH5ES46P2XWmX92yisoZywf5km75wv5sYcXDUCLMmMxOLCtthDgMA==} engines: {node: '>=6.9.0'} @@ -2180,16 +1557,6 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-transform-template-literals/7.18.9_@babel+core@7.20.2: - resolution: {integrity: sha512-S8cOWfT82gTezpYOiVaGHrCbhlHgKhQt8XH5ES46P2XWmX92yisoZywf5km75wv5sYcXDUCLMmMxOLCtthDgMA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.20.2 - '@babel/helper-plugin-utils': 7.20.2 - dev: true - /@babel/plugin-transform-typeof-symbol/7.18.9: resolution: {integrity: sha512-SRfwTtF11G2aemAZWivL7PD+C9z52v9EvMqH9BuYbabyPuKUvSWks3oCg6041pT925L4zVFqaVBeECwsmlguEw==} engines: {node: '>=6.9.0'} @@ -2199,16 +1566,6 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-transform-typeof-symbol/7.18.9_@babel+core@7.20.2: - resolution: {integrity: sha512-SRfwTtF11G2aemAZWivL7PD+C9z52v9EvMqH9BuYbabyPuKUvSWks3oCg6041pT925L4zVFqaVBeECwsmlguEw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.20.2 - '@babel/helper-plugin-utils': 7.20.2 - dev: true - /@babel/plugin-transform-unicode-escapes/7.18.10: resolution: {integrity: sha512-kKAdAI+YzPgGY/ftStBFXTI1LZFju38rYThnfMykS+IXy8BVx+res7s2fxf1l8I35DV2T97ezo6+SGrXz6B3iQ==} engines: {node: '>=6.9.0'} @@ -2218,16 +1575,6 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-transform-unicode-escapes/7.18.10_@babel+core@7.20.2: - resolution: {integrity: sha512-kKAdAI+YzPgGY/ftStBFXTI1LZFju38rYThnfMykS+IXy8BVx+res7s2fxf1l8I35DV2T97ezo6+SGrXz6B3iQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.20.2 - '@babel/helper-plugin-utils': 7.20.2 - dev: true - /@babel/plugin-transform-unicode-regex/7.18.6: resolution: {integrity: sha512-gE7A6Lt7YLnNOL3Pb9BNeZvi+d8l7tcRrG4+pwJjK9hD2xX4mEvjlQW60G9EEmfXVYRPv9VRQcyegIVHCql/AA==} engines: {node: '>=6.9.0'} @@ -2238,17 +1585,6 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-transform-unicode-regex/7.18.6_@babel+core@7.20.2: - resolution: {integrity: sha512-gE7A6Lt7YLnNOL3Pb9BNeZvi+d8l7tcRrG4+pwJjK9hD2xX4mEvjlQW60G9EEmfXVYRPv9VRQcyegIVHCql/AA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.20.2 - '@babel/helper-create-regexp-features-plugin': 7.19.0_@babel+core@7.20.2 - '@babel/helper-plugin-utils': 7.20.2 - dev: true - /@babel/preset-env/7.20.2: resolution: {integrity: sha512-1G0efQEWR1EHkKvKHqbG+IN/QdgwfByUpM5V5QroDzGV2t3S/WXNQd693cHiHTlCFMpr9B6FkPFXDA2lQcKoDg==} engines: {node: '>=6.9.0'} @@ -2334,92 +1670,6 @@ packages: - supports-color dev: true - /@babel/preset-env/7.20.2_@babel+core@7.20.2: - resolution: {integrity: sha512-1G0efQEWR1EHkKvKHqbG+IN/QdgwfByUpM5V5QroDzGV2t3S/WXNQd693cHiHTlCFMpr9B6FkPFXDA2lQcKoDg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/compat-data': 7.20.1 - '@babel/core': 7.20.2 - '@babel/helper-compilation-targets': 7.20.0_@babel+core@7.20.2 - '@babel/helper-plugin-utils': 7.20.2 - '@babel/helper-validator-option': 7.18.6 - '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.18.6_@babel+core@7.20.2 - '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.18.9_@babel+core@7.20.2 - '@babel/plugin-proposal-async-generator-functions': 7.20.1_@babel+core@7.20.2 - '@babel/plugin-proposal-class-properties': 7.18.6_@babel+core@7.20.2 - '@babel/plugin-proposal-class-static-block': 7.18.6_@babel+core@7.20.2 - '@babel/plugin-proposal-dynamic-import': 7.18.6_@babel+core@7.20.2 - '@babel/plugin-proposal-export-namespace-from': 7.18.9_@babel+core@7.20.2 - '@babel/plugin-proposal-json-strings': 7.18.6_@babel+core@7.20.2 - '@babel/plugin-proposal-logical-assignment-operators': 7.18.9_@babel+core@7.20.2 - '@babel/plugin-proposal-nullish-coalescing-operator': 7.18.6_@babel+core@7.20.2 - '@babel/plugin-proposal-numeric-separator': 7.18.6_@babel+core@7.20.2 - '@babel/plugin-proposal-object-rest-spread': 7.20.2_@babel+core@7.20.2 - '@babel/plugin-proposal-optional-catch-binding': 7.18.6_@babel+core@7.20.2 - '@babel/plugin-proposal-optional-chaining': 7.18.9_@babel+core@7.20.2 - '@babel/plugin-proposal-private-methods': 7.18.6_@babel+core@7.20.2 - '@babel/plugin-proposal-private-property-in-object': 7.18.6_@babel+core@7.20.2 - '@babel/plugin-proposal-unicode-property-regex': 7.18.6_@babel+core@7.20.2 - '@babel/plugin-syntax-async-generators': 7.8.4_@babel+core@7.20.2 - '@babel/plugin-syntax-class-properties': 7.12.13_@babel+core@7.20.2 - '@babel/plugin-syntax-class-static-block': 7.14.5_@babel+core@7.20.2 - '@babel/plugin-syntax-dynamic-import': 7.8.3_@babel+core@7.20.2 - '@babel/plugin-syntax-export-namespace-from': 7.8.3_@babel+core@7.20.2 - '@babel/plugin-syntax-import-assertions': 7.20.0_@babel+core@7.20.2 - '@babel/plugin-syntax-json-strings': 7.8.3_@babel+core@7.20.2 - '@babel/plugin-syntax-logical-assignment-operators': 7.10.4_@babel+core@7.20.2 - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3_@babel+core@7.20.2 - '@babel/plugin-syntax-numeric-separator': 7.10.4_@babel+core@7.20.2 - '@babel/plugin-syntax-object-rest-spread': 7.8.3_@babel+core@7.20.2 - '@babel/plugin-syntax-optional-catch-binding': 7.8.3_@babel+core@7.20.2 - '@babel/plugin-syntax-optional-chaining': 7.8.3_@babel+core@7.20.2 - '@babel/plugin-syntax-private-property-in-object': 7.14.5_@babel+core@7.20.2 - '@babel/plugin-syntax-top-level-await': 7.14.5_@babel+core@7.20.2 - '@babel/plugin-transform-arrow-functions': 7.18.6_@babel+core@7.20.2 - '@babel/plugin-transform-async-to-generator': 7.18.6_@babel+core@7.20.2 - '@babel/plugin-transform-block-scoped-functions': 7.18.6_@babel+core@7.20.2 - '@babel/plugin-transform-block-scoping': 7.20.2_@babel+core@7.20.2 - '@babel/plugin-transform-classes': 7.20.2_@babel+core@7.20.2 - '@babel/plugin-transform-computed-properties': 7.18.9_@babel+core@7.20.2 - '@babel/plugin-transform-destructuring': 7.20.2_@babel+core@7.20.2 - '@babel/plugin-transform-dotall-regex': 7.18.6_@babel+core@7.20.2 - '@babel/plugin-transform-duplicate-keys': 7.18.9_@babel+core@7.20.2 - '@babel/plugin-transform-exponentiation-operator': 7.18.6_@babel+core@7.20.2 - '@babel/plugin-transform-for-of': 7.18.8_@babel+core@7.20.2 - '@babel/plugin-transform-function-name': 7.18.9_@babel+core@7.20.2 - '@babel/plugin-transform-literals': 7.18.9_@babel+core@7.20.2 - '@babel/plugin-transform-member-expression-literals': 7.18.6_@babel+core@7.20.2 - '@babel/plugin-transform-modules-amd': 7.19.6_@babel+core@7.20.2 - '@babel/plugin-transform-modules-commonjs': 7.19.6_@babel+core@7.20.2 - '@babel/plugin-transform-modules-systemjs': 7.19.6_@babel+core@7.20.2 - '@babel/plugin-transform-modules-umd': 7.18.6_@babel+core@7.20.2 - '@babel/plugin-transform-named-capturing-groups-regex': 7.19.1_@babel+core@7.20.2 - '@babel/plugin-transform-new-target': 7.18.6_@babel+core@7.20.2 - '@babel/plugin-transform-object-super': 7.18.6_@babel+core@7.20.2 - '@babel/plugin-transform-parameters': 7.20.3_@babel+core@7.20.2 - '@babel/plugin-transform-property-literals': 7.18.6_@babel+core@7.20.2 - '@babel/plugin-transform-regenerator': 7.18.6_@babel+core@7.20.2 - '@babel/plugin-transform-reserved-words': 7.18.6_@babel+core@7.20.2 - '@babel/plugin-transform-shorthand-properties': 7.18.6_@babel+core@7.20.2 - '@babel/plugin-transform-spread': 7.19.0_@babel+core@7.20.2 - '@babel/plugin-transform-sticky-regex': 7.18.6_@babel+core@7.20.2 - '@babel/plugin-transform-template-literals': 7.18.9_@babel+core@7.20.2 - '@babel/plugin-transform-typeof-symbol': 7.18.9_@babel+core@7.20.2 - '@babel/plugin-transform-unicode-escapes': 7.18.10_@babel+core@7.20.2 - '@babel/plugin-transform-unicode-regex': 7.18.6_@babel+core@7.20.2 - '@babel/preset-modules': 0.1.5_@babel+core@7.20.2 - '@babel/types': 7.20.2 - babel-plugin-polyfill-corejs2: 0.3.3_@babel+core@7.20.2 - babel-plugin-polyfill-corejs3: 0.6.0_@babel+core@7.20.2 - babel-plugin-polyfill-regenerator: 0.4.1_@babel+core@7.20.2 - core-js-compat: 3.26.1 - semver: 6.3.0 - transitivePeerDependencies: - - supports-color - dev: true - /@babel/preset-modules/0.1.5: resolution: {integrity: sha512-A57th6YRG7oR3cq/yt/Y84MvGgE0eJG2F1JLhKuyG+jFxEgrd/HAMJatiFtmOiZurz+0DkrvbheCLaV5f2JfjA==} peerDependencies: @@ -2432,19 +1682,6 @@ packages: esutils: 2.0.3 dev: true - /@babel/preset-modules/0.1.5_@babel+core@7.20.2: - resolution: {integrity: sha512-A57th6YRG7oR3cq/yt/Y84MvGgE0eJG2F1JLhKuyG+jFxEgrd/HAMJatiFtmOiZurz+0DkrvbheCLaV5f2JfjA==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.20.2 - '@babel/helper-plugin-utils': 7.20.2 - '@babel/plugin-proposal-unicode-property-regex': 7.18.6_@babel+core@7.20.2 - '@babel/plugin-transform-dotall-regex': 7.18.6_@babel+core@7.20.2 - '@babel/types': 7.20.2 - esutils: 2.0.3 - dev: true - /@babel/runtime/7.20.13: resolution: {integrity: sha512-gt3PKXs0DBoL9xCvOIIZ2NEqAGZqHjAnmVbfQtB620V0uReIQutpel14KcneZuer7UioY8ALKZ7iocavvzTNFA==} engines: {node: '>=6.9.0'} @@ -2465,6 +1702,7 @@ packages: '@babel/code-frame': 7.18.6 '@babel/parser': 7.20.3 '@babel/types': 7.20.2 + dev: true /@babel/traverse/7.20.1: resolution: {integrity: sha512-d3tN8fkVJwFLkHkBN479SOsw4DMZnz8cdbL/gvuDuzy3TS6Nfw80HuQqhw1pITbIruHyh7d1fMA47kWzmcUEGA==} @@ -2482,6 +1720,7 @@ packages: globals: 11.12.0 transitivePeerDependencies: - supports-color + dev: true /@babel/types/7.20.2: resolution: {integrity: sha512-FnnvsNWgZCr232sqtXggapvlkk/tuwR/qhGzcmxI0GXLCjmPYQPzio2FbdlWuY6y1sHFfQKk+rRbUZ9VStQMog==} @@ -2491,6 +1730,15 @@ packages: '@babel/helper-validator-identifier': 7.19.1 to-fast-properties: 2.0.0 + /@babel/types/7.21.2: + resolution: {integrity: sha512-3wRZSs7jiFaB8AjxiiD+VqN5DTG2iRvJGQ+qYFrs/654lg6kGTQWIOFjlBo5RaXuAZjBmP3+OQH4dmhqiiyYxw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-string-parser': 7.19.4 + '@babel/helper-validator-identifier': 7.19.1 + to-fast-properties: 2.0.0 + dev: true + /@bcoe/v8-coverage/0.2.3: resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} dev: true @@ -2524,35 +1772,6 @@ packages: - utf-8-validate dev: false - /@coinbase/wallet-sdk/3.6.3_@babel+core@7.20.2: - resolution: {integrity: sha512-XUR4poOJE+dKzwBTdlM693CdLFitr046oZOVY3iDnbFcRrrQswhbDji7q4CmUcD4HxbfViX7PFoIwl79YQcukg==} - engines: {node: '>= 10.0.0'} - dependencies: - '@metamask/safe-event-emitter': 2.0.0 - '@solana/web3.js': 1.70.3 - bind-decorator: 1.0.11 - bn.js: 5.2.1 - buffer: 6.0.3 - clsx: 1.2.1 - eth-block-tracker: 4.4.3_@babel+core@7.20.2 - eth-json-rpc-filters: 4.2.2 - eth-rpc-errors: 4.0.2 - json-rpc-engine: 6.1.0 - keccak: 3.0.2 - preact: 10.11.3 - qs: 6.11.0 - rxjs: 6.6.7 - sha.js: 2.4.11 - stream-browserify: 3.0.0 - util: 0.12.5 - transitivePeerDependencies: - - '@babel/core' - - bufferutil - - encoding - - supports-color - - utf-8-validate - dev: false - /@colors/colors/1.5.0: resolution: {integrity: sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==} engines: {node: '>=0.1.90'} @@ -2567,7 +1786,7 @@ packages: '@jridgewell/trace-mapping': 0.3.9 dev: true - /@defi-wonderland/smock/2.3.4_d44p6lx7t3c2oeudc2zxbd5d54: + /@defi-wonderland/smock/2.3.4_u3rpjeimcwsavv62fpribvk5fm: resolution: {integrity: sha512-VYJbsoCOdFRyGkAwvaQhQRrU6V8AjK3five8xdbo41DEE9n3qXzUNBUxyD9HhXB/dWWPFWT21IGw5Ztl6Qw3Ew==} peerDependencies: '@ethersproject/abi': ^5 @@ -2577,19 +1796,16 @@ packages: ethers: ^5 hardhat: ^2 dependencies: - '@ethersproject/abi': 5.7.0 - '@ethersproject/abstract-provider': 5.7.0 - '@ethersproject/abstract-signer': 5.7.0 '@nomicfoundation/ethereumjs-evm': 1.0.0 '@nomicfoundation/ethereumjs-util': 8.0.0 '@nomicfoundation/ethereumjs-vm': 6.0.0 - '@nomiclabs/hardhat-ethers': 2.2.1_3uaf6nt3qt6cyh5fx3fc5i4mn4 + '@nomiclabs/hardhat-ethers': 2.2.2_wknqauzjtp3mhprkntsmqpccee diff: 5.1.0 ethers: 5.7.2 - hardhat: 2.12.2_2dtigtkb225m7ii7q45utxqwgi + hardhat: 2.13.0_6qtx7vkbdhwvdm4crzlegk4mvi lodash.isequal: 4.5.0 lodash.isequalwith: 4.4.0 - rxjs: 7.5.7 + rxjs: 7.8.0 semver: 7.3.8 transitivePeerDependencies: - supports-color @@ -2603,7 +1819,7 @@ packages: eth-ens-namehash: 2.0.8 solc: 0.4.26 testrpc: 0.0.1 - web3-utils: 1.8.1 + web3-utils: 1.8.2 dev: true /@ensdomains/resolver/0.2.4: @@ -2636,7 +1852,7 @@ packages: ajv: 6.12.6 debug: 4.3.4 espree: 7.3.1 - globals: 13.18.0 + globals: 13.20.0 ignore: 4.0.6 import-fresh: 3.3.0 js-yaml: 3.14.1 @@ -2659,7 +1875,7 @@ packages: - utf-8-validate dev: true - /@ethereum-waffle/compiler/3.4.4_typescript@4.9.3: + /@ethereum-waffle/compiler/3.4.4_typescript@4.9.5: resolution: {integrity: sha512-RUK3axJ8IkD5xpWjWoJgyHclOeEzDLQFga6gKpeGxiS/zBu+HB0W2FvsrrLalTFIaPw/CGYACRBSIxqiCqwqTQ==} engines: {node: '>=10.0'} dependencies: @@ -2670,10 +1886,10 @@ packages: '@types/node-fetch': 2.6.2 ethers: 5.7.2 mkdirp: 0.5.6 - node-fetch: 2.6.7 + node-fetch: 2.6.9 solc: 0.6.12 ts-generator: 0.1.1 - typechain: 3.0.0_typescript@4.9.3 + typechain: 3.0.0_typescript@4.9.5 transitivePeerDependencies: - bufferutil - encoding @@ -2712,7 +1928,7 @@ packages: '@ethereum-waffle/ens': 3.4.4 ethers: 5.7.2 ganache-core: 2.13.2 - patch-package: 6.5.0 + patch-package: 6.5.1 postinstall-postinstall: 2.1.0 transitivePeerDependencies: - bufferutil @@ -3066,6 +2282,39 @@ packages: tslib: 2.5.0 dev: false + /@foundry-rs/easy-foundryup/0.1.3: + resolution: {integrity: sha512-Funb4hrSBeikKCmccFT/d3Ud5o92tlIZHTJeMCVk5b54/+CHZHr4g7MmtvO5xrGhxrOebQ0L+ojIj+VixgW7ug==} + dependencies: + command-exists: 1.2.9 + ts-interface-checker: 0.1.13 + dev: true + + /@foundry-rs/hardhat-forge/0.1.17_fwz6j6oy647sr4tch7c5jpqkoq: + resolution: {integrity: sha512-2wxzxA12CQmT11PH/KigyVTNm/4vzsVtzVZow6gwCbC41fTyf73a5qbggHZFRR74JXfmvVSkX1BJitTmdzQvxw==} + peerDependencies: + '@nomiclabs/hardhat-ethers': ^2.0.0 + ethereum-waffle: ^3.2.0 + ethers: ^5.0.0 + hardhat: ^2.0.0 + dependencies: + '@foundry-rs/easy-foundryup': 0.1.3 + '@nomiclabs/hardhat-ethers': 2.2.2_wknqauzjtp3mhprkntsmqpccee + '@nomiclabs/hardhat-waffle': 2.0.5_fwz6j6oy647sr4tch7c5jpqkoq + '@types/sinon-chai': 3.2.9 + '@types/web3': 1.0.19 + camelcase-keys: 7.0.2 + debug: 4.3.4 + ethereum-waffle: 3.4.4_typescript@4.9.5 + ethers: 5.7.2 + fs-extra: 10.1.0 + glob: 7.2.3 + hardhat: 2.13.0_6qtx7vkbdhwvdm4crzlegk4mvi + true-case-path: 2.2.1 + ts-interface-checker: 0.1.13 + transitivePeerDependencies: + - supports-color + dev: true + /@gar/promisify/1.1.3: resolution: {integrity: sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==} dev: true @@ -3087,13 +2336,13 @@ packages: dependencies: '@gnosis.pm/mock-contract': 4.0.0 '@gnosis.pm/safe-contracts': 1.3.0_ethers@5.7.2 - '@openzeppelin/contracts': 4.8.0 - '@openzeppelin/contracts-upgradeable': 4.8.0 + '@openzeppelin/contracts': 4.8.2 + '@openzeppelin/contracts-upgradeable': 4.8.2 argv: 0.0.2 dotenv: 16.0.3 ethers: 5.7.2 - solc: 0.8.17 - yargs: 17.6.2 + solc: 0.8.19 + yargs: 17.7.1 transitivePeerDependencies: - bufferutil - debug @@ -3348,6 +2597,7 @@ packages: dependencies: '@jridgewell/set-array': 1.1.2 '@jridgewell/sourcemap-codec': 1.4.14 + dev: true /@jridgewell/gen-mapping/0.3.2: resolution: {integrity: sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==} @@ -3356,14 +2606,17 @@ packages: '@jridgewell/set-array': 1.1.2 '@jridgewell/sourcemap-codec': 1.4.14 '@jridgewell/trace-mapping': 0.3.17 + dev: true /@jridgewell/resolve-uri/3.1.0: resolution: {integrity: sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==} engines: {node: '>=6.0.0'} + dev: true /@jridgewell/set-array/1.1.2: resolution: {integrity: sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==} engines: {node: '>=6.0.0'} + dev: true /@jridgewell/source-map/0.3.2: resolution: {integrity: sha512-m7O9o2uR8k2ObDysZYzdfhb08VuEml5oWGiosa1VdaPZ/A6QyPkAJuwN0Q1lhULOf6B7MtQmHENS743hWtCrgw==} @@ -3374,12 +2627,14 @@ packages: /@jridgewell/sourcemap-codec/1.4.14: resolution: {integrity: sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==} + dev: true /@jridgewell/trace-mapping/0.3.17: resolution: {integrity: sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==} dependencies: '@jridgewell/resolve-uri': 3.1.0 '@jridgewell/sourcemap-codec': 1.4.14 + dev: true /@jridgewell/trace-mapping/0.3.9: resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} @@ -3719,9 +2974,19 @@ packages: /@noble/hashes/1.1.2: resolution: {integrity: sha512-KYRCASVTv6aeUi1tsF8/vpyR7zpfs3FUzy2Jqm+MU+LmUKhQ0y2FpfwqkCcxSg2ua4GALJd8k2R76WxwZGbQpA==} + dev: false + + /@noble/hashes/1.2.0: + resolution: {integrity: sha512-FZfhjEDbT5GRswV3C6uvLPHMiVD6lQBmpoX5+eSiPaMTXte/IKqI5dykDxzZB/WBeK/CDuQRBWarPdi3FNY2zQ==} + dev: true /@noble/secp256k1/1.6.3: resolution: {integrity: sha512-T04e4iTurVy7I8Sw4+c5OSN9/RkPlo1uKxAomtxQNLq8j1uPAqnsqG1bqvY3Jv7c13gyr6dui0zmh/I3+f/JaQ==} + dev: false + + /@noble/secp256k1/1.7.1: + resolution: {integrity: sha512-hOUk6AyBFmqVrv7k5WAw/LpszxVbj9gGN4JRkIX52fdFAj1UA61KXmZDvqVEm+pOyec3+fIeZB02LYa/pWOArw==} + dev: true /@nodelib/fs.scandir/2.1.5: resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} @@ -3791,7 +3056,7 @@ packages: '@nomicfoundation/ethereumjs-rlp': 4.0.0 '@nomicfoundation/ethereumjs-util': 8.0.0 abstract-level: 1.0.3 - bigint-crypto-utils: 3.1.7 + bigint-crypto-utils: 3.1.8 ethereum-cryptography: 0.1.3 dev: true @@ -3838,7 +3103,7 @@ packages: '@nomicfoundation/ethereumjs-rlp': 4.0.0 '@nomicfoundation/ethereumjs-util': 8.0.0 ethereum-cryptography: 0.1.3 - readable-stream: 3.6.0 + readable-stream: 3.6.2 dev: true /@nomicfoundation/ethereumjs-tx/4.0.0: @@ -3883,17 +3148,17 @@ packages: - supports-color dev: true - /@nomicfoundation/hardhat-network-helpers/1.0.6_hardhat@2.12.2: - resolution: {integrity: sha512-a35iVD4ycF6AoTfllAnKm96IPIzzHpgKX/ep4oKc2bsUKFfMlacWdyntgC/7d5blyCTXfFssgNAvXDZfzNWVGQ==} + /@nomicfoundation/hardhat-network-helpers/1.0.8_hardhat@2.13.0: + resolution: {integrity: sha512-MNqQbzUJZnCMIYvlniC3U+kcavz/PhhQSsY90tbEtUyMj/IQqsLwIRZa4ctjABh3Bz0KCh9OXUZ7Yk/d9hr45Q==} peerDependencies: hardhat: ^2.9.5 dependencies: ethereumjs-util: 7.1.5 - hardhat: 2.12.2_2dtigtkb225m7ii7q45utxqwgi + hardhat: 2.13.0_6qtx7vkbdhwvdm4crzlegk4mvi dev: true - /@nomicfoundation/solidity-analyzer-darwin-arm64/0.1.0: - resolution: {integrity: sha512-vEF3yKuuzfMHsZecHQcnkUrqm8mnTWfJeEVFHpg+cO+le96xQA4lAJYdUan8pXZohQxv1fSReQsn4QGNuBNuCw==} + /@nomicfoundation/solidity-analyzer-darwin-arm64/0.1.1: + resolution: {integrity: sha512-KcTodaQw8ivDZyF+D76FokN/HdpgGpfjc/gFCImdLUyqB6eSWVaZPazMbeAjmfhx3R0zm/NYVzxwAokFKgrc0w==} engines: {node: '>= 10'} cpu: [arm64] os: [darwin] @@ -3901,8 +3166,8 @@ packages: dev: true optional: true - /@nomicfoundation/solidity-analyzer-darwin-x64/0.1.0: - resolution: {integrity: sha512-dlHeIg0pTL4dB1l9JDwbi/JG6dHQaU1xpDK+ugYO8eJ1kxx9Dh2isEUtA4d02cQAl22cjOHTvifAk96A+ItEHA==} + /@nomicfoundation/solidity-analyzer-darwin-x64/0.1.1: + resolution: {integrity: sha512-XhQG4BaJE6cIbjAVtzGOGbK3sn1BO9W29uhk9J8y8fZF1DYz0Doj8QDMfpMu+A6TjPDs61lbsmeYodIDnfveSA==} engines: {node: '>= 10'} cpu: [x64] os: [darwin] @@ -3910,8 +3175,8 @@ packages: dev: true optional: true - /@nomicfoundation/solidity-analyzer-freebsd-x64/0.1.0: - resolution: {integrity: sha512-WFCZYMv86WowDA4GiJKnebMQRt3kCcFqHeIomW6NMyqiKqhK1kIZCxSLDYsxqlx396kKLPN1713Q1S8tu68GKg==} + /@nomicfoundation/solidity-analyzer-freebsd-x64/0.1.1: + resolution: {integrity: sha512-GHF1VKRdHW3G8CndkwdaeLkVBi5A9u2jwtlS7SLhBc8b5U/GcoL39Q+1CSO3hYqePNP+eV5YI7Zgm0ea6kMHoA==} engines: {node: '>= 10'} cpu: [x64] os: [freebsd] @@ -3919,48 +3184,44 @@ packages: dev: true optional: true - /@nomicfoundation/solidity-analyzer-linux-arm64-gnu/0.1.0: - resolution: {integrity: sha512-DTw6MNQWWlCgc71Pq7CEhEqkb7fZnS7oly13pujs4cMH1sR0JzNk90Mp1zpSCsCs4oKan2ClhMlLKtNat/XRKQ==} + /@nomicfoundation/solidity-analyzer-linux-arm64-gnu/0.1.1: + resolution: {integrity: sha512-g4Cv2fO37ZsUENQ2vwPnZc2zRenHyAxHcyBjKcjaSmmkKrFr64yvzeNO8S3GBFCo90rfochLs99wFVGT/0owpg==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] - libc: [glibc] requiresBuild: true dev: true optional: true - /@nomicfoundation/solidity-analyzer-linux-arm64-musl/0.1.0: - resolution: {integrity: sha512-wUpUnR/3GV5Da88MhrxXh/lhb9kxh9V3Jya2NpBEhKDIRCDmtXMSqPMXHZmOR9DfCwCvG6vLFPr/+YrPCnUN0w==} + /@nomicfoundation/solidity-analyzer-linux-arm64-musl/0.1.1: + resolution: {integrity: sha512-WJ3CE5Oek25OGE3WwzK7oaopY8xMw9Lhb0mlYuJl/maZVo+WtP36XoQTb7bW/i8aAdHW5Z+BqrHMux23pvxG3w==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] - libc: [musl] requiresBuild: true dev: true optional: true - /@nomicfoundation/solidity-analyzer-linux-x64-gnu/0.1.0: - resolution: {integrity: sha512-lR0AxK1x/MeKQ/3Pt923kPvwigmGX3OxeU5qNtQ9pj9iucgk4PzhbS3ruUeSpYhUxG50jN4RkIGwUMoev5lguw==} + /@nomicfoundation/solidity-analyzer-linux-x64-gnu/0.1.1: + resolution: {integrity: sha512-5WN7leSr5fkUBBjE4f3wKENUy9HQStu7HmWqbtknfXkkil+eNWiBV275IOlpXku7v3uLsXTOKpnnGHJYI2qsdA==} engines: {node: '>= 10'} cpu: [x64] os: [linux] - libc: [glibc] requiresBuild: true dev: true optional: true - /@nomicfoundation/solidity-analyzer-linux-x64-musl/0.1.0: - resolution: {integrity: sha512-A1he/8gy/JeBD3FKvmI6WUJrGrI5uWJNr5Xb9WdV+DK0F8msuOqpEByLlnTdLkXMwW7nSl3awvLezOs9xBHJEg==} + /@nomicfoundation/solidity-analyzer-linux-x64-musl/0.1.1: + resolution: {integrity: sha512-KdYMkJOq0SYPQMmErv/63CwGwMm5XHenEna9X9aB8mQmhDBrYrlAOSsIPgFCUSL0hjxE3xHP65/EPXR/InD2+w==} engines: {node: '>= 10'} cpu: [x64] os: [linux] - libc: [musl] requiresBuild: true dev: true optional: true - /@nomicfoundation/solidity-analyzer-win32-arm64-msvc/0.1.0: - resolution: {integrity: sha512-7x5SXZ9R9H4SluJZZP8XPN+ju7Mx+XeUMWZw7ZAqkdhP5mK19I4vz3x0zIWygmfE8RT7uQ5xMap0/9NPsO+ykw==} + /@nomicfoundation/solidity-analyzer-win32-arm64-msvc/0.1.1: + resolution: {integrity: sha512-VFZASBfl4qiBYwW5xeY20exWhmv6ww9sWu/krWSesv3q5hA0o1JuzmPHR4LPN6SUZj5vcqci0O6JOL8BPw+APg==} engines: {node: '>= 10'} cpu: [arm64] os: [win32] @@ -3968,8 +3229,8 @@ packages: dev: true optional: true - /@nomicfoundation/solidity-analyzer-win32-ia32-msvc/0.1.0: - resolution: {integrity: sha512-m7w3xf+hnE774YRXu+2mGV7RiF3QJtUoiYU61FascCkQhX3QMQavh7saH/vzb2jN5D24nT/jwvaHYX/MAM9zUw==} + /@nomicfoundation/solidity-analyzer-win32-ia32-msvc/0.1.1: + resolution: {integrity: sha512-JnFkYuyCSA70j6Si6cS1A9Gh1aHTEb8kOTBApp/c7NRTFGNMH8eaInKlyuuiIbvYFhlXW4LicqyYuWNNq9hkpQ==} engines: {node: '>= 10'} cpu: [ia32] os: [win32] @@ -3977,8 +3238,8 @@ packages: dev: true optional: true - /@nomicfoundation/solidity-analyzer-win32-x64-msvc/0.1.0: - resolution: {integrity: sha512-xCuybjY0sLJQnJhupiFAXaek2EqF0AP0eBjgzaalPXSNvCEN6ZYHvUzdA50ENDVeSYFXcUsYf3+FsD3XKaeptA==} + /@nomicfoundation/solidity-analyzer-win32-x64-msvc/0.1.1: + resolution: {integrity: sha512-HrVJr6+WjIXGnw3Q9u6KQcbZCtk0caVWhCdFADySvRyUxJ8PnzlaP+MhwNE8oyT8OZ6ejHBRrrgjSqDCFXGirw==} engines: {node: '>= 10'} cpu: [x64] os: [win32] @@ -3986,66 +3247,64 @@ packages: dev: true optional: true - /@nomicfoundation/solidity-analyzer/0.1.0: - resolution: {integrity: sha512-xGWAiVCGOycvGiP/qrlf9f9eOn7fpNbyJygcB0P21a1MDuVPlKt0Srp7rvtBEutYQ48ouYnRXm33zlRnlTOPHg==} + /@nomicfoundation/solidity-analyzer/0.1.1: + resolution: {integrity: sha512-1LMtXj1puAxyFusBgUIy5pZk3073cNXYnXUpuNKFghHbIit/xZgbk0AokpUADbNm3gyD6bFWl3LRFh3dhVdREg==} engines: {node: '>= 12'} optionalDependencies: - '@nomicfoundation/solidity-analyzer-darwin-arm64': 0.1.0 - '@nomicfoundation/solidity-analyzer-darwin-x64': 0.1.0 - '@nomicfoundation/solidity-analyzer-freebsd-x64': 0.1.0 - '@nomicfoundation/solidity-analyzer-linux-arm64-gnu': 0.1.0 - '@nomicfoundation/solidity-analyzer-linux-arm64-musl': 0.1.0 - '@nomicfoundation/solidity-analyzer-linux-x64-gnu': 0.1.0 - '@nomicfoundation/solidity-analyzer-linux-x64-musl': 0.1.0 - '@nomicfoundation/solidity-analyzer-win32-arm64-msvc': 0.1.0 - '@nomicfoundation/solidity-analyzer-win32-ia32-msvc': 0.1.0 - '@nomicfoundation/solidity-analyzer-win32-x64-msvc': 0.1.0 + '@nomicfoundation/solidity-analyzer-darwin-arm64': 0.1.1 + '@nomicfoundation/solidity-analyzer-darwin-x64': 0.1.1 + '@nomicfoundation/solidity-analyzer-freebsd-x64': 0.1.1 + '@nomicfoundation/solidity-analyzer-linux-arm64-gnu': 0.1.1 + '@nomicfoundation/solidity-analyzer-linux-arm64-musl': 0.1.1 + '@nomicfoundation/solidity-analyzer-linux-x64-gnu': 0.1.1 + '@nomicfoundation/solidity-analyzer-linux-x64-musl': 0.1.1 + '@nomicfoundation/solidity-analyzer-win32-arm64-msvc': 0.1.1 + '@nomicfoundation/solidity-analyzer-win32-ia32-msvc': 0.1.1 + '@nomicfoundation/solidity-analyzer-win32-x64-msvc': 0.1.1 dev: true - /@nomiclabs/hardhat-ethers/2.2.1_3uaf6nt3qt6cyh5fx3fc5i4mn4: - resolution: {integrity: sha512-RHWYwnxryWR8hzRmU4Jm/q4gzvXpetUOJ4OPlwH2YARcDB+j79+yAYCwO0lN1SUOb4++oOTJEe6AWLEc42LIvg==} + /@nomiclabs/hardhat-ethers/2.2.2_wknqauzjtp3mhprkntsmqpccee: + resolution: {integrity: sha512-NLDlDFL2us07C0jB/9wzvR0kuLivChJWCXTKcj3yqjZqMoYp7g7wwS157F70VHx/+9gHIBGzak5pKDwG8gEefA==} peerDependencies: ethers: ^5.0.0 hardhat: ^2.0.0 dependencies: ethers: 5.7.2 - hardhat: 2.12.2_2dtigtkb225m7ii7q45utxqwgi + hardhat: 2.13.0_6qtx7vkbdhwvdm4crzlegk4mvi dev: true - /@nomiclabs/hardhat-etherscan/3.1.2_hardhat@2.12.2: - resolution: {integrity: sha512-IEikeOVq0C/7CY6aD74d8L4BpGoc/FNiN6ldiPVg0QIFIUSu4FSGA1dmtJZJKk1tjpwgrfTLQNWnigtEaN9REg==} + /@nomiclabs/hardhat-etherscan/3.1.7_hardhat@2.13.0: + resolution: {integrity: sha512-tZ3TvSgpvsQ6B6OGmo1/Au6u8BrAkvs1mIC/eURA3xgIfznUZBhmpne8hv7BXUzw9xNL3fXdpOYgOQlVMTcoHQ==} peerDependencies: hardhat: ^2.0.4 dependencies: '@ethersproject/abi': 5.7.0 '@ethersproject/address': 5.7.0 - cbor: 5.2.0 + cbor: 8.1.0 chalk: 2.4.2 debug: 4.3.4 fs-extra: 7.0.1 - hardhat: 2.12.2_2dtigtkb225m7ii7q45utxqwgi + hardhat: 2.13.0_6qtx7vkbdhwvdm4crzlegk4mvi lodash: 4.17.21 semver: 6.3.0 table: 6.8.1 - undici: 5.12.0 + undici: 5.20.0 transitivePeerDependencies: - supports-color dev: true - /@nomiclabs/hardhat-waffle/2.0.3_wzgqb2xh4egjkdzuv52bfmbi24: - resolution: {integrity: sha512-049PHSnI1CZq6+XTbrMbMv5NaL7cednTfPenx02k3cEh8wBMLa6ys++dBETJa6JjfwgA9nBhhHQ173LJv6k2Pg==} + /@nomiclabs/hardhat-waffle/2.0.5_fwz6j6oy647sr4tch7c5jpqkoq: + resolution: {integrity: sha512-U1RH9OQ1mWYQfb+moX5aTgGjpVVlOcpiFI47wwnaGG4kLhcTy90cNiapoqZenxcRAITVbr0/+QSduINL5EsUIQ==} peerDependencies: '@nomiclabs/hardhat-ethers': ^2.0.0 - ethereum-waffle: ^3.2.0 + ethereum-waffle: '*' ethers: ^5.0.0 hardhat: ^2.0.0 dependencies: - '@nomiclabs/hardhat-ethers': 2.2.1_3uaf6nt3qt6cyh5fx3fc5i4mn4 - '@types/sinon-chai': 3.2.9 - '@types/web3': 1.0.19 - ethereum-waffle: 3.4.4_typescript@4.9.3 + '@nomiclabs/hardhat-ethers': 2.2.2_wknqauzjtp3mhprkntsmqpccee + ethereum-waffle: 3.4.4_typescript@4.9.5 ethers: 5.7.2 - hardhat: 2.12.2_2dtigtkb225m7ii7q45utxqwgi + hardhat: 2.13.0_6qtx7vkbdhwvdm4crzlegk4mvi dev: true /@npmcli/fs/1.1.1: @@ -4064,16 +3323,16 @@ packages: rimraf: 3.0.2 dev: true - /@openzeppelin/contracts-upgradeable/4.8.0: - resolution: {integrity: sha512-5GeFgqMiDlqGT8EdORadp1ntGF0qzWZLmEY7Wbp/yVhN7/B3NNzCxujuI77ktlyG81N3CUZP8cZe3ZAQ/cW10w==} + /@openzeppelin/contracts-upgradeable/4.8.2: + resolution: {integrity: sha512-zIggnBwemUmmt9IS73qxi+tumALxCY4QEs3zLCII78k0Gfse2hAOdAkuAeLUzvWUpneMUfFE5sGHzEUSTvn4Ag==} dev: false - /@openzeppelin/contracts/4.8.0: - resolution: {integrity: sha512-AGuwhRRL+NaKx73WKRNzeCxOCOCxpaqF+kp8TJ89QzAipSwZy/NoflkWaL9bywXFRhIzXt8j38sfF7KBKCPWLw==} + /@openzeppelin/contracts/4.8.2: + resolution: {integrity: sha512-kEUOgPQszC0fSYWpbh2kT94ltOJwj1qfT2DWo+zVttmGmf97JZ99LspePNaeeaLhCImaHVeBbjaQFZQn7+Zc5g==} dev: false - /@openzeppelin/hardhat-upgrades/1.21.0_43thxqwvphwusq7frx7sx2tjf4: - resolution: {integrity: sha512-Kwl7IN0Hlhj4HluMTTl0DrtU90OI/Q6rG3sAyd2pv3fababe9EuZqs9DydOlkWM45JwTzC+eBzX3TgHsqI13eA==} + /@openzeppelin/hardhat-upgrades/1.22.1_3tghbxmzql23z7wrs7ihu6h3ki: + resolution: {integrity: sha512-MdoitCTLl4zwMU8MeE/bCj+7JMWBEvd38XqJkw36PkJrXlbv6FedDVCPoumMAhpmtymm0nTwTYYklYG+L6WiiQ==} hasBin: true peerDependencies: '@nomiclabs/hardhat-ethers': ^2.0.0 @@ -4085,28 +3344,28 @@ packages: '@nomiclabs/harhdat-etherscan': optional: true dependencies: - '@nomiclabs/hardhat-ethers': 2.2.1_3uaf6nt3qt6cyh5fx3fc5i4mn4 - '@nomiclabs/hardhat-etherscan': 3.1.2_hardhat@2.12.2 - '@openzeppelin/upgrades-core': 1.20.4 + '@nomiclabs/hardhat-ethers': 2.2.2_wknqauzjtp3mhprkntsmqpccee + '@nomiclabs/hardhat-etherscan': 3.1.7_hardhat@2.13.0 + '@openzeppelin/upgrades-core': 1.24.1 chalk: 4.1.2 debug: 4.3.4 ethers: 5.7.2 - hardhat: 2.12.2_2dtigtkb225m7ii7q45utxqwgi + hardhat: 2.13.0_6qtx7vkbdhwvdm4crzlegk4mvi proper-lockfile: 4.1.2 transitivePeerDependencies: - supports-color dev: true - /@openzeppelin/upgrades-core/1.20.4: - resolution: {integrity: sha512-Y4/+BPIbnopfE6ZhPOE2CD0V5fnvDxKKm7+kryx5+WrcRCTW3B5DjbXL9xyyoviG8Rn5EXUh5Fk1GLbiYDfu0g==} + /@openzeppelin/upgrades-core/1.24.1: + resolution: {integrity: sha512-QhdIQDUykJ3vQauB6CheV7vk4zgn0e1iY+IDg7r1KqpA1m2bqIGjQCpzidW33K4bZc9zdJSPx2/Z6Um5KxCB7A==} dependencies: cbor: 8.1.0 chalk: 4.1.2 - compare-versions: 5.0.1 + compare-versions: 5.0.3 debug: 4.3.4 ethereumjs-util: 7.1.5 proper-lockfile: 4.1.2 - solidity-ast: 0.4.38 + solidity-ast: 0.4.46 transitivePeerDependencies: - supports-color dev: true @@ -4170,17 +3429,6 @@ packages: magic-string: 0.25.9 dev: true - /@rollup/plugin-inject/4.0.4_rollup@2.79.1: - resolution: {integrity: sha512-4pbcU4J/nS+zuHk+c+OL3WtmEQhqxlZ9uqfjQMQDOHOPld7PsCd8k5LWs8h5wjwJN7MgnAn768F2sDxEP4eNFQ==} - peerDependencies: - rollup: ^1.20.0 || ^2.0.0 - dependencies: - '@rollup/pluginutils': 3.1.0_rollup@2.79.1 - estree-walker: 2.0.2 - magic-string: 0.25.9 - rollup: 2.79.1 - dev: true - /@rollup/pluginutils/3.1.0: resolution: {integrity: sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==} engines: {node: '>= 8.0.0'} @@ -4192,34 +3440,22 @@ packages: picomatch: 2.3.1 dev: true - /@rollup/pluginutils/3.1.0_rollup@2.79.1: - resolution: {integrity: sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==} - engines: {node: '>= 8.0.0'} - peerDependencies: - rollup: ^1.20.0||^2.0.0 - dependencies: - '@types/estree': 0.0.39 - estree-walker: 1.0.1 - picomatch: 2.3.1 - rollup: 2.79.1 - dev: true - /@scure/base/1.1.1: resolution: {integrity: sha512-ZxOhsSyxYwLJj3pLZCefNitxsj093tb2vq90mp2txoYeBqbcjDjqFhyM8eUjq/uFm6zJ+mUuqxlS2FkuSY1MTA==} dev: true - /@scure/bip32/1.1.0: - resolution: {integrity: sha512-ftTW3kKX54YXLCxH6BB7oEEoJfoE2pIgw7MINKAs5PsS6nqKPuKk1haTF/EuHmYqG330t5GSrdmtRuHaY1a62Q==} + /@scure/bip32/1.1.5: + resolution: {integrity: sha512-XyNh1rB0SkEqd3tXcXMi+Xe1fvg+kUIcoRIEujP1Jgv7DqW2r9lg3Ah0NkFaCs9sTkQAQA8kw7xiRXzENi9Rtw==} dependencies: - '@noble/hashes': 1.1.2 - '@noble/secp256k1': 1.6.3 + '@noble/hashes': 1.2.0 + '@noble/secp256k1': 1.7.1 '@scure/base': 1.1.1 dev: true - /@scure/bip39/1.1.0: - resolution: {integrity: sha512-pwrPOS16VeTKg98dYXQyIjJEcWfz7/1YJIwxUEPFfQPtc86Ym/1sVgQ2RLoD43AazMk2l/unK4ITySSpW2+82w==} + /@scure/bip39/1.1.1: + resolution: {integrity: sha512-t+wDck2rVkh65Hmv280fYdVdY25J9YeEUIgn2LG1WM6gxFkGzcksoDiUkWVpVp3Oex9xGC68JU2dSbUfwZ2jPg==} dependencies: - '@noble/hashes': 1.1.2 + '@noble/hashes': 1.2.0 '@scure/base': 1.1.1 dev: true @@ -4363,6 +3599,12 @@ packages: antlr4ts: 0.5.0-alpha.4 dev: true + /@solidity-parser/parser/0.16.0: + resolution: {integrity: sha512-ESipEcHyRHg4Np4SqBCfcXwyxxna1DgFVz69bgpLV8vzl/NP1DtcKsJ4dJZXWQhY/Z4J2LeKBiOkOVZn9ct33Q==} + dependencies: + antlr4ts: 0.5.0-alpha.4 + dev: true + /@sveltejs/vite-plugin-svelte/1.3.1_svelte@3.53.1+vite@3.2.4: resolution: {integrity: sha512-2Uu2sDdIR+XQWF7QWOVSF2jR9EU6Ciw1yWfYnfLYj8HIgnNxkh/8g22Fw2pBUI8QNyW/KxtqJUWBI+8ypamSrQ==} engines: {node: ^14.18.0 || >= 16} @@ -4449,10 +3691,10 @@ packages: typechain: ^3.0.0 dependencies: ethers: 5.7.2 - typechain: 3.0.0_typescript@4.9.3 + typechain: 3.0.0_typescript@4.9.5 dev: true - /@typechain/ethers-v5/7.2.0_rqgsou2umo6ifhsmtcb3krjbfm: + /@typechain/ethers-v5/7.2.0_jcns4h3uqvirgzfg2h4tj32z6y: resolution: {integrity: sha512-jfcmlTvaaJjng63QsT49MT6R1HFhtO/TBMWbyzPFSzMmVIqb2tL6prnKBs4ZJrSvmgIXWy+ttSjpaxCTq8D/Tw==} peerDependencies: '@ethersproject/abi': ^5.0.0 @@ -4462,17 +3704,14 @@ packages: typechain: ^5.0.0 typescript: '>=4.0.0' dependencies: - '@ethersproject/abi': 5.7.0 - '@ethersproject/bytes': 5.7.0 - '@ethersproject/providers': 5.7.2 ethers: 5.7.2 lodash: 4.17.21 - ts-essentials: 7.0.3_typescript@4.9.3 - typechain: 5.2.0_typescript@4.9.3 - typescript: 4.9.3 + ts-essentials: 7.0.3_typescript@4.9.5 + typechain: 5.2.0_typescript@4.9.5 + typescript: 4.9.5 dev: true - /@typechain/hardhat/2.3.1_i3sbpo4srhduw7xvdsryjfwk5e: + /@typechain/hardhat/2.3.1_72qu7yerczljvjdavmwb3bv7oy: resolution: {integrity: sha512-BQV8OKQi0KAzLXCdsPO0pZBNQQ6ra8A2ucC26uFX/kquRBtJu1yEyWnVSmtr07b5hyRoJRpzUeINLnyqz4/MAw==} peerDependencies: hardhat: ^2.0.10 @@ -4480,13 +3719,12 @@ packages: typechain: ^5.1.2 dependencies: fs-extra: 9.1.0 - hardhat: 2.12.2_2dtigtkb225m7ii7q45utxqwgi - lodash: 4.17.21 - typechain: 5.2.0_typescript@4.9.3 + hardhat: 2.13.0_6qtx7vkbdhwvdm4crzlegk4mvi + typechain: 5.2.0_typescript@4.9.5 dev: true - /@types/abstract-leveldown/7.2.0: - resolution: {integrity: sha512-q5veSX6zjUy/DlDhR4Y4cU0k2Ar+DT2LUraP00T19WLmTO6Se1djepCCaqU6nQrwcJ5Hyo/CWqxTzrrFg8eqbQ==} + /@types/abstract-leveldown/7.2.1: + resolution: {integrity: sha512-YK8irIC+eMrrmtGx0H4ISn9GgzLd9dojZWJaMbjp1YHLl2VqqNFBNrL5Q3KjGf4VE3sf/4hmq6EhQZ7kZp1NoQ==} dev: true /@types/acorn/4.0.6: @@ -4531,12 +3769,12 @@ packages: /@types/bn.js/4.11.6: resolution: {integrity: sha512-pqr857jrp2kPuO9uRjZ3PwnJTjoQy+fcdxvBTvHm6dkmEL9q+hDD/2j/0ELOBPtPnS8LjCX0gI9nbl8lVkadpg==} dependencies: - '@types/node': 18.14.2 + '@types/node': 18.15.1 /@types/bn.js/5.1.1: resolution: {integrity: sha512-qNrYbZqMx0uJAfKnKclPh+dTwK33KfLHYqtyODwd5HnXOjnkhc4qgn3BrK6RWyGZm5+sIFE7Q7Vz6QQtJB7w7g==} dependencies: - '@types/node': 18.14.2 + '@types/node': 12.20.55 dev: true /@types/cacheable-request/6.0.3: @@ -4544,7 +3782,7 @@ packages: dependencies: '@types/http-cache-semantics': 4.0.1 '@types/keyv': 3.1.4 - '@types/node': 18.14.2 + '@types/node': 18.15.1 '@types/responselike': 1.0.0 dev: true optional: true @@ -4556,13 +3794,13 @@ packages: /@types/concat-stream/1.6.1: resolution: {integrity: sha512-eHE4cQPoj6ngxBZMvVf6Hw7Mh4jMW4U9lpGmS5GBPB9RYxlFg+CHaVN7ErNY4W9XfLIEn20b4VDYaIrbq0q4uA==} dependencies: - '@types/node': 18.14.2 + '@types/node': 18.15.1 dev: true /@types/connect/3.4.35: resolution: {integrity: sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==} dependencies: - '@types/node': 18.14.2 + '@types/node': 18.15.1 dev: false /@types/debug/4.1.7: @@ -4574,8 +3812,15 @@ packages: /@types/eslint-scope/3.7.4: resolution: {integrity: sha512-9K4zoImiZc3HlIp6AVUDE4CWYx22a+lhSZMYNpbjW04+YF0KWj4pJXnEMjdnFTiQibFFmElcsasJXDbdI/EPhA==} dependencies: - '@types/eslint': 8.4.10 - '@types/estree': 1.0.0 + '@types/eslint': 8.21.1 + '@types/estree': 0.0.51 + dev: true + + /@types/eslint/8.21.1: + resolution: {integrity: sha512-rc9K8ZpVjNcLs8Fp0dkozd5Pt2Apk1glO4Vgz8ix1u6yFByxfqo5Yavpy65o+93TAe24jr7v+eSBtFLvOQtCRQ==} + dependencies: + '@types/estree': 0.0.51 + '@types/json-schema': 7.0.11 dev: true /@types/eslint/8.4.10: @@ -4605,25 +3850,26 @@ packages: /@types/estree/1.0.0: resolution: {integrity: sha512-WulqXMDUTYAXCjZnk6JtIHPigp55cVtDgDrO2gHRwhyJto21+1zbVCtOYB2L1F9w4qCQ0rOGWBnBe0FNTiEJIQ==} + dev: false /@types/form-data/0.0.33: resolution: {integrity: sha512-8BSvG1kGm83cyJITQMZSulnl6QV8jqAGreJsc5tPu1Jq0vTSOiY/k24Wx82JRpWwZSqrala6sd5rWi6aNXvqcw==} dependencies: - '@types/node': 18.14.2 + '@types/node': 18.15.1 dev: true /@types/glob/7.2.0: resolution: {integrity: sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==} dependencies: '@types/minimatch': 5.1.2 - '@types/node': 18.14.2 + '@types/node': 18.15.1 dev: true - /@types/glob/8.0.1: - resolution: {integrity: sha512-8bVUjXZvJacUFkJXHdyZ9iH1Eaj5V7I8c4NdH5sQJsdXkqT4CA5Dhb4yb4VE/3asyx4L9ayZr1NIhTsWHczmMw==} + /@types/glob/8.1.0: + resolution: {integrity: sha512-IO+MJPVhoqz+28h1qLAcBEH2+xHMK6MTyHJc7MTnnYb6wsoLR29POVGJ7LycmVXIqyy/4/2ShP5sUwTXuOwb/w==} dependencies: '@types/minimatch': 5.1.2 - '@types/node': 18.11.18 + '@types/node': 12.20.55 dev: true /@types/graceful-fs/4.1.5: @@ -4689,7 +3935,7 @@ packages: /@types/keyv/3.1.4: resolution: {integrity: sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==} dependencies: - '@types/node': 18.14.2 + '@types/node': 18.15.1 dev: true optional: true @@ -4700,9 +3946,9 @@ packages: /@types/levelup/4.3.3: resolution: {integrity: sha512-K+OTIjJcZHVlZQN1HmU64VtrC0jC3dXWQozuEIR9zVvltIk90zaGPM2AgT+fIkChpzHhFE3YnvFLCbLtzAmexA==} dependencies: - '@types/abstract-leveldown': 7.2.0 + '@types/abstract-leveldown': 7.2.1 '@types/level-errors': 3.0.0 - '@types/node': 18.13.0 + '@types/node': 12.20.55 dev: true /@types/lru-cache/5.1.1: @@ -4734,7 +3980,7 @@ packages: /@types/mkdirp/0.5.2: resolution: {integrity: sha512-U5icWpv7YnZYGsN4/cmh3WD2onMY0aJIiTE6+51TwJCttdHvtCYmkBNOobHlXwrJRL0nkH9jH4kD+1FAdMN4Tg==} dependencies: - '@types/node': 18.14.2 + '@types/node': 12.20.55 dev: true /@types/mocha/9.1.1: @@ -4748,7 +3994,7 @@ packages: /@types/node-fetch/2.6.2: resolution: {integrity: sha512-DHqhlq5jeESLy19TYhLakJ07kNumXWjcDdxXsLUMJZ6ue8VZJj4kLPQVE/2mdHh3xZziNF1xppu5lwmS53HR+A==} dependencies: - '@types/node': 18.14.2 + '@types/node': 12.20.55 form-data: 3.0.1 dev: true @@ -4759,20 +4005,16 @@ packages: /@types/node/12.20.55: resolution: {integrity: sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==} - /@types/node/18.11.18: - resolution: {integrity: sha512-DHQpWGjyQKSHj3ebjFI/wRKcqQcdR+MoFBygntYOZytCqNfkd2ZC4ARDJ2DQqhjH5p85Nnd3jhUJIXrszFX/JA==} - dev: true - /@types/node/18.13.0: resolution: {integrity: sha512-gC3TazRzGoOnoKAhUx+Q0t8S9Tzs74z7m0ipwGpSqQrleP14hKxP4/JUeEQcD3W1/aIpnWl8pHowI7WokuZpXg==} dev: true /@types/node/18.14.2: resolution: {integrity: sha512-1uEQxww3DaghA0RxqHx0O0ppVlo43pJhepY51OxuQIKHpjbnYLA7vcdwioNPzIqmC2u3I/dmylcqjlh0e7AyUA==} + dev: true /@types/node/18.15.1: resolution: {integrity: sha512-U2TWca8AeHSmbpi314QBESRk7oPjSZjDsR+c+H4ECC1l+kFgpZf8Ydhv3SJpPy51VyZHHqxlb6mTTqYNNRVAIw==} - dev: true /@types/node/8.10.66: resolution: {integrity: sha512-tktOkFUA4kXx2hhhrB8bIFb5TbwzS4uOhKEmwiD+NoiL0qtP2OQ9mFldbgD4dV1djrlBYP6eBuQZiWjuHUpqFw==} @@ -4789,12 +4031,16 @@ packages: /@types/pbkdf2/3.1.0: resolution: {integrity: sha512-Cf63Rv7jCQ0LaL8tNXmEyqTHuIJxRdlS5vMh1mj5voN4+QFhVZnlZruezqpWYDiJ8UTzhP0VmeLXCmBk66YrMQ==} dependencies: - '@types/node': 18.14.2 + '@types/node': 18.15.1 /@types/prettier/2.7.1: resolution: {integrity: sha512-ri0UmynRRvZiiUJdiz38MmIblKK+oH30MztdBVR95dv/Ubw6neWSb8u1XpRb72L4qsZOhz+L+z9JD40SJmfWow==} dev: true + /@types/prettier/2.7.2: + resolution: {integrity: sha512-KufADq8uQqo1pYKVIYzfKbJfBAc0sOeXqGbFaSpv8MRmC/zXgowNZmFcbngndGk922QDmOASEXUZCaY48gs4cg==} + dev: true + /@types/prop-types/15.7.5: resolution: {integrity: sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==} @@ -4816,13 +4062,13 @@ packages: /@types/resolve/0.0.8: resolution: {integrity: sha512-auApPaJf3NPfe18hSoJkp8EbZzer2ISk7o8mCC3M9he/a04+gbMF97NkpD2S8riMGvm4BMRI59/SZQSaLTKpsQ==} dependencies: - '@types/node': 18.14.2 + '@types/node': 12.20.55 dev: true /@types/responselike/1.0.0: resolution: {integrity: sha512-85Y2BjiufFzaMIlvJDvTTB8Fxl2xfLo4HgmHzVBz08w4wDePCTjYw66PdrolO0kzli3yam/YCgRufyo1DdQVTA==} dependencies: - '@types/node': 18.14.2 + '@types/node': 18.15.1 dev: true optional: true @@ -4844,7 +4090,7 @@ packages: /@types/secp256k1/4.0.3: resolution: {integrity: sha512-Da66lEIFeIz9ltsdMZcpQvmrmmoqrfju8pm1BH8WbYjZSwUgCwXLb9C+9XYogwBITnbsSaMdVPb2ekf7TV+03w==} dependencies: - '@types/node': 18.14.2 + '@types/node': 18.15.1 /@types/semver/7.3.13: resolution: {integrity: sha512-21cFJr9z3g5dW8B0CVI9g2O9beqaThGQ6ZFBqHfwhzLDKUxaqTIy3vnfah/UPkfOiF2pLq+tGz+W8RyCskuslw==} @@ -4889,7 +4135,7 @@ packages: /@types/ws/7.4.7: resolution: {integrity: sha512-JQbbmxZTZehdc2iszGKs5oC3NFnjeay7mtAWrdt7qNtAVK0g19muApzAy4bm9byz79xa2ZnO/BOBC2R8RC5Lww==} dependencies: - '@types/node': 18.14.2 + '@types/node': 18.15.1 dev: false /@types/yargs-parser/21.0.0: @@ -4902,7 +4148,7 @@ packages: '@types/yargs-parser': 21.0.0 dev: true - /@typescript-eslint/eslint-plugin/4.33.0_b437dje45jwsli5vlhomcei76i: + /@typescript-eslint/eslint-plugin/4.33.0_s2qqtxhzmb7vugvfoyripfgp7i: resolution: {integrity: sha512-aINiAxGVdOl1eJyVjaWn/YcVAq4Gi/Yo35qHGCnqbWVz61g39D0h23veY/MA0rFFGfxK7TySg2uwDeNv+JgVpg==} engines: {node: ^10.12.0 || >=12.0.0} peerDependencies: @@ -4913,22 +4159,22 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/experimental-utils': 4.33.0_77fvizpdb3y4icyeo2mf4eo7em - '@typescript-eslint/parser': 4.33.0_77fvizpdb3y4icyeo2mf4eo7em + '@typescript-eslint/experimental-utils': 4.33.0_jofidmxrjzhj7l6vknpw5ecvfe + '@typescript-eslint/parser': 4.33.0_jofidmxrjzhj7l6vknpw5ecvfe '@typescript-eslint/scope-manager': 4.33.0 debug: 4.3.4 eslint: 7.32.0 functional-red-black-tree: 1.0.1 - ignore: 5.2.0 + ignore: 5.2.4 regexpp: 3.2.0 semver: 7.3.8 - tsutils: 3.21.0_typescript@4.9.3 - typescript: 4.9.3 + tsutils: 3.21.0_typescript@4.9.5 + typescript: 4.9.5 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/eslint-plugin/5.44.0_c5rgyxfozmk6acmvyot27wcp74: + /@typescript-eslint/eslint-plugin/5.44.0_7kywactpvjpcexyctx5cege4cm: resolution: {integrity: sha512-j5ULd7FmmekcyWeArx+i8x7sdRHzAtXTkmDPthE4amxZOWKFK7bomoJ4r7PJ8K7PoMzD16U8MmuZFAonr1ERvw==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: @@ -4939,22 +4185,22 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/parser': 5.44.0_typescript@4.9.3 + '@typescript-eslint/parser': 5.44.0_typescript@4.9.5 '@typescript-eslint/scope-manager': 5.44.0 - '@typescript-eslint/type-utils': 5.44.0_typescript@4.9.3 - '@typescript-eslint/utils': 5.44.0_typescript@4.9.3 + '@typescript-eslint/type-utils': 5.44.0_typescript@4.9.5 + '@typescript-eslint/utils': 5.44.0_typescript@4.9.5 debug: 4.3.4 ignore: 5.2.0 natural-compare-lite: 1.4.0 regexpp: 3.2.0 semver: 7.3.8 - tsutils: 3.21.0_typescript@4.9.3 - typescript: 4.9.3 + tsutils: 3.21.0_typescript@4.9.5 + typescript: 4.9.5 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/eslint-plugin/5.44.0_e2lvjb2eg2mgv3h5oqf6kw3to4: + /@typescript-eslint/eslint-plugin/5.44.0_c5rgyxfozmk6acmvyot27wcp74: resolution: {integrity: sha512-j5ULd7FmmekcyWeArx+i8x7sdRHzAtXTkmDPthE4amxZOWKFK7bomoJ4r7PJ8K7PoMzD16U8MmuZFAonr1ERvw==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: @@ -4965,12 +4211,11 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/parser': 5.44.0_77fvizpdb3y4icyeo2mf4eo7em + '@typescript-eslint/parser': 5.44.0_typescript@4.9.3 '@typescript-eslint/scope-manager': 5.44.0 - '@typescript-eslint/type-utils': 5.44.0_77fvizpdb3y4icyeo2mf4eo7em - '@typescript-eslint/utils': 5.44.0_77fvizpdb3y4icyeo2mf4eo7em + '@typescript-eslint/type-utils': 5.44.0_typescript@4.9.3 + '@typescript-eslint/utils': 5.44.0_typescript@4.9.3 debug: 4.3.4 - eslint: 7.32.0 ignore: 5.2.0 natural-compare-lite: 1.4.0 regexpp: 3.2.0 @@ -4981,34 +4226,7 @@ packages: - supports-color dev: true - /@typescript-eslint/eslint-plugin/5.44.0_wn2lldm33jszzpptq7r22sqksi: - resolution: {integrity: sha512-j5ULd7FmmekcyWeArx+i8x7sdRHzAtXTkmDPthE4amxZOWKFK7bomoJ4r7PJ8K7PoMzD16U8MmuZFAonr1ERvw==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - '@typescript-eslint/parser': ^5.0.0 - eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - dependencies: - '@typescript-eslint/parser': 5.44.0_jofidmxrjzhj7l6vknpw5ecvfe - '@typescript-eslint/scope-manager': 5.44.0 - '@typescript-eslint/type-utils': 5.44.0_jofidmxrjzhj7l6vknpw5ecvfe - '@typescript-eslint/utils': 5.44.0_jofidmxrjzhj7l6vknpw5ecvfe - debug: 4.3.4 - eslint: 7.32.0 - ignore: 5.2.0 - natural-compare-lite: 1.4.0 - regexpp: 3.2.0 - semver: 7.3.8 - tsutils: 3.21.0_typescript@4.9.5 - typescript: 4.9.5 - transitivePeerDependencies: - - supports-color - dev: true - - /@typescript-eslint/experimental-utils/4.33.0_77fvizpdb3y4icyeo2mf4eo7em: + /@typescript-eslint/experimental-utils/4.33.0_jofidmxrjzhj7l6vknpw5ecvfe: resolution: {integrity: sha512-zeQjOoES5JFjTnAhI5QY7ZviczMzDptls15GFsI6jyUOq0kOf9+WonkhtlIhh0RgHRnqj5gdNxW5j1EvAyYg6Q==} engines: {node: ^10.12.0 || >=12.0.0} peerDependencies: @@ -5017,7 +4235,7 @@ packages: '@types/json-schema': 7.0.11 '@typescript-eslint/scope-manager': 4.33.0 '@typescript-eslint/types': 4.33.0 - '@typescript-eslint/typescript-estree': 4.33.0_typescript@4.9.3 + '@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 @@ -5026,7 +4244,7 @@ packages: - typescript dev: true - /@typescript-eslint/parser/4.33.0_77fvizpdb3y4icyeo2mf4eo7em: + /@typescript-eslint/parser/4.33.0_jofidmxrjzhj7l6vknpw5ecvfe: resolution: {integrity: sha512-ZohdsbXadjGBSK0/r+d87X0SBmKzOq4/S5nzK6SBgJspFo9/CUDJ7hjayuze+JK7CZQLDMroqytp7pOcFKTxZA==} engines: {node: ^10.12.0 || >=12.0.0} peerDependencies: @@ -5038,15 +4256,15 @@ packages: dependencies: '@typescript-eslint/scope-manager': 4.33.0 '@typescript-eslint/types': 4.33.0 - '@typescript-eslint/typescript-estree': 4.33.0_typescript@4.9.3 + '@typescript-eslint/typescript-estree': 4.33.0_typescript@4.9.5 debug: 4.3.4 eslint: 7.32.0 - typescript: 4.9.3 + typescript: 4.9.5 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/parser/5.44.0_77fvizpdb3y4icyeo2mf4eo7em: + /@typescript-eslint/parser/5.44.0_typescript@4.9.3: resolution: {integrity: sha512-H7LCqbZnKqkkgQHaKLGC6KUjt3pjJDx8ETDqmwncyb6PuoigYajyAwBGz08VU/l86dZWZgI4zm5k2VaKqayYyA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: @@ -5060,13 +4278,12 @@ packages: '@typescript-eslint/types': 5.44.0 '@typescript-eslint/typescript-estree': 5.44.0_typescript@4.9.3 debug: 4.3.4 - eslint: 7.32.0 typescript: 4.9.3 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/parser/5.44.0_jofidmxrjzhj7l6vknpw5ecvfe: + /@typescript-eslint/parser/5.44.0_typescript@4.9.5: resolution: {integrity: sha512-H7LCqbZnKqkkgQHaKLGC6KUjt3pjJDx8ETDqmwncyb6PuoigYajyAwBGz08VU/l86dZWZgI4zm5k2VaKqayYyA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: @@ -5080,31 +4297,11 @@ packages: '@typescript-eslint/types': 5.44.0 '@typescript-eslint/typescript-estree': 5.44.0_typescript@4.9.5 debug: 4.3.4 - eslint: 7.32.0 typescript: 4.9.5 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/parser/5.44.0_typescript@4.9.3: - resolution: {integrity: sha512-H7LCqbZnKqkkgQHaKLGC6KUjt3pjJDx8ETDqmwncyb6PuoigYajyAwBGz08VU/l86dZWZgI4zm5k2VaKqayYyA==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - dependencies: - '@typescript-eslint/scope-manager': 5.44.0 - '@typescript-eslint/types': 5.44.0 - '@typescript-eslint/typescript-estree': 5.44.0_typescript@4.9.3 - debug: 4.3.4 - typescript: 4.9.3 - transitivePeerDependencies: - - supports-color - dev: true - /@typescript-eslint/scope-manager/4.33.0: resolution: {integrity: sha512-5IfJHpgTsTZuONKbODctL4kKuQje/bzBRkwHE8UOZ4f89Zeddg+EGZs8PD8NcN4LdM3ygHWYB3ukPAYjvl/qbQ==} engines: {node: ^8.10.0 || ^10.13.0 || >=11.10.1} @@ -5121,7 +4318,7 @@ packages: '@typescript-eslint/visitor-keys': 5.44.0 dev: true - /@typescript-eslint/type-utils/5.44.0_77fvizpdb3y4icyeo2mf4eo7em: + /@typescript-eslint/type-utils/5.44.0_typescript@4.9.3: resolution: {integrity: sha512-A1u0Yo5wZxkXPQ7/noGkRhV4J9opcymcr31XQtOzcc5nO/IHN2E2TPMECKWYpM3e6olWEM63fq/BaL1wEYnt/w==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: @@ -5132,16 +4329,15 @@ packages: optional: true dependencies: '@typescript-eslint/typescript-estree': 5.44.0_typescript@4.9.3 - '@typescript-eslint/utils': 5.44.0_77fvizpdb3y4icyeo2mf4eo7em + '@typescript-eslint/utils': 5.44.0_typescript@4.9.3 debug: 4.3.4 - eslint: 7.32.0 tsutils: 3.21.0_typescript@4.9.3 typescript: 4.9.3 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/type-utils/5.44.0_jofidmxrjzhj7l6vknpw5ecvfe: + /@typescript-eslint/type-utils/5.44.0_typescript@4.9.5: resolution: {integrity: sha512-A1u0Yo5wZxkXPQ7/noGkRhV4J9opcymcr31XQtOzcc5nO/IHN2E2TPMECKWYpM3e6olWEM63fq/BaL1wEYnt/w==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: @@ -5152,34 +4348,14 @@ packages: optional: true dependencies: '@typescript-eslint/typescript-estree': 5.44.0_typescript@4.9.5 - '@typescript-eslint/utils': 5.44.0_jofidmxrjzhj7l6vknpw5ecvfe + '@typescript-eslint/utils': 5.44.0_typescript@4.9.5 debug: 4.3.4 - eslint: 7.32.0 tsutils: 3.21.0_typescript@4.9.5 typescript: 4.9.5 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/type-utils/5.44.0_typescript@4.9.3: - resolution: {integrity: sha512-A1u0Yo5wZxkXPQ7/noGkRhV4J9opcymcr31XQtOzcc5nO/IHN2E2TPMECKWYpM3e6olWEM63fq/BaL1wEYnt/w==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - eslint: '*' - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - dependencies: - '@typescript-eslint/typescript-estree': 5.44.0_typescript@4.9.3 - '@typescript-eslint/utils': 5.44.0_typescript@4.9.3 - debug: 4.3.4 - tsutils: 3.21.0_typescript@4.9.3 - typescript: 4.9.3 - transitivePeerDependencies: - - supports-color - dev: true - /@typescript-eslint/types/4.33.0: resolution: {integrity: sha512-zKp7CjQzLQImXEpLt2BUw1tvOMPfNoTAfb8l51evhYbOEEzdWyQNmHWWGPR6hwKJDAi+1VXSBmnhL9kyVTTOuQ==} engines: {node: ^8.10.0 || ^10.13.0 || >=11.10.1} @@ -5190,7 +4366,7 @@ packages: engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dev: true - /@typescript-eslint/typescript-estree/4.33.0_typescript@4.9.3: + /@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} peerDependencies: @@ -5205,8 +4381,8 @@ packages: globby: 11.1.0 is-glob: 4.0.3 semver: 7.3.8 - tsutils: 3.21.0_typescript@4.9.3 - typescript: 4.9.3 + tsutils: 3.21.0_typescript@4.9.5 + typescript: 4.9.5 transitivePeerDependencies: - supports-color dev: true @@ -5253,7 +4429,7 @@ packages: - supports-color dev: true - /@typescript-eslint/utils/5.44.0_77fvizpdb3y4icyeo2mf4eo7em: + /@typescript-eslint/utils/5.44.0_typescript@4.9.3: resolution: {integrity: sha512-fMzA8LLQ189gaBjS0MZszw5HBdZgVwxVFShCO3QN+ws3GlPkcy9YuS3U4wkT6su0w+Byjq3mS3uamy9HE4Yfjw==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: @@ -5264,16 +4440,15 @@ packages: '@typescript-eslint/scope-manager': 5.44.0 '@typescript-eslint/types': 5.44.0 '@typescript-eslint/typescript-estree': 5.44.0_typescript@4.9.3 - eslint: 7.32.0 eslint-scope: 5.1.1 - eslint-utils: 3.0.0_eslint@7.32.0 + eslint-utils: 3.0.0 semver: 7.3.8 transitivePeerDependencies: - supports-color - typescript dev: true - /@typescript-eslint/utils/5.44.0_jofidmxrjzhj7l6vknpw5ecvfe: + /@typescript-eslint/utils/5.44.0_typescript@4.9.5: resolution: {integrity: sha512-fMzA8LLQ189gaBjS0MZszw5HBdZgVwxVFShCO3QN+ws3GlPkcy9YuS3U4wkT6su0w+Byjq3mS3uamy9HE4Yfjw==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: @@ -5284,26 +4459,6 @@ packages: '@typescript-eslint/scope-manager': 5.44.0 '@typescript-eslint/types': 5.44.0 '@typescript-eslint/typescript-estree': 5.44.0_typescript@4.9.5 - eslint: 7.32.0 - eslint-scope: 5.1.1 - eslint-utils: 3.0.0_eslint@7.32.0 - semver: 7.3.8 - transitivePeerDependencies: - - supports-color - - typescript - dev: true - - /@typescript-eslint/utils/5.44.0_typescript@4.9.3: - resolution: {integrity: sha512-fMzA8LLQ189gaBjS0MZszw5HBdZgVwxVFShCO3QN+ws3GlPkcy9YuS3U4wkT6su0w+Byjq3mS3uamy9HE4Yfjw==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 - dependencies: - '@types/json-schema': 7.0.11 - '@types/semver': 7.3.13 - '@typescript-eslint/scope-manager': 5.44.0 - '@typescript-eslint/types': 5.44.0 - '@typescript-eslint/typescript-estree': 5.44.0_typescript@4.9.3 eslint-scope: 5.1.1 eslint-utils: 3.0.0 semver: 7.3.8 @@ -5331,15 +4486,15 @@ packages: /@vue/compiler-sfc/2.7.14: resolution: {integrity: sha512-aNmNHyLPsw+sVvlQFQ2/8sjNuLtK54TC6cuKnVzAY93ks4ZBrvwQSnkkIh7bsbNhum5hJBS00wSDipQ937f5DA==} dependencies: - '@babel/parser': 7.20.3 + '@babel/parser': 7.21.2 postcss: 8.4.21 source-map: 0.6.1 dev: true - /@vue/component-compiler-utils/3.3.0_lodash@4.17.21: + /@vue/component-compiler-utils/3.3.0: resolution: {integrity: sha512-97sfH2mYNU+2PzGrmK2haqffDpVASuib9/w2/noxiFi31Z54hW+q3izKQXXQZSNhtiUpAI36uSuYepeBe4wpHQ==} dependencies: - consolidate: 0.15.1_lodash@4.17.21 + consolidate: 0.15.1 hash-sum: 1.0.2 lru-cache: 4.1.5 merge-source-map: 1.1.0 @@ -5348,7 +4503,7 @@ packages: source-map: 0.6.1 vue-template-es2015-compiler: 1.9.1 optionalDependencies: - prettier: 2.7.1 + prettier: 2.8.4 transitivePeerDependencies: - arc-templates - atpl @@ -5409,32 +4564,6 @@ packages: resolution: {integrity: sha512-L+lUuyxsocjBB3fwak3t0miXxyMHuXntysgm/R+MIbBfidsZEHpeky44z4Qdft2TUlGtb08i5QSl+4eUEQGTNw==} dev: false - /@wagmi/connectors/0.1.1_igzkohdkbvuxwssjqsbqwxprka: - resolution: {integrity: sha512-W9w73o9HCYzuBsDHuujwBT/nGGIu5qLBSqVqslXf/S1Q9OiWoudmuIs3opuYqxgw5MpWbMqhq6QaxA7Qcd6NrA==} - peerDependencies: - '@wagmi/core': 0.8.x - ethers: ^5.0.0 - peerDependenciesMeta: - '@wagmi/core': - optional: true - dependencies: - '@coinbase/wallet-sdk': 3.6.3_@babel+core@7.20.2 - '@ledgerhq/connect-kit-loader': 1.0.1 - '@wagmi/core': 0.8.4_xvrh6f4niupavonwizjzh3wv4q - '@walletconnect/ethereum-provider': 1.8.0 - abitype: 0.1.8_typescript@4.9.3 - ethers: 5.7.2 - eventemitter3: 4.0.7 - transitivePeerDependencies: - - '@babel/core' - - bufferutil - - debug - - encoding - - supports-color - - typescript - - utf-8-validate - dev: false - /@wagmi/connectors/0.1.1_lpbbub423epmm6q3g5mjjnmjwe: resolution: {integrity: sha512-W9w73o9HCYzuBsDHuujwBT/nGGIu5qLBSqVqslXf/S1Q9OiWoudmuIs3opuYqxgw5MpWbMqhq6QaxA7Qcd6NrA==} peerDependencies: @@ -5461,7 +4590,7 @@ packages: - utf-8-validate dev: false - /@wagmi/connectors/0.1.1_wklos3touta4goq4ye6zjwurtq: + /@wagmi/connectors/0.1.1_qumsokfsavwbqmluzzd5y4jcfa: resolution: {integrity: sha512-W9w73o9HCYzuBsDHuujwBT/nGGIu5qLBSqVqslXf/S1Q9OiWoudmuIs3opuYqxgw5MpWbMqhq6QaxA7Qcd6NrA==} peerDependencies: '@wagmi/core': 0.8.x @@ -5469,57 +4598,25 @@ packages: peerDependenciesMeta: '@wagmi/core': optional: true - dependencies: - '@coinbase/wallet-sdk': 3.6.3_@babel+core@7.20.2 - '@ledgerhq/connect-kit-loader': 1.0.1 - '@wagmi/core': 0.8.4_gexomxxtwfnmlvmj4reuwmegee - '@walletconnect/ethereum-provider': 1.8.0 - abitype: 0.1.8_typescript@4.9.5 - ethers: 5.7.2 - eventemitter3: 4.0.7 - transitivePeerDependencies: - - '@babel/core' - - bufferutil - - debug - - encoding - - supports-color - - typescript - - utf-8-validate - dev: false - - /@wagmi/core/0.8.4_5mvh6ls5vdjonfqgvwoj34otni: - resolution: {integrity: sha512-orFRGOei+ixH8fIU9DitjKFSnv7sEv4j0A32gin2aADLuyBsAqG7xD+5LzfVD8EarHzU98Mk9d4hmmIkMg8bXw==} - peerDependencies: - '@coinbase/wallet-sdk': '>=3.6.0' - '@walletconnect/ethereum-provider': '>=1.7.5' - ethers: '>=5.5.1' - peerDependenciesMeta: - '@coinbase/wallet-sdk': - optional: true - '@walletconnect/ethereum-provider': - optional: true dependencies: '@coinbase/wallet-sdk': 3.6.3 - '@wagmi/chains': 0.1.3 - '@wagmi/connectors': 0.1.1_lpbbub423epmm6q3g5mjjnmjwe - abitype: 0.2.5_typescript@4.9.3 + '@ledgerhq/connect-kit-loader': 1.0.1 + '@wagmi/core': 0.8.4_km5vcydjtqolcouev6sh7bgmoy + '@walletconnect/ethereum-provider': 1.8.0 + abitype: 0.1.8_typescript@4.9.5 ethers: 5.7.2 eventemitter3: 4.0.7 - zustand: 4.1.4 transitivePeerDependencies: - '@babel/core' - bufferutil - debug - encoding - - immer - - react - supports-color - typescript - utf-8-validate - - zod dev: false - /@wagmi/core/0.8.4_gexomxxtwfnmlvmj4reuwmegee: + /@wagmi/core/0.8.4_5mvh6ls5vdjonfqgvwoj34otni: resolution: {integrity: sha512-orFRGOei+ixH8fIU9DitjKFSnv7sEv4j0A32gin2aADLuyBsAqG7xD+5LzfVD8EarHzU98Mk9d4hmmIkMg8bXw==} peerDependencies: '@coinbase/wallet-sdk': '>=3.6.0' @@ -5531,13 +4628,13 @@ packages: '@walletconnect/ethereum-provider': optional: true dependencies: - '@coinbase/wallet-sdk': 3.6.3_@babel+core@7.20.2 + '@coinbase/wallet-sdk': 3.6.3 '@wagmi/chains': 0.1.3 - '@wagmi/connectors': 0.1.1_wklos3touta4goq4ye6zjwurtq - abitype: 0.2.5_typescript@4.9.5 + '@wagmi/connectors': 0.1.1_lpbbub423epmm6q3g5mjjnmjwe + abitype: 0.2.5_typescript@4.9.3 ethers: 5.7.2 eventemitter3: 4.0.7 - zustand: 4.1.4_react@18.2.0 + zustand: 4.1.4 transitivePeerDependencies: - '@babel/core' - bufferutil @@ -5551,7 +4648,7 @@ packages: - zod dev: false - /@wagmi/core/0.8.4_xvrh6f4niupavonwizjzh3wv4q: + /@wagmi/core/0.8.4_km5vcydjtqolcouev6sh7bgmoy: resolution: {integrity: sha512-orFRGOei+ixH8fIU9DitjKFSnv7sEv4j0A32gin2aADLuyBsAqG7xD+5LzfVD8EarHzU98Mk9d4hmmIkMg8bXw==} peerDependencies: '@coinbase/wallet-sdk': '>=3.6.0' @@ -5563,13 +4660,13 @@ packages: '@walletconnect/ethereum-provider': optional: true dependencies: - '@coinbase/wallet-sdk': 3.6.3_@babel+core@7.20.2 + '@coinbase/wallet-sdk': 3.6.3 '@wagmi/chains': 0.1.3 - '@wagmi/connectors': 0.1.1_igzkohdkbvuxwssjqsbqwxprka - abitype: 0.2.5_typescript@4.9.3 + '@wagmi/connectors': 0.1.1_qumsokfsavwbqmluzzd5y4jcfa + abitype: 0.2.5_typescript@4.9.5 ethers: 5.7.2 eventemitter3: 4.0.7 - zustand: 4.1.4_react@18.2.0 + zustand: 4.1.4 transitivePeerDependencies: - '@babel/core' - bufferutil @@ -6068,12 +5165,12 @@ packages: acorn-walk: 7.2.0 dev: true - /acorn-import-assertions/1.8.0_acorn@8.8.1: + /acorn-import-assertions/1.8.0_acorn@8.8.2: resolution: {integrity: sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw==} peerDependencies: acorn: ^8 dependencies: - acorn: 8.8.1 + acorn: 8.8.2 dev: true /acorn-jsx/5.3.2_acorn@7.4.1: @@ -6116,12 +5213,6 @@ packages: hasBin: true dev: true - /acorn/8.8.1: - resolution: {integrity: sha512-7zFpHzhnqYKrkYdUjF1HI1bzd0VygEGX8lFk4k5zVMqHEoES+P+7TKI+EvLO9WVMJ8eekdO0aDEK044xTXwPPA==} - engines: {node: '>=0.4.0'} - hasBin: true - dev: true - /acorn/8.8.2: resolution: {integrity: sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==} engines: {node: '>=0.4.0'} @@ -6187,8 +5278,8 @@ packages: uri-js: 4.4.1 dev: true - /ajv/8.11.2: - resolution: {integrity: sha512-E4bfmKAhGiSTvMfL1Myyycaub+cUEU2/IvpylXkUu7CHBkBj1f/ikdzbD7YQ6FKUbixDxeYvB/xY4fvyroDlQg==} + /ajv/8.12.0: + resolution: {integrity: sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==} dependencies: fast-deep-equal: 3.1.3 json-schema-traverse: 1.0.0 @@ -6308,7 +5399,7 @@ packages: engines: {node: '>=10'} dependencies: delegates: 1.0.0 - readable-stream: 3.6.0 + readable-stream: 3.6.2 dev: true /are-we-there-yet/3.0.1: @@ -6316,7 +5407,7 @@ packages: engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} dependencies: delegates: 1.0.0 - readable-stream: 3.6.0 + readable-stream: 3.6.2 dev: true /arg/1.0.0: @@ -6342,6 +5433,7 @@ packages: /argv/0.0.2: resolution: {integrity: sha512-dEamhpPEwRUBpLNHeuCm/v+g0anFByHahxodVO/BbAarHVBBg2MccCwf9K+o1Pof+2btdnkJelYVUWjW/VrATw==} engines: {node: '>=0.6.10'} + deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. dev: false /arr-diff/4.0.0: @@ -6383,9 +5475,9 @@ packages: engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.2 - define-properties: 1.1.4 - es-abstract: 1.20.4 - get-intrinsic: 1.1.3 + define-properties: 1.2.0 + es-abstract: 1.21.1 + get-intrinsic: 1.2.0 is-string: 1.0.7 dev: true @@ -6409,8 +5501,18 @@ packages: engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.2 - define-properties: 1.1.4 - es-abstract: 1.20.4 + define-properties: 1.2.0 + es-abstract: 1.21.1 + es-shim-unscopables: 1.0.0 + dev: true + + /array.prototype.flatmap/1.3.1: + resolution: {integrity: sha512-8UGn9O1FDVvMNB0UlLv4voxRMze7+FpHyF5mSMRjWHUMlpoDViniy05870VlxhfgTnLbpuwTzvD76MTtWxB/mQ==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + define-properties: 1.2.0 + es-abstract: 1.21.1 es-shim-unscopables: 1.0.0 dev: true @@ -6419,8 +5521,8 @@ packages: engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.2 - define-properties: 1.1.4 - es-abstract: 1.20.4 + define-properties: 1.2.0 + es-abstract: 1.21.1 es-array-method-boxes-properly: 1.0.0 is-string: 1.0.7 dev: true @@ -6550,8 +5652,8 @@ packages: peerDependencies: postcss: ^8.1.0 dependencies: - browserslist: 4.21.5 - caniuse-lite: 1.0.30001458 + browserslist: 4.21.4 + caniuse-lite: 1.0.30001434 fraction.js: 4.2.0 normalize-range: 0.1.2 picocolors: 1.0.0 @@ -6578,14 +5680,13 @@ packages: /available-typed-arrays/1.0.5: resolution: {integrity: sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==} engines: {node: '>= 0.4'} - dev: false /aws-sign2/0.7.0: resolution: {integrity: sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==} dev: true - /aws4/1.11.0: - resolution: {integrity: sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==} + /aws4/1.12.0: + resolution: {integrity: sha512-NmWvPnx0F1SfrQbYwOi7OeaNGokp9XhzNioJ/CSBs8Qa4vxug81mhJEAVZwxXuBmYB5KDRfMq/F3RR0BIU7sWg==} dev: true /axios/0.21.4: @@ -6853,18 +5954,6 @@ packages: transitivePeerDependencies: - supports-color - /babel-plugin-polyfill-corejs2/0.3.3_@babel+core@7.20.2: - resolution: {integrity: sha512-8hOdmFYFSZhqg2C/JgLUQ+t52o5nirNwaWM2B9LWteozwIvM14VSwdsCAUET10qT+kmySAlseadmfeeSWFCy+Q==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/compat-data': 7.20.1 - '@babel/core': 7.20.2 - '@babel/helper-define-polyfill-provider': 0.3.3_@babel+core@7.20.2 - semver: 6.3.0 - transitivePeerDependencies: - - supports-color - /babel-plugin-polyfill-corejs3/0.6.0: resolution: {integrity: sha512-+eHqR6OPcBhJOGgsIar7xoAB1GcSwVUA3XjAd7HJNzOXT4wv6/H7KIdA/Nc60cvUlDbKApmqNvD1B1bzOt4nyA==} peerDependencies: @@ -6875,17 +5964,6 @@ packages: transitivePeerDependencies: - supports-color - /babel-plugin-polyfill-corejs3/0.6.0_@babel+core@7.20.2: - resolution: {integrity: sha512-+eHqR6OPcBhJOGgsIar7xoAB1GcSwVUA3XjAd7HJNzOXT4wv6/H7KIdA/Nc60cvUlDbKApmqNvD1B1bzOt4nyA==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.20.2 - '@babel/helper-define-polyfill-provider': 0.3.3_@babel+core@7.20.2 - core-js-compat: 3.26.1 - transitivePeerDependencies: - - supports-color - /babel-plugin-polyfill-regenerator/0.4.1: resolution: {integrity: sha512-NtQGmyQDXjQqQ+IzRkBVwEOz9lQ4zxAQZgoAYEtU9dJjnl1Oc98qnN7jcp+bE7O7aYzVpavXE3/VKXNzUbh7aw==} peerDependencies: @@ -6895,16 +5973,6 @@ packages: transitivePeerDependencies: - supports-color - /babel-plugin-polyfill-regenerator/0.4.1_@babel+core@7.20.2: - resolution: {integrity: sha512-NtQGmyQDXjQqQ+IzRkBVwEOz9lQ4zxAQZgoAYEtU9dJjnl1Oc98qnN7jcp+bE7O7aYzVpavXE3/VKXNzUbh7aw==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.20.2 - '@babel/helper-define-polyfill-provider': 0.3.3_@babel+core@7.20.2 - transitivePeerDependencies: - - supports-color - /babel-plugin-syntax-async-functions/6.13.0: resolution: {integrity: sha512-4Zp4unmHgw30A1eWI5EpACji2qMocisdXhAftfhXoSV9j0Tvj6nRFE3tOmRY912E0FMRm/L5xWE7MGVT2FoLnw==} dev: true @@ -7364,8 +6432,8 @@ packages: bindings: 1.5.0 dev: false - /bigint-crypto-utils/3.1.7: - resolution: {integrity: sha512-zpCQpIE2Oy5WIQpjC9iYZf8Uh9QqoS51ZCooAcNvzv1AQ3VWdT52D0ksr1+/faeK8HVIej1bxXcP75YcqH3KPA==} + /bigint-crypto-utils/3.1.8: + resolution: {integrity: sha512-+VMV9Laq8pXLBKKKK49nOoq9bfR3j7NNQAtbA617a4nw9bVLo8rsqkKMBgM2AJWlNX9fEIyYaYX+d0laqYV4tw==} engines: {node: '>=10.4.0'} dependencies: bigint-mod-arith: 3.1.2 @@ -7376,9 +6444,10 @@ packages: engines: {node: '>=10.4.0'} dev: true - /bignumber.js/9.1.0: - resolution: {integrity: sha512-4LwHK4nfDOraBCtst+wOWIHbu1vhvAPJK8g8nROd4iuc3PSEjWif/qwbkh8jwCJz6yDBvtU4KPynETgrfh7y3A==} + /bignumber.js/9.1.1: + resolution: {integrity: sha512-pHm4LsMJ6lzgNGVfZHjMoO8sdoRhOzOH4MLmY65Jg70bpxCKu5iOHNJyfF6OyvYw7t8Fpf35RuzUyqnQsj8Vig==} dev: true + optional: true /binary-extensions/2.2.0: resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} @@ -7445,7 +6514,7 @@ packages: engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} dependencies: bytes: 3.1.2 - content-type: 1.0.4 + content-type: 1.0.5 debug: 2.6.9 depd: 2.0.0 destroy: 1.2.0 @@ -7461,6 +6530,27 @@ packages: dev: true optional: true + /body-parser/1.20.2: + resolution: {integrity: sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==} + engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} + dependencies: + bytes: 3.1.2 + content-type: 1.0.5 + debug: 2.6.9 + depd: 2.0.0 + destroy: 1.2.0 + http-errors: 2.0.0 + iconv-lite: 0.4.24 + on-finished: 2.4.1 + qs: 6.11.0 + raw-body: 2.5.2 + type-is: 1.6.18 + unpipe: 1.0.0 + transitivePeerDependencies: + - supports-color + dev: true + optional: true + /boolbase/1.0.0: resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} dev: true @@ -7583,7 +6673,7 @@ packages: elliptic: 6.5.4 inherits: 2.0.4 parse-asn1: 5.1.6 - readable-stream: 3.6.0 + readable-stream: 3.6.2 safe-buffer: 5.2.1 dev: true @@ -7591,8 +6681,8 @@ packages: resolution: {integrity: sha512-WHVocJYavUwVgVViC0ORikPHQquXwVh939TaelZ4WDqpWgTX/FsGhl/+P4qBUAGcRvtOgDgC+xftNWWp2RUTAQ==} hasBin: true dependencies: - caniuse-lite: 1.0.30001451 - electron-to-chromium: 1.4.291 + caniuse-lite: 1.0.30001465 + electron-to-chromium: 1.4.328 dev: true /browserslist/4.21.4: @@ -7710,7 +6800,7 @@ packages: engines: {node: '>=6.14.2'} requiresBuild: true dependencies: - node-gyp-build: 4.5.0 + node-gyp-build: 4.6.0 /busboy/1.6.0: resolution: {integrity: sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==} @@ -7790,7 +6880,7 @@ packages: dependencies: clone-response: 1.0.3 get-stream: 5.2.0 - http-cache-semantics: 4.1.0 + http-cache-semantics: 4.1.1 keyv: 3.1.0 lowercase-keys: 2.0.0 normalize-url: 4.5.1 @@ -7804,7 +6894,7 @@ packages: dependencies: clone-response: 1.0.3 get-stream: 5.2.0 - http-cache-semantics: 4.1.0 + http-cache-semantics: 4.1.1 keyv: 4.5.2 lowercase-keys: 2.0.0 normalize-url: 6.1.0 @@ -7823,7 +6913,7 @@ packages: resolution: {integrity: sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==} dependencies: function-bind: 1.1.1 - get-intrinsic: 1.1.3 + get-intrinsic: 1.2.0 /caller-callsite/2.0.0: resolution: {integrity: sha512-JuG3qI4QOftFsZyOn1qq87fq5grLIyk1JYd5lJmdA+fG7aQ9pA/i3JIJGcO3q0MrRcHlOt1U+ZeHW8Dq9axALQ==} @@ -7870,6 +6960,16 @@ packages: quick-lru: 4.0.1 dev: true + /camelcase-keys/7.0.2: + resolution: {integrity: sha512-Rjs1H+A9R+Ig+4E/9oyB66UC5Mj9Xq3N//vcLf2WzgdTi/3gUu3Z9KoqmlrEG4VuuLK8wJHofxzdQXz/knhiYg==} + engines: {node: '>=12'} + dependencies: + camelcase: 6.3.0 + map-obj: 4.3.0 + quick-lru: 5.1.1 + type-fest: 1.4.0 + dev: true + /camelcase/3.0.0: resolution: {integrity: sha512-4nhGqUkc4BqbBBB4Q6zLuD7lzzrHYrjKGeYaEji/3tFR5VdJu9v+LilhGIVe8wxEJPPOeWo7eg8dwY13TZ1BNg==} engines: {node: '>=0.10.0'} @@ -7891,14 +6991,6 @@ packages: /caniuse-lite/1.0.30001447: resolution: {integrity: sha512-bdKU1BQDPeEXe9A39xJnGtY0uRq/z5osrnXUw0TcK+EYno45Y+U7QU9HhHEyzvMDffpYadFXi3idnSNkcwLkTw==} - /caniuse-lite/1.0.30001451: - resolution: {integrity: sha512-XY7UbUpGRatZzoRft//5xOa69/1iGJRBlrieH6QYrkKLIFn3m7OVEJ81dSrKoy2BnKsdbX5cLrOispZNYo9v2w==} - dev: true - - /caniuse-lite/1.0.30001458: - resolution: {integrity: sha512-lQ1VlUUq5q9ro9X+5gOEyH7i3vm+AYVT1WDCVB69XOZ17KZRhnZ9J0Sqz7wTHQaLBJccNCHq8/Ww5LlOIZbB0w==} - dev: true - /caniuse-lite/1.0.30001465: resolution: {integrity: sha512-HvjgL3MYAJjceTDCcjRnQGjwUz/5qec9n7JPOzUursUoOTIsYCSDOb1l7RsnZE8mjbxG78zVRCKfrBXyvChBag==} @@ -7911,14 +7003,6 @@ packages: engines: {node: '>=6'} dev: true - /cbor/5.2.0: - resolution: {integrity: sha512-5IMhi9e1QU76ppa5/ajP1BmMWZ2FHkhAhjeVKQ/EFCgYSEaeVaoGtL7cxJskf9oCCk+XjzaIdc3IuU/dbA/o2A==} - engines: {node: '>=6.0.0'} - dependencies: - bignumber.js: 9.1.0 - nofilter: 1.0.4 - dev: true - /cbor/8.1.0: resolution: {integrity: sha512-DwGjNW9omn6EwP70aXsn7FQJx5kO12tX0bZkaTjzdVFM6/7nhA4t0EENocKGx6D2Bch9PE2KzCUf5SceBdeijg==} engines: {node: '>=12.19'} @@ -7936,7 +7020,7 @@ packages: dependencies: assertion-error: 1.1.0 check-error: 1.0.2 - deep-eql: 4.1.2 + deep-eql: 4.1.3 get-func-name: 2.0.0 loupe: 2.3.6 pathval: 1.1.1 @@ -7970,6 +7054,7 @@ packages: ansi-styles: 3.2.1 escape-string-regexp: 1.0.5 supports-color: 5.5.0 + dev: true /chalk/4.1.2: resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} @@ -8117,11 +7202,11 @@ packages: catering: 2.1.1 module-error: 1.0.2 napi-macros: 2.0.0 - node-gyp-build: 4.5.0 + node-gyp-build: 4.6.0 dev: true - /clean-css/5.3.1: - resolution: {integrity: sha512-lCr8OHhiWCTw4v8POJovCoh4T7I9U11yVsPjMWWnnMmp9ZowCxyad1Pathle/9HjaDp+fdQKjO9fQydE6RHTZg==} + /clean-css/5.3.2: + resolution: {integrity: sha512-JVJbM+f3d3Q704rF4bqQ5UUyTtuJ0JRKNbTKVEeujCCBoMdkEi+V+e8oktO9qGQNSvHrFTM6JZRXrUvGR1czww==} engines: {node: '>= 10.0'} dependencies: source-map: 0.6.1 @@ -8362,13 +7447,13 @@ packages: resolution: {integrity: sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==} engines: {node: '>= 12'} - /commander/9.4.1: - resolution: {integrity: sha512-5EEkTNyHNGFPD2H+c/dXXfQZYa/scCKasxWcXJaWnNJ99pnQN9Vnmqow+p+PlFPE63Q6mThaZws1T+HxfpgtPw==} + /commander/9.5.0: + resolution: {integrity: sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==} engines: {node: ^12.20.0 || >=14} dev: true - /compare-versions/5.0.1: - resolution: {integrity: sha512-v8Au3l0b+Nwkp4G142JcgJFh1/TUhdxut7wzD1Nq1dyp5oa3tXaqb03EXOAB6jS4gMlalkjAUPZBMiAfKUixHQ==} + /compare-versions/5.0.3: + resolution: {integrity: sha512-4UZlZP8Z99MGEY+Ovg/uJxJuvoXuN4M6B3hKaiackiHrgzQFEe3diJi1mf1PNHbFujM7FvLrK2bpgIaImbtZ1A==} dev: true /component-emitter/1.3.0: @@ -8389,7 +7474,7 @@ packages: dependencies: buffer-from: 1.1.2 inherits: 2.0.4 - readable-stream: 2.3.7 + readable-stream: 2.3.8 typedarray: 0.0.6 dev: true @@ -8397,7 +7482,7 @@ packages: resolution: {integrity: sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==} dev: true - /consolidate/0.15.1_lodash@4.17.21: + /consolidate/0.15.1: resolution: {integrity: sha512-DW46nrsMJgy9kqAbPt5rKaCr7uFtpo4mSUvLHIUbJEjm0vo+aY5QLwBUq3FK4tRnJr/X0Psc0C4jf/h+HtXSMw==} engines: {node: '>= 0.10.0'} peerDependencies: @@ -8563,7 +7648,6 @@ packages: optional: true dependencies: bluebird: 3.7.2 - lodash: 4.17.21 dev: true /content-disposition/0.5.4: @@ -8583,14 +7667,15 @@ packages: dev: true optional: true - /content-type/1.0.4: - resolution: {integrity: sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==} + /content-type/1.0.5: + resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==} engines: {node: '>= 0.6'} dev: true optional: true /convert-source-map/1.9.0: resolution: {integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==} + dev: true /cookie-signature/1.0.6: resolution: {integrity: sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==} @@ -8608,8 +7693,8 @@ packages: dev: true optional: true - /cookiejar/2.1.3: - resolution: {integrity: sha512-JxbCBUdrfr6AQjOXrxoTvAMJO4HBTUIlBzslcJPAz+/KT8yk53fXun51u+RenNYvad/+Vc2DIz5o9UxlCDymFQ==} + /cookiejar/2.1.4: + resolution: {integrity: sha512-LDx6oHrK+PhzLKJU9j5S7/Y3jM/mUHvD/DeI1WQmJn652iPC5Y4TBzC9l+5OMOXlyTTA+SmVUPm0HQUwpD5Jqw==} dev: true optional: true @@ -8629,8 +7714,8 @@ packages: dependencies: browserslist: 4.21.4 - /core-js-pure/3.26.1: - resolution: {integrity: sha512-VVXcDpp/xJ21KdULRq/lXdLzQAtX7+37LzpyfFM973il0tWSsDEoyzG38G14AjTpK9VTfiNM9jnFauq/CpaWGQ==} + /core-js-pure/3.29.0: + resolution: {integrity: sha512-v94gUjN5UTe1n0yN/opTihJ8QBWD2O8i19RfTZR7foONPWArnjB96QA/wk5ozu1mm6ja3udQCzOzwQXTxi3xOQ==} requiresBuild: true dev: true @@ -8678,8 +7763,8 @@ packages: yaml: 1.10.2 dev: true - /cosmiconfig/8.0.0: - resolution: {integrity: sha512-da1EafcpH6b/TD8vDRaWV7xFINlHlF6zKsGwS1TsuVJTZRkquaS5HTMq7uq6h31619QjbsYl21gVDOm32KM1vQ==} + /cosmiconfig/8.1.0: + resolution: {integrity: sha512-0tLZ9URlPGU7JsKq0DQOQ3FoRsYX8xDZ7xMiATQfaiGMz7EHowNkbU9u1coAOmnh9p/1ySpm0RB3JNWRXM5GCg==} engines: {node: '>=14'} dependencies: import-fresh: 3.3.0 @@ -8727,7 +7812,7 @@ packages: /cross-fetch/2.2.6: resolution: {integrity: sha512-9JZz+vXCmfKUZ68zAptS7k4Nu8e2qcibe7WVZYps7sAgk5R8GYTc+T1WR0v1rlP9HxgARmOX1UTIJZFytajpNA==} dependencies: - node-fetch: 2.6.7 + node-fetch: 2.6.9 whatwg-fetch: 2.0.4 transitivePeerDependencies: - encoding @@ -8789,8 +7874,8 @@ packages: randomfill: 1.0.4 dev: true - /css-loader/6.7.2_webpack@5.75.0: - resolution: {integrity: sha512-oqGbbVcBJkm8QwmnNzrFrWTnudnRZC+1eXikLJl0n4ljcfotgRifpg2a1lKy8jTrc4/d9A/ap1GFq1jDKG7J+Q==} + /css-loader/6.7.3_webpack@5.75.0: + resolution: {integrity: sha512-qhOH1KlBMnZP8FzRO6YCH9UHXQhVMcEGLyNdb7Hv2cpcmJbW0YrddO+tG1ab5nT41KpHIYGsbeHqxB9xPu1pKQ==} engines: {node: '>= 12.13.0'} peerDependencies: webpack: ^5.0.0 @@ -8950,7 +8035,7 @@ packages: supports-color: 8.1.1 dev: true - /debug/4.3.4_supports-color@9.2.3: + /debug/4.3.4_supports-color@9.3.1: resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} engines: {node: '>=6.0'} peerDependencies: @@ -8960,7 +8045,7 @@ packages: optional: true dependencies: ms: 2.1.2 - supports-color: 9.2.3 + supports-color: 9.3.1 dev: true /decamelize-keys/1.1.1: @@ -8993,6 +8078,12 @@ packages: /decode-uri-component/0.2.0: resolution: {integrity: sha512-hjf+xovcEn31w/EUYdTXQh/8smFL/dzYjohQGEIgjyNavaJfBY2p5F527Bo1VPATxv0VYTUC2bOcXvqFwk78Og==} engines: {node: '>=0.10'} + dev: false + + /decode-uri-component/0.2.2: + resolution: {integrity: sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==} + engines: {node: '>=0.10'} + dev: true /decompress-response/3.3.0: resolution: {integrity: sha512-BzRPQuY1ip+qDonAOz42gRm/pg9F768C+npV/4JOsxRC2sq+Rlk+Q4ZCAsOhnIaMrgarILY+RMUIvMmmX1qAEA==} @@ -9012,8 +8103,8 @@ packages: resolution: {integrity: sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==} dev: true - /deep-eql/4.1.2: - resolution: {integrity: sha512-gT18+YW4CcW/DBNTwAmqTtkJh7f9qqScu2qFVlx7kCoeY9tlBu9cUcr7+I+Z/noG8INehS3xQgLpTtd/QUTn4w==} + /deep-eql/4.1.3: + resolution: {integrity: sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==} engines: {node: '>=6'} dependencies: type-detect: 4.0.8 @@ -9082,8 +8173,8 @@ packages: inherits: 2.0.4 dev: true - /define-properties/1.1.4: - resolution: {integrity: sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==} + /define-properties/1.2.0: + resolution: {integrity: sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==} engines: {node: '>= 0.4'} dependencies: has-property-descriptors: 1.0.0 @@ -9257,7 +8348,7 @@ packages: /difflib/0.2.4: resolution: {integrity: sha512-9YVwmMb0wQHQNr5J9m6BSj6fk4pfGITGQOOs+D9Fl+INODWFOfvhIU1hNv6GgR1RBoC/9NJcwu77zShxV0kT7w==} dependencies: - heap: 0.2.6 + heap: 0.2.7 dev: true /dijkstrajs/1.0.2: @@ -9391,10 +8482,6 @@ packages: /electron-to-chromium/1.4.284: resolution: {integrity: sha512-M8WEXFuKXMYMVr45fo8mq0wUrrJHheiKZf6BArTKk9ZBYCKJEOU5H8cdWgDT+qCVZf7Na4lVUaZsA+h6uA9+PA==} - /electron-to-chromium/1.4.291: - resolution: {integrity: sha512-8vk4rSMBh9LRfZKE6wcxOLmlfA4Xsa4v0RRwB6VJkAH703klC9XfZIocmTk2gLBzW31P6XbuNeMt1aB5aAu/2g==} - dev: true - /electron-to-chromium/1.4.328: resolution: {integrity: sha512-DE9tTy2PNmy1v55AZAO542ui+MLC2cvINMK4P2LXGsJdput/ThVG9t+QGecPuAZZSgC8XoI+Jh9M1OG9IoNSCw==} @@ -9429,6 +8516,10 @@ packages: engines: {node: '>= 4'} dev: true + /encode-utf8/1.0.3: + resolution: {integrity: sha512-ucAnuBEhUK4boH2HjVYG5Q2mQyPorvv0u/ocS+zhdw0S8AlHYY+GOFhP1Gio5z4icpP2ivFSvhtFjQi8+T9ppw==} + dev: true + /encodeurl/1.0.2: resolution: {integrity: sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==} engines: {node: '>= 0.8'} @@ -9509,34 +8600,43 @@ packages: is-arrayish: 0.2.1 dev: true - /es-abstract/1.20.4: - resolution: {integrity: sha512-0UtvRN79eMe2L+UNEF1BwRe364sj/DXhQ/k5FmivgoSdpM90b8Jc0mDzKMGo7QS0BVbOP/bTwBKNnDc9rNzaPA==} + /es-abstract/1.21.1: + resolution: {integrity: sha512-QudMsPOz86xYz/1dG1OuGBKOELjCh99IIWHLzy5znUB6j8xG2yMA7bfTV86VSqKF+Y/H08vQPR+9jyXpuC6hfg==} engines: {node: '>= 0.4'} dependencies: + available-typed-arrays: 1.0.5 call-bind: 1.0.2 + es-set-tostringtag: 2.0.1 es-to-primitive: 1.2.1 function-bind: 1.1.1 function.prototype.name: 1.1.5 - get-intrinsic: 1.1.3 + get-intrinsic: 1.2.0 get-symbol-description: 1.0.0 + globalthis: 1.0.3 + gopd: 1.0.1 has: 1.0.3 has-property-descriptors: 1.0.0 + has-proto: 1.0.1 has-symbols: 1.0.3 - internal-slot: 1.0.3 + internal-slot: 1.0.5 + is-array-buffer: 3.0.2 is-callable: 1.2.7 is-negative-zero: 2.0.2 is-regex: 1.1.4 is-shared-array-buffer: 1.0.2 is-string: 1.0.7 + is-typed-array: 1.1.10 is-weakref: 1.0.2 - object-inspect: 1.12.2 + object-inspect: 1.12.3 object-keys: 1.1.1 object.assign: 4.1.4 regexp.prototype.flags: 1.4.3 safe-regex-test: 1.0.0 string.prototype.trimend: 1.0.6 string.prototype.trimstart: 1.0.6 + typed-array-length: 1.0.4 unbox-primitive: 1.0.2 + which-typed-array: 1.1.9 dev: true /es-array-method-boxes-properly/1.0.0: @@ -9547,6 +8647,15 @@ packages: resolution: {integrity: sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ==} dev: true + /es-set-tostringtag/2.0.1: + resolution: {integrity: sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==} + engines: {node: '>= 0.4'} + dependencies: + get-intrinsic: 1.2.0 + has: 1.0.3 + has-tostringtag: 1.0.0 + dev: true + /es-shim-unscopables/1.0.0: resolution: {integrity: sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==} dependencies: @@ -9871,8 +8980,8 @@ packages: source-map: 0.6.1 dev: true - /eslint-config-prettier/8.5.0_eslint@7.32.0: - resolution: {integrity: sha512-obmWKLUNCnhtQRKc+tmnYuQl0pFU1ibYJQ5BGhTVB08bHe9wC8qUeG7c08dj9XX+AuPj1YSGSQIHl1pnDHZR0Q==} + /eslint-config-prettier/8.6.0_eslint@7.32.0: + resolution: {integrity: sha512-bAF0eLpLVqP5oEVUFKpMA+NnRFICwn9X8B5jrR9FcqnYBuPbqWEjTEspPWMj5ye6czoSLDweCzSo3Ko7gGrZaA==} hasBin: true peerDependencies: eslint: '>=7.0.0' @@ -9880,7 +8989,7 @@ packages: eslint: 7.32.0 dev: true - /eslint-config-standard/16.0.3_wnerebu6rbpsve3qx7qqwvcqtq: + /eslint-config-standard/16.0.3_s3p4dyzitdtgac5nictnavtxa4: resolution: {integrity: sha512-x4fmJL5hGqNJKGHSjnLdgA6U6h1YW/G2dW9fA+cyVur4SK6lyue8+UgNKWlZtUDTXvgKDD/Oa3GQjmB5kjtVvg==} peerDependencies: eslint: ^7.12.1 @@ -9889,21 +8998,22 @@ packages: eslint-plugin-promise: ^4.2.1 || ^5.0.0 dependencies: eslint: 7.32.0 - eslint-plugin-import: 2.26.0_ffi3uiz42rv3jyhs6cr7p7qqry + eslint-plugin-import: 2.27.5_ffi3uiz42rv3jyhs6cr7p7qqry eslint-plugin-node: 11.1.0_eslint@7.32.0 eslint-plugin-promise: 5.2.0_eslint@7.32.0 dev: true - /eslint-import-resolver-node/0.3.6: - resolution: {integrity: sha512-0En0w03NRVMn9Uiyn8YRPDKvWjxCWkslUEhGNTdGx15RvPJYQ+lbOlqrlNI2vEAs4pDYK4f/HN2TbDmk5TP0iw==} + /eslint-import-resolver-node/0.3.7: + resolution: {integrity: sha512-gozW2blMLJCeFpBwugLTGyvVjNoeo1knonXAcatC6bjPBZitotxdWf7Gimr25N4c0AAOo4eOUfaG82IJPDpqCA==} dependencies: debug: 3.2.7 + is-core-module: 2.11.0 resolve: 1.22.1 transitivePeerDependencies: - supports-color dev: true - /eslint-module-utils/2.7.4_d3sglxdl6hhgcbhsy3jaoc7rpu: + /eslint-module-utils/2.7.4_n7wmpe4hfzj47xhbzj4etqyjdi: resolution: {integrity: sha512-j4GT+rqzCoRKHwURX7pddtIPGySnX9Si/cgMI5ztrcqOPtk5dDEeZ34CQVPphnqkJytlc97Vuk05Um2mJ3gEQA==} engines: {node: '>=4'} peerDependencies: @@ -9924,10 +9034,10 @@ packages: eslint-import-resolver-webpack: optional: true dependencies: - '@typescript-eslint/parser': 4.33.0_77fvizpdb3y4icyeo2mf4eo7em + '@typescript-eslint/parser': 4.33.0_jofidmxrjzhj7l6vknpw5ecvfe debug: 3.2.7 eslint: 7.32.0 - eslint-import-resolver-node: 0.3.6 + eslint-import-resolver-node: 0.3.7 transitivePeerDependencies: - supports-color dev: true @@ -9943,8 +9053,8 @@ packages: regexpp: 3.2.0 dev: true - /eslint-plugin-import/2.26.0_ffi3uiz42rv3jyhs6cr7p7qqry: - resolution: {integrity: sha512-hYfi3FXaM8WPLf4S1cikh/r4IxnO6zrhZbEGz2b660EJRbuxgpDS5gkCuYgGWg2xxh2rBuIr4Pvhve/7c31koA==} + /eslint-plugin-import/2.27.5_ffi3uiz42rv3jyhs6cr7p7qqry: + resolution: {integrity: sha512-LmEt3GVofgiGuiE+ORpnvP+kAm3h6MLZJ4Q5HCyHADofsb4VzXFsRiWj3c0OFiV+3DWFh0qg3v9gcPlfc3zRow==} engines: {node: '>=4'} peerDependencies: '@typescript-eslint/parser': '*' @@ -9953,21 +9063,23 @@ packages: '@typescript-eslint/parser': optional: true dependencies: - '@typescript-eslint/parser': 4.33.0_77fvizpdb3y4icyeo2mf4eo7em + '@typescript-eslint/parser': 4.33.0_jofidmxrjzhj7l6vknpw5ecvfe array-includes: 3.1.6 array.prototype.flat: 1.3.1 - debug: 2.6.9 + array.prototype.flatmap: 1.3.1 + debug: 3.2.7 doctrine: 2.1.0 eslint: 7.32.0 - eslint-import-resolver-node: 0.3.6 - eslint-module-utils: 2.7.4_d3sglxdl6hhgcbhsy3jaoc7rpu + eslint-import-resolver-node: 0.3.7 + eslint-module-utils: 2.7.4_n7wmpe4hfzj47xhbzj4etqyjdi has: 1.0.3 is-core-module: 2.11.0 is-glob: 4.0.3 minimatch: 3.1.2 object.values: 1.1.6 resolve: 1.22.1 - tsconfig-paths: 3.14.1 + semver: 6.3.0 + tsconfig-paths: 3.14.2 transitivePeerDependencies: - eslint-import-resolver-typescript - eslint-import-resolver-webpack @@ -10004,13 +9116,13 @@ packages: eslint: 7.32.0 eslint-plugin-es: 3.0.1_eslint@7.32.0 eslint-utils: 2.1.0 - ignore: 5.2.0 + ignore: 5.2.4 minimatch: 3.1.2 resolve: 1.22.1 semver: 6.3.0 dev: true - /eslint-plugin-prettier/3.4.1_uxd3uwca74b5prxme7kige3a7y: + /eslint-plugin-prettier/3.4.1_2fbugv7hbzbahj5qm3ztcno6by: resolution: {integrity: sha512-htg25EUYUeIhKHXjOinK4BgCcDwtLHjqaxCDsMy5nbnUMkKFvIhMVCp+5GFUXQ4Nr8lBsPqtGAqBenbpFqAA2g==} engines: {node: '>=6.0.0'} peerDependencies: @@ -10022,8 +9134,8 @@ packages: optional: true dependencies: eslint: 7.32.0 - eslint-config-prettier: 8.5.0_eslint@7.32.0 - prettier: 2.8.0 + eslint-config-prettier: 8.6.0_eslint@7.32.0 + prettier: 2.8.4 prettier-linter-helpers: 1.0.0 dev: true @@ -10113,13 +9225,13 @@ packages: eslint-utils: 2.1.0 eslint-visitor-keys: 2.1.0 espree: 7.3.1 - esquery: 1.4.0 + esquery: 1.5.0 esutils: 2.0.3 fast-deep-equal: 3.1.3 file-entry-cache: 6.0.1 functional-red-black-tree: 1.0.1 glob-parent: 5.1.2 - globals: 13.18.0 + globals: 13.20.0 ignore: 4.0.6 import-fresh: 3.3.0 imurmurhash: 0.1.4 @@ -10163,8 +9275,8 @@ packages: engines: {node: '>=4'} hasBin: true - /esquery/1.4.0: - resolution: {integrity: sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==} + /esquery/1.5.0: + resolution: {integrity: sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==} engines: {node: '>=0.10'} dependencies: estraverse: 5.3.0 @@ -10265,7 +9377,7 @@ packages: ethjs-util: 0.1.6 json-rpc-engine: 3.8.0 pify: 2.3.0 - tape: 4.16.1 + tape: 4.16.2 transitivePeerDependencies: - supports-color dev: true @@ -10284,20 +9396,6 @@ packages: - supports-color dev: false - /eth-block-tracker/4.4.3_@babel+core@7.20.2: - resolution: {integrity: sha512-A8tG4Z4iNg4mw5tP1Vung9N9IjgMNqpiMoJ/FouSFwNCGHv2X0mmOYwtQOJzki6XN7r7Tyo01S29p7b224I4jw==} - dependencies: - '@babel/plugin-transform-runtime': 7.19.6_@babel+core@7.20.2 - '@babel/runtime': 7.20.13 - eth-query: 2.1.2 - json-rpc-random-id: 1.0.1 - pify: 3.0.0 - safe-event-emitter: 1.0.1 - transitivePeerDependencies: - - '@babel/core' - - supports-color - dev: false - /eth-ens-namehash/2.0.8: resolution: {integrity: sha512-VWEI1+KJfz4Km//dadyvBBoBeSQ0MHTXPvr8UIXiLW6IanxvAV+DmlZAijZwAyggqGUfwQBeHf7tc9wzc1piSw==} dependencies: @@ -10317,7 +9415,7 @@ packages: '@solidity-parser/parser': 0.14.5 cli-table3: 0.5.1 colors: 1.4.0 - ethereum-cryptography: 1.1.2 + ethereum-cryptography: 1.2.0 ethers: 4.0.49 fs-readdir-recursive: 1.1.0 lodash: 4.17.21 @@ -10370,7 +9468,7 @@ packages: json-rpc-error: 2.0.0 json-stable-stringify: 1.0.2 promise-to-callback: 1.0.0 - tape: 4.16.1 + tape: 4.16.2 transitivePeerDependencies: - supports-color dev: true @@ -10505,7 +9603,7 @@ packages: create-hash: 1.2.0 create-hmac: 1.1.7 hash.js: 1.1.7 - keccak: 3.0.2 + keccak: 3.0.3 pbkdf2: 3.1.2 randombytes: 2.1.0 safe-buffer: 5.2.1 @@ -10513,22 +9611,22 @@ packages: secp256k1: 4.0.3 setimmediate: 1.0.5 - /ethereum-cryptography/1.1.2: - resolution: {integrity: sha512-XDSJlg4BD+hq9N2FjvotwUET9Tfxpxc3kWGE2AqUG5vcbeunnbImVk3cj6e/xT3phdW21mE8R5IugU4fspQDcQ==} + /ethereum-cryptography/1.2.0: + resolution: {integrity: sha512-6yFQC9b5ug6/17CQpCyE3k9eKBMdhyVjzUy1WkiuY/E4vj/SXDBbCw8QEIaXqf0Mf2SnY6RmpDcwlUmBSS0EJw==} dependencies: - '@noble/hashes': 1.1.2 - '@noble/secp256k1': 1.6.3 - '@scure/bip32': 1.1.0 - '@scure/bip39': 1.1.0 + '@noble/hashes': 1.2.0 + '@noble/secp256k1': 1.7.1 + '@scure/bip32': 1.1.5 + '@scure/bip39': 1.1.1 dev: true - /ethereum-waffle/3.4.4_typescript@4.9.3: + /ethereum-waffle/3.4.4_typescript@4.9.5: resolution: {integrity: sha512-PA9+jCjw4WC3Oc5ocSMBj5sXvueWQeAbvCA+hUlb6oFgwwKyq5ka3bWQ7QZcjzIX+TdFkxP4IbFmoY2D8Dkj9Q==} engines: {node: '>=10.0'} hasBin: true dependencies: '@ethereum-waffle/chai': 3.4.4 - '@ethereum-waffle/compiler': 3.4.4_typescript@4.9.3 + '@ethereum-waffle/compiler': 3.4.4_typescript@4.9.5 '@ethereum-waffle/mock-contract': 3.4.4 '@ethereum-waffle/provider': 3.4.4 ethers: 5.7.2 @@ -10696,7 +9794,7 @@ packages: dependencies: async: 2.6.4 async-eventemitter: 0.2.4 - core-js-pure: 3.26.1 + core-js-pure: 3.29.0 ethereumjs-account: 3.0.0 ethereumjs-block: 2.2.2 ethereumjs-blockchain: 4.0.4 @@ -10895,7 +9993,7 @@ packages: array-flatten: 1.1.1 body-parser: 1.20.1 content-disposition: 0.5.4 - content-type: 1.0.4 + content-type: 1.0.5 cookie: 0.5.0 cookie-signature: 1.0.6 debug: 2.6.9 @@ -11170,6 +10268,12 @@ packages: resolution: {integrity: sha512-rDjbZUKpN8OYhB0IE/vY/I8UWO/602IIJEU/76Tv4LvYnwHCk0BCsvz4eRr9n+FQcri7L5cyaXOo0+/Kh4HisA==} dev: true + /fmix/0.1.0: + resolution: {integrity: sha512-Y6hyofImk9JdzU8k5INtTXX1cu8LDlePWDFU5sftm9H+zKCr5SGrVjdhkvsim646cw5zD0nADj8oHyXMZmCZ9w==} + dependencies: + imul: 1.0.1 + dev: true + /focus-visible/5.2.0: resolution: {integrity: sha512-Rwix9pBtC1Nuy5wysTmKy+UjbDJpIfg8eHjw0rjZ1mX4GNLz1Bmd16uDpI3Gk1i70Fgcs8Csg2lPm8HULFg9DQ==} dev: false @@ -11383,8 +10487,8 @@ packages: engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.2 - define-properties: 1.1.4 - es-abstract: 1.20.4 + define-properties: 1.2.0 + es-abstract: 1.21.1 functions-have-names: 1.2.3 dev: true @@ -11485,6 +10589,7 @@ packages: /gensync/1.0.0-beta.2: resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} engines: {node: '>=6.9.0'} + dev: true /get-caller-file/1.0.3: resolution: {integrity: sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==} @@ -11498,8 +10603,8 @@ packages: resolution: {integrity: sha512-Hm0ixYtaSZ/V7C8FJrtZIuBBI+iSgL+1Aq82zSu8VQNB4S3Gk8e7Qs3VwBDJAhmRZcFqkl3tQu36g/Foh5I5ig==} dev: true - /get-intrinsic/1.1.3: - resolution: {integrity: sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==} + /get-intrinsic/1.2.0: + resolution: {integrity: sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q==} dependencies: function-bind: 1.1.1 has: 1.0.3 @@ -11556,7 +10661,7 @@ packages: engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.2 - get-intrinsic: 1.1.3 + get-intrinsic: 1.2.0 dev: true /get-value/2.0.6: @@ -11667,7 +10772,7 @@ packages: fs.realpath: 1.0.0 inflight: 1.0.6 inherits: 2.0.4 - minimatch: 5.0.1 + minimatch: 5.1.6 once: 1.4.0 dev: true @@ -11697,9 +10802,10 @@ packages: /globals/11.12.0: resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} engines: {node: '>=4'} + dev: true - /globals/13.18.0: - resolution: {integrity: sha512-/mR4KI8Ps2spmoc0Ulu9L7agOF0du1CZNQ3dke8yItYlyKNmGrkONemBbd6V8UTc1Wgcqn21t3WYB7dbRmh6/A==} + /globals/13.20.0: + resolution: {integrity: sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==} engines: {node: '>=8'} dependencies: type-fest: 0.20.2 @@ -11710,6 +10816,13 @@ packages: engines: {node: '>=0.10.0'} dev: true + /globalthis/1.0.3: + resolution: {integrity: sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==} + engines: {node: '>= 0.4'} + dependencies: + define-properties: 1.2.0 + dev: true + /globalyzer/0.1.0: resolution: {integrity: sha512-40oNTM9UfG6aBmuKxk/giHn5nQ8RVz/SS4Ir6zgzOv9/qC3kKZ9v4etGTcJbEl/NyVQH7FGU7d+X1egr57Md2Q==} dev: false @@ -11756,11 +10869,10 @@ packages: /gopd/1.0.1: resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} dependencies: - get-intrinsic: 1.1.3 - dev: false + get-intrinsic: 1.2.0 - /got/11.8.5: - resolution: {integrity: sha512-o0Je4NvQObAuZPHLFoRSkdG2lTgtcynqymzg2Vupdx6PorhaT5MCbIyXG6d4D94kk8ZG57QeosgdiqfJWhEhlQ==} + /got/11.8.6: + resolution: {integrity: sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g==} engines: {node: '>=10.19.0'} dependencies: '@sindresorhus/is': 4.6.0 @@ -11847,7 +10959,7 @@ packages: engines: {node: '>=6'} dev: true - /hardhat-abi-exporter/2.10.1_hardhat@2.12.2: + /hardhat-abi-exporter/2.10.1_hardhat@2.13.0: resolution: {integrity: sha512-X8GRxUTtebMAd2k4fcPyVnCdPa6dYK4lBsrwzKP5yiSq4i+WadWPIumaLfce53TUf/o2TnLpLOduyO1ylE2NHQ==} engines: {node: '>=14.14.0'} peerDependencies: @@ -11855,31 +10967,31 @@ packages: dependencies: '@ethersproject/abi': 5.7.0 delete-empty: 3.0.0 - hardhat: 2.12.2_2dtigtkb225m7ii7q45utxqwgi + hardhat: 2.13.0_6qtx7vkbdhwvdm4crzlegk4mvi dev: true - /hardhat-contract-sizer/2.8.0_hardhat@2.12.2: + /hardhat-contract-sizer/2.8.0_hardhat@2.13.0: resolution: {integrity: sha512-jXt2Si3uIDx5z99J+gvKa0yvIw156pE4dpH9X/PvTQv652BUd+qGj7WT93PXnHXGh5qhQLkjDYeZMYNOThfjFg==} peerDependencies: hardhat: ^2.0.0 dependencies: chalk: 4.1.2 cli-table3: 0.6.3 - hardhat: 2.12.2_2dtigtkb225m7ii7q45utxqwgi + hardhat: 2.13.0_6qtx7vkbdhwvdm4crzlegk4mvi strip-ansi: 6.0.1 dev: true - /hardhat-docgen/1.3.0_lfwxduevmqdtswpjkbv2koayie: + /hardhat-docgen/1.3.0_hardhat@2.13.0: resolution: {integrity: sha512-paaiOHjJFLCLz2/qM1TQ7ZEG+Vy+LBvJL+SW4A64ZhBnVnyoZ/zv9DvEuawaWhqP5P7AOM6r22reVz4ecWgW7A==} engines: {node: '>=14.14.0'} peerDependencies: hardhat: ^2.0.0 dependencies: - css-loader: 6.7.2_webpack@5.75.0 - hardhat: 2.12.2_2dtigtkb225m7ii7q45utxqwgi + css-loader: 6.7.3_webpack@5.75.0 + hardhat: 2.13.0_6qtx7vkbdhwvdm4crzlegk4mvi html-webpack-plugin: 5.5.0_webpack@5.75.0 vue: 2.7.14 - vue-loader: 15.10.1_36bk4haztx5nmdoe37hieqy74q + vue-loader: 15.10.1_y5o36p7qrshhm4v7l6yk7rwfsu vue-router: 3.6.5_vue@2.7.14 vue-template-compiler: 2.7.14 webpack: 5.75.0 @@ -11945,22 +11057,31 @@ packages: - whiskers dev: true - /hardhat-gas-reporter/1.0.9_hardhat@2.12.2: + /hardhat-gas-reporter/1.0.9_hardhat@2.13.0: resolution: {integrity: sha512-INN26G3EW43adGKBNzYWOlI3+rlLnasXTwW79YNnUhXPDa+yHESgt639dJEs37gCjhkbNKcRRJnomXEuMFBXJg==} peerDependencies: hardhat: ^2.0.2 dependencies: array-uniq: 1.0.3 eth-gas-reporter: 0.2.25 - hardhat: 2.12.2_2dtigtkb225m7ii7q45utxqwgi + hardhat: 2.13.0_6qtx7vkbdhwvdm4crzlegk4mvi sha1: 1.1.1 transitivePeerDependencies: - '@codechecks/client' dev: true - /hardhat/2.12.2_2dtigtkb225m7ii7q45utxqwgi: - resolution: {integrity: sha512-f3ZhzXy1uyQv0UXnAQ8GCBOWjzv++WJNb7bnm10SsyC3dB7vlPpsMWBNhq7aoRxKrNhX9tCev81KFV3i5BTeMQ==} - engines: {node: ^14.0.0 || ^16.0.0 || ^18.0.0} + /hardhat-preprocessor/0.1.5_hardhat@2.13.0: + resolution: {integrity: sha512-j8m44mmPxpxAAd0G8fPHRHOas/INZdzptSur0TNJvMEGcFdLDhbHHxBcqZVQ/bmiW42q4gC60AP4CXn9EF018g==} + peerDependencies: + hardhat: ^2.0.5 + dependencies: + hardhat: 2.13.0_6qtx7vkbdhwvdm4crzlegk4mvi + murmur-128: 0.2.1 + dev: true + + /hardhat/2.13.0_6qtx7vkbdhwvdm4crzlegk4mvi: + resolution: {integrity: sha512-ZlzBOLML1QGlm6JWyVAG8lVTEAoOaVm1in/RU2zoGAnYEoD1Rp4T+ZMvrLNhHaaeS9hfjJ1gJUBfiDr4cx+htQ==} + engines: {node: '>=14.0.0'} hasBin: true peerDependencies: ts-node: '*' @@ -11983,7 +11104,7 @@ packages: '@nomicfoundation/ethereumjs-tx': 4.0.0 '@nomicfoundation/ethereumjs-util': 8.0.0 '@nomicfoundation/ethereumjs-vm': 6.0.0 - '@nomicfoundation/solidity-analyzer': 0.1.0 + '@nomicfoundation/solidity-analyzer': 0.1.1 '@sentry/node': 5.30.0 '@types/bn.js': 5.1.1 '@types/lru-cache': 5.1.1 @@ -11997,30 +11118,30 @@ packages: debug: 4.3.4 enquirer: 2.3.6 env-paths: 2.2.1 - ethereum-cryptography: 1.1.2 + ethereum-cryptography: 1.2.0 ethereumjs-abi: 0.6.8 find-up: 2.1.0 fp-ts: 1.19.3 fs-extra: 7.0.1 glob: 7.2.0 - immutable: 4.1.0 + immutable: 4.2.4 io-ts: 1.10.4 - keccak: 3.0.2 + keccak: 3.0.3 lodash: 4.17.21 mnemonist: 0.38.5 - mocha: 10.1.0 + mocha: 10.2.0 p-map: 4.0.0 qs: 6.11.0 - raw-body: 2.5.1 + raw-body: 2.5.2 resolve: 1.17.0 semver: 6.3.0 solc: 0.7.3_debug@4.3.4 source-map-support: 0.5.21 stacktrace-parser: 0.1.10 - ts-node: 10.9.1_vw4thnff6td543szquzqpxymti + ts-node: 10.9.1_prfxyxghnskheluimpb6dvby4q tsort: 0.0.1 - typescript: 4.9.3 - undici: 5.12.0 + typescript: 4.9.5 + undici: 5.20.0 uuid: 8.3.2 ws: 7.5.9 transitivePeerDependencies: @@ -12053,6 +11174,7 @@ packages: /has-flag/3.0.0: resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} engines: {node: '>=4'} + dev: true /has-flag/4.0.0: resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} @@ -12062,7 +11184,12 @@ packages: /has-property-descriptors/1.0.0: resolution: {integrity: sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==} dependencies: - get-intrinsic: 1.1.3 + get-intrinsic: 1.2.0 + dev: true + + /has-proto/1.0.1: + resolution: {integrity: sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==} + engines: {node: '>= 0.4'} dev: true /has-symbols/1.0.3: @@ -12121,7 +11248,7 @@ packages: engines: {node: '>=4'} dependencies: inherits: 2.0.4 - readable-stream: 3.6.0 + readable-stream: 3.6.2 safe-buffer: 5.2.1 /hash-obj/4.0.0: @@ -12229,6 +11356,10 @@ packages: resolution: {integrity: sha512-MzzWcnfB1e4EG2vHi3dXHoBupmuXNZzx6pY6HldVS55JKKBoq3xOyzfSaZRkJp37HIhEYC78knabHff3zc4dQQ==} dev: true + /heap/0.2.7: + resolution: {integrity: sha512-2bsegYkkHO+h/9MGbn6KWcE45cHZgPANo5LXF7EvWdT0yT2EguSVO1nDgU5c8+ZOPwp2vMNa7YFsJhVcDR9Sdg==} + dev: true + /hmac-drbg/1.0.1: resolution: {integrity: sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==} dependencies: @@ -12272,12 +11403,12 @@ packages: hasBin: true dependencies: camel-case: 4.1.2 - clean-css: 5.3.1 + clean-css: 5.3.2 commander: 8.3.0 he: 1.2.0 param-case: 3.0.4 relateurl: 0.2.7 - terser: 5.15.1 + terser: 5.16.5 dev: true /html-webpack-plugin/5.5.0_webpack@5.75.0: @@ -12317,6 +11448,11 @@ packages: resolution: {integrity: sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==} dev: true + /http-cache-semantics/4.1.1: + resolution: {integrity: sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==} + dev: true + optional: true + /http-errors/2.0.0: resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==} engines: {node: '>= 0.8'} @@ -12458,8 +11594,8 @@ packages: resolution: {integrity: sha512-HR7EVodfFUdQCTIeySw+WDRFJlPcLOJbXfwwZ7Oom6tjsvZ3bOkCDJHehQC3nxJrv7+f9XecwazynjU8e4Vw3Q==} dev: true - /immutable/4.1.0: - resolution: {integrity: sha512-oNkuqVTA8jqG1Q6c+UglTOD1xhC1BtjKI7XkCXRkZHrN5m18/XsnUp8Q89GkQO/z+0WjonSvl0FLhDYftp46nQ==} + /immutable/4.2.4: + resolution: {integrity: sha512-WDxL3Hheb1JkRN3sQkyujNlL/xRjAo3rJtaU5xeufUauG66JdMr32bLj4gF+vWl84DIA3Zxw7tiAjneYzRRw+w==} dev: true /import-cwd/2.1.0: @@ -12501,6 +11637,11 @@ packages: resolve-cwd: 3.0.0 dev: true + /imul/1.0.1: + resolution: {integrity: sha512-WFAgfwPLAjU66EKt6vRdTlKj4nAgIDQzh29JonLa4Bqtl6D8JrIMvWjCnx7xEjVNmP3U0fM5o8ZObk7d0f62bA==} + engines: {node: '>=0.10.0'} + dev: true + /imurmurhash/0.1.4: resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} engines: {node: '>=0.8.19'} @@ -12536,11 +11677,11 @@ packages: resolution: {integrity: sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q==} dev: false - /internal-slot/1.0.3: - resolution: {integrity: sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==} + /internal-slot/1.0.5: + resolution: {integrity: sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==} engines: {node: '>= 0.4'} dependencies: - get-intrinsic: 1.1.3 + get-intrinsic: 1.2.0 has: 1.0.3 side-channel: 1.0.4 dev: true @@ -12622,6 +11763,14 @@ packages: call-bind: 1.0.2 has-tostringtag: 1.0.0 + /is-array-buffer/3.0.2: + resolution: {integrity: sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==} + dependencies: + call-bind: 1.0.2 + get-intrinsic: 1.2.0 + is-typed-array: 1.1.10 + dev: true + /is-arrayish/0.2.1: resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} dev: true @@ -12936,7 +12085,6 @@ packages: for-each: 0.3.3 gopd: 1.0.1 has-tostringtag: 1.0.0 - dev: false /is-typedarray/1.0.0: resolution: {integrity: sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==} @@ -13528,7 +12676,7 @@ packages: resolution: {integrity: sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==} engines: {node: '>= 10.13.0'} dependencies: - '@types/node': 18.14.2 + '@types/node': 12.20.55 merge-stream: 2.0.0 supports-color: 8.1.1 dev: true @@ -13653,6 +12801,7 @@ packages: resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==} engines: {node: '>=4'} hasBin: true + dev: true /json-buffer/3.0.0: resolution: {integrity: sha512-CuUqjv0FUZIdXkHPI8MezCnFCdaTAacej1TZYulLoAg1h/PhwkdXFN4V/gzY4g+fMBCOV2xF+rp7t2XD2ns/NQ==} @@ -13738,8 +12887,8 @@ packages: hasBin: true dev: true - /json5/1.0.1: - resolution: {integrity: sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==} + /json5/1.0.2: + resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==} hasBin: true dependencies: minimist: 1.2.8 @@ -13749,6 +12898,7 @@ packages: resolution: {integrity: sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==} engines: {node: '>=6'} hasBin: true + dev: true /jsonc-parser/3.2.0: resolution: {integrity: sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==} @@ -13824,7 +12974,17 @@ packages: dependencies: node-addon-api: 2.0.2 node-gyp-build: 4.5.0 - readable-stream: 3.6.0 + readable-stream: 3.6.2 + dev: false + + /keccak/3.0.3: + resolution: {integrity: sha512-JZrLIAJWuZxKbCilMpNz5Vj7Vtb4scDG3dMXLOsbzBmQGyjwE61BbW7bJkfKKCShXiQZt3T6sBgALRtmd+nZaQ==} + engines: {node: '>=10.0.0'} + requiresBuild: true + dependencies: + node-addon-api: 2.0.2 + node-gyp-build: 4.6.0 + readable-stream: 3.6.2 /keyv/3.1.0: resolution: {integrity: sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==} @@ -13981,7 +13141,7 @@ packages: engines: {node: '>=4'} dependencies: inherits: 2.0.4 - readable-stream: 2.3.7 + readable-stream: 2.3.8 xtend: 4.0.2 dev: true @@ -13990,7 +13150,7 @@ packages: engines: {node: '>=6'} dependencies: inherits: 2.0.4 - readable-stream: 2.3.7 + readable-stream: 2.3.8 xtend: 4.0.2 dev: true @@ -13999,7 +13159,7 @@ packages: engines: {node: '>=6'} dependencies: inherits: 2.0.4 - readable-stream: 3.6.0 + readable-stream: 3.6.2 xtend: 4.0.2 dev: true @@ -14055,7 +13215,7 @@ packages: /level-post/1.0.7: resolution: {integrity: sha512-PWYqG4Q00asOrLhX7BejSajByB4EmG2GaKHfj3h5UmmZ2duciXLPGYWIjBzLECFWUGOZWlm5B20h/n3Gs3HKew==} dependencies: - ltgt: 2.2.1 + ltgt: 2.1.3 dev: true /level-sublevel/5.2.3: @@ -14077,7 +13237,7 @@ packages: ltgt: 2.1.3 pull-defer: 0.2.3 pull-level: 2.0.4 - pull-stream: 3.6.14 + pull-stream: 3.7.0 typewiselite: 1.0.0 xtend: 4.0.2 dev: true @@ -14114,7 +13274,7 @@ packages: engines: {node: '>=6'} dependencies: inherits: 2.0.4 - readable-stream: 2.3.7 + readable-stream: 2.3.8 xtend: 4.0.2 dev: true @@ -14123,7 +13283,7 @@ packages: engines: {node: '>=6'} dependencies: inherits: 2.0.4 - readable-stream: 3.6.0 + readable-stream: 3.6.2 xtend: 4.0.2 dev: true @@ -14227,17 +13387,17 @@ packages: dependencies: cli-truncate: 3.1.0 colorette: 2.0.19 - commander: 9.4.1 - debug: 4.3.4_supports-color@9.2.3 + commander: 9.5.0 + debug: 4.3.4_supports-color@9.3.1 execa: 5.1.1 lilconfig: 2.0.5 listr2: 4.0.5 micromatch: 4.0.5 normalize-path: 3.0.0 - object-inspect: 1.12.2 + object-inspect: 1.12.3 pidtree: 0.5.0 string-argv: 0.3.1 - supports-color: 9.2.3 + supports-color: 9.3.1 yaml: 1.10.2 transitivePeerDependencies: - enquirer @@ -14257,7 +13417,7 @@ packages: log-update: 4.0.0 p-map: 4.0.0 rfdc: 1.3.0 - rxjs: 7.5.7 + rxjs: 7.8.0 through: 2.3.8 wrap-ansi: 7.0.0 dev: true @@ -14284,7 +13444,7 @@ packages: dependencies: big.js: 5.2.2 emojis-list: 3.0.0 - json5: 1.0.1 + json5: 1.0.2 dev: true /loader-utils/2.0.4: @@ -14899,7 +14059,7 @@ packages: level-ws: 0.0.0 levelup: 1.3.9 memdown: 1.4.1 - readable-stream: 2.3.7 + readable-stream: 2.3.8 rlp: 2.2.7 semaphore: 1.1.0 dev: true @@ -14911,7 +14071,7 @@ packages: ethereumjs-util: 5.2.1 level-mem: 3.0.1 level-ws: 1.0.0 - readable-stream: 3.6.0 + readable-stream: 3.6.2 rlp: 2.2.7 semaphore: 1.1.0 dev: true @@ -14923,7 +14083,7 @@ packages: ethereumjs-util: 7.1.5 level-mem: 5.0.1 level-ws: 2.0.0 - readable-stream: 3.6.0 + readable-stream: 3.6.2 semaphore-async-await: 1.5.1 dev: true @@ -15382,6 +14542,13 @@ packages: brace-expansion: 2.0.1 dev: true + /minimatch/5.1.6: + resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==} + engines: {node: '>=10'} + dependencies: + brace-expansion: 2.0.1 + dev: true + /minimist-options/4.1.0: resolution: {integrity: sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==} engines: {node: '>= 6'} @@ -15484,7 +14651,7 @@ packages: engines: {node: '>=4'} deprecated: This package is broken and no longer maintained. 'mkdirp' itself supports promises now, please switch to that. dependencies: - mkdirp: 1.0.4 + mkdirp: 2.1.5 dev: true optional: true @@ -15508,14 +14675,21 @@ packages: hasBin: true dev: true + /mkdirp/2.1.5: + resolution: {integrity: sha512-jbjfql+shJtAPrFoKxHOXip4xS+kul9W3OzfzzrqueWK2QMGon2bFH2opl6W9EagBThjEz+iysyi/swOoVfB/w==} + engines: {node: '>=10'} + hasBin: true + dev: true + optional: true + /mnemonist/0.38.5: resolution: {integrity: sha512-bZTFT5rrPKtPJxj8KSV0WkPyNxl72vQepqqVUAW2ARUpUSF2qXMB6jZj7hW5/k7C1rtpzqbD/IIbJwLXUjCHeg==} dependencies: obliterator: 2.0.4 dev: true - /mocha/10.1.0: - resolution: {integrity: sha512-vUF7IYxEoN7XhQpFLxQAEMtE4W91acW4B6En9l97MwE9stL1A9gusXfoHZCLVHDUJ/7V5+lbCM6yMqzo5vNymg==} + /mocha/10.2.0: + resolution: {integrity: sha512-IDY7fl/BecMwFHzoqF2sg/SHHANeBoMMXFlS9r0OXKDssYE1M5O43wUY/9BVPeIvfH2zmEbBfseqN9gBQZzXkg==} engines: {node: '>= 14.0.0'} hasBin: true dependencies: @@ -15676,6 +14850,14 @@ packages: dev: true optional: true + /murmur-128/0.2.1: + resolution: {integrity: sha512-WseEgiRkI6aMFBbj8Cg9yBj/y+OdipwVC7zUo3W2W1JAJITwouUOtpqsmGSg67EQmwwSyod7hsVsWY5LsrfQVg==} + dependencies: + encode-utf8: 1.0.3 + fmix: 0.1.0 + imul: 1.0.1 + dev: true + /nan/2.17.0: resolution: {integrity: sha512-2ZTgtl0nJsO0KQCjEpxcIr5D+Yv90plTitZt9JBfQvVJDS5seMl3FOvsh3+9CoYWXf/1l5OaZzzF6nDm4cagaQ==} dev: true @@ -15946,10 +15128,28 @@ packages: optional: true dependencies: whatwg-url: 5.0.0 + dev: false + + /node-fetch/2.6.9: + resolution: {integrity: sha512-DJm/CJkZkRjKKj4Zi4BsKVZh3ValV5IR5s7LVZnW+6YMh0W1BfNA8XSs6DLMGYlId5F3KnA70uu2qepcR08Qqg==} + engines: {node: 4.x || >=6.0.0} + peerDependencies: + encoding: ^0.1.0 + peerDependenciesMeta: + encoding: + optional: true + dependencies: + whatwg-url: 5.0.0 + dev: true /node-gyp-build/4.5.0: resolution: {integrity: sha512-2iGbaQBV+ITgCz76ZEjmhUKAKVf7xfY1sRl4UiKQspfZMH2h06SyhNsnSVy50cwkFQDGLyif6m/6uFXHkOZ6rg==} hasBin: true + dev: false + + /node-gyp-build/4.6.0: + resolution: {integrity: sha512-NTZVKn9IylLwUzaKjkas1e4u2DLNcV4rdYagA4PWdPwW87Bi7z+BznyKSRwS/761tV/lzCGXplWsiaMjLqP2zQ==} + hasBin: true /node-gyp/8.4.1: resolution: {integrity: sha512-olTJRgUtAb/hOXG0E93wZDs5YiJlgbXxTwQAFHyNlRsXQnYzUaF2aGgujZbw+hR8aF4ZG/rST57bWMWD16jr9w==} @@ -16007,11 +15207,6 @@ packages: - supports-color dev: true - /nofilter/1.0.4: - resolution: {integrity: sha512-N8lidFp+fCz+TD51+haYdbDGrcBWwuHX40F5+z0qkUjMJ5Tp+rdSuAkMJ9N9eoolDlEVTf6u5icM+cNKkKW2mA==} - engines: {node: '>=8'} - dev: true - /nofilter/3.1.0: resolution: {integrity: sha512-l2NNj07e9afPnhAhvgVrCD/oy2Ai1yfLpuo3EpiO1jFTsB4sFz6oIfAfSZyQzVpkZQ9xS8ZS5g1jCBgq4Hwo0g==} engines: {node: '>=12.19'} @@ -16152,15 +15347,15 @@ packages: engines: {node: '>= 6'} dev: true - /object-inspect/1.12.2: - resolution: {integrity: sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==} + /object-inspect/1.12.3: + resolution: {integrity: sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==} /object-is/1.1.5: resolution: {integrity: sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==} engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.2 - define-properties: 1.1.4 + define-properties: 1.2.0 dev: true /object-keys/0.2.0: @@ -16192,7 +15387,7 @@ packages: resolution: {integrity: sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==} engines: {node: '>= 0.4'} dependencies: - define-properties: 1.1.4 + define-properties: 1.2.0 function-bind: 1.1.1 has-symbols: 1.0.3 object-keys: 1.1.1 @@ -16203,7 +15398,7 @@ packages: engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.2 - define-properties: 1.1.4 + define-properties: 1.2.0 has-symbols: 1.0.3 object-keys: 1.1.1 dev: true @@ -16214,8 +15409,8 @@ packages: dependencies: array.prototype.reduce: 1.0.5 call-bind: 1.0.2 - define-properties: 1.1.4 - es-abstract: 1.20.4 + define-properties: 1.2.0 + es-abstract: 1.21.1 dev: true /object.pick/1.3.0: @@ -16230,8 +15425,8 @@ packages: engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.2 - define-properties: 1.1.4 - es-abstract: 1.20.4 + define-properties: 1.2.0 + es-abstract: 1.21.1 dev: true /obliterator/2.0.4: @@ -16524,8 +15719,8 @@ packages: - supports-color dev: true - /patch-package/6.5.0: - resolution: {integrity: sha512-tC3EqJmo74yKqfsMzELaFwxOAu6FH6t+FzFOsnWAuARm7/n2xB5AOeOueE221eM9gtMuIKMKpF9tBy/X2mNP0Q==} + /patch-package/6.5.1: + resolution: {integrity: sha512-I/4Zsalfhc6bphmJTlrLoOcAF87jcxko4q0qsv4bGcurbr8IskEOtdnt9iCmsQVGL1B+iUhSQqweyTLJfCF9rA==} engines: {node: '>=10', npm: '>5'} hasBin: true dependencies: @@ -16533,7 +15728,7 @@ packages: chalk: 4.1.2 cross-spawn: 6.0.5 find-yarn-workspace-root: 2.0.0 - fs-extra: 7.0.1 + fs-extra: 9.1.0 is-ci: 2.0.0 klaw-sync: 6.0.0 minimist: 1.2.8 @@ -16809,23 +16004,9 @@ packages: ts-node: optional: true dependencies: - lilconfig: 2.1.0 - postcss: 8.4.21 - yaml: 1.10.2 - dev: true - - /postcss-loader/6.2.1_6jdsrmfenkuhhw3gx4zvjlznce: - resolution: {integrity: sha512-WbbYpmAaKcux/P66bZ40bpWsBucjx/TTgVVzRZ9yUO8yQfVBlameJ0ZGVaPfH64hNSBh63a+ICP5nqOpBA0w+Q==} - engines: {node: '>= 12.13.0'} - peerDependencies: - postcss: ^7.0.0 || ^8.0.1 - webpack: ^5.0.0 - dependencies: - cosmiconfig: 7.1.0 - klona: 2.0.5 + lilconfig: 2.0.6 postcss: 8.4.21 - semver: 7.3.8 - webpack: 5.75.0 + yaml: 1.10.2 dev: true /postcss-loader/6.2.1_postcss@8.4.19: @@ -16841,7 +16022,7 @@ packages: semver: 7.3.8 dev: true - /postcss-loader/6.2.1_upg3rk2kpasnbk27hkqapxaxfq: + /postcss-loader/6.2.1_postcss@8.4.21: resolution: {integrity: sha512-WbbYpmAaKcux/P66bZ40bpWsBucjx/TTgVVzRZ9yUO8yQfVBlameJ0ZGVaPfH64hNSBh63a+ICP5nqOpBA0w+Q==} engines: {node: '>= 12.13.0'} peerDependencies: @@ -16850,9 +16031,8 @@ packages: dependencies: cosmiconfig: 7.1.0 klona: 2.0.5 - postcss: 8.4.19 + postcss: 8.4.21 semver: 7.3.8 - webpack: 5.75.0 dev: true /postcss-modules-extract-imports/3.0.0_postcss@8.4.21: @@ -17033,14 +16213,14 @@ packages: fast-diff: 1.2.0 dev: true - /prettier-plugin-solidity/1.1.2_prettier@2.8.0: - resolution: {integrity: sha512-KC5oNbFJfyBaFiO0kl56J6AXnDmr9tUlBV1iqo864x4KQrKYKaBZvW9jhT2oC0NHoNp7/GoMJNxqL8pp8k7C/g==} + /prettier-plugin-solidity/1.1.3_prettier@2.8.4: + resolution: {integrity: sha512-fQ9yucPi2sBbA2U2Xjh6m4isUTJ7S7QLc/XDDsktqqxYfTwdYKJ0EnnywXHwCGAaYbQNK+HIYPL1OemxuMsgeg==} engines: {node: '>=12'} peerDependencies: prettier: '>=2.3.0 || >=3.0.0-alpha.0' dependencies: - '@solidity-parser/parser': 0.15.0 - prettier: 2.8.0 + '@solidity-parser/parser': 0.16.0 + prettier: 2.8.4 semver: 7.3.8 solidity-comments-extractor: 0.0.7 dev: true @@ -17061,12 +16241,6 @@ packages: hasBin: true dev: true - /prettier/2.8.0: - resolution: {integrity: sha512-9Lmg8hTFZKG0Asr/kW9Bp8tJjRVluO8EJQVfY2T7FMw9T5jy4I/Uvx0Rca/XWf50QQ1/SS48+6IJWnrb+2yemA==} - engines: {node: '>=10.13.0'} - hasBin: true - dev: true - /prettier/2.8.4: resolution: {integrity: sha512-vIS4Rlc2FNh0BySk3Wkd6xmwxB0FpOndW5fisM5H8hsZSxU2VWVB5CWIkIjWvrHjIhxk2g3bfMKM87zNTrZddw==} engines: {node: '>=10.13.0'} @@ -17226,7 +16400,7 @@ packages: pull-cat: 1.1.11 pull-live: 1.0.1 pull-pushable: 2.2.0 - pull-stream: 3.6.14 + pull-stream: 3.7.0 pull-window: 2.1.4 stream-to-pull-stream: 1.7.3 dev: true @@ -17235,15 +16409,15 @@ packages: resolution: {integrity: sha512-tkNz1QT5gId8aPhV5+dmwoIiA1nmfDOzJDlOOUpU5DNusj6neNd3EePybJ5+sITr2FwyCs/FVpx74YMCfc8YeA==} dependencies: pull-cat: 1.1.11 - pull-stream: 3.6.14 + pull-stream: 3.7.0 dev: true /pull-pushable/2.2.0: resolution: {integrity: sha512-M7dp95enQ2kaHvfCt2+DJfyzgCSpWVR2h2kWYnVsW6ZpxQBx5wOu0QWOvQPVoPnBLUZYitYP2y7HyHkLQNeGXg==} dev: true - /pull-stream/3.6.14: - resolution: {integrity: sha512-KIqdvpqHHaTUA2mCYcLG1ibEbu/LCKoJZsBWyv9lSYtPkJPBq8m3Hxa103xHi6D2thj5YXa0TqK3L3GUkwgnew==} + /pull-stream/3.7.0: + resolution: {integrity: sha512-Eco+/R004UaCK2qEDE8vGklcTG2OeZSVm1kTUQNrykEjDwcFXDZhygFDsW49DbXyJMEhHeRL3z5cRVqPAhXlIw==} dev: true /pull-window/2.1.4: @@ -17272,6 +16446,11 @@ packages: engines: {node: '>=6'} dev: true + /punycode/2.3.0: + resolution: {integrity: sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==} + engines: {node: '>=6'} + dev: true + /qrcode/1.4.4: resolution: {integrity: sha512-oLzEC5+NKFou9P0bMj5+v6Z40evexeE29Z9cummZXZ9QXyMr3lphkURzxjXgPJC5azpxcshoDWV1xE46z+/c3Q==} engines: {node: '>=4'} @@ -17301,7 +16480,7 @@ packages: resolution: {integrity: sha512-gjWOsm2SoGlgLEdAGt7a6slVOk9mGiXmPFMqrEhLQ68rhQuBnpfs3+EmlvqKyxnCo9/PPlF+9MtY02S1aFg+Jw==} engines: {node: '>=0.10.0'} dependencies: - decode-uri-component: 0.2.0 + decode-uri-component: 0.2.2 object-assign: 4.1.1 strict-uri-encode: 1.1.0 dev: true @@ -17367,6 +16546,17 @@ packages: iconv-lite: 0.4.24 unpipe: 1.0.0 dev: true + optional: true + + /raw-body/2.5.2: + resolution: {integrity: sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==} + engines: {node: '>= 0.8'} + dependencies: + bytes: 3.1.2 + http-errors: 2.0.0 + iconv-lite: 0.4.24 + unpipe: 1.0.0 + dev: true /rc/1.2.8: resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==} @@ -17461,13 +16651,17 @@ packages: util-deprecate: 1.0.2 dev: true - /readable-stream/3.6.0: - resolution: {integrity: sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==} - engines: {node: '>= 6'} + /readable-stream/2.3.8: + resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} dependencies: + core-util-is: 1.0.3 inherits: 2.0.4 - string_decoder: 1.3.0 + isarray: 1.0.0 + process-nextick-args: 2.0.1 + safe-buffer: 5.1.2 + string_decoder: 1.1.1 util-deprecate: 1.0.2 + dev: true /readable-stream/3.6.2: resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} @@ -17476,7 +16670,6 @@ packages: inherits: 2.0.4 string_decoder: 1.3.0 util-deprecate: 1.0.2 - dev: false /readdirp/3.2.0: resolution: {integrity: sha512-crk4Qu3pmXwgxdSgGhgA/eXiJAPQiX4GMOZZMXnqKxHX7TaoL+3gQVo/WeuAiogr07DpnfjIMpXXa+PAIvwPGQ==} @@ -17563,7 +16756,7 @@ packages: engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.2 - define-properties: 1.1.4 + define-properties: 1.2.0 functions-have-names: 1.2.3 dev: true @@ -17788,7 +16981,7 @@ packages: deprecated: request has been deprecated, see https://github.com/request/request/issues/3142 dependencies: aws-sign2: 0.7.0 - aws4: 1.11.0 + aws4: 1.12.0 caseless: 0.12.0 combined-stream: 1.0.8 extend: 3.0.2 @@ -17984,15 +17177,6 @@ packages: '@rollup/plugin-inject': 4.0.4 dev: true - /rollup-plugin-polyfill-node/0.10.2_rollup@2.79.1: - resolution: {integrity: sha512-5GMywXiLiuQP6ZzED/LO/Q0HyDi2W6b8VN+Zd3oB0opIjyRs494Me2ZMaqKWDNbGiW4jvvzl6L2n4zRgxS9cSQ==} - peerDependencies: - rollup: ^1.20.0 || ^2.0.0 - dependencies: - '@rollup/plugin-inject': 4.0.4_rollup@2.79.1 - rollup: 2.79.1 - dev: true - /rollup/2.79.1: resolution: {integrity: sha512-uKxbd0IhMZOhjAiD5oAFp7BqvkA4Dv47qpOCtaNvng4HBwdbWtdOh8f5nZNuk2rp51PMGk3bzfWu5oayNEuYnw==} engines: {node: '>=10.0.0'} @@ -18036,8 +17220,8 @@ packages: tslib: 1.14.1 dev: false - /rxjs/7.5.7: - resolution: {integrity: sha512-z9MzKh/UcOqB3i20H6rtrlaE/CgjLOvheWK/9ILrbhROGTweAi1BaFsTT9FbwZi5Trr1qNRs+MXkhmR06awzQA==} + /rxjs/7.8.0: + resolution: {integrity: sha512-F2+gxDshqmIub1KdvZkaEfGDwLNpPvk9Fs6LD/MyQxNgMds/WH9OdDDXOmxUZpME+iSK3rQCctkL0DYyytUqMg==} dependencies: tslib: 2.5.0 dev: true @@ -18069,7 +17253,7 @@ packages: resolution: {integrity: sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==} dependencies: call-bind: 1.0.2 - get-intrinsic: 1.1.3 + get-intrinsic: 1.2.0 is-regex: 1.1.4 dev: true @@ -18179,7 +17363,7 @@ packages: dependencies: elliptic: 6.5.4 node-addon-api: 2.0.2 - node-gyp-build: 4.5.0 + node-gyp-build: 4.6.0 /section-matter/1.0.0: resolution: {integrity: sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA==} @@ -18256,6 +17440,12 @@ packages: randombytes: 2.1.0 dev: true + /serialize-javascript/6.0.1: + resolution: {integrity: sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w==} + dependencies: + randombytes: 2.1.0 + dev: true + /serve-static/1.15.0: resolution: {integrity: sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==} engines: {node: '>= 0.8.0'} @@ -18273,7 +17463,7 @@ packages: resolution: {integrity: sha512-/xE6GvsKKqyo1BAY+KxOWXcLpPsUUyji7Qg3bVD7hh1eRze5bR1uYiuDA/k3Gof1s9BTzQZEJK8sNcNGFIzeWw==} engines: {node: '>=6'} dependencies: - body-parser: 1.20.1 + body-parser: 1.20.2 cors: 2.8.5 express: 4.18.2 request: 2.88.2 @@ -18386,8 +17576,8 @@ packages: resolution: {integrity: sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==} dependencies: call-bind: 1.0.2 - get-intrinsic: 1.1.3 - object-inspect: 1.12.2 + get-intrinsic: 1.2.0 + object-inspect: 1.12.3 /signal-exit/3.0.7: resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} @@ -18562,8 +17752,8 @@ packages: - debug dev: true - /solc/0.8.17: - resolution: {integrity: sha512-Dtidk2XtTTmkB3IKdyeg6wLYopJnBVxdoykN8oP8VY3PQjN16BScYoUJTXFm2OP7P0hXNAqWiJNmmfuELtLf8g==} + /solc/0.8.19: + resolution: {integrity: sha512-yqurS3wzC4LdEvmMobODXqprV4MYJcVtinuxgrp61ac8K2zz40vXA0eSAskSHPgv8dQo7Nux39i3QBsHx4pqyA==} engines: {node: '>=10.0.0'} hasBin: true dependencies: @@ -18588,7 +17778,7 @@ packages: ast-parents: 0.0.1 chalk: 4.1.2 commander: 10.0.0 - cosmiconfig: 8.0.0 + cosmiconfig: 8.1.0 fast-diff: 1.2.0 glob: 8.1.0 ignore: 5.2.4 @@ -18603,22 +17793,22 @@ packages: prettier: 2.8.4 dev: true - /solidity-ast/0.4.38: - resolution: {integrity: sha512-e7gT6g8l8M2rAzH648QA3/IihCNy/anFoWyChVD+T+zfX4FjXbT8AO2DB3wG1iEmIBib9/+vD+GvTElWWpdw+w==} + /solidity-ast/0.4.46: + resolution: {integrity: sha512-MlPZQfPhjWXqh7YxWcBGDXaPZIfMYCOHYoLEhGDWulNwEPIQQZuB7mA9eP17CU0jY/bGR4avCEUVVpvHtT2gbA==} dev: true /solidity-comments-extractor/0.0.7: resolution: {integrity: sha512-wciNMLg/Irp8OKGrh3S2tfvZiZ0NEyILfcRCXCD4mp7SgK/i9gzLfhY2hY7VMCQJ3kH9UB9BzNdibIVMchzyYw==} dev: true - /solidity-docgen/0.6.0-beta.34_hardhat@2.12.2: - resolution: {integrity: sha512-igdGrkg8gT1jn+B2NwzjEtSf+7NTrSi/jz88zO7MZWgETmcWbXaxgAsQP4BQeC4YFeH0Pie1NsLP7+9qDgvFtA==} + /solidity-docgen/0.6.0-beta.35_hardhat@2.13.0: + resolution: {integrity: sha512-9QdwK1THk/MWIdq1PEW/6dvtND0pUqpFTsbKwwU9YQIMYuRhH1lek9SsgnsGGYtdJ0VTrXXcVT30q20a8Y610A==} peerDependencies: hardhat: ^2.8.0 dependencies: handlebars: 4.7.7 - hardhat: 2.12.2_2dtigtkb225m7ii7q45utxqwgi - solidity-ast: 0.4.38 + hardhat: 2.13.0_6qtx7vkbdhwvdm4crzlegk4mvi + solidity-ast: 0.4.46 dev: true /sorcery/0.10.0: @@ -18647,7 +17837,7 @@ packages: deprecated: See https://github.com/lydell/source-map-resolve#deprecated dependencies: atob: 2.1.2 - decode-uri-component: 0.2.0 + decode-uri-component: 0.2.2 resolve-url: 0.2.1 source-map-url: 0.4.1 urix: 0.1.0 @@ -18812,14 +18002,14 @@ packages: resolution: {integrity: sha512-H73RAHsVBapbim0tU2JwwOiXUj+fikfiaoYAKHF3VJfA0pe2BCzkhAHBlLG6REzE+2WNZcxOXjK7lkso+9euLA==} dependencies: inherits: 2.0.4 - readable-stream: 3.6.0 + readable-stream: 3.6.2 dev: false /stream-to-pull-stream/1.7.3: resolution: {integrity: sha512-6sNyqJpr5dIOQdgNy/xcDWwDuzAsAwVzhzrWlAPAQ7Lkjx/rv0wgvxEyKwTq6FmNd5rjTrELt/CLmaSw7crMGg==} dependencies: looper: 3.0.0 - pull-stream: 3.6.14 + pull-stream: 3.7.0 dev: true /streamsearch/1.1.0: @@ -18902,24 +18092,24 @@ packages: engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.2 - define-properties: 1.1.4 - es-abstract: 1.20.4 + define-properties: 1.2.0 + es-abstract: 1.21.1 dev: true /string.prototype.trimend/1.0.6: resolution: {integrity: sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==} dependencies: call-bind: 1.0.2 - define-properties: 1.1.4 - es-abstract: 1.20.4 + define-properties: 1.2.0 + es-abstract: 1.21.1 dev: true /string.prototype.trimstart/1.0.6: resolution: {integrity: sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==} dependencies: call-bind: 1.0.2 - define-properties: 1.1.4 - es-abstract: 1.20.4 + define-properties: 1.2.0 + es-abstract: 1.21.1 dev: true /string_decoder/0.10.31: @@ -19082,6 +18272,7 @@ packages: engines: {node: '>=4'} dependencies: has-flag: 3.0.0 + dev: true /supports-color/6.0.0: resolution: {integrity: sha512-on9Kwidc1IUQo+bQdhi8+Tijpo0e1SS6RoGo2guUwn5vdaxw8RXOF9Vb2ws+ihWOmh4JnCJOvaziZWP1VABaLg==} @@ -19104,8 +18295,8 @@ packages: has-flag: 4.0.0 dev: true - /supports-color/9.2.3: - resolution: {integrity: sha512-aszYUX/DVK/ed5rFLb/dDinVJrQjG/vmU433wtqVSD800rYsJNWxh2R3USV90aLSU+UsyQkbNeffVLzc6B6foA==} + /supports-color/9.3.1: + resolution: {integrity: sha512-knBY82pjmnIzK3NifMo3RxEIRD9E0kIzV4BKcyTZ9+9kWgLMxd4PrsTSMoFQUabgRBbF8KOLRDCyKgNV+iK44Q==} engines: {node: '>=12'} dev: true @@ -19121,34 +18312,6 @@ packages: resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} engines: {node: '>= 0.4'} - /svelte-check/2.9.2_abcb4yglsprjylcfcbep3tcqgq: - resolution: {integrity: sha512-DRi8HhnCiqiGR2YF9ervPGvtoYrheE09cXieCTEqeTPOTJzfoa54Py8rovIBv4bH4n5HgZYIyTQ3DDLHQLl2uQ==} - hasBin: true - peerDependencies: - svelte: ^3.24.0 - dependencies: - '@jridgewell/trace-mapping': 0.3.17 - chokidar: 3.5.3 - fast-glob: 3.2.12 - import-fresh: 3.3.0 - picocolors: 1.0.0 - sade: 1.8.1 - svelte: 3.53.1 - svelte-preprocess: 4.10.7_axwq5llc4jwkf7awicvy3hu32q - typescript: 4.9.3 - transitivePeerDependencies: - - '@babel/core' - - coffeescript - - less - - node-sass - - postcss - - postcss-load-config - - pug - - sass - - stylus - - sugarss - dev: true - /svelte-check/2.9.2_dfqi3dk7soqznqtir4fhqm6z5i: resolution: {integrity: sha512-DRi8HhnCiqiGR2YF9ervPGvtoYrheE09cXieCTEqeTPOTJzfoa54Py8rovIBv4bH4n5HgZYIyTQ3DDLHQLl2uQ==} hasBin: true @@ -19177,7 +18340,7 @@ packages: - sugarss dev: true - /svelte-check/2.9.2_qusgu27jzmoklr7jjlsel7vazu: + /svelte-check/2.9.2_zerbpdatqmtl23l4lmflabtkhm: resolution: {integrity: sha512-DRi8HhnCiqiGR2YF9ervPGvtoYrheE09cXieCTEqeTPOTJzfoa54Py8rovIBv4bH4n5HgZYIyTQ3DDLHQLl2uQ==} hasBin: true peerDependencies: @@ -19190,7 +18353,7 @@ packages: picocolors: 1.0.0 sade: 1.8.1 svelte: 3.53.1 - svelte-preprocess: 4.10.7_zghfvwl5qvgby3kg6npc7yqe34 + svelte-preprocess: 4.10.7_ge4z2gzwvmjf74ug6kcjgue5me typescript: 4.9.3 transitivePeerDependencies: - '@babel/core' @@ -19269,60 +18432,6 @@ packages: svelte-hmr: 0.14.12_svelte@3.53.1 dev: true - /svelte-preprocess/4.10.7_axwq5llc4jwkf7awicvy3hu32q: - resolution: {integrity: sha512-sNPBnqYD6FnmdBrUmBCaqS00RyCsCpj2BG58A1JBswNF7b0OKviwxqVrOL/CKyJrLSClrSeqQv5BXNg2RUbPOw==} - engines: {node: '>= 9.11.2'} - requiresBuild: true - peerDependencies: - '@babel/core': ^7.10.2 - coffeescript: ^2.5.1 - less: ^3.11.3 || ^4.0.0 - node-sass: '*' - postcss: ^7 || ^8 - postcss-load-config: ^2.1.0 || ^3.0.0 || ^4.0.0 - pug: ^3.0.0 - sass: ^1.26.8 - stylus: ^0.55.0 - sugarss: ^2.0.0 - svelte: ^3.23.0 - typescript: ^3.9.5 || ^4.0.0 - peerDependenciesMeta: - '@babel/core': - optional: true - coffeescript: - optional: true - less: - optional: true - node-sass: - optional: true - postcss: - optional: true - postcss-load-config: - optional: true - pug: - optional: true - sass: - optional: true - stylus: - optional: true - sugarss: - optional: true - typescript: - optional: true - dependencies: - '@babel/core': 7.20.2 - '@types/pug': 2.0.6 - '@types/sass': 1.43.1 - detect-indent: 6.1.0 - magic-string: 0.25.9 - node-sass: 7.0.3 - postcss: 8.4.19 - sorcery: 0.10.0 - strip-indent: 3.0.0 - svelte: 3.53.1 - typescript: 4.9.3 - dev: true - /svelte-preprocess/4.10.7_d6lifvqr42ebgwtwt2nbwt433a: resolution: {integrity: sha512-sNPBnqYD6FnmdBrUmBCaqS00RyCsCpj2BG58A1JBswNF7b0OKviwxqVrOL/CKyJrLSClrSeqQv5BXNg2RUbPOw==} engines: {node: '>= 9.11.2'} @@ -19376,7 +18485,7 @@ packages: typescript: 4.9.3 dev: true - /svelte-preprocess/4.10.7_y4sunccvtjgz4dr3g3pzi7kmze: + /svelte-preprocess/4.10.7_ge4z2gzwvmjf74ug6kcjgue5me: resolution: {integrity: sha512-sNPBnqYD6FnmdBrUmBCaqS00RyCsCpj2BG58A1JBswNF7b0OKviwxqVrOL/CKyJrLSClrSeqQv5BXNg2RUbPOw==} engines: {node: '>= 9.11.2'} requiresBuild: true @@ -19417,7 +18526,6 @@ packages: typescript: optional: true dependencies: - '@babel/core': 7.20.2 '@types/pug': 2.0.6 '@types/sass': 1.43.1 detect-indent: 6.1.0 @@ -19427,10 +18535,10 @@ packages: sorcery: 0.10.0 strip-indent: 3.0.0 svelte: 3.53.1 - typescript: 4.9.5 + typescript: 4.9.3 dev: true - /svelte-preprocess/4.10.7_zghfvwl5qvgby3kg6npc7yqe34: + /svelte-preprocess/4.10.7_urj4ueeh3k3dx7qcxhluquyqdy: resolution: {integrity: sha512-sNPBnqYD6FnmdBrUmBCaqS00RyCsCpj2BG58A1JBswNF7b0OKviwxqVrOL/CKyJrLSClrSeqQv5BXNg2RUbPOw==} engines: {node: '>= 9.11.2'} requiresBuild: true @@ -19471,7 +18579,6 @@ packages: typescript: optional: true dependencies: - '@babel/core': 7.20.2 '@types/pug': 2.0.6 '@types/sass': 1.43.1 detect-indent: 6.1.0 @@ -19481,7 +18588,7 @@ packages: sorcery: 0.10.0 strip-indent: 3.0.0 svelte: 3.53.1 - typescript: 4.9.3 + typescript: 4.9.5 dev: true /svelte-spa-router/3.3.0: @@ -19501,7 +18608,7 @@ packages: buffer: 5.7.1 eth-lib: 0.1.29 fs-extra: 4.0.3 - got: 11.8.5 + got: 11.8.6 mime-types: 2.1.35 mkdirp-promise: 5.0.1 mock-fs: 4.14.0 @@ -19538,7 +18645,7 @@ packages: resolution: {integrity: sha512-Y4X9zqrCftUhMeH2EptSSERdVKt/nEdijTOacGD/97EKjhQ/Qs8RTlEGABSJNNN8lac9kheH+af7yAkEWlgneA==} engines: {node: '>=10.0.0'} dependencies: - ajv: 8.11.2 + ajv: 8.12.0 lodash.truncate: 4.4.2 slice-ansi: 4.0.0 string-width: 4.2.3 @@ -19652,8 +18759,8 @@ packages: engines: {node: '>=6'} dev: true - /tape/4.16.1: - resolution: {integrity: sha512-U4DWOikL5gBYUrlzx+J0oaRedm2vKLFbtA/+BRAXboGWpXO7bMP8ddxlq3Cse2bvXFQ0jZMOj6kk3546mvCdFg==} + /tape/4.16.2: + resolution: {integrity: sha512-TUChV+q0GxBBCEbfCYkGLkv8hDJYjMdSWdE0/Lr331sB389dsvFUHNV9ph5iQqKzt8Ss9drzcda/YeexclBFqg==} hasBin: true dependencies: call-bind: 1.0.2 @@ -19666,7 +18773,7 @@ packages: inherits: 2.0.4 is-regex: 1.1.4 minimist: 1.2.8 - object-inspect: 1.12.2 + object-inspect: 1.12.3 resolve: 1.22.1 resumer: 0.0.0 string.prototype.trim: 1.2.7 @@ -19746,13 +18853,13 @@ packages: '@jridgewell/trace-mapping': 0.3.17 jest-worker: 27.5.1 schema-utils: 3.1.1 - serialize-javascript: 6.0.0 - terser: 5.15.1 + serialize-javascript: 6.0.1 + terser: 5.16.5 webpack: 5.75.0 dev: true - /terser/5.15.1: - resolution: {integrity: sha512-K1faMUvpm/FBxjBXud0LWVAGxmvoPbZbfTCYbSgaaYQaIXI3/TdI7a7ZGA73Zrou6Q8Zmz3oeUTsp/dj+ag2Xw==} + /terser/5.16.5: + resolution: {integrity: sha512-qcwfg4+RZa3YvlFh0qjifnzBHjKGNbtDo9yivMqMFDy9Q6FSaQWSB/j1xKhsoUFJIqDOM3TsN6D5xbrMrFcHbg==} engines: {node: '>=10'} hasBin: true dependencies: @@ -19823,7 +18930,7 @@ packages: /through2/2.0.5: resolution: {integrity: sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==} dependencies: - readable-stream: 2.3.7 + readable-stream: 2.3.8 xtend: 4.0.2 dev: true @@ -19940,7 +19047,7 @@ packages: engines: {node: '>=0.8'} dependencies: psl: 1.9.0 - punycode: 2.1.1 + punycode: 2.3.0 dev: true /tough-cookie/4.1.2: @@ -19987,24 +19094,28 @@ packages: glob: 7.2.3 dev: true + /true-case-path/2.2.1: + resolution: {integrity: sha512-0z3j8R7MCjy10kc/g+qg7Ln3alJTodw9aDuVWZa3uiWqfuBMKeAeP2ocWcxoyM3D73yz3Jt/Pu4qPr4wHSdB/Q==} + dev: true + /ts-essentials/1.0.4: resolution: {integrity: sha512-q3N1xS4vZpRouhYHDPwO0bDW3EZ6SK9CrrDHxi/D6BPReSjpVgWIOpLS2o0gSBZm+7q/wyKp6RVM1AeeW7uyfQ==} dev: true - /ts-essentials/6.0.7_typescript@4.9.3: + /ts-essentials/6.0.7_typescript@4.9.5: resolution: {integrity: sha512-2E4HIIj4tQJlIHuATRHayv0EfMGK3ris/GRk1E3CFnsZzeNV+hUmelbaTZHLtXaZppM5oLhHRtO04gINC4Jusw==} peerDependencies: typescript: '>=3.7.0' dependencies: - typescript: 4.9.3 + typescript: 4.9.5 dev: true - /ts-essentials/7.0.3_typescript@4.9.3: + /ts-essentials/7.0.3_typescript@4.9.5: resolution: {integrity: sha512-8+gr5+lqO3G84KdiTSMRLtuyJ+nTBVRKuCrK4lidMPdVeEp0uqC875uE5NMcaA7YYMN7XsNiFQuMvasF8HT/xQ==} peerDependencies: typescript: '>=3.7.0' dependencies: - typescript: 4.9.3 + typescript: 4.9.5 dev: true /ts-generator/0.1.1: @@ -20012,7 +19123,7 @@ packages: hasBin: true dependencies: '@types/mkdirp': 0.5.2 - '@types/prettier': 2.7.1 + '@types/prettier': 2.7.2 '@types/resolve': 0.0.8 chalk: 2.4.2 glob: 7.2.3 @@ -20022,6 +19133,10 @@ packages: ts-essentials: 1.0.4 dev: true + /ts-interface-checker/0.1.13: + resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} + dev: true + /ts-jest-mock-import-meta/0.12.0_ts-jest@27.1.5: resolution: {integrity: sha512-LfuetNsQ6CDEAPekFOtMpCPRBBAgoA322IQ95eCa3x0mR++GwhZddlsmjOUhxRPLF3utbXUZpCEZiW+HP8jkiA==} peerDependencies: @@ -20030,43 +19145,7 @@ packages: ts-jest: 27.1.5_ucbcg4iu5zhznj2s67mybtqili dev: true - /ts-jest/27.1.5_hf2lt5tikeukj66wl5cvus5z2u: - resolution: {integrity: sha512-Xv6jBQPoBEvBq/5i2TeSG9tt/nqkbpcurrEG1b+2yfBrcJelOZF9Ml6dmyMh7bcW9JyFbRYpR5rxROSlBLTZHA==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} - hasBin: true - peerDependencies: - '@babel/core': '>=7.0.0-beta.0 <8' - '@types/jest': ^27.0.0 - babel-jest: '>=27.0.0 <28' - esbuild: '*' - jest: ^27.0.0 - typescript: '>=3.8 <5.0' - peerDependenciesMeta: - '@babel/core': - optional: true - '@types/jest': - optional: true - babel-jest: - optional: true - esbuild: - optional: true - dependencies: - '@babel/core': 7.20.2 - '@types/jest': 27.5.2 - babel-jest: 27.5.1_@babel+core@7.20.2 - bs-logger: 0.2.6 - fast-json-stable-stringify: 2.1.0 - jest: 27.5.1 - jest-util: 27.5.1 - json5: 2.2.1 - lodash.memoize: 4.1.2 - make-error: 1.3.6 - semver: 7.3.8 - typescript: 4.9.3 - yargs-parser: 20.2.4 - dev: true - - /ts-jest/27.1.5_tr6btbnawl4wz6is4v2fl47ayu: + /ts-jest/27.1.5_gy2w2unevcycrhih2qxqkdetla: resolution: {integrity: sha512-Xv6jBQPoBEvBq/5i2TeSG9tt/nqkbpcurrEG1b+2yfBrcJelOZF9Ml6dmyMh7bcW9JyFbRYpR5rxROSlBLTZHA==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} hasBin: true @@ -20087,9 +19166,8 @@ packages: esbuild: optional: true dependencies: - '@babel/core': 7.20.2 '@types/jest': 27.5.2 - babel-jest: 27.5.1_@babel+core@7.20.2 + babel-jest: 27.5.1 bs-logger: 0.2.6 fast-json-stable-stringify: 2.1.0 jest: 27.5.1 @@ -20137,21 +19215,6 @@ packages: yargs-parser: 20.2.4 dev: true - /ts-loader/9.4.1_hhrrucqyg4eysmfpujvov2ym5u: - resolution: {integrity: sha512-384TYAqGs70rn9F0VBnh6BPTfhga7yFNdC5gXbQpDrBj9/KsT4iRkGqKXhziofHOlE2j6YEaiTYVGKKvPhGWvw==} - engines: {node: '>=12.0.0'} - peerDependencies: - typescript: '*' - webpack: ^5.0.0 - dependencies: - chalk: 4.1.2 - enhanced-resolve: 5.12.0 - micromatch: 4.0.5 - semver: 7.3.8 - typescript: 4.9.5 - webpack: 5.75.0 - dev: true - /ts-loader/9.4.1_typescript@4.9.3: resolution: {integrity: sha512-384TYAqGs70rn9F0VBnh6BPTfhga7yFNdC5gXbQpDrBj9/KsT4iRkGqKXhziofHOlE2j6YEaiTYVGKKvPhGWvw==} engines: {node: '>=12.0.0'} @@ -20166,7 +19229,7 @@ packages: typescript: 4.9.3 dev: true - /ts-loader/9.4.1_vfotqvx6lgcbf3upbs6hgaza4q: + /ts-loader/9.4.1_typescript@4.9.5: resolution: {integrity: sha512-384TYAqGs70rn9F0VBnh6BPTfhga7yFNdC5gXbQpDrBj9/KsT4iRkGqKXhziofHOlE2j6YEaiTYVGKKvPhGWvw==} engines: {node: '>=12.0.0'} peerDependencies: @@ -20177,11 +19240,10 @@ packages: enhanced-resolve: 5.12.0 micromatch: 4.0.5 semver: 7.3.8 - typescript: 4.9.3 - webpack: 5.75.0 + typescript: 4.9.5 dev: true - /ts-node/10.9.1_vw4thnff6td543szquzqpxymti: + /ts-node/10.9.1_prfxyxghnskheluimpb6dvby4q: resolution: {integrity: sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==} hasBin: true peerDependencies: @@ -20201,23 +19263,23 @@ packages: '@tsconfig/node14': 1.0.3 '@tsconfig/node16': 1.0.3 '@types/node': 12.20.55 - acorn: 8.8.1 + acorn: 8.8.2 acorn-walk: 8.2.0 arg: 4.1.3 create-require: 1.1.1 diff: 4.0.2 make-error: 1.3.6 - typescript: 4.9.3 + typescript: 4.9.5 v8-compile-cache-lib: 3.0.1 yn: 3.1.1 dev: true - /tsconfig-paths/3.14.1: - resolution: {integrity: sha512-fxDhWnFSLt3VuTwtvJt5fpwxBHg5AdKWMsgcPOOIilyjymcYVZoCQF8fvFRezCNfblEXmi+PcM1eYHeOAgXCOQ==} + /tsconfig-paths/3.14.2: + resolution: {integrity: sha512-o/9iXgCYc5L/JxCHPe3Hvh8Q/2xm5Z+p18PESBU6Ff33695QnCHBEjcytY2q19ua7Mbl/DavtBOLq+oG0RCL+g==} dependencies: '@types/json5': 0.0.29 - json5: 1.0.1 - minimist: 1.2.7 + json5: 1.0.2 + minimist: 1.2.8 strip-bom: 3.0.0 dev: true @@ -20324,7 +19386,6 @@ packages: /type-fest/1.4.0: resolution: {integrity: sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==} engines: {node: '>=10'} - dev: false /type-is/1.6.18: resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==} @@ -20341,7 +19402,7 @@ packages: /type/2.7.2: resolution: {integrity: sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw==} - /typechain/3.0.0_typescript@4.9.3: + /typechain/3.0.0_typescript@4.9.5: resolution: {integrity: sha512-ft4KVmiN3zH4JUFu2WJBrwfHeDf772Tt2d8bssDTo/YcckKW2D+OwFrHXRC6hJvO3mHjFQTihoMV6fJOi0Hngg==} hasBin: true dependencies: @@ -20350,20 +19411,20 @@ packages: fs-extra: 7.0.1 js-sha3: 0.8.0 lodash: 4.17.21 - ts-essentials: 6.0.7_typescript@4.9.3 + ts-essentials: 6.0.7_typescript@4.9.5 ts-generator: 0.1.1 transitivePeerDependencies: - supports-color - typescript dev: true - /typechain/5.2.0_typescript@4.9.3: + /typechain/5.2.0_typescript@4.9.5: resolution: {integrity: sha512-0INirvQ+P+MwJOeMct+WLkUE4zov06QxC96D+i3uGFEHoiSkZN70MKDQsaj8zkL86wQwByJReI2e7fOUwECFuw==} hasBin: true peerDependencies: typescript: '>=4.1.0' dependencies: - '@types/prettier': 2.7.1 + '@types/prettier': 2.7.2 command-line-args: 4.0.7 debug: 4.3.4 fs-extra: 7.0.1 @@ -20371,13 +19432,21 @@ packages: js-sha3: 0.8.0 lodash: 4.17.21 mkdirp: 1.0.4 - prettier: 2.8.0 - ts-essentials: 7.0.3_typescript@4.9.3 - typescript: 4.9.3 + prettier: 2.8.4 + ts-essentials: 7.0.3_typescript@4.9.5 + typescript: 4.9.5 transitivePeerDependencies: - supports-color dev: true + /typed-array-length/1.0.4: + resolution: {integrity: sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==} + dependencies: + call-bind: 1.0.2 + for-each: 0.3.3 + is-typed-array: 1.1.10 + dev: true + /typedarray-to-buffer/1.0.4: resolution: {integrity: sha512-vjMKrfSoUDN8/Vnqitw2FmstOfuJ73G6CrSEKnf11A6RmasVxHqfeBcnTb6RsL4pTMuV5Zsv9IiHRphMZyckUw==} dev: true @@ -20446,8 +19515,8 @@ packages: dev: true optional: true - /undici/5.12.0: - resolution: {integrity: sha512-zMLamCG62PGjd9HHMpo05bSLvvwWOZgGeiWlN/vlqu3+lRo3elxktVGEyLMX+IO7c2eflLjcW74AlkhEZm15mg==} + /undici/5.20.0: + resolution: {integrity: sha512-J3j60dYzuo6Eevbawwp1sdg16k5Tf768bxYK4TUJRH7cBM4kFCbf3mOnM/0E3vQYXvpxITbbWmBafaDbxLDz3g==} engines: {node: '>=12.18'} dependencies: busboy: 1.6.0 @@ -20646,7 +19715,7 @@ packages: /uri-js/4.4.1: resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} dependencies: - punycode: 2.1.1 + punycode: 2.3.0 dev: true /urix/0.1.0: @@ -20687,14 +19756,6 @@ packages: react: ^16.8.0 || ^17.0.0 || ^18.0.0 dev: false - /use-sync-external-store/1.2.0_react@18.2.0: - resolution: {integrity: sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA==} - peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - dependencies: - react: 18.2.0 - dev: false - /use/3.1.1: resolution: {integrity: sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==} engines: {node: '>=0.10.0'} @@ -20705,7 +19766,7 @@ packages: engines: {node: '>=6.14.2'} requiresBuild: true dependencies: - node-gyp-build: 4.5.0 + node-gyp-build: 4.6.0 /utf8/3.0.0: resolution: {integrity: sha512-E8VjFIQ/TyQgp+TZfS6l8yp/xWppSAHzidGiRrqe4bK4XP9pTRyKFgGJpO3SN7zdX4DeomTrwaseCHovfpFcqQ==} @@ -20718,7 +19779,7 @@ packages: resolution: {integrity: sha512-/s3UsZUrIfa6xDhr7zZhnE9SLQ5RIXyYfiVnMMyMDzOc8WhWN4Nbh36H842OyurKbCDAesZOJaVyvmSl6fhGQw==} dependencies: call-bind: 1.0.2 - define-properties: 1.1.4 + define-properties: 1.2.0 for-each: 0.3.3 has-symbols: 1.0.3 object.getownpropertydescriptors: 2.1.5 @@ -20921,7 +19982,7 @@ packages: resolution: {integrity: sha512-BXq3jwIagosjgNVae6tkHzzIk6a8MHFtzAdwhnV5VlvPTFxDCvIttgSiHWjdGoTJvXtmRu5HacExfdarRcFhog==} dev: true - /vue-loader/15.10.1_36bk4haztx5nmdoe37hieqy74q: + /vue-loader/15.10.1_y5o36p7qrshhm4v7l6yk7rwfsu: resolution: {integrity: sha512-SaPHK1A01VrNthlix6h1hq4uJu7S/z0kdLUb6klubo738NeQoLbS6V9/d8Pv19tU0XdQKju3D1HSKuI8wJ5wMA==} peerDependencies: '@vue/compiler-sfc': ^3.0.8 @@ -20937,8 +19998,8 @@ packages: vue-template-compiler: optional: true dependencies: - '@vue/component-compiler-utils': 3.3.0_lodash@4.17.21 - css-loader: 6.7.2_webpack@5.75.0 + '@vue/component-compiler-utils': 3.3.0 + css-loader: 6.7.3_webpack@5.75.0 hash-sum: 1.0.2 loader-utils: 1.4.2 vue-hot-reload-api: 2.3.4 @@ -21142,7 +20203,7 @@ packages: dependencies: '@types/bn.js': 4.11.6 '@types/node': 12.20.55 - bignumber.js: 9.1.0 + bignumber.js: 9.1.1 web3-core-helpers: 1.2.11 web3-core-method: 1.2.11 web3-core-requestmanager: 1.2.11 @@ -21293,7 +20354,7 @@ packages: json-rpc-error: 2.0.0 json-stable-stringify: 1.0.2 promise-to-callback: 1.0.0 - readable-stream: 2.3.7 + readable-stream: 2.3.8 request: 2.88.2 semaphore: 1.1.0 ws: 5.2.3 @@ -21366,8 +20427,8 @@ packages: dev: true optional: true - /web3-utils/1.8.1: - resolution: {integrity: sha512-LgnM9p6V7rHHUGfpMZod+NST8cRfGzJ1BTXAyNo7A9cJX9LczBfSRxJp+U/GInYe9mby40t3v22AJdlELibnsQ==} + /web3-utils/1.8.2: + resolution: {integrity: sha512-v7j6xhfLQfY7xQDrUP0BKbaNrmZ2/+egbqP9q3KYmOiPpnvAfol+32slgL0WX/5n8VPvKCK5EZ1HGrAVICSToA==} engines: {node: '>=8.0.0'} dependencies: bn.js: 5.2.1 @@ -21431,8 +20492,8 @@ packages: '@webassemblyjs/ast': 1.11.1 '@webassemblyjs/wasm-edit': 1.11.1 '@webassemblyjs/wasm-parser': 1.11.1 - acorn: 8.8.1 - acorn-import-assertions: 1.8.0_acorn@8.8.1 + acorn: 8.8.2 + acorn-import-assertions: 1.8.0_acorn@8.8.2 browserslist: 4.21.5 chrome-trace-event: 1.0.3 enhanced-resolve: 5.12.0 @@ -21526,7 +20587,6 @@ packages: gopd: 1.0.1 has-tostringtag: 1.0.0 is-typed-array: 1.1.10 - dev: false /which/1.3.1: resolution: {integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==} @@ -21734,7 +20794,7 @@ packages: /xhr2-cookies/1.1.0: resolution: {integrity: sha512-hjXUA6q+jl/bd8ADHcVfFsSPIf+tyLIjuO9TwJC9WI6JP2zKcS7C+p56I9kCLLsaCiNT035iYvEUUzdEFj/8+g==} dependencies: - cookiejar: 2.1.3 + cookiejar: 2.1.4 dev: true optional: true @@ -21915,6 +20975,20 @@ packages: string-width: 4.2.3 y18n: 5.0.8 yargs-parser: 21.1.1 + dev: true + + /yargs/17.7.1: + resolution: {integrity: sha512-cwiTb08Xuv5fqF4AovYacTFNxk62th7LKJ6BL9IGUpTJrWoU7/7WdQGTP2SjKf1dUNBGzDd28p/Yfs/GI6JrLw==} + engines: {node: '>=12'} + dependencies: + cliui: 8.0.1 + escalade: 3.1.1 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + string-width: 4.2.3 + y18n: 5.0.8 + yargs-parser: 21.1.1 + dev: false /yargs/4.8.1: resolution: {integrity: sha512-LqodLrnIDM3IFT+Hf/5sxBnEGECrfdC1uIbgZeJmESCSo4HoCAaKEus8MylXHAkdacGc0ye+Qa+dpkuom8uVYA==} @@ -21963,22 +21037,6 @@ packages: use-sync-external-store: 1.2.0 dev: false - /zustand/4.1.4_react@18.2.0: - resolution: {integrity: sha512-k2jVOlWo8p4R83mQ+/uyB8ILPO2PCJOf+QVjcL+1PbMCk1w5OoPYpAIxy9zd93FSfmJqoH6lGdwzzjwqJIRU5A==} - engines: {node: '>=12.7.0'} - peerDependencies: - immer: '>=9.0' - react: '>=16.8' - peerDependenciesMeta: - immer: - optional: true - react: - optional: true - dependencies: - react: 18.2.0 - use-sync-external-store: 1.2.0_react@18.2.0 - dev: false - /zwitch/2.0.4: resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==} dev: false @@ -21991,7 +21049,7 @@ packages: bn.js: 4.12.0 ethereumjs-util: 6.2.1 - github.com/taikoxyz/solidity-coverage/ceb49fd1f6041e4fcd26079dfb0d3b0f58c812e5_hardhat@2.12.2: + github.com/taikoxyz/solidity-coverage/ceb49fd1f6041e4fcd26079dfb0d3b0f58c812e5_hardhat@2.13.0: resolution: {tarball: https://codeload.github.com/taikoxyz/solidity-coverage/tar.gz/ceb49fd1f6041e4fcd26079dfb0d3b0f58c812e5} id: github.com/taikoxyz/solidity-coverage/ceb49fd1f6041e4fcd26079dfb0d3b0f58c812e5 name: solidity-coverage @@ -22010,7 +21068,7 @@ packages: ghost-testrpc: 0.0.2 global-modules: 2.0.0 globby: 10.0.2 - hardhat: 2.12.2_2dtigtkb225m7ii7q45utxqwgi + hardhat: 2.13.0_6qtx7vkbdhwvdm4crzlegk4mvi jsonschema: 1.4.1 lodash: 4.17.21 mocha: 7.1.2 @@ -22020,7 +21078,7 @@ packages: sc-istanbul: 0.4.6 semver: 7.3.8 shelljs: 0.8.5 - web3-utils: 1.8.1 + web3-utils: 1.8.2 transitivePeerDependencies: - supports-color dev: true From 53bfe0769ab96bf869762ad5d6140f0d618ec3b6 Mon Sep 17 00:00:00 2001 From: Daniel Wang Date: Wed, 22 Mar 2023 12:35:55 +0800 Subject: [PATCH 02/47] refactor --- packages/protocol/contracts/L1/TaikoToken.sol | 2 +- .../contracts/L1/libs/LibVerifying.sol | 2 +- packages/protocol/contracts/L2/TaikoL2.sol | 4 +-- packages/protocol/snapshot.txt | 11 +++++++ packages/protocol/test2/GasComparison.t.sol | 30 +++++++++---------- packages/protocol/test2/TaikoL1.t.sol | 12 ++++---- packages/protocol/test2/TaikoL1TestBase.sol | 2 +- .../contract-documentation/L1/TaikoErrors.md | 6 ++++ .../signal/SignalService.md | 2 +- 9 files changed, 44 insertions(+), 27 deletions(-) create mode 100644 packages/protocol/snapshot.txt diff --git a/packages/protocol/contracts/L1/TaikoToken.sol b/packages/protocol/contracts/L1/TaikoToken.sol index 148e8eb96bb..4996fbb4966 100644 --- a/packages/protocol/contracts/L1/TaikoToken.sol +++ b/packages/protocol/contracts/L1/TaikoToken.sol @@ -61,7 +61,7 @@ contract TaikoToken is EssentialContract, ERC20Upgradeable, IMintableERC20 { decimals_: 18 }); - for (uint i = 0; i < _premintRecipients.length; ++i) { + for (uint256 i = 0; i < _premintRecipients.length; ++i) { _mint(_premintRecipients[i], _premintAmounts[i]); } } diff --git a/packages/protocol/contracts/L1/libs/LibVerifying.sol b/packages/protocol/contracts/L1/libs/LibVerifying.sol index 71cba51f202..0c801648fd7 100644 --- a/packages/protocol/contracts/L1/libs/LibVerifying.sol +++ b/packages/protocol/contracts/L1/libs/LibVerifying.sol @@ -149,7 +149,7 @@ library LibVerifying { .toUint64(); } - uint proofTime; + uint256 proofTime; unchecked { proofTime = (fc.provenAt - blk.proposedAt) * 1000; } diff --git a/packages/protocol/contracts/L2/TaikoL2.sol b/packages/protocol/contracts/L2/TaikoL2.sol index e7c55a9e634..7cb87c93166 100644 --- a/packages/protocol/contracts/L2/TaikoL2.sol +++ b/packages/protocol/contracts/L2/TaikoL2.sol @@ -67,7 +67,7 @@ contract TaikoL2 is EssentialContract, TaikoL2Signer, IXchainSync { (publicInputHash, ) = _calcPublicInputHash(block.number); if (block.number > 0) { - uint parentHeight = block.number - 1; + uint256 parentHeight = block.number - 1; _l2Hashes[parentHeight] = blockhash(parentHeight); } } @@ -175,7 +175,7 @@ contract TaikoL2 is EssentialContract, TaikoL2Signer, IXchainSync { // put the previous 255 blockhashes (excluding the parent's) into a // ring buffer. for (uint256 i; i < 255 && blockNumber >= i + 1; ++i) { - uint j = blockNumber - i - 1; + uint256 j = blockNumber - i - 1; inputs[j % 255] = blockhash(j); } } diff --git a/packages/protocol/snapshot.txt b/packages/protocol/snapshot.txt new file mode 100644 index 00000000000..04538961afc --- /dev/null +++ b/packages/protocol/snapshot.txt @@ -0,0 +1,11 @@ +GasComparisonTest:testCompareHashString(uint256) (runs: 256, μ: 278647, ~: 220728) +ReadBlockhashVsCalldata:testAnchorSigning(bytes32) (runs: 256, μ: 23434, ~: 23453) +ReadBlockhashVsCalldata:testAnchorTxs() (gas: 74910999) +ReadBlockhashVsCalldata:testAnchorTxsFailByNonTaikoL2Signer() (gas: 8472) +ReadBlockhashVsCalldata:testAnchorTxsFailInTheSameBlock() (gas: 121154) +TaikoL1Test:test_block_time_decreases_but_fee_remains() (gas: 18572742) +TaikoL1Test:test_block_time_increases_but_fee_decreases() (gas: 18550268) +TaikoL1Test:test_more_blocks_than_ring_buffer_size() (gas: 20880651) +TaikoL1Test:test_multiple_blocks_in_one_L1_block() (gas: 757668) +TaikoL1Test:test_verifying_multiple_blocks_once() (gas: 2724631) +TaikoL1WithConfig:test_getTimeAdjustedFee() (gas: 1461) \ No newline at end of file diff --git a/packages/protocol/test2/GasComparison.t.sol b/packages/protocol/test2/GasComparison.t.sol index d20e7c15b48..edc594e0640 100644 --- a/packages/protocol/test2/GasComparison.t.sol +++ b/packages/protocol/test2/GasComparison.t.sol @@ -130,23 +130,23 @@ contract FooBar { //------ - function increment_1(uint count) public { - uint a; - for (uint i = 0; i < count; i++) { + function increment_1(uint256 count) public { + uint256 a; + for (uint256 i = 0; i < count; i++) { a += i; } } - function increment_2(uint count) public { - uint a; - for (uint i = 0; i < count; ++i) { + function increment_2(uint256 count) public { + uint256 a; + for (uint256 i = 0; i < count; ++i) { a += i; } } - function increment_3(uint count) public { - uint a; - for (uint i = 0; i < count; ) { + function increment_3(uint256 count) public { + uint256 a; + for (uint256 i = 0; i < count; ) { a += i; unchecked { i++; @@ -154,9 +154,9 @@ contract FooBar { } } - function increment_4(uint count) public { - uint a; - for (uint i = 0; i < count; ) { + function increment_4(uint256 count) public { + uint256 a; + for (uint256 i = 0; i < count; ) { a += i; unchecked { ++i; @@ -166,14 +166,14 @@ contract FooBar { // ------ function hashKey_1( - uint chainId, + uint256 chainId, string memory name ) public view returns (bytes32) { return keccak256(bytes(string.concat(Strings.toString(chainId), name))); } function hashKey_2( - uint chainId, + uint256 chainId, string memory name ) public view returns (bytes32) { return keccak256(abi.encodePacked(chainId, name)); @@ -200,7 +200,7 @@ contract GasComparisonTest is Test { foobar = new FooBar(); } - function testCompareHashString(uint count) external { + function testCompareHashString(uint256 count) external { vm.assume(count > 10 && count < 1000); string memory str = string(new bytes(count)); assertEq( diff --git a/packages/protocol/test2/TaikoL1.t.sol b/packages/protocol/test2/TaikoL1.t.sol index f811b7c48e8..be427ea5d9a 100644 --- a/packages/protocol/test2/TaikoL1.t.sol +++ b/packages/protocol/test2/TaikoL1.t.sol @@ -81,7 +81,7 @@ contract TaikoL1Test is TaikoL1TestBase { bytes32 parentHash = GENESIS_BLOCK_HASH; for ( - uint blockId = 1; + uint256 blockId = 1; blockId < conf.maxNumProposedBlocks * 10; blockId++ ) { @@ -106,7 +106,7 @@ contract TaikoL1Test is TaikoL1TestBase { bytes32 parentHash = GENESIS_BLOCK_HASH; - for (uint blockId = 1; blockId <= 2; blockId++) { + for (uint256 blockId = 1; blockId <= 2; blockId++) { printVariables("before propose"); TaikoData.BlockMetadata memory meta = proposeBlock(Alice, 1024); printVariables("after propose"); @@ -127,7 +127,7 @@ contract TaikoL1Test is TaikoL1TestBase { bytes32 parentHash = GENESIS_BLOCK_HASH; for ( - uint blockId = 1; + uint256 blockId = 1; blockId <= conf.maxNumProposedBlocks - 1; blockId++ ) { @@ -155,7 +155,7 @@ contract TaikoL1Test is TaikoL1TestBase { bytes32 parentHash = GENESIS_BLOCK_HASH; for ( - uint blockId = 1; + uint256 blockId = 1; blockId < conf.maxNumProposedBlocks * 10; blockId++ ) { @@ -182,9 +182,9 @@ contract TaikoL1Test is TaikoL1TestBase { bytes32 parentHash = GENESIS_BLOCK_HASH; - uint total = conf.maxNumProposedBlocks * 10; + uint256 total = conf.maxNumProposedBlocks * 10; - for (uint blockId = 1; blockId < total; blockId++) { + for (uint256 blockId = 1; blockId < total; blockId++) { printVariables("before propose"); TaikoData.BlockMetadata memory meta = proposeBlock(Alice, 1024); mine(1); diff --git a/packages/protocol/test2/TaikoL1TestBase.sol b/packages/protocol/test2/TaikoL1TestBase.sol index 2c43831f7ff..460866ca2e2 100644 --- a/packages/protocol/test2/TaikoL1TestBase.sol +++ b/packages/protocol/test2/TaikoL1TestBase.sol @@ -153,7 +153,7 @@ abstract contract TaikoL1TestBase is Test { function _depositTaikoToken( address who, uint256 amountTko, - uint amountEth + uint256 amountEth ) internal { vm.deal(who, amountEth * 1 ether); tko.transfer(who, amountTko * 1 ether); diff --git a/packages/website/pages/docs/reference/contract-documentation/L1/TaikoErrors.md b/packages/website/pages/docs/reference/contract-documentation/L1/TaikoErrors.md index ae1eeefb681..b4d0403fc86 100644 --- a/packages/website/pages/docs/reference/contract-documentation/L1/TaikoErrors.md +++ b/packages/website/pages/docs/reference/contract-documentation/L1/TaikoErrors.md @@ -123,3 +123,9 @@ error L1_TX_LIST_RANGE() ```solidity error L1_TX_LIST() ``` + +### L1_UNEXPECTED_FORK_CHOICE_ID + +```solidity +error L1_UNEXPECTED_FORK_CHOICE_ID() +``` diff --git a/packages/website/pages/docs/reference/contract-documentation/signal/SignalService.md b/packages/website/pages/docs/reference/contract-documentation/signal/SignalService.md index c6c13eb467f..b8738414912 100644 --- a/packages/website/pages/docs/reference/contract-documentation/signal/SignalService.md +++ b/packages/website/pages/docs/reference/contract-documentation/signal/SignalService.md @@ -8,7 +8,7 @@ title: SignalService ```solidity struct SignalProof { - struct BlockHeader header; + uint256 height; bytes proof; } ``` From 6a133808d558ff1c5dcdeb9205d5291cd5a162eb Mon Sep 17 00:00:00 2001 From: Daniel Wang <99078276+dantaik@users.noreply.github.com> Date: Wed, 22 Mar 2023 12:39:46 +0800 Subject: [PATCH 03/47] Delete .gas-snapshot --- packages/protocol/.gas-snapshot | 2 -- 1 file changed, 2 deletions(-) delete mode 100644 packages/protocol/.gas-snapshot diff --git a/packages/protocol/.gas-snapshot b/packages/protocol/.gas-snapshot deleted file mode 100644 index 1679d511059..00000000000 --- a/packages/protocol/.gas-snapshot +++ /dev/null @@ -1,2 +0,0 @@ -GasComparisonTest:testCompareHashString(uint256) (runs: 256, μ: 282730, ~: 206082) -TaikoL1Test:testProposeSingleBlock() (gas: 3474497) \ No newline at end of file From 177f41bfefb47dca51e13dfb3f1bf009058bedd2 Mon Sep 17 00:00:00 2001 From: Daniel Wang <99078276+dantaik@users.noreply.github.com> Date: Thu, 23 Mar 2023 10:03:54 +0800 Subject: [PATCH 04/47] refactor(protocol): check if amount > 0 inside sendEther (#13390) --- .../protocol/contracts/bridge/EtherVault.sol | 8 ++---- .../bridge/libs/LibBridgeProcess.sol | 20 ++++----------- .../contracts/bridge/libs/LibBridgeRetry.sol | 7 +++--- .../contracts/bridge/libs/LibBridgeSend.sol | 4 +-- .../protocol/contracts/libs/LibAddress.sol | 1 + packages/protocol/test2/GasComparison.t.sol | 25 +++++++++++-------- 6 files changed, 27 insertions(+), 38 deletions(-) diff --git a/packages/protocol/contracts/bridge/EtherVault.sol b/packages/protocol/contracts/bridge/EtherVault.sol index b71a2e63d22..60d2f15de0b 100644 --- a/packages/protocol/contracts/bridge/EtherVault.sol +++ b/packages/protocol/contracts/bridge/EtherVault.sol @@ -78,9 +78,7 @@ contract EtherVault is EssentialContract, BridgeErrors { * @param amount Amount of Ether to send. */ function releaseEther(uint256 amount) public onlyAuthorized nonReentrant { - if (amount > 0) { - msg.sender.sendEther(amount); - } + msg.sender.sendEther(amount); emit EtherReleased(msg.sender, amount); } @@ -97,9 +95,7 @@ contract EtherVault is EssentialContract, BridgeErrors { if (recipient == address(0)) { revert B_EV_DO_NOT_BURN(); } - if (amount > 0) { - recipient.sendEther(amount); - } + recipient.sendEther(amount); emit EtherReleased(recipient, amount); } diff --git a/packages/protocol/contracts/bridge/libs/LibBridgeProcess.sol b/packages/protocol/contracts/bridge/libs/LibBridgeProcess.sol index 1ab72780c60..b7384ce790f 100644 --- a/packages/protocol/contracts/bridge/libs/LibBridgeProcess.sol +++ b/packages/protocol/contracts/bridge/libs/LibBridgeProcess.sol @@ -97,9 +97,7 @@ library LibBridgeProcess { } // We send the Ether before the message call in case the call will // actually consume Ether. - if (message.depositValue > 0) { - message.owner.sendEther(message.depositValue); - } + message.owner.sendEther(message.depositValue); LibBridgeStatus.MessageStatus status; uint256 refundAmount; @@ -129,9 +127,7 @@ library LibBridgeProcess { status = LibBridgeStatus.MessageStatus.DONE; } else { status = LibBridgeStatus.MessageStatus.RETRIABLE; - if (ethVault != address(0) && message.callValue > 0) { - ethVault.sendEther(message.callValue); - } + ethVault.sendEther(message.callValue); } } @@ -145,19 +141,13 @@ library LibBridgeProcess { // if sender is the refundAddress if (msg.sender == refundAddress) { uint256 amount = message.processingFee + refundAmount; - if (amount > 0) { - refundAddress.sendEther(amount); - } + refundAddress.sendEther(amount); } else { // if sender is another address (eg. the relayer) // First attempt relayer is rewarded the processingFee // message.owner has to eat the cost - if (message.processingFee > 0) { - msg.sender.sendEther(message.processingFee); - } - if (refundAmount > 0) { - refundAddress.sendEther(refundAmount); - } + msg.sender.sendEther(message.processingFee); + refundAddress.sendEther(refundAmount); } } } diff --git a/packages/protocol/contracts/bridge/libs/LibBridgeRetry.sol b/packages/protocol/contracts/bridge/libs/LibBridgeRetry.sol index 752b2312bdb..af8143b7fee 100644 --- a/packages/protocol/contracts/bridge/libs/LibBridgeRetry.sol +++ b/packages/protocol/contracts/bridge/libs/LibBridgeRetry.sol @@ -89,10 +89,9 @@ library LibBridgeRetry { address refundAddress = message.refundAddress == address(0) ? message.owner : message.refundAddress; - if (message.callValue > 0) { - refundAddress.sendEther(message.callValue); - } - } else if (ethVault != address(0) && message.callValue > 0) { + + refundAddress.sendEther(message.callValue); + } else { ethVault.sendEther(message.callValue); } } diff --git a/packages/protocol/contracts/bridge/libs/LibBridgeSend.sol b/packages/protocol/contracts/bridge/libs/LibBridgeSend.sol index 3fbbba6b0c4..3d1de931337 100644 --- a/packages/protocol/contracts/bridge/libs/LibBridgeSend.sol +++ b/packages/protocol/contracts/bridge/libs/LibBridgeSend.sol @@ -74,9 +74,7 @@ library LibBridgeSend { // store it here on the Bridge. Processing will release Ether from the // EtherVault or the Bridge on the destination chain. address ethVault = resolver.resolve("ether_vault", true); - if (ethVault != address(0) && expectedAmount > 0) { - ethVault.sendEther(expectedAmount); - } + ethVault.sendEther(expectedAmount); message.id = state.nextMessageId++; message.sender = msg.sender; diff --git a/packages/protocol/contracts/libs/LibAddress.sol b/packages/protocol/contracts/libs/LibAddress.sol index 84468a4b693..314c3d4c0ab 100644 --- a/packages/protocol/contracts/libs/LibAddress.sol +++ b/packages/protocol/contracts/libs/LibAddress.sol @@ -18,6 +18,7 @@ library LibAddress { * @param amount The amount of Ether to send. */ function sendEther(address to, uint256 amount) internal { + if (amount == 0 || to == address(0)) return; (bool success, ) = payable(to).call{value: amount}(""); require(success, "ETH transfer failed"); } diff --git a/packages/protocol/test2/GasComparison.t.sol b/packages/protocol/test2/GasComparison.t.sol index edc594e0640..ecb17f9b68f 100644 --- a/packages/protocol/test2/GasComparison.t.sol +++ b/packages/protocol/test2/GasComparison.t.sol @@ -4,8 +4,16 @@ pragma solidity ^0.8.18; import "forge-std/Test.sol"; import "forge-std/console2.sol"; import "../contracts/L1/TaikoData.sol"; +import "../contracts/libs/LibAddress.sol"; import {Strings} from "@openzeppelin/contracts/utils/Strings.sol"; +library LibAddress2 { + function sendEther(address to, uint256 amount) internal { + (bool success, ) = payable(to).call{value: amount}(""); + require(success, "ETH transfer failed"); + } +} + struct MyStruct { uint256 id; uint256 l1Height; @@ -180,16 +188,13 @@ contract FooBar { } // ------ - function send0Ether_check(address to, uint256 amount) public { - if (amount > 0) { - (bool success, ) = payable(to).call{value: amount}(""); - require(success, "ETH transfer failed"); - } + function send0Ether_CheckOutside(address to, uint256 amount) public { + if (amount == 0 || to == address(0)) return; + LibAddress2.sendEther(to, amount); } - function send0Ether_noCheck(address to, uint256 amount) public { - (bool success, ) = payable(to).call{value: amount}(""); - require(success, "ETH transfer failed"); + function send0Ether_CheckInside(address to, uint256 amount) public { + LibAddress.sendEther(to, amount); } } @@ -261,8 +266,8 @@ contract GasComparisonTest is Test { { address to = 0x50081b12838240B1bA02b3177153Bca678a86078; - foobar.send0Ether_check(to, 0); - foobar.send0Ether_noCheck(to, 0); + foobar.send0Ether_CheckInside(to, 0); + foobar.send0Ether_CheckOutside(to, 0); } } } From 59cd9fabd27b3f6933226d2aa8910e2b9bbb7437 Mon Sep 17 00:00:00 2001 From: Daniel Wang <99078276+dantaik@users.noreply.github.com> Date: Thu, 23 Mar 2023 10:18:08 +0800 Subject: [PATCH 05/47] Update packages/protocol/contracts/L2/TaikoL2.sol Co-authored-by: Brecht Devos --- packages/protocol/contracts/L2/TaikoL2.sol | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/protocol/contracts/L2/TaikoL2.sol b/packages/protocol/contracts/L2/TaikoL2.sol index 7cb87c93166..96583b58ad2 100644 --- a/packages/protocol/contracts/L2/TaikoL2.sol +++ b/packages/protocol/contracts/L2/TaikoL2.sol @@ -82,7 +82,7 @@ contract TaikoL2 is EssentialContract, TaikoL2Signer, IXchainSync { * certain block-level global variables because they are not part of the * Trie structure. * - * A circuit will verify the integratity among: + * A circuit will verify the integrity among: * - l1Hash, l1SignalRoot, and l1SignalServiceAddress * - (l1Hash and l1SignalServiceAddress) are both hased into of the * ZKP's instance. From 6138b1fb66fc5b1dd3345a36e805259a2ff3dd00 Mon Sep 17 00:00:00 2001 From: Daniel Wang <99078276+dantaik@users.noreply.github.com> Date: Thu, 23 Mar 2023 20:26:18 +0800 Subject: [PATCH 06/47] refactor(protocol): address some comments from Brecht and Dani (#13428) Co-authored-by: adaki2004 --- packages/protocol/contracts/L1/TaikoData.sol | 8 ++++---- .../contracts/L1/libs/LibProposing.sol | 15 +++++++------- .../protocol/contracts/L1/libs/LibProving.sol | 6 +++--- .../contracts/L1/libs/LibTokenomics.sol | 7 ++++--- .../protocol/contracts/L1/libs/LibUtils.sol | 10 +++++----- .../contracts/L1/libs/LibVerifying.sol | 20 ++++++++++--------- packages/protocol/contracts/L2/TaikoL2.sol | 2 +- packages/protocol/test2/TaikoL1TestBase.sol | 8 ++++---- .../contract-documentation/L1/TaikoData.md | 8 ++++---- .../contract-documentation/L2/TaikoL2.md | 4 ++-- 10 files changed, 46 insertions(+), 42 deletions(-) diff --git a/packages/protocol/contracts/L1/TaikoData.sol b/packages/protocol/contracts/L1/TaikoData.sol index 5474e7fe12f..e34bbed85f3 100644 --- a/packages/protocol/contracts/L1/TaikoData.sol +++ b/packages/protocol/contracts/L1/TaikoData.sol @@ -48,8 +48,8 @@ library TaikoData { uint64 feeBaseTwei; uint64 genesisHeight; uint64 genesisTimestamp; - uint64 nextBlockId; - uint64 lastBlockId; + uint64 numBlocks; + uint64 lastVerifiedBlockId; uint64 avgBlockTime; uint64 avgProofTime; uint64 lastProposedAt; @@ -144,13 +144,13 @@ library TaikoData { uint64 __reserved2; // Changed when a block is proposed or proven/finalized // Changed when a block is proposed - uint64 nextBlockId; + uint64 numBlocks; uint64 lastProposedAt; // Timestamp when the last block is proposed. uint64 avgBlockTime; // miliseconds uint64 __reserved3; // Changed when a block is proven/finalized uint64 __reserved4; - uint64 lastBlockId; + uint64 lastVerifiedBlockId; // the proof time moving average, note that for each block, only the // first proof's time is considered. uint64 avgProofTime; // miliseconds diff --git a/packages/protocol/contracts/L1/libs/LibProposing.sol b/packages/protocol/contracts/L1/libs/LibProposing.sol index 4e8a1e71e54..80f36eef615 100644 --- a/packages/protocol/contracts/L1/libs/LibProposing.sol +++ b/packages/protocol/contracts/L1/libs/LibProposing.sol @@ -55,7 +55,8 @@ library LibProposing { ) revert L1_INVALID_METADATA(); if ( - state.nextBlockId >= state.lastBlockId + config.maxNumProposedBlocks + state.numBlocks >= + state.lastVerifiedBlockId + config.maxNumProposedBlocks ) revert L1_TOO_MANY_BLOCKS(); uint64 timeNow = uint64(block.timestamp); @@ -108,11 +109,11 @@ library LibProposing { // add salt to this random number as L2 mixHash uint256 mixHash; unchecked { - mixHash = block.prevrandao * state.nextBlockId; + mixHash = block.prevrandao * state.numBlocks; } TaikoData.BlockMetadata memory meta = TaikoData.BlockMetadata({ - id: state.nextBlockId, + id: state.numBlocks, gasLimit: input.gasLimit, timestamp: timeNow, l1Height: uint64(block.number - 1), @@ -151,7 +152,7 @@ library LibProposing { } TaikoData.ProposedBlock storage blk = state.proposedBlocks[ - state.nextBlockId % config.maxNumProposedBlocks + state.numBlocks % config.maxNumProposedBlocks ]; blk.metaHash = LibUtils.hashMetadata(meta); @@ -176,9 +177,9 @@ library LibProposing { state.lastProposedAt = meta.timestamp; - emit BlockProposed(state.nextBlockId, meta, txListCached); + emit BlockProposed(state.numBlocks, meta, txListCached); unchecked { - ++state.nextBlockId; + ++state.numBlocks; } } @@ -187,7 +188,7 @@ library LibProposing { uint256 maxNumProposedBlocks, uint256 id ) internal view returns (TaikoData.ProposedBlock storage) { - if (id <= state.lastBlockId || id >= state.nextBlockId) { + if (id <= state.lastVerifiedBlockId || id >= state.numBlocks) { revert L1_ID(); } diff --git a/packages/protocol/contracts/L1/libs/LibProving.sol b/packages/protocol/contracts/L1/libs/LibProving.sol index 2dddaca9430..ff4914fef94 100644 --- a/packages/protocol/contracts/L1/libs/LibProving.sol +++ b/packages/protocol/contracts/L1/libs/LibProving.sol @@ -42,8 +42,8 @@ library LibProving { TaikoData.BlockMetadata memory meta = evidence.meta; if ( meta.id != blockId || - meta.id <= state.lastBlockId || - meta.id >= state.nextBlockId + meta.id <= state.lastVerifiedBlockId || + meta.id >= state.numBlocks ) revert L1_ID(); if ( @@ -183,7 +183,7 @@ library LibProving { uint256 id, bytes32 parentHash ) internal view returns (TaikoData.ForkChoice storage) { - if (id <= state.lastBlockId || id >= state.nextBlockId) { + if (id <= state.lastVerifiedBlockId || id >= state.numBlocks) { revert L1_ID(); } diff --git a/packages/protocol/contracts/L1/libs/LibTokenomics.sol b/packages/protocol/contracts/L1/libs/LibTokenomics.sol index 69808fad441..c588687a2ad 100644 --- a/packages/protocol/contracts/L1/libs/LibTokenomics.sol +++ b/packages/protocol/contracts/L1/libs/LibTokenomics.sol @@ -81,7 +81,7 @@ library LibTokenomics { returns (uint256 newFeeBase, uint256 fee, uint256 depositAmount) { uint256 feeBase = fromTwei(state.feeBaseTwei); - if (state.nextBlockId <= config.constantFeeRewardBlocks) { + if (state.numBlocks <= config.constantFeeRewardBlocks) { fee = feeBase; newFeeBase = feeBase; } else { @@ -129,7 +129,7 @@ library LibTokenomics { if (proposedAt > provenAt) revert L1_INVALID_PARAM(); uint256 feeBase = fromTwei(state.feeBaseTwei); - if (state.lastBlockId <= config.constantFeeRewardBlocks) { + if (state.lastVerifiedBlockId <= config.constantFeeRewardBlocks) { reward = feeBase; newFeeBase = feeBase; // tRelBp = 0; @@ -167,7 +167,8 @@ library LibTokenomics { (config.maxNumProposedBlocks - 1) + config.slotSmoothingFactor; // n is the number of unverified blocks - uint256 n = 1000 * (state.nextBlockId - state.lastBlockId - 1); + uint256 n = 1000 * + (state.numBlocks - state.lastVerifiedBlockId - 1); // k is `m − n + 1` or `m − n - 1`in the whitepaper uint256 k = isProposal ? m - n - 1000 : m - n + 1000; return (feeBase * (m - 1000) * m) / (m - n) / k; diff --git a/packages/protocol/contracts/L1/libs/LibUtils.sol b/packages/protocol/contracts/L1/libs/LibUtils.sol index 56952929656..7d74d41aac6 100644 --- a/packages/protocol/contracts/L1/libs/LibUtils.sol +++ b/packages/protocol/contracts/L1/libs/LibUtils.sol @@ -25,10 +25,10 @@ library LibUtils { ) internal view returns (TaikoData.VerifiedBlock storage verifiedBlock) { uint256 _blockId = blockId; if (_blockId == 0) { - _blockId = state.lastBlockId; + _blockId = state.lastVerifiedBlockId; } else if ( - _blockId + maxNumVerifiedBlocks <= state.lastBlockId || - _blockId > state.lastBlockId + _blockId + maxNumVerifiedBlocks <= state.lastVerifiedBlockId || + _blockId > state.lastVerifiedBlockId ) revert L1_BLOCK_NUMBER(); verifiedBlock = state.verifiedBlocks[_blockId % maxNumVerifiedBlocks]; @@ -43,10 +43,10 @@ library LibUtils { feeBaseTwei: state.feeBaseTwei, genesisHeight: state.genesisHeight, genesisTimestamp: state.genesisTimestamp, - nextBlockId: state.nextBlockId, + numBlocks: state.numBlocks, lastProposedAt: state.lastProposedAt, avgBlockTime: state.avgBlockTime, - lastBlockId: state.lastBlockId, + lastVerifiedBlockId: state.lastVerifiedBlockId, avgProofTime: state.avgProofTime }); } diff --git a/packages/protocol/contracts/L1/libs/LibVerifying.sol b/packages/protocol/contracts/L1/libs/LibVerifying.sol index 0c801648fd7..846d4e2fe12 100644 --- a/packages/protocol/contracts/L1/libs/LibVerifying.sol +++ b/packages/protocol/contracts/L1/libs/LibVerifying.sol @@ -38,7 +38,7 @@ library LibVerifying { state.genesisHeight = uint64(block.number); state.genesisTimestamp = uint64(block.timestamp); state.feeBaseTwei = feeBaseTwei; - state.nextBlockId = 1; + state.numBlocks = 1; state.verifiedBlocks[0].blockHash = genesisBlockHash; @@ -51,24 +51,26 @@ library LibVerifying { uint256 maxBlocks ) internal { bytes32 blockHash = state - .verifiedBlocks[state.lastBlockId % config.maxNumVerifiedBlocks] + .verifiedBlocks[ + state.lastVerifiedBlockId % config.maxNumVerifiedBlocks + ] .blockHash; bytes32 signalRoot; uint64 processed; uint256 i; unchecked { - i = state.lastBlockId + 1; + i = state.lastVerifiedBlockId + 1; } - while (i < state.nextBlockId && processed < maxBlocks) { + while (i < state.numBlocks && processed < maxBlocks) { TaikoData.ProposedBlock storage blk = state.proposedBlocks[ i % config.maxNumProposedBlocks ]; uint256 fcId = state.forkChoiceIds[i][blockHash]; - if (blk.nextForkChoiceId <= fcId) { + if (fcId == 0) { break; } @@ -95,7 +97,7 @@ library LibVerifying { if (processed > 0) { unchecked { - state.lastBlockId += processed; + state.lastVerifiedBlockId += processed; } // Note: Not all L2 hashes are stored on L1, only the last @@ -103,14 +105,14 @@ library LibVerifying { // verified hash is the only one needed checking the existence // of a cross-chain message with a merkle proof. state.verifiedBlocks[ - state.lastBlockId % config.maxNumVerifiedBlocks + state.lastVerifiedBlockId % config.maxNumVerifiedBlocks ] = TaikoData.VerifiedBlock( - state.lastBlockId, + state.lastVerifiedBlockId, blockHash, signalRoot ); - emit XchainSynced(state.lastBlockId, blockHash, signalRoot); + emit XchainSynced(state.lastVerifiedBlockId, blockHash, signalRoot); } } diff --git a/packages/protocol/contracts/L2/TaikoL2.sol b/packages/protocol/contracts/L2/TaikoL2.sol index 96583b58ad2..790de867db3 100644 --- a/packages/protocol/contracts/L2/TaikoL2.sol +++ b/packages/protocol/contracts/L2/TaikoL2.sol @@ -84,7 +84,7 @@ contract TaikoL2 is EssentialContract, TaikoL2Signer, IXchainSync { * * A circuit will verify the integrity among: * - l1Hash, l1SignalRoot, and l1SignalServiceAddress - * - (l1Hash and l1SignalServiceAddress) are both hased into of the + * - (l1Hash and l1SignalServiceAddress) are both hashed into of the * ZKP's instance. * * This transaction shall be the first transaction in every L2 block. diff --git a/packages/protocol/test2/TaikoL1TestBase.sol b/packages/protocol/test2/TaikoL1TestBase.sol index 460866ca2e2..ef4df260133 100644 --- a/packages/protocol/test2/TaikoL1TestBase.sol +++ b/packages/protocol/test2/TaikoL1TestBase.sol @@ -92,10 +92,10 @@ abstract contract TaikoL1TestBase is Test { uint256 _mixHash; unchecked { - _mixHash = block.prevrandao * variables.nextBlockId; + _mixHash = block.prevrandao * variables.numBlocks; } - meta.id = variables.nextBlockId; + meta.id = variables.numBlocks; meta.l1Height = uint64(block.number - 1); meta.l1Hash = blockhash(block.number - 1); meta.beneficiary = proposer; @@ -168,9 +168,9 @@ abstract contract TaikoL1TestBase is Test { string memory str = string.concat( Strings.toString(logCount++), ":[", - Strings.toString(vars.lastBlockId), + Strings.toString(vars.lastVerifiedBlockId), unicode"→", - Strings.toString(vars.nextBlockId), + Strings.toString(vars.numBlocks), "] feeBase(twei):", Strings.toString(vars.feeBaseTwei), " fee(twei):", diff --git a/packages/website/pages/docs/reference/contract-documentation/L1/TaikoData.md b/packages/website/pages/docs/reference/contract-documentation/L1/TaikoData.md index 5bdcde55c64..5763d14f532 100644 --- a/packages/website/pages/docs/reference/contract-documentation/L1/TaikoData.md +++ b/packages/website/pages/docs/reference/contract-documentation/L1/TaikoData.md @@ -52,8 +52,8 @@ struct StateVariables { uint64 feeBaseTwei; uint64 genesisHeight; uint64 genesisTimestamp; - uint64 nextBlockId; - uint64 lastBlockId; + uint64 numBlocks; + uint64 lastVerifiedBlockId; uint64 avgBlockTime; uint64 avgProofTime; uint64 lastProposedAt; @@ -168,12 +168,12 @@ struct State { uint64 genesisTimestamp; uint64 __reserved1; uint64 __reserved2; - uint64 nextBlockId; + uint64 numBlocks; uint64 lastProposedAt; uint64 avgBlockTime; uint64 __reserved3; uint64 __reserved4; - uint64 lastBlockId; + uint64 lastVerifiedBlockId; uint64 avgProofTime; uint64 feeBaseTwei; uint256[42] __gap; diff --git a/packages/website/pages/docs/reference/contract-documentation/L2/TaikoL2.md b/packages/website/pages/docs/reference/contract-documentation/L2/TaikoL2.md index 7f8e5c23eb8..5138d4743dd 100644 --- a/packages/website/pages/docs/reference/contract-documentation/L2/TaikoL2.md +++ b/packages/website/pages/docs/reference/contract-documentation/L2/TaikoL2.md @@ -72,10 +72,10 @@ message verification (eg. bridging). This function will also check certain block-level global variables because they are not part of the Trie structure. -A circuit will verify the integratity among: +A circuit will verify the integrity among: - l1Hash, l1SignalRoot, and l1SignalServiceAddress -- (l1Hash and l1SignalServiceAddress) are both hased into of the +- (l1Hash and l1SignalServiceAddress) are both hashed into of the ZKP's instance. This transaction shall be the first transaction in every L2 block. From 4ddbd9b6d429254eb7b8e8d4530770a7c62826ed Mon Sep 17 00:00:00 2001 From: Daniel Wang <99078276+dantaik@users.noreply.github.com> Date: Fri, 24 Mar 2023 14:04:12 +0800 Subject: [PATCH 07/47] feat(protocol): make gasUsed of L2 blocks available on L1 (#13440) Co-authored-by: David --- packages/protocol/contracts/L1/TaikoData.sol | 1 + .../protocol/contracts/L1/libs/LibProving.sol | 9 +++++---- packages/protocol/test2/TaikoL1.t.sol | 15 ++++++++++----- packages/protocol/test2/TaikoL1TestBase.sol | 4 +++- 4 files changed, 19 insertions(+), 10 deletions(-) diff --git a/packages/protocol/contracts/L1/TaikoData.sol b/packages/protocol/contracts/L1/TaikoData.sol index e34bbed85f3..c3b6a699d52 100644 --- a/packages/protocol/contracts/L1/TaikoData.sol +++ b/packages/protocol/contracts/L1/TaikoData.sol @@ -91,6 +91,7 @@ library TaikoData { bytes32 blockHash; bytes32 signalRoot; address prover; + uint64 gasUsed; } struct ForkChoice { diff --git a/packages/protocol/contracts/L1/libs/LibProving.sol b/packages/protocol/contracts/L1/libs/LibProving.sol index ff4914fef94..60db6f4e63f 100644 --- a/packages/protocol/contracts/L1/libs/LibProving.sol +++ b/packages/protocol/contracts/L1/libs/LibProving.sol @@ -131,7 +131,7 @@ library LibProving { false ); - bytes32[9] memory inputs; + bytes32[10] memory inputs; inputs[0] = bytes32(uint256(uint160(l1SignalService))); inputs[1] = bytes32(uint256(uint160(l2SignalService))); inputs[2] = bytes32(uint256(uint160(taikoL2))); @@ -139,16 +139,17 @@ library LibProving { inputs[4] = evidence.blockHash; inputs[5] = evidence.signalRoot; inputs[6] = bytes32(uint256(uint160(evidence.prover))); - inputs[7] = blk.metaHash; + inputs[7] = bytes32(uint256(evidence.gasUsed)); // TODO(daniel): document this + inputs[8] = blk.metaHash; // Circuits shall use this value to check anchor gas limit. // Note that this value is not necessary and can be hard-coded // in to the circuit code, but if we upgrade the protocol // and the gas limit changes, then having it here may be handy. - inputs[8] = bytes32(config.anchorTxGasLimit); + inputs[9] = bytes32(config.anchorTxGasLimit); assembly { - instance := keccak256(inputs, mul(32, 9)) + instance := keccak256(inputs, mul(32, 10)) } } diff --git a/packages/protocol/test2/TaikoL1.t.sol b/packages/protocol/test2/TaikoL1.t.sol index be427ea5d9a..ff5bb22ea65 100644 --- a/packages/protocol/test2/TaikoL1.t.sol +++ b/packages/protocol/test2/TaikoL1.t.sol @@ -79,6 +79,7 @@ contract TaikoL1Test is TaikoL1TestBase { _depositTaikoToken(Carol, 1E6, 100); bytes32 parentHash = GENESIS_BLOCK_HASH; + uint64 gasUsed = 1000000; for ( uint256 blockId = 1; @@ -92,7 +93,7 @@ contract TaikoL1Test is TaikoL1TestBase { bytes32 blockHash = bytes32(1E10 + blockId); bytes32 signalRoot = bytes32(1E9 + blockId); - proveBlock(Bob, meta, parentHash, blockHash, signalRoot); + proveBlock(Bob, gasUsed, meta, parentHash, blockHash, signalRoot); verifyBlock(Carol, 1); parentHash = blockHash; } @@ -105,6 +106,7 @@ contract TaikoL1Test is TaikoL1TestBase { _depositTaikoToken(Alice, 1000, 1000); bytes32 parentHash = GENESIS_BLOCK_HASH; + uint64 gasUsed = 1000000; for (uint256 blockId = 1; blockId <= 2; blockId++) { printVariables("before propose"); @@ -113,7 +115,7 @@ contract TaikoL1Test is TaikoL1TestBase { bytes32 blockHash = bytes32(1E10 + blockId); bytes32 signalRoot = bytes32(1E9 + blockId); - proveBlock(Alice, meta, parentHash, blockHash, signalRoot); + proveBlock(Alice, gasUsed, meta, parentHash, blockHash, signalRoot); verifyBlock(Alice, 2); parentHash = blockHash; } @@ -125,6 +127,7 @@ contract TaikoL1Test is TaikoL1TestBase { _depositTaikoToken(Alice, 1E6, 100); bytes32 parentHash = GENESIS_BLOCK_HASH; + uint64 gasUsed = 1000000; for ( uint256 blockId = 1; @@ -137,7 +140,7 @@ contract TaikoL1Test is TaikoL1TestBase { bytes32 blockHash = bytes32(1E10 + blockId); bytes32 signalRoot = bytes32(1E9 + blockId); - proveBlock(Alice, meta, parentHash, blockHash, signalRoot); + proveBlock(Alice, gasUsed, meta, parentHash, blockHash, signalRoot); parentHash = blockHash; } verifyBlock(Alice, conf.maxNumProposedBlocks - 2); @@ -153,6 +156,7 @@ contract TaikoL1Test is TaikoL1TestBase { _depositTaikoToken(Carol, 1E6, 100); bytes32 parentHash = GENESIS_BLOCK_HASH; + uint64 gasUsed = 1000000; for ( uint256 blockId = 1; @@ -165,7 +169,7 @@ contract TaikoL1Test is TaikoL1TestBase { bytes32 blockHash = bytes32(1E10 + blockId); bytes32 signalRoot = bytes32(1E9 + blockId); - proveBlock(Bob, meta, parentHash, blockHash, signalRoot); + proveBlock(Bob, gasUsed, meta, parentHash, blockHash, signalRoot); verifyBlock(Carol, 1); mine(blockId); parentHash = blockHash; @@ -181,6 +185,7 @@ contract TaikoL1Test is TaikoL1TestBase { _depositTaikoToken(Carol, 1E6, 100); bytes32 parentHash = GENESIS_BLOCK_HASH; + uint64 gasUsed = 1000000; uint256 total = conf.maxNumProposedBlocks * 10; @@ -191,7 +196,7 @@ contract TaikoL1Test is TaikoL1TestBase { bytes32 blockHash = bytes32(1E10 + blockId); bytes32 signalRoot = bytes32(1E9 + blockId); - proveBlock(Bob, meta, parentHash, blockHash, signalRoot); + proveBlock(Bob, gasUsed, meta, parentHash, blockHash, signalRoot); verifyBlock(Carol, 1); mine(total + 1 - blockId); parentHash = blockHash; diff --git a/packages/protocol/test2/TaikoL1TestBase.sol b/packages/protocol/test2/TaikoL1TestBase.sol index ef4df260133..f2441e63ac5 100644 --- a/packages/protocol/test2/TaikoL1TestBase.sol +++ b/packages/protocol/test2/TaikoL1TestBase.sol @@ -110,6 +110,7 @@ abstract contract TaikoL1TestBase is Test { function proveBlock( address prover, + uint64 gasUsed, TaikoData.BlockMetadata memory meta, bytes32 parentHash, bytes32 blockHash, @@ -126,7 +127,8 @@ abstract contract TaikoL1TestBase is Test { parentHash: parentHash, blockHash: blockHash, signalRoot: signalRoot, - prover: prover + prover: prover, + gasUsed: gasUsed }); vm.prank(prover, prover); From 0b8f7fe72b46899cb7f6a2f4425a127e3130a43e Mon Sep 17 00:00:00 2001 From: Daniel Wang <99078276+dantaik@users.noreply.github.com> Date: Sat, 25 Mar 2023 00:57:43 +0800 Subject: [PATCH 08/47] refactor(protocol): various changes based on Brecht & Dani's feedback (#13427) --- .../protocol/contracts/L1/TaikoConfig.sol | 6 +- packages/protocol/contracts/L1/TaikoData.sol | 30 +++---- .../protocol/contracts/L1/TaikoErrors.sol | 5 +- packages/protocol/contracts/L1/TaikoL1.sol | 57 ++++++------- .../contracts/L1/libs/LibProposing.sol | 27 +++---- .../protocol/contracts/L1/libs/LibProving.sol | 78 +++++++++--------- .../contracts/L1/libs/LibTokenomics.sol | 2 +- .../protocol/contracts/L1/libs/LibUtils.sol | 21 ++--- .../contracts/L1/libs/LibVerifying.sol | 80 ++++++++----------- .../contracts/test/L1/TestTaikoL1.sol | 2 +- .../test/L1/TestTaikoL1EnableTokenomics.sol | 2 +- .../test/L1/TaikoL1.integration.test.ts | 4 +- packages/protocol/test/L1/TaikoL1.test.ts | 2 +- packages/protocol/test2/TaikoL1.t.sol | 8 +- .../contract-documentation/L1/TaikoData.md | 26 +++--- .../contract-documentation/L1/TaikoErrors.md | 14 +--- .../contract-documentation/L1/TaikoL1.md | 4 +- 17 files changed, 161 insertions(+), 207 deletions(-) diff --git a/packages/protocol/contracts/L1/TaikoConfig.sol b/packages/protocol/contracts/L1/TaikoConfig.sol index 96d5fbc47ac..5fa96128338 100644 --- a/packages/protocol/contracts/L1/TaikoConfig.sol +++ b/packages/protocol/contracts/L1/TaikoConfig.sol @@ -13,9 +13,9 @@ library TaikoConfig { return TaikoData.Config({ chainId: 167, - // maxNumProposedBlocks-1 is actually the max number of pending blocks. - // two weeks if avg block time is 10 seconds - maxNumProposedBlocks: 120961, + // Two weeks if avg block time is 10 seconds + maxNumProposedBlocks: 120960, + ringBufferSize: 120960 + 10, maxNumVerifiedBlocks: 4096, //Each time one more block is verified, there will be ~20k // more gas cost. diff --git a/packages/protocol/contracts/L1/TaikoData.sol b/packages/protocol/contracts/L1/TaikoData.sol index c3b6a699d52..4a5cad1f61c 100644 --- a/packages/protocol/contracts/L1/TaikoData.sol +++ b/packages/protocol/contracts/L1/TaikoData.sol @@ -19,6 +19,7 @@ library TaikoData { struct Config { uint256 chainId; uint256 maxNumProposedBlocks; + uint256 ringBufferSize; uint256 maxNumVerifiedBlocks; // This number is calculated from maxNumProposedBlocks to make // the 'the maximum value of the multiplier' close to 20.0 @@ -94,31 +95,27 @@ library TaikoData { uint64 gasUsed; } + // 3 slots struct ForkChoice { bytes32 blockHash; bytes32 signalRoot; - address prover; uint64 provenAt; + address prover; } - // 4 slots - struct ProposedBlock { + // 5 slots + struct Block { + uint64 blockId; + uint64 proposedAt; + uint24 nextForkChoiceId; + uint24 verifiedForkChoiceId; bytes32 metaHash; uint256 deposit; address proposer; - uint64 proposedAt; - uint24 nextForkChoiceId; // ForkChoice storage are reusable mapping(uint256 forkChoiceId => ForkChoice) forkChoices; } - // 3 slots - struct VerifiedBlock { - uint64 blockId; - bytes32 blockHash; - bytes32 signalRoot; - } - // This struct takes 9 slots. struct TxListInfo { uint64 validSince; @@ -126,13 +123,8 @@ library TaikoData { } struct State { - // Ring buffer for proposed but unverified blocks. - mapping(uint256 blockId_mode_maxNumProposedBlocks => ProposedBlock) proposedBlocks; - // Ring buffer for recent verified blocks. - // It shall be big enough to cache the last verified block's hash and - // signal root for long enough so signals can be verified anytime within - // 30 minutes. - mapping(uint256 blockId_mode_maxNumVerifiedBlocks => VerifiedBlock) verifiedBlocks; + // Ring buffer for proposed blocks and a some recent verified blocks. + mapping(uint256 blockId_mode_ringBufferSize => Block) blocks; // A mapping from (blockId, parentHash) to a reusable ForkChoice storage pointer. // solhint-disable-next-line max-line-length mapping(uint256 blockId => mapping(bytes32 parentHash => uint256 forkChoiceId)) forkChoiceIds; diff --git a/packages/protocol/contracts/L1/TaikoErrors.sol b/packages/protocol/contracts/L1/TaikoErrors.sol index 797c26c9147..d8aa408f293 100644 --- a/packages/protocol/contracts/L1/TaikoErrors.sol +++ b/packages/protocol/contracts/L1/TaikoErrors.sol @@ -9,12 +9,11 @@ pragma solidity ^0.8.18; abstract contract TaikoErrors { // The following custom errors must match the definitions in other V1 libraries. error L1_ALREADY_PROVEN(); - error L1_BLOCK_NUMBER(); + error L1_BLOCK_ID(); error L1_CONFLICT_PROOF(); error L1_CONTRACT_NOT_ALLOWED(); error L1_EVIDENCE_MISMATCH(); - error L1_FORK_CHOICE_ID(); - error L1_ID(); + error L1_FORK_CHOICE_NOT_FOUND(); error L1_INSUFFICIENT_TOKEN(); error L1_INVALID_CONFIG(); error L1_INVALID_EVIDENCE(); diff --git a/packages/protocol/contracts/L1/TaikoL1.sol b/packages/protocol/contracts/L1/TaikoL1.sol index 36e36eeb935..9ed79c578a7 100644 --- a/packages/protocol/contracts/L1/TaikoL1.sol +++ b/packages/protocol/contracts/L1/TaikoL1.sol @@ -150,7 +150,7 @@ contract TaikoL1 is EssentialContract, IXchainSync, TaikoEvents, TaikoErrors { } function getBlock( - uint256 id + uint256 blockId ) public view @@ -161,11 +161,11 @@ contract TaikoL1 is EssentialContract, IXchainSync, TaikoEvents, TaikoErrors { uint64 _proposedAt ) { - TaikoData.ProposedBlock storage blk = LibProposing.getBlock( - state, - getConfig().maxNumProposedBlocks, - id - ); + TaikoData.Block storage blk = LibProposing.getBlock({ + state: state, + config: getConfig(), + blockId: blockId + }); _metaHash = blk.metaHash; _deposit = blk.deposit; _proposer = blk.proposer; @@ -173,42 +173,45 @@ contract TaikoL1 is EssentialContract, IXchainSync, TaikoEvents, TaikoErrors { } function getForkChoice( - uint256 id, + uint256 blockId, bytes32 parentHash ) public view returns (TaikoData.ForkChoice memory) { return - LibProving.getForkChoice( - state, - getConfig().maxNumProposedBlocks, - id, - parentHash - ); + LibProving.getForkChoice({ + state: state, + config: getConfig(), + blockId: blockId, + parentHash: parentHash + }); } function getXchainBlockHash( uint256 blockId ) public view override returns (bytes32) { + (bool found, TaikoData.Block storage blk) = LibUtils.getL2ChainData({ + state: state, + config: getConfig(), + blockId: blockId + }); return - LibUtils - .getL2ChainData( - state, - blockId, - getConfig().maxNumVerifiedBlocks - ) - .blockHash; + found + ? blk.forkChoices[blk.verifiedForkChoiceId].blockHash + : bytes32(0); } function getXchainSignalRoot( uint256 blockId ) public view override returns (bytes32) { + (bool found, TaikoData.Block storage blk) = LibUtils.getL2ChainData({ + state: state, + config: getConfig(), + blockId: blockId + }); + return - LibUtils - .getL2ChainData( - state, - blockId, - getConfig().maxNumVerifiedBlocks - ) - .signalRoot; + found + ? blk.forkChoices[blk.verifiedForkChoiceId].signalRoot + : bytes32(0); } function getStateVariables() diff --git a/packages/protocol/contracts/L1/libs/LibProposing.sol b/packages/protocol/contracts/L1/libs/LibProposing.sol index 80f36eef615..cc5a5f393e5 100644 --- a/packages/protocol/contracts/L1/libs/LibProposing.sol +++ b/packages/protocol/contracts/L1/libs/LibProposing.sol @@ -24,7 +24,7 @@ library LibProposing { bool txListCached ); - error L1_ID(); + error L1_BLOCK_ID(); error L1_INSUFFICIENT_TOKEN(); error L1_INVALID_METADATA(); error L1_NOT_SOLO_PROPOSER(); @@ -56,7 +56,7 @@ library LibProposing { if ( state.numBlocks >= - state.lastVerifiedBlockId + config.maxNumProposedBlocks + state.lastVerifiedBlockId + config.maxNumProposedBlocks + 1 ) revert L1_TOO_MANY_BLOCKS(); uint64 timeNow = uint64(block.timestamp); @@ -151,15 +151,17 @@ library LibProposing { .toUint64(); } - TaikoData.ProposedBlock storage blk = state.proposedBlocks[ - state.numBlocks % config.maxNumProposedBlocks + TaikoData.Block storage blk = state.blocks[ + state.numBlocks % config.ringBufferSize ]; + blk.blockId = state.numBlocks; + blk.proposedAt = meta.timestamp; + blk.nextForkChoiceId = 1; + blk.verifiedForkChoiceId = 0; blk.metaHash = LibUtils.hashMetadata(meta); blk.deposit = deposit; blk.proposer = msg.sender; - blk.proposedAt = meta.timestamp; - blk.nextForkChoiceId = 1; if (state.lastProposedAt > 0) { uint256 blockTime; @@ -185,13 +187,10 @@ library LibProposing { function getBlock( TaikoData.State storage state, - uint256 maxNumProposedBlocks, - uint256 id - ) internal view returns (TaikoData.ProposedBlock storage) { - if (id <= state.lastVerifiedBlockId || id >= state.numBlocks) { - revert L1_ID(); - } - - return state.proposedBlocks[id % maxNumProposedBlocks]; + TaikoData.Config memory config, + uint256 blockId + ) internal view returns (TaikoData.Block storage blk) { + blk = state.blocks[blockId % config.ringBufferSize]; + if (blk.blockId != blockId) revert L1_BLOCK_ID(); } } diff --git a/packages/protocol/contracts/L1/libs/LibProving.sol b/packages/protocol/contracts/L1/libs/LibProving.sol index 60db6f4e63f..adc84e2f5d4 100644 --- a/packages/protocol/contracts/L1/libs/LibProving.sol +++ b/packages/protocol/contracts/L1/libs/LibProving.sol @@ -23,10 +23,10 @@ library LibProving { ); error L1_ALREADY_PROVEN(); + error L1_BLOCK_ID(); error L1_CONFLICT_PROOF(); error L1_EVIDENCE_MISMATCH(); - error L1_FORK_CHOICE_ID(); - error L1_ID(); + error L1_FORK_CHOICE_NOT_FOUND(); error L1_INVALID_PROOF(); error L1_INVALID_EVIDENCE(); error L1_NOT_ORACLE_PROVER(); @@ -44,72 +44,67 @@ library LibProving { meta.id != blockId || meta.id <= state.lastVerifiedBlockId || meta.id >= state.numBlocks - ) revert L1_ID(); + ) revert L1_BLOCK_ID(); if ( - // 0 and 1 (placeholder) are not allowed - uint256(evidence.parentHash) <= 1 || - // 0 and 1 (placeholder) are not allowed - uint256(evidence.blockHash) <= 1 || + evidence.parentHash == 0 || + evidence.blockHash == 0 || // cannot be the same hash evidence.blockHash == evidence.parentHash || - // 0 and 1 (placeholder) are not allowed - uint256(evidence.signalRoot) <= 1 || + evidence.signalRoot == 0 || // prover must not be zero evidence.prover == address(0) ) revert L1_INVALID_EVIDENCE(); - TaikoData.ProposedBlock storage blk = state.proposedBlocks[ - meta.id % config.maxNumProposedBlocks + TaikoData.Block storage blk = state.blocks[ + meta.id % config.ringBufferSize ]; if (blk.metaHash != LibUtils.hashMetadata(meta)) revert L1_EVIDENCE_MISMATCH(); + TaikoData.ForkChoice storage fc; + bool oracleProving; + uint256 fcId = state.forkChoiceIds[blockId][evidence.parentHash]; if (fcId == 0) { fcId = blk.nextForkChoiceId; - state.forkChoiceIds[blockId][evidence.parentHash] = fcId; - unchecked { ++blk.nextForkChoiceId; } - } else if (fcId >= blk.nextForkChoiceId) { - revert L1_UNEXPECTED_FORK_CHOICE_ID(); // this shall not happen - } - TaikoData.ForkChoice storage fc = blk.forkChoices[fcId]; + assert(fcId > 0); + state.forkChoiceIds[blockId][evidence.parentHash] = fcId; + fc = blk.forkChoices[fcId]; + fc.blockHash = evidence.blockHash; + fc.signalRoot = evidence.signalRoot; - bool oracleProving; - if (uint256(fc.blockHash) <= 1) { - // 0 or 1 (placeholder) indicate this block has not been proven if (config.enableOracleProver) { if (msg.sender != resolver.resolve("oracle_prover", false)) revert L1_NOT_ORACLE_PROVER(); oracleProving = true; - } - - fc.blockHash = evidence.blockHash; - fc.signalRoot = evidence.signalRoot; - - if (oracleProving) { - // make sure we reset the prover address to indicate it is - // proven by the oracle prover + // we are reusing storage slots, still need to reset the + // [provenAt+prover] slot. + fc.provenAt = uint64(1); fc.prover = address(0); } else { - fc.prover = evidence.prover; fc.provenAt = uint64(block.timestamp); + fc.prover = evidence.prover; } } else { - if (fc.prover != address(0)) revert L1_ALREADY_PROVEN(); + assert(fcId < blk.nextForkChoiceId); + fc = blk.forkChoices[fcId]; + if ( fc.blockHash != evidence.blockHash || fc.signalRoot != evidence.signalRoot ) revert L1_CONFLICT_PROOF(); - fc.prover = evidence.prover; + if (fc.prover != address(0)) revert L1_ALREADY_PROVEN(); + fc.provenAt = uint64(block.timestamp); + fc.prover = evidence.prover; } if (!oracleProving && !config.skipZKPVerification) { @@ -180,20 +175,19 @@ library LibProving { function getForkChoice( TaikoData.State storage state, - uint256 maxNumProposedBlocks, - uint256 id, + TaikoData.Config memory config, + uint256 blockId, bytes32 parentHash ) internal view returns (TaikoData.ForkChoice storage) { - if (id <= state.lastVerifiedBlockId || id >= state.numBlocks) { - revert L1_ID(); - } - - TaikoData.ProposedBlock storage blk = state.proposedBlocks[ - id % maxNumProposedBlocks + TaikoData.Block storage blk = state.blocks[ + blockId % config.ringBufferSize ]; - uint256 fcId = state.forkChoiceIds[id][parentHash]; - if (fcId == 0 || fcId >= blk.nextForkChoiceId) - revert L1_FORK_CHOICE_ID(); + if (blk.blockId != blockId) revert L1_BLOCK_ID(); + + uint256 fcId = state.forkChoiceIds[blockId][parentHash]; + if (fcId == 0) revert L1_FORK_CHOICE_NOT_FOUND(); + + assert(fcId < blk.nextForkChoiceId); return blk.forkChoices[fcId]; } diff --git a/packages/protocol/contracts/L1/libs/LibTokenomics.sol b/packages/protocol/contracts/L1/libs/LibTokenomics.sol index c588687a2ad..2e3f58bb718 100644 --- a/packages/protocol/contracts/L1/libs/LibTokenomics.sol +++ b/packages/protocol/contracts/L1/libs/LibTokenomics.sol @@ -164,7 +164,7 @@ library LibTokenomics { unchecked { // m is the `n'` in the whitepaper uint256 m = 1000 * - (config.maxNumProposedBlocks - 1) + + config.maxNumProposedBlocks + config.slotSmoothingFactor; // n is the number of unverified blocks uint256 n = 1000 * diff --git a/packages/protocol/contracts/L1/libs/LibUtils.sol b/packages/protocol/contracts/L1/libs/LibUtils.sol index 7d74d41aac6..5065f93359a 100644 --- a/packages/protocol/contracts/L1/libs/LibUtils.sol +++ b/packages/protocol/contracts/L1/libs/LibUtils.sol @@ -16,23 +16,16 @@ import {TaikoData} from "../TaikoData.sol"; library LibUtils { using LibMath for uint256; - error L1_BLOCK_NUMBER(); + error L1_BLOCK_ID(); function getL2ChainData( TaikoData.State storage state, - uint256 blockId, - uint256 maxNumVerifiedBlocks - ) internal view returns (TaikoData.VerifiedBlock storage verifiedBlock) { - uint256 _blockId = blockId; - if (_blockId == 0) { - _blockId = state.lastVerifiedBlockId; - } else if ( - _blockId + maxNumVerifiedBlocks <= state.lastVerifiedBlockId || - _blockId > state.lastVerifiedBlockId - ) revert L1_BLOCK_NUMBER(); - - verifiedBlock = state.verifiedBlocks[_blockId % maxNumVerifiedBlocks]; - if (verifiedBlock.blockId != blockId) revert L1_BLOCK_NUMBER(); + TaikoData.Config memory config, + uint256 blockId + ) internal view returns (bool found, TaikoData.Block storage blk) { + uint256 id = blockId == 0 ? state.lastVerifiedBlockId : blockId; + blk = state.blocks[id % config.ringBufferSize]; + found = (blk.blockId == id && blk.verifiedForkChoiceId != 0); } function getStateVariables( diff --git a/packages/protocol/contracts/L1/libs/LibVerifying.sol b/packages/protocol/contracts/L1/libs/LibVerifying.sol index 846d4e2fe12..a834c9d22d1 100644 --- a/packages/protocol/contracts/L1/libs/LibVerifying.sol +++ b/packages/protocol/contracts/L1/libs/LibVerifying.sol @@ -35,12 +35,20 @@ library LibVerifying { ) internal { _checkConfig(config); - state.genesisHeight = uint64(block.number); - state.genesisTimestamp = uint64(block.timestamp); + uint64 timeNow = uint64(block.number); + state.genesisHeight = timeNow; + state.genesisTimestamp = timeNow; state.feeBaseTwei = feeBaseTwei; state.numBlocks = 1; - state.verifiedBlocks[0].blockHash = genesisBlockHash; + TaikoData.Block storage blk = state.blocks[0]; + blk.proposedAt = timeNow; + blk.nextForkChoiceId = 2; + blk.verifiedForkChoiceId = 1; + + TaikoData.ForkChoice storage fc = state.blocks[0].forkChoices[1]; + fc.blockHash = genesisBlockHash; + fc.provenAt = timeNow; emit BlockVerified(0, genesisBlockHash); } @@ -50,43 +58,40 @@ library LibVerifying { TaikoData.Config memory config, uint256 maxBlocks ) internal { - bytes32 blockHash = state - .verifiedBlocks[ - state.lastVerifiedBlockId % config.maxNumVerifiedBlocks - ] - .blockHash; + uint256 i = state.lastVerifiedBlockId; + TaikoData.Block storage blk = state.blocks[i % config.ringBufferSize]; + + uint256 fcId = blk.verifiedForkChoiceId; + assert(fcId > 0); + + bytes32 blockHash = blk.forkChoices[fcId].blockHash; + assert(blockHash != bytes32(0)); bytes32 signalRoot; uint64 processed; - uint256 i; unchecked { - i = state.lastVerifiedBlockId + 1; + ++i; } while (i < state.numBlocks && processed < maxBlocks) { - TaikoData.ProposedBlock storage blk = state.proposedBlocks[ - i % config.maxNumProposedBlocks - ]; + blk = state.blocks[i % config.ringBufferSize]; - uint256 fcId = state.forkChoiceIds[i][blockHash]; - - if (fcId == 0) { - break; - } + fcId = state.forkChoiceIds[i][blockHash]; + if (fcId == 0) break; TaikoData.ForkChoice storage fc = blk.forkChoices[fcId]; - - if (fc.prover == address(0)) { - break; - } + if (fc.prover == address(0)) break; (blockHash, signalRoot) = _markBlockVerified({ state: state, config: config, - fc: fc, - blk: blk + blk: blk, + fcId: uint24(fcId), + fc: fc }); + assert(blockHash != bytes32(0)); + emit BlockVerified(i, blockHash); unchecked { @@ -99,19 +104,6 @@ library LibVerifying { unchecked { state.lastVerifiedBlockId += processed; } - - // Note: Not all L2 hashes are stored on L1, only the last - // verified one in a batch. This is sufficient because the last - // verified hash is the only one needed checking the existence - // of a cross-chain message with a merkle proof. - state.verifiedBlocks[ - state.lastVerifiedBlockId % config.maxNumVerifiedBlocks - ] = TaikoData.VerifiedBlock( - state.lastVerifiedBlockId, - blockHash, - signalRoot - ); - emit XchainSynced(state.lastVerifiedBlockId, blockHash, signalRoot); } } @@ -119,8 +111,9 @@ library LibVerifying { function _markBlockVerified( TaikoData.State storage state, TaikoData.Config memory config, + TaikoData.Block storage blk, TaikoData.ForkChoice storage fc, - TaikoData.ProposedBlock storage blk + uint24 fcId ) private returns (bytes32 blockHash, bytes32 signalRoot) { if (config.enableTokenomics) { (uint256 newFeeBase, uint256 amount, uint256 tRelBp) = LibTokenomics @@ -167,13 +160,7 @@ library LibVerifying { signalRoot = fc.signalRoot; blk.nextForkChoiceId = 1; - - // Clean up the fork choice but keep non-zeros if possible to be - // reused. - fc.blockHash = bytes32(uint256(1)); // none-zero placeholder - fc.signalRoot = bytes32(uint256(1)); // none-zero placeholder - fc.provenAt = 1; // none-zero placeholder - fc.prover = address(0); + blk.verifiedForkChoiceId = fcId; } function _addToBalance( @@ -194,7 +181,8 @@ library LibVerifying { function _checkConfig(TaikoData.Config memory config) private pure { if ( config.chainId <= 1 || - config.maxNumProposedBlocks <= 1 || + config.maxNumProposedBlocks == 1 || + config.ringBufferSize <= config.maxNumProposedBlocks + 1 || config.maxNumVerifiedBlocks == 0 || config.blockMaxGasLimit == 0 || config.maxTransactionsPerBlock == 0 || diff --git a/packages/protocol/contracts/test/L1/TestTaikoL1.sol b/packages/protocol/contracts/test/L1/TestTaikoL1.sol index e4e40490fe3..f398a8bb05a 100644 --- a/packages/protocol/contracts/test/L1/TestTaikoL1.sol +++ b/packages/protocol/contracts/test/L1/TestTaikoL1.sol @@ -19,7 +19,7 @@ contract TestTaikoL1 is TaikoL1 { config.chainId = 167; // up to 2048 pending blocks config.maxNumProposedBlocks = 4; - config.maxNumVerifiedBlocks = 3; + config.ringBufferSize = 6; // This number is calculated from maxNumProposedBlocks to make // the 'the maximum value of the multiplier' close to 20.0 config.maxVerificationsPerTx = 0; diff --git a/packages/protocol/contracts/test/L1/TestTaikoL1EnableTokenomics.sol b/packages/protocol/contracts/test/L1/TestTaikoL1EnableTokenomics.sol index 521fca91f06..fce4276f951 100644 --- a/packages/protocol/contracts/test/L1/TestTaikoL1EnableTokenomics.sol +++ b/packages/protocol/contracts/test/L1/TestTaikoL1EnableTokenomics.sol @@ -19,7 +19,7 @@ contract TestTaikoL1EnableTokenomics is TaikoL1 { config.chainId = 167; // up to 2048 pending blocks config.maxNumProposedBlocks = 6; - config.maxNumVerifiedBlocks = 10; + config.ringBufferSize = 8; // This number is calculated from maxNumProposedBlocks to make // the 'the maximum value of the multiplier' close to 20.0 config.maxVerificationsPerTx = 0; // dont verify blocks automatically diff --git a/packages/protocol/test/L1/TaikoL1.integration.test.ts b/packages/protocol/test/L1/TaikoL1.integration.test.ts index 52f606ac14e..63115fd59a7 100644 --- a/packages/protocol/test/L1/TaikoL1.integration.test.ts +++ b/packages/protocol/test/L1/TaikoL1.integration.test.ts @@ -71,7 +71,7 @@ describe("integ-----disabled-----ration:TaikoL1", function () { it("should revert if block is out of range and not a valid proposed block", async function () { await readShouldRevertWithCustomError( taikoL1.getBlock(123), - "L1_ID()" + "L1_BLOCK_ID()" ); }); @@ -240,7 +240,7 @@ describe("integ-----disabled-----ration:TaikoL1", function () { await txShouldRevertWithCustomError( txPromise, l1Provider, - "L1_ID()" + "L1_BLOCK_ID()" ); } }); diff --git a/packages/protocol/test/L1/TaikoL1.test.ts b/packages/protocol/test/L1/TaikoL1.test.ts index c317dc123ea..9027b5fac66 100644 --- a/packages/protocol/test/L1/TaikoL1.test.ts +++ b/packages/protocol/test/L1/TaikoL1.test.ts @@ -26,7 +26,7 @@ describe("TaikoL1", function () { describe("getXchainBlockHash()", async function () { it("should revert because header number has not been synced", async function () { await expect(taikoL1.getXchainBlockHash(1)).to.be.revertedWith( - "L1_BLOCK_NUMBER()" + "L1_BLOCK_ID()" ); }); diff --git a/packages/protocol/test2/TaikoL1.t.sol b/packages/protocol/test2/TaikoL1.t.sol index ff5bb22ea65..11d8522f24d 100644 --- a/packages/protocol/test2/TaikoL1.t.sol +++ b/packages/protocol/test2/TaikoL1.t.sol @@ -29,8 +29,8 @@ contract TaikoL1WithConfig is TaikoL1 { config.maxVerificationsPerTx = 0; config.enableSoloProposer = false; config.enableOracleProver = false; - config.maxNumProposedBlocks = 11; - config.maxNumVerifiedBlocks = 40; + config.maxNumProposedBlocks = 10; + config.ringBufferSize = 12; // this value must be changed if `maxNumProposedBlocks` is changed. config.slotSmoothingFactor = 4160; config.anchorTxGasLimit = 180000; @@ -131,7 +131,7 @@ contract TaikoL1Test is TaikoL1TestBase { for ( uint256 blockId = 1; - blockId <= conf.maxNumProposedBlocks - 1; + blockId <= conf.maxNumProposedBlocks; blockId++ ) { printVariables("before propose"); @@ -143,7 +143,7 @@ contract TaikoL1Test is TaikoL1TestBase { proveBlock(Alice, gasUsed, meta, parentHash, blockHash, signalRoot); parentHash = blockHash; } - verifyBlock(Alice, conf.maxNumProposedBlocks - 2); + verifyBlock(Alice, conf.maxNumProposedBlocks - 1); printVariables("after verify"); verifyBlock(Alice, conf.maxNumProposedBlocks); printVariables("after verify"); diff --git a/packages/website/pages/docs/reference/contract-documentation/L1/TaikoData.md b/packages/website/pages/docs/reference/contract-documentation/L1/TaikoData.md index 5763d14f532..b8bc41cb345 100644 --- a/packages/website/pages/docs/reference/contract-documentation/L1/TaikoData.md +++ b/packages/website/pages/docs/reference/contract-documentation/L1/TaikoData.md @@ -22,6 +22,7 @@ struct FeeConfig { struct Config { uint256 chainId; uint256 maxNumProposedBlocks; + uint256 ringBufferSize; uint256 maxNumVerifiedBlocks; uint256 maxVerificationsPerTx; uint256 blockMaxGasLimit; @@ -118,34 +119,26 @@ struct BlockEvidence { struct ForkChoice { bytes32 blockHash; bytes32 signalRoot; - address prover; uint64 provenAt; + address prover; } ``` -### ProposedBlock +### Block ```solidity -struct ProposedBlock { +struct Block { + uint64 blockId; + uint64 proposedAt; + uint24 nextForkChoiceId; + uint24 verifiedForkChoiceId; bytes32 metaHash; uint256 deposit; address proposer; - uint64 proposedAt; - uint24 nextForkChoiceId; mapping(uint256 => struct TaikoData.ForkChoice) forkChoices; } ``` -### VerifiedBlock - -```solidity -struct VerifiedBlock { - uint64 blockId; - bytes32 blockHash; - bytes32 signalRoot; -} -``` - ### TxListInfo ```solidity @@ -159,8 +152,7 @@ struct TxListInfo { ```solidity struct State { - mapping(uint256 => struct TaikoData.ProposedBlock) proposedBlocks; - mapping(uint256 => struct TaikoData.VerifiedBlock) verifiedBlocks; + mapping(uint256 => struct TaikoData.Block) blocks; mapping(uint256 => mapping(bytes32 => uint256)) forkChoiceIds; mapping(address => uint256) balances; mapping(bytes32 => struct TaikoData.TxListInfo) txListInfo; diff --git a/packages/website/pages/docs/reference/contract-documentation/L1/TaikoErrors.md b/packages/website/pages/docs/reference/contract-documentation/L1/TaikoErrors.md index b4d0403fc86..d783ef3470c 100644 --- a/packages/website/pages/docs/reference/contract-documentation/L1/TaikoErrors.md +++ b/packages/website/pages/docs/reference/contract-documentation/L1/TaikoErrors.md @@ -10,10 +10,10 @@ title: TaikoErrors error L1_ALREADY_PROVEN() ``` -### L1_BLOCK_NUMBER +### L1_BLOCK_ID ```solidity -error L1_BLOCK_NUMBER() +error L1_BLOCK_ID() ``` ### L1_CONFLICT_PROOF @@ -34,16 +34,10 @@ error L1_CONTRACT_NOT_ALLOWED() error L1_EVIDENCE_MISMATCH() ``` -### L1_FORK_CHOICE_ID +### L1_FORK_CHOICE_NOT_FOUND ```solidity -error L1_FORK_CHOICE_ID() -``` - -### L1_ID - -```solidity -error L1_ID() +error L1_FORK_CHOICE_NOT_FOUND() ``` ### L1_INSUFFICIENT_TOKEN diff --git a/packages/website/pages/docs/reference/contract-documentation/L1/TaikoL1.md b/packages/website/pages/docs/reference/contract-documentation/L1/TaikoL1.md index 8cec6299cb2..5ca79b851f1 100644 --- a/packages/website/pages/docs/reference/contract-documentation/L1/TaikoL1.md +++ b/packages/website/pages/docs/reference/contract-documentation/L1/TaikoL1.md @@ -94,13 +94,13 @@ function getProofReward(uint64 provenAt, uint64 proposedAt) public view returns ### getBlock ```solidity -function getBlock(uint256 id) public view returns (bytes32 _metaHash, uint256 _deposit, address _proposer, uint64 _proposedAt) +function getBlock(uint256 blockId) public view returns (bytes32 _metaHash, uint256 _deposit, address _proposer, uint64 _proposedAt) ``` ### getForkChoice ```solidity -function getForkChoice(uint256 id, bytes32 parentHash) public view returns (struct TaikoData.ForkChoice) +function getForkChoice(uint256 blockId, bytes32 parentHash) public view returns (struct TaikoData.ForkChoice) ``` ### getXchainBlockHash From 7b912ee37f09189b07bd8b609a923899c9e346b0 Mon Sep 17 00:00:00 2001 From: Daniel Wang <99078276+dantaik@users.noreply.github.com> Date: Sat, 25 Mar 2023 01:14:19 +0800 Subject: [PATCH 09/47] fix(protocol): allow deposit Ether to any address on L2 (#13426) --- packages/protocol/contracts/bridge/TokenVault.sol | 13 +++++++------ .../contracts/bridge/libs/LibBridgeProcess.sol | 1 - 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/packages/protocol/contracts/bridge/TokenVault.sol b/packages/protocol/contracts/bridge/TokenVault.sol index d07e2e24914..278a1c12578 100644 --- a/packages/protocol/contracts/bridge/TokenVault.sol +++ b/packages/protocol/contracts/bridge/TokenVault.sol @@ -121,7 +121,6 @@ contract TokenVault is EssentialContract { error TOKENVAULT_INVALID_TO(); error TOKENVAULT_INVALID_VALUE(); - error TOKENVAULT_INVALID_CALL_VALUE(); error TOKENVAULT_INVALID_TOKEN(); error TOKENVAULT_INVALID_AMOUNT(); error TOKENVAULT_CANONICAL_TOKEN_NOT_FOUND(); @@ -141,6 +140,10 @@ contract TokenVault is EssentialContract { /** * Receives Ether and constructs a Bridge message. Sends the Ether and * message along to the Bridge. + * + * @dev This function doesn't' seem to belong here as it has nothing to + * do with ERC20 tokens. It's added here only for convenience. + * * @param destChainId @custom:see IBridge.Message * @param to @custom:see IBridge.Message * @param gasLimit @custom:see IBridge.Message @@ -168,12 +171,10 @@ contract TokenVault is EssentialContract { message.to = to; message.gasLimit = gasLimit; message.processingFee = processingFee; - message.depositValue = msg.value - processingFee; + message.callValue = msg.value - processingFee; message.refundAddress = refundAddress; message.memo = memo; - - // prevent future PRs from changing the callValue when it must be zero - if (message.callValue != 0) revert TOKENVAULT_INVALID_CALL_VALUE(); + // message.depositValue = 0; bytes32 msgHash = IBridge(resolve("bridge", false)).sendMessage{ value: msg.value @@ -184,7 +185,7 @@ contract TokenVault is EssentialContract { from: message.owner, to: message.to, destChainId: destChainId, - amount: message.depositValue + amount: message.callValue }); } diff --git a/packages/protocol/contracts/bridge/libs/LibBridgeProcess.sol b/packages/protocol/contracts/bridge/libs/LibBridgeProcess.sol index b7384ce790f..17b205284d2 100644 --- a/packages/protocol/contracts/bridge/libs/LibBridgeProcess.sol +++ b/packages/protocol/contracts/bridge/libs/LibBridgeProcess.sol @@ -115,7 +115,6 @@ library LibBridgeProcess { ? gasleft() : message.gasLimit; - // this will call receiveERC20 on the tokenVault, sending the tokens to the user bool success = LibBridgeInvoke.invokeMessageCall({ state: state, message: message, From 7c0dbcd1811752b149fa96d0ea055409b5e10671 Mon Sep 17 00:00:00 2001 From: Daniel Wang <99078276+dantaik@users.noreply.github.com> Date: Sat, 25 Mar 2023 10:27:46 +0800 Subject: [PATCH 10/47] feat(protocol): instead of revert, emit a special event for conflicting proofs (#13449) --- .../protocol/contracts/L1/TaikoErrors.sol | 1 - .../protocol/contracts/L1/TaikoEvents.sol | 9 ++++++++ .../protocol/contracts/L1/libs/LibProving.sol | 22 +++++++++++++++++-- packages/relayer/TaikoL1.json | 5 ----- 4 files changed, 29 insertions(+), 8 deletions(-) diff --git a/packages/protocol/contracts/L1/TaikoErrors.sol b/packages/protocol/contracts/L1/TaikoErrors.sol index d8aa408f293..4d0a74135b6 100644 --- a/packages/protocol/contracts/L1/TaikoErrors.sol +++ b/packages/protocol/contracts/L1/TaikoErrors.sol @@ -10,7 +10,6 @@ abstract contract TaikoErrors { // The following custom errors must match the definitions in other V1 libraries. error L1_ALREADY_PROVEN(); error L1_BLOCK_ID(); - error L1_CONFLICT_PROOF(); error L1_CONTRACT_NOT_ALLOWED(); error L1_EVIDENCE_MISMATCH(); error L1_FORK_CHOICE_NOT_FOUND(); diff --git a/packages/protocol/contracts/L1/TaikoEvents.sol b/packages/protocol/contracts/L1/TaikoEvents.sol index 752080a7efe..cbd7388bb1b 100644 --- a/packages/protocol/contracts/L1/TaikoEvents.sol +++ b/packages/protocol/contracts/L1/TaikoEvents.sol @@ -24,5 +24,14 @@ abstract contract TaikoEvents { address prover ); + event ConflictingProof( + uint64 blockId, + bytes32 parentHash, + bytes32 conflictingBlockHash, + bytes32 conflictingSignalRoot, + bytes32 blockHash, + bytes32 signalRoot + ); + event BlockVerified(uint256 indexed id, bytes32 blockHash); } diff --git a/packages/protocol/contracts/L1/libs/LibProving.sol b/packages/protocol/contracts/L1/libs/LibProving.sol index adc84e2f5d4..7bdc4469785 100644 --- a/packages/protocol/contracts/L1/libs/LibProving.sol +++ b/packages/protocol/contracts/L1/libs/LibProving.sol @@ -22,9 +22,17 @@ library LibProving { address prover ); + event ConflictingProof( + uint64 blockId, + bytes32 parentHash, + bytes32 conflictingBlockHash, + bytes32 conflictingSignalRoot, + bytes32 blockHash, + bytes32 signalRoot + ); + error L1_ALREADY_PROVEN(); error L1_BLOCK_ID(); - error L1_CONFLICT_PROOF(); error L1_EVIDENCE_MISMATCH(); error L1_FORK_CHOICE_NOT_FOUND(); error L1_INVALID_PROOF(); @@ -99,7 +107,17 @@ library LibProving { if ( fc.blockHash != evidence.blockHash || fc.signalRoot != evidence.signalRoot - ) revert L1_CONFLICT_PROOF(); + ) { + emit ConflictingProof({ + blockId: meta.id, + parentHash: evidence.parentHash, + conflictingBlockHash: evidence.blockHash, + conflictingSignalRoot: evidence.signalRoot, + blockHash: fc.blockHash, + signalRoot: fc.signalRoot + }); + return; + } if (fc.prover != address(0)) revert L1_ALREADY_PROVEN(); diff --git a/packages/relayer/TaikoL1.json b/packages/relayer/TaikoL1.json index a52b5f49163..f9410f57423 100644 --- a/packages/relayer/TaikoL1.json +++ b/packages/relayer/TaikoL1.json @@ -99,11 +99,6 @@ "name": "L1_COMMITTED", "type": "error" }, - { - "inputs": [], - "name": "L1_CONFLICT_PROOF", - "type": "error" - }, { "inputs": [], "name": "L1_CONTRACT_NOT_ALLOWED", From 85acf3353646b4e48273d93e316844848d761cbd Mon Sep 17 00:00:00 2001 From: Daniel Wang <99078276+dantaik@users.noreply.github.com> Date: Sat, 25 Mar 2023 10:28:02 +0800 Subject: [PATCH 11/47] refactor(protocol): change TaikoToken's decimals from 18 to 8 (#13443) --- packages/protocol/contracts/L1/TaikoData.sol | 16 ++++----- packages/protocol/contracts/L1/TaikoL1.sol | 4 +-- packages/protocol/contracts/L1/TaikoToken.sol | 8 ++++- .../contracts/L1/libs/LibProposing.sol | 10 +++--- .../contracts/L1/libs/LibTokenomics.sol | 33 ++++--------------- .../protocol/contracts/L1/libs/LibUtils.sol | 2 +- .../contracts/L1/libs/LibVerifying.sol | 10 +++--- packages/protocol/test2/LibTokenomics.t.sol | 2 +- packages/protocol/test2/TaikoL1.t.sol | 32 +++++++++--------- packages/protocol/test2/TaikoL1TestBase.sol | 21 ++++++------ .../contract-documentation/L1/TaikoData.md | 11 ++++--- .../contract-documentation/L1/TaikoL1.md | 2 +- .../contract-documentation/L1/TaikoToken.md | 12 +++++++ 13 files changed, 80 insertions(+), 83 deletions(-) diff --git a/packages/protocol/contracts/L1/TaikoData.sol b/packages/protocol/contracts/L1/TaikoData.sol index 4a5cad1f61c..cdb8816b17e 100644 --- a/packages/protocol/contracts/L1/TaikoData.sol +++ b/packages/protocol/contracts/L1/TaikoData.sol @@ -46,7 +46,7 @@ library TaikoData { } struct StateVariables { - uint64 feeBaseTwei; + uint64 feeBase; uint64 genesisHeight; uint64 genesisTimestamp; uint64 numBlocks; @@ -69,9 +69,9 @@ library TaikoData { // 5 slots struct BlockMetadata { uint64 id; - uint32 gasLimit; uint64 timestamp; uint64 l1Height; + uint32 gasLimit; bytes32 l1Hash; bytes32 mixHash; bytes32 txListHash; @@ -92,7 +92,7 @@ library TaikoData { bytes32 blockHash; bytes32 signalRoot; address prover; - uint64 gasUsed; + uint32 gasUsed; } // 3 slots @@ -103,17 +103,17 @@ library TaikoData { address prover; } - // 5 slots + // 4 slots struct Block { + // ForkChoice storage are reusable + mapping(uint256 forkChoiceId => ForkChoice) forkChoices; uint64 blockId; uint64 proposedAt; + uint64 deposit; uint24 nextForkChoiceId; uint24 verifiedForkChoiceId; bytes32 metaHash; - uint256 deposit; address proposer; - // ForkChoice storage are reusable - mapping(uint256 forkChoiceId => ForkChoice) forkChoices; } // This struct takes 9 slots. @@ -147,7 +147,7 @@ library TaikoData { // the proof time moving average, note that for each block, only the // first proof's time is considered. uint64 avgProofTime; // miliseconds - uint64 feeBaseTwei; + uint64 feeBase; // Reserved uint256[42] __gap; } diff --git a/packages/protocol/contracts/L1/TaikoL1.sol b/packages/protocol/contracts/L1/TaikoL1.sol index 9ed79c578a7..9191b8b7f8c 100644 --- a/packages/protocol/contracts/L1/TaikoL1.sol +++ b/packages/protocol/contracts/L1/TaikoL1.sol @@ -28,14 +28,14 @@ contract TaikoL1 is EssentialContract, IXchainSync, TaikoEvents, TaikoErrors { function init( address _addressManager, bytes32 _genesisBlockHash, - uint64 _feeBaseTwei + uint64 _feeBase ) external initializer { EssentialContract._init(_addressManager); LibVerifying.init({ state: state, config: getConfig(), genesisBlockHash: _genesisBlockHash, - feeBaseTwei: _feeBaseTwei + feeBase: _feeBase }); } diff --git a/packages/protocol/contracts/L1/TaikoToken.sol b/packages/protocol/contracts/L1/TaikoToken.sol index 4996fbb4966..9b2159f73a8 100644 --- a/packages/protocol/contracts/L1/TaikoToken.sol +++ b/packages/protocol/contracts/L1/TaikoToken.sol @@ -36,6 +36,7 @@ contract TaikoToken is EssentialContract, ERC20Upgradeable, IMintableERC20 { error TKO_INVALID_ADDR(); error TKO_INVALID_PREMINT_PARAMS(); + error TKO_MINT_DISALLOWED(); /********************* * External Functions* @@ -58,7 +59,7 @@ contract TaikoToken is EssentialContract, ERC20Upgradeable, IMintableERC20 { ERC20Upgradeable.__ERC20_init({ name_: _name, symbol_: _symbol, - decimals_: 18 + decimals_: 8 }); for (uint256 i = 0; i < _premintRecipients.length; ++i) { @@ -116,4 +117,9 @@ contract TaikoToken is EssentialContract, ERC20Upgradeable, IMintableERC20 { _burn(account, amount); emit Burn(account, amount); } + + function _mint(address account, uint256 amount) internal override { + ERC20Upgradeable._mint(account, amount); + if (totalSupply() > type(uint64).max) revert TKO_MINT_DISALLOWED(); + } } diff --git a/packages/protocol/contracts/L1/libs/LibProposing.sol b/packages/protocol/contracts/L1/libs/LibProposing.sol index cc5a5f393e5..c06bd7f1008 100644 --- a/packages/protocol/contracts/L1/libs/LibProposing.sol +++ b/packages/protocol/contracts/L1/libs/LibProposing.sol @@ -114,9 +114,9 @@ library LibProposing { TaikoData.BlockMetadata memory meta = TaikoData.BlockMetadata({ id: state.numBlocks, - gasLimit: input.gasLimit, timestamp: timeNow, l1Height: uint64(block.number - 1), + gasLimit: input.gasLimit, l1Hash: blockhash(block.number - 1), mixHash: bytes32(mixHash), txListHash: input.txListHash, @@ -142,10 +142,10 @@ library LibProposing { state.balances[msg.sender] -= burnAmount; } // Update feeBase and avgBlockTime - state.feeBaseTwei = LibUtils + state.feeBase = LibUtils .movingAverage({ - maValue: state.feeBaseTwei, - newValue: LibTokenomics.toTwei(newFeeBase), + maValue: state.feeBase, + newValue: newFeeBase, maf: config.feeBaseMAF }) .toUint64(); @@ -157,10 +157,10 @@ library LibProposing { blk.blockId = state.numBlocks; blk.proposedAt = meta.timestamp; + blk.deposit = uint64(deposit); blk.nextForkChoiceId = 1; blk.verifiedForkChoiceId = 0; blk.metaHash = LibUtils.hashMetadata(meta); - blk.deposit = deposit; blk.proposer = msg.sender; if (state.lastProposedAt > 0) { diff --git a/packages/protocol/contracts/L1/libs/LibTokenomics.sol b/packages/protocol/contracts/L1/libs/LibTokenomics.sol index 2e3f58bb718..7cbf631367f 100644 --- a/packages/protocol/contracts/L1/libs/LibTokenomics.sol +++ b/packages/protocol/contracts/L1/libs/LibTokenomics.sol @@ -53,25 +53,6 @@ library LibTokenomics { } } - function fromTwei(uint64 amount) internal pure returns (uint256) { - if (amount == 0) { - return TWEI_TO_WEI; - } else { - return amount * TWEI_TO_WEI; - } - } - - function toTwei(uint256 amount) internal pure returns (uint64) { - uint256 _twei = amount / TWEI_TO_WEI; - if (_twei > type(uint64).max) { - return type(uint64).max; - } else if (_twei == 0) { - return uint64(1); - } else { - return uint64(_twei); - } - } - function getBlockFee( TaikoData.State storage state, TaikoData.Config memory config @@ -80,14 +61,13 @@ library LibTokenomics { view returns (uint256 newFeeBase, uint256 fee, uint256 depositAmount) { - uint256 feeBase = fromTwei(state.feeBaseTwei); if (state.numBlocks <= config.constantFeeRewardBlocks) { - fee = feeBase; - newFeeBase = feeBase; + fee = state.feeBase; + newFeeBase = state.feeBase; } else { (newFeeBase, ) = getTimeAdjustedFee({ feeConfig: config.proposingConfig, - feeBase: feeBase, + feeBase: state.feeBase, isProposal: true, tNow: block.timestamp, tLast: state.lastProposedAt, @@ -128,15 +108,14 @@ library LibTokenomics { { if (proposedAt > provenAt) revert L1_INVALID_PARAM(); - uint256 feeBase = fromTwei(state.feeBaseTwei); if (state.lastVerifiedBlockId <= config.constantFeeRewardBlocks) { - reward = feeBase; - newFeeBase = feeBase; + reward = state.feeBase; + newFeeBase = state.feeBase; // tRelBp = 0; } else { (newFeeBase, tRelBp) = getTimeAdjustedFee({ feeConfig: config.provingConfig, - feeBase: feeBase, + feeBase: state.feeBase, isProposal: false, tNow: provenAt, tLast: proposedAt, diff --git a/packages/protocol/contracts/L1/libs/LibUtils.sol b/packages/protocol/contracts/L1/libs/LibUtils.sol index 5065f93359a..35288749c35 100644 --- a/packages/protocol/contracts/L1/libs/LibUtils.sol +++ b/packages/protocol/contracts/L1/libs/LibUtils.sol @@ -33,7 +33,7 @@ library LibUtils { ) internal view returns (TaikoData.StateVariables memory) { return TaikoData.StateVariables({ - feeBaseTwei: state.feeBaseTwei, + feeBase: state.feeBase, genesisHeight: state.genesisHeight, genesisTimestamp: state.genesisTimestamp, numBlocks: state.numBlocks, diff --git a/packages/protocol/contracts/L1/libs/LibVerifying.sol b/packages/protocol/contracts/L1/libs/LibVerifying.sol index a834c9d22d1..1d3ff495348 100644 --- a/packages/protocol/contracts/L1/libs/LibVerifying.sol +++ b/packages/protocol/contracts/L1/libs/LibVerifying.sol @@ -31,14 +31,14 @@ library LibVerifying { TaikoData.State storage state, TaikoData.Config memory config, bytes32 genesisBlockHash, - uint64 feeBaseTwei + uint64 feeBase ) internal { _checkConfig(config); uint64 timeNow = uint64(block.number); state.genesisHeight = timeNow; state.genesisTimestamp = timeNow; - state.feeBaseTwei = feeBaseTwei; + state.feeBase = feeBase; state.numBlocks = 1; TaikoData.Block storage blk = state.blocks[0]; @@ -135,10 +135,10 @@ library LibVerifying { _addToBalance(state, blk.proposer, amount); // Update feeBase and avgProofTime - state.feeBaseTwei = LibUtils + state.feeBase = LibUtils .movingAverage({ - maValue: state.feeBaseTwei, - newValue: LibTokenomics.toTwei(newFeeBase), + maValue: state.feeBase, + newValue: newFeeBase, maf: config.feeBaseMAF }) .toUint64(); diff --git a/packages/protocol/test2/LibTokenomics.t.sol b/packages/protocol/test2/LibTokenomics.t.sol index 5c20e840c4e..8aab7e0bd0b 100644 --- a/packages/protocol/test2/LibTokenomics.t.sol +++ b/packages/protocol/test2/LibTokenomics.t.sol @@ -17,7 +17,7 @@ contract TaikoL1WithConfig is Test { } function test_getTimeAdjustedFee() public { - uint256 feeBase = 10 ether; + uint256 feeBase = 10 * 1E8; uint256 tLast = 100000; uint256 tAvg = 40; uint256 tNow = tLast + tAvg; diff --git a/packages/protocol/test2/TaikoL1.t.sol b/packages/protocol/test2/TaikoL1.t.sol index 11d8522f24d..d556283944f 100644 --- a/packages/protocol/test2/TaikoL1.t.sol +++ b/packages/protocol/test2/TaikoL1.t.sol @@ -74,12 +74,12 @@ contract TaikoL1Test is TaikoL1TestBase { /// @dev Test we can propose, prove, then verify more blocks than 'maxNumProposedBlocks' function test_more_blocks_than_ring_buffer_size() external { - _depositTaikoToken(Alice, 1E6, 100); - _depositTaikoToken(Bob, 1E6, 100); - _depositTaikoToken(Carol, 1E6, 100); + _depositTaikoToken(Alice, 1E6 * 1E8, 100 ether); + _depositTaikoToken(Bob, 1E6 * 1E8, 100 ether); + _depositTaikoToken(Carol, 1E6 * 1E8, 100 ether); bytes32 parentHash = GENESIS_BLOCK_HASH; - uint64 gasUsed = 1000000; + uint32 gasUsed = 1000000; for ( uint256 blockId = 1; @@ -103,10 +103,10 @@ contract TaikoL1Test is TaikoL1TestBase { /// @dev Test more than one block can be proposed, proven, & verified in the /// same L1 block. function test_multiple_blocks_in_one_L1_block() external { - _depositTaikoToken(Alice, 1000, 1000); + _depositTaikoToken(Alice, 1000 * 1E8, 1000 ether); bytes32 parentHash = GENESIS_BLOCK_HASH; - uint64 gasUsed = 1000000; + uint32 gasUsed = 1000000; for (uint256 blockId = 1; blockId <= 2; blockId++) { printVariables("before propose"); @@ -124,10 +124,10 @@ contract TaikoL1Test is TaikoL1TestBase { /// @dev Test verifying multiple blocks in one transaction function test_verifying_multiple_blocks_once() external { - _depositTaikoToken(Alice, 1E6, 100); + _depositTaikoToken(Alice, 1E6 * 1E8, 1000 ether); bytes32 parentHash = GENESIS_BLOCK_HASH; - uint64 gasUsed = 1000000; + uint32 gasUsed = 1000000; for ( uint256 blockId = 1; @@ -151,12 +151,12 @@ contract TaikoL1Test is TaikoL1TestBase { /// @dev Test block timeincrease and fee shall decrease. function test_block_time_increases_but_fee_decreases() external { - _depositTaikoToken(Alice, 1E6, 100); - _depositTaikoToken(Bob, 1E6, 100); - _depositTaikoToken(Carol, 1E6, 100); + _depositTaikoToken(Alice, 1E6 * 1E8, 100 ether); + _depositTaikoToken(Bob, 1E6 * 1E8, 100 ether); + _depositTaikoToken(Carol, 1E6 * 1E8, 100 ether); bytes32 parentHash = GENESIS_BLOCK_HASH; - uint64 gasUsed = 1000000; + uint32 gasUsed = 1000000; for ( uint256 blockId = 1; @@ -180,12 +180,12 @@ contract TaikoL1Test is TaikoL1TestBase { /// @dev Test block time goes down lover time and the fee should remain // the same. function test_block_time_decreases_but_fee_remains() external { - _depositTaikoToken(Alice, 1E6, 100); - _depositTaikoToken(Bob, 1E6, 100); - _depositTaikoToken(Carol, 1E6, 100); + _depositTaikoToken(Alice, 1E6 * 1E8, 100 ether); + _depositTaikoToken(Bob, 1E6 * 1E8, 100 ether); + _depositTaikoToken(Carol, 1E6 * 1E8, 100 ether); bytes32 parentHash = GENESIS_BLOCK_HASH; - uint64 gasUsed = 1000000; + uint32 gasUsed = 1000000; uint256 total = conf.maxNumProposedBlocks * 10; diff --git a/packages/protocol/test2/TaikoL1TestBase.sol b/packages/protocol/test2/TaikoL1TestBase.sol index f2441e63ac5..10a87d0ec0b 100644 --- a/packages/protocol/test2/TaikoL1TestBase.sol +++ b/packages/protocol/test2/TaikoL1TestBase.sol @@ -21,7 +21,7 @@ abstract contract TaikoL1TestBase is Test { bytes32 public constant GENESIS_BLOCK_HASH = keccak256("GENESIS_BLOCK_HASH"); - uint64 feeBaseTwei = 1000000; // 1 TKO + uint64 feeBase = 1E8; // 1 TKO address public constant L2SS = 0xa008AE5Ba00656a3Cc384de589579e3E52aC030C; address public constant L2TaikoL2 = @@ -41,7 +41,7 @@ abstract contract TaikoL1TestBase is Test { addressManager.init(); L1 = deployTaikoL1(); - L1.init(address(addressManager), GENESIS_BLOCK_HASH, feeBaseTwei); + L1.init(address(addressManager), GENESIS_BLOCK_HASH, feeBase); conf = L1.getConfig(); tko = new TaikoToken(); @@ -60,7 +60,7 @@ abstract contract TaikoL1TestBase is Test { // set proto_broker to this address to mint some TKO _registerAddress("proto_broker", address(this)); - tko.mint(address(this), 1E12 ether); + tko.mint(address(this), 1E9 * 1E8); // register all addresses _registerAddress("taiko_token", address(tko)); @@ -110,7 +110,7 @@ abstract contract TaikoL1TestBase is Test { function proveBlock( address prover, - uint64 gasUsed, + uint32 gasUsed, TaikoData.BlockMetadata memory meta, bytes32 parentHash, bytes32 blockHash, @@ -157,25 +157,24 @@ abstract contract TaikoL1TestBase is Test { uint256 amountTko, uint256 amountEth ) internal { - vm.deal(who, amountEth * 1 ether); - tko.transfer(who, amountTko * 1 ether); + vm.deal(who, amountEth); + tko.transfer(who, amountTko); vm.prank(who, who); - L1.deposit(amountTko * 1 ether); + L1.deposit(amountTko); } function printVariables(string memory comment) internal { TaikoData.StateVariables memory vars = L1.getStateVariables(); (uint256 fee, ) = L1.getBlockFee(); - fee /= 1E12; string memory str = string.concat( Strings.toString(logCount++), ":[", Strings.toString(vars.lastVerifiedBlockId), unicode"→", Strings.toString(vars.numBlocks), - "] feeBase(twei):", - Strings.toString(vars.feeBaseTwei), - " fee(twei):", + "] feeBase:", + Strings.toString(vars.feeBase), + " fee:", Strings.toString(fee), " avgBlockTime:", Strings.toString(vars.avgBlockTime), diff --git a/packages/website/pages/docs/reference/contract-documentation/L1/TaikoData.md b/packages/website/pages/docs/reference/contract-documentation/L1/TaikoData.md index b8bc41cb345..a7a9fb0f75d 100644 --- a/packages/website/pages/docs/reference/contract-documentation/L1/TaikoData.md +++ b/packages/website/pages/docs/reference/contract-documentation/L1/TaikoData.md @@ -50,7 +50,7 @@ struct Config { ```solidity struct StateVariables { - uint64 feeBaseTwei; + uint64 feeBase; uint64 genesisHeight; uint64 genesisTimestamp; uint64 numBlocks; @@ -79,9 +79,9 @@ struct BlockMetadataInput { ```solidity struct BlockMetadata { uint64 id; - uint32 gasLimit; uint64 timestamp; uint64 l1Height; + uint32 gasLimit; bytes32 l1Hash; bytes32 mixHash; bytes32 txListHash; @@ -110,6 +110,7 @@ struct BlockEvidence { bytes32 blockHash; bytes32 signalRoot; address prover; + uint32 gasUsed; } ``` @@ -128,14 +129,14 @@ struct ForkChoice { ```solidity struct Block { + mapping(uint256 => struct TaikoData.ForkChoice) forkChoices; uint64 blockId; uint64 proposedAt; + uint64 deposit; uint24 nextForkChoiceId; uint24 verifiedForkChoiceId; bytes32 metaHash; - uint256 deposit; address proposer; - mapping(uint256 => struct TaikoData.ForkChoice) forkChoices; } ``` @@ -167,7 +168,7 @@ struct State { uint64 __reserved4; uint64 lastVerifiedBlockId; uint64 avgProofTime; - uint64 feeBaseTwei; + uint64 feeBase; uint256[42] __gap; } ``` diff --git a/packages/website/pages/docs/reference/contract-documentation/L1/TaikoL1.md b/packages/website/pages/docs/reference/contract-documentation/L1/TaikoL1.md index 5ca79b851f1..472d9fedf6a 100644 --- a/packages/website/pages/docs/reference/contract-documentation/L1/TaikoL1.md +++ b/packages/website/pages/docs/reference/contract-documentation/L1/TaikoL1.md @@ -13,7 +13,7 @@ struct TaikoData.State state ### init ```solidity -function init(address _addressManager, bytes32 _genesisBlockHash, uint64 _feeBaseTwei) external +function init(address _addressManager, bytes32 _genesisBlockHash, uint64 _feeBase) external ``` ### proposeBlock diff --git a/packages/website/pages/docs/reference/contract-documentation/L1/TaikoToken.md b/packages/website/pages/docs/reference/contract-documentation/L1/TaikoToken.md index deff05bf36e..a1a175160eb 100644 --- a/packages/website/pages/docs/reference/contract-documentation/L1/TaikoToken.md +++ b/packages/website/pages/docs/reference/contract-documentation/L1/TaikoToken.md @@ -30,6 +30,12 @@ error TKO_INVALID_ADDR() error TKO_INVALID_PREMINT_PARAMS() ``` +### TKO_MINT_DISALLOWED + +```solidity +error TKO_MINT_DISALLOWED() +``` + ### init ```solidity @@ -83,3 +89,9 @@ the circulating supply._ | ------- | ------- | ------------------------------------ | | account | address | The address to burn the tokens from. | | amount | uint256 | The amount of tokens to burn. | + +### \_mint + +```solidity +function _mint(address account, uint256 amount) internal +``` From e7cc30bddf33e6dc1cb97b95316372ea21d52045 Mon Sep 17 00:00:00 2001 From: Daniel Wang <99078276+dantaik@users.noreply.github.com> Date: Mon, 27 Mar 2023 10:05:21 +0800 Subject: [PATCH 12/47] refactor(protocol): various small improvements (#13459) --- .../protocol/contracts/L1/TaikoConfig.sol | 1 - packages/protocol/contracts/L1/TaikoData.sol | 2 - .../contracts/L1/libs/LibProposing.sol | 202 +++++++++--------- .../protocol/contracts/L1/libs/LibProving.sol | 13 +- .../contracts/L1/libs/LibVerifying.sol | 3 +- .../contracts/test/L1/TestTaikoL1.sol | 1 - .../test/L1/TestTaikoL1EnableTokenomics.sol | 1 - packages/protocol/test2/TaikoL1.t.sol | 16 +- packages/protocol/test2/TaikoL1TestBase.sol | 4 +- 9 files changed, 115 insertions(+), 128 deletions(-) diff --git a/packages/protocol/contracts/L1/TaikoConfig.sol b/packages/protocol/contracts/L1/TaikoConfig.sol index 5fa96128338..9248800f35a 100644 --- a/packages/protocol/contracts/L1/TaikoConfig.sol +++ b/packages/protocol/contracts/L1/TaikoConfig.sol @@ -32,7 +32,6 @@ library TaikoConfig { maxBytesPerTxList: 120000, minTxGasLimit: 21000, slotSmoothingFactor: 946649, - anchorTxGasLimit: 180000, // 100 basis points or 1% rewardBurnBips: 100, proposerDepositPctg: 25, // - 25% diff --git a/packages/protocol/contracts/L1/TaikoData.sol b/packages/protocol/contracts/L1/TaikoData.sol index cdb8816b17e..f372f0f53c1 100644 --- a/packages/protocol/contracts/L1/TaikoData.sol +++ b/packages/protocol/contracts/L1/TaikoData.sol @@ -29,7 +29,6 @@ library TaikoData { uint256 maxBytesPerTxList; uint256 minTxGasLimit; uint256 slotSmoothingFactor; - uint256 anchorTxGasLimit; uint256 rewardBurnBips; uint256 proposerDepositPctg; // Moving average factors @@ -92,7 +91,6 @@ library TaikoData { bytes32 blockHash; bytes32 signalRoot; address prover; - uint32 gasUsed; } // 3 slots diff --git a/packages/protocol/contracts/L1/libs/LibProposing.sol b/packages/protocol/contracts/L1/libs/LibProposing.sol index c06bd7f1008..44963d97236 100644 --- a/packages/protocol/contracts/L1/libs/LibProposing.sol +++ b/packages/protocol/contracts/L1/libs/LibProposing.sol @@ -41,6 +41,110 @@ library LibProposing { TaikoData.BlockMetadataInput memory input, bytes calldata txList ) internal { + bool cacheTxList = _validateBlock({ + state: state, + config: config, + resolver: resolver, + input: input, + txList: txList + }); + + if (cacheTxList) { + state.txListInfo[input.txListHash] = TaikoData.TxListInfo({ + validSince: uint64(block.timestamp), + size: uint24(txList.length) + }); + } + + // After The Merge, L1 mixHash contains the prevrandao + // from the beacon chain. Since multiple Taiko blocks + // can be proposed in one Ethereum block, we need to + // add salt to this random number as L2 mixHash + TaikoData.BlockMetadata memory meta; + unchecked { + meta = TaikoData.BlockMetadata({ + id: state.numBlocks, + timestamp: uint64(block.timestamp), + l1Height: uint64(block.number - 1), + gasLimit: input.gasLimit, + l1Hash: blockhash(block.number - 1), + mixHash: bytes32(block.prevrandao * state.numBlocks), + txListHash: input.txListHash, + txListByteStart: input.txListByteStart, + txListByteEnd: input.txListByteEnd, + beneficiary: input.beneficiary + }); + } + + TaikoData.Block storage blk = state.blocks[ + state.numBlocks % config.ringBufferSize + ]; + + blk.blockId = state.numBlocks; + blk.proposedAt = meta.timestamp; + blk.deposit = 0; + blk.nextForkChoiceId = 1; + blk.verifiedForkChoiceId = 0; + blk.metaHash = LibUtils.hashMetadata(meta); + blk.proposer = msg.sender; + + if (config.enableTokenomics) { + (uint256 newFeeBase, uint256 fee, uint256 deposit) = LibTokenomics + .getBlockFee(state, config); + + uint256 burnAmount = fee + deposit; + if (state.balances[msg.sender] < burnAmount) + revert L1_INSUFFICIENT_TOKEN(); + + unchecked { + state.balances[msg.sender] -= burnAmount; + } + + // Update feeBase and avgBlockTime + state.feeBase = LibUtils + .movingAverage({ + maValue: state.feeBase, + newValue: newFeeBase, + maf: config.feeBaseMAF + }) + .toUint64(); + + blk.deposit = uint64(deposit); + } + + unchecked { + state.avgBlockTime = LibUtils + .movingAverage({ + maValue: state.avgBlockTime, + newValue: (meta.timestamp - state.lastProposedAt) * 1000, + maf: config.proposingConfig.avgTimeMAF + }) + .toUint64(); + state.lastProposedAt = meta.timestamp; + } + + emit BlockProposed(state.numBlocks, meta, cacheTxList); + unchecked { + ++state.numBlocks; + } + } + + function getBlock( + TaikoData.State storage state, + TaikoData.Config memory config, + uint256 blockId + ) internal view returns (TaikoData.Block storage blk) { + blk = state.blocks[blockId % config.ringBufferSize]; + if (blk.blockId != blockId) revert L1_BLOCK_ID(); + } + + function _validateBlock( + TaikoData.State storage state, + TaikoData.Config memory config, + AddressResolver resolver, + TaikoData.BlockMetadataInput memory input, + bytes calldata txList + ) private view returns (bool cacheTxList) { // For alpha-2 testnet, the network only allows an special address // to propose but anyone to prove. This is the first step of testing // the tokenomics. @@ -60,8 +164,6 @@ library LibProposing { ) revert L1_TOO_MANY_BLOCKS(); uint64 timeNow = uint64(block.timestamp); - bool txListCached; - // hanlding txList { uint24 size = uint24(txList.length); @@ -94,103 +196,9 @@ library LibProposing { if (input.txListHash != keccak256(txList)) revert L1_TX_LIST_HASH(); - if (input.cacheTxListInfo != 0) { - state.txListInfo[input.txListHash] = TaikoData - .TxListInfo({validSince: timeNow, size: size}); - txListCached = true; - } + cacheTxList = (input.cacheTxListInfo != 0); } } } - - // After The Merge, L1 mixHash contains the prevrandao - // from the beacon chain. Since multiple Taiko blocks - // can be proposed in one Ethereum block, we need to - // add salt to this random number as L2 mixHash - uint256 mixHash; - unchecked { - mixHash = block.prevrandao * state.numBlocks; - } - - TaikoData.BlockMetadata memory meta = TaikoData.BlockMetadata({ - id: state.numBlocks, - timestamp: timeNow, - l1Height: uint64(block.number - 1), - gasLimit: input.gasLimit, - l1Hash: blockhash(block.number - 1), - mixHash: bytes32(mixHash), - txListHash: input.txListHash, - txListByteStart: input.txListByteStart, - txListByteEnd: input.txListByteEnd, - beneficiary: input.beneficiary - }); - - uint256 deposit; - if (config.enableTokenomics) { - uint256 newFeeBase; - { - uint256 fee; - (newFeeBase, fee, deposit) = LibTokenomics.getBlockFee( - state, - config - ); - - uint256 burnAmount = fee + deposit; - if (state.balances[msg.sender] <= burnAmount) - revert L1_INSUFFICIENT_TOKEN(); - - state.balances[msg.sender] -= burnAmount; - } - // Update feeBase and avgBlockTime - state.feeBase = LibUtils - .movingAverage({ - maValue: state.feeBase, - newValue: newFeeBase, - maf: config.feeBaseMAF - }) - .toUint64(); - } - - TaikoData.Block storage blk = state.blocks[ - state.numBlocks % config.ringBufferSize - ]; - - blk.blockId = state.numBlocks; - blk.proposedAt = meta.timestamp; - blk.deposit = uint64(deposit); - blk.nextForkChoiceId = 1; - blk.verifiedForkChoiceId = 0; - blk.metaHash = LibUtils.hashMetadata(meta); - blk.proposer = msg.sender; - - if (state.lastProposedAt > 0) { - uint256 blockTime; - unchecked { - blockTime = (meta.timestamp - state.lastProposedAt) * 1000; - } - state.avgBlockTime = LibUtils - .movingAverage({ - maValue: state.avgBlockTime, - newValue: blockTime, - maf: config.proposingConfig.avgTimeMAF - }) - .toUint64(); - } - - state.lastProposedAt = meta.timestamp; - - emit BlockProposed(state.numBlocks, meta, txListCached); - unchecked { - ++state.numBlocks; - } - } - - function getBlock( - TaikoData.State storage state, - TaikoData.Config memory config, - uint256 blockId - ) internal view returns (TaikoData.Block storage blk) { - blk = state.blocks[blockId % config.ringBufferSize]; - if (blk.blockId != blockId) revert L1_BLOCK_ID(); } } diff --git a/packages/protocol/contracts/L1/libs/LibProving.sol b/packages/protocol/contracts/L1/libs/LibProving.sol index 7bdc4469785..2b63a8b9162 100644 --- a/packages/protocol/contracts/L1/libs/LibProving.sol +++ b/packages/protocol/contracts/L1/libs/LibProving.sol @@ -144,7 +144,7 @@ library LibProving { false ); - bytes32[10] memory inputs; + bytes32[8] memory inputs; inputs[0] = bytes32(uint256(uint160(l1SignalService))); inputs[1] = bytes32(uint256(uint160(l2SignalService))); inputs[2] = bytes32(uint256(uint160(taikoL2))); @@ -152,17 +152,10 @@ library LibProving { inputs[4] = evidence.blockHash; inputs[5] = evidence.signalRoot; inputs[6] = bytes32(uint256(uint160(evidence.prover))); - inputs[7] = bytes32(uint256(evidence.gasUsed)); // TODO(daniel): document this - inputs[8] = blk.metaHash; - - // Circuits shall use this value to check anchor gas limit. - // Note that this value is not necessary and can be hard-coded - // in to the circuit code, but if we upgrade the protocol - // and the gas limit changes, then having it here may be handy. - inputs[9] = bytes32(config.anchorTxGasLimit); + inputs[7] = blk.metaHash; assembly { - instance := keccak256(inputs, mul(32, 10)) + instance := keccak256(inputs, mul(32, 8)) } } diff --git a/packages/protocol/contracts/L1/libs/LibVerifying.sol b/packages/protocol/contracts/L1/libs/LibVerifying.sol index 1d3ff495348..3daac9fd0fc 100644 --- a/packages/protocol/contracts/L1/libs/LibVerifying.sol +++ b/packages/protocol/contracts/L1/libs/LibVerifying.sol @@ -35,7 +35,7 @@ library LibVerifying { ) internal { _checkConfig(config); - uint64 timeNow = uint64(block.number); + uint64 timeNow = uint64(block.timestamp); state.genesisHeight = timeNow; state.genesisTimestamp = timeNow; state.feeBase = feeBase; @@ -191,7 +191,6 @@ library LibVerifying { config.maxBytesPerTxList > 128 * 1024 || config.minTxGasLimit == 0 || config.slotSmoothingFactor == 0 || - config.anchorTxGasLimit == 0 || // EIP-4844 blob deleted after 30 days config.txListCacheExpiry > 30 * 24 hours || config.rewardBurnBips >= 10000 diff --git a/packages/protocol/contracts/test/L1/TestTaikoL1.sol b/packages/protocol/contracts/test/L1/TestTaikoL1.sol index f398a8bb05a..af568997f0d 100644 --- a/packages/protocol/contracts/test/L1/TestTaikoL1.sol +++ b/packages/protocol/contracts/test/L1/TestTaikoL1.sol @@ -28,7 +28,6 @@ contract TestTaikoL1 is TaikoL1 { config.maxBytesPerTxList = 120000; config.minTxGasLimit = 21000; config.slotSmoothingFactor = 590000; - config.anchorTxGasLimit = 180000; config.rewardBurnBips = 100; // 100 basis points or 1% config.proposerDepositPctg = 25; // 25% diff --git a/packages/protocol/contracts/test/L1/TestTaikoL1EnableTokenomics.sol b/packages/protocol/contracts/test/L1/TestTaikoL1EnableTokenomics.sol index fce4276f951..64c14eba7d3 100644 --- a/packages/protocol/contracts/test/L1/TestTaikoL1EnableTokenomics.sol +++ b/packages/protocol/contracts/test/L1/TestTaikoL1EnableTokenomics.sol @@ -28,7 +28,6 @@ contract TestTaikoL1EnableTokenomics is TaikoL1 { config.maxBytesPerTxList = 120000; config.minTxGasLimit = 21000; config.slotSmoothingFactor = 590000; - config.anchorTxGasLimit = 180000; config.rewardBurnBips = 100; // 100 basis points or 1% config.proposerDepositPctg = 25; // 25% diff --git a/packages/protocol/test2/TaikoL1.t.sol b/packages/protocol/test2/TaikoL1.t.sol index d556283944f..31b035787cf 100644 --- a/packages/protocol/test2/TaikoL1.t.sol +++ b/packages/protocol/test2/TaikoL1.t.sol @@ -33,7 +33,6 @@ contract TaikoL1WithConfig is TaikoL1 { config.ringBufferSize = 12; // this value must be changed if `maxNumProposedBlocks` is changed. config.slotSmoothingFactor = 4160; - config.anchorTxGasLimit = 180000; config.proposingConfig = TaikoData.FeeConfig({ avgTimeMAF: 64, @@ -79,7 +78,6 @@ contract TaikoL1Test is TaikoL1TestBase { _depositTaikoToken(Carol, 1E6 * 1E8, 100 ether); bytes32 parentHash = GENESIS_BLOCK_HASH; - uint32 gasUsed = 1000000; for ( uint256 blockId = 1; @@ -93,7 +91,7 @@ contract TaikoL1Test is TaikoL1TestBase { bytes32 blockHash = bytes32(1E10 + blockId); bytes32 signalRoot = bytes32(1E9 + blockId); - proveBlock(Bob, gasUsed, meta, parentHash, blockHash, signalRoot); + proveBlock(Bob, meta, parentHash, blockHash, signalRoot); verifyBlock(Carol, 1); parentHash = blockHash; } @@ -106,7 +104,6 @@ contract TaikoL1Test is TaikoL1TestBase { _depositTaikoToken(Alice, 1000 * 1E8, 1000 ether); bytes32 parentHash = GENESIS_BLOCK_HASH; - uint32 gasUsed = 1000000; for (uint256 blockId = 1; blockId <= 2; blockId++) { printVariables("before propose"); @@ -115,7 +112,7 @@ contract TaikoL1Test is TaikoL1TestBase { bytes32 blockHash = bytes32(1E10 + blockId); bytes32 signalRoot = bytes32(1E9 + blockId); - proveBlock(Alice, gasUsed, meta, parentHash, blockHash, signalRoot); + proveBlock(Alice, meta, parentHash, blockHash, signalRoot); verifyBlock(Alice, 2); parentHash = blockHash; } @@ -127,7 +124,6 @@ contract TaikoL1Test is TaikoL1TestBase { _depositTaikoToken(Alice, 1E6 * 1E8, 1000 ether); bytes32 parentHash = GENESIS_BLOCK_HASH; - uint32 gasUsed = 1000000; for ( uint256 blockId = 1; @@ -140,7 +136,7 @@ contract TaikoL1Test is TaikoL1TestBase { bytes32 blockHash = bytes32(1E10 + blockId); bytes32 signalRoot = bytes32(1E9 + blockId); - proveBlock(Alice, gasUsed, meta, parentHash, blockHash, signalRoot); + proveBlock(Alice, meta, parentHash, blockHash, signalRoot); parentHash = blockHash; } verifyBlock(Alice, conf.maxNumProposedBlocks - 1); @@ -156,7 +152,6 @@ contract TaikoL1Test is TaikoL1TestBase { _depositTaikoToken(Carol, 1E6 * 1E8, 100 ether); bytes32 parentHash = GENESIS_BLOCK_HASH; - uint32 gasUsed = 1000000; for ( uint256 blockId = 1; @@ -169,7 +164,7 @@ contract TaikoL1Test is TaikoL1TestBase { bytes32 blockHash = bytes32(1E10 + blockId); bytes32 signalRoot = bytes32(1E9 + blockId); - proveBlock(Bob, gasUsed, meta, parentHash, blockHash, signalRoot); + proveBlock(Bob, meta, parentHash, blockHash, signalRoot); verifyBlock(Carol, 1); mine(blockId); parentHash = blockHash; @@ -185,7 +180,6 @@ contract TaikoL1Test is TaikoL1TestBase { _depositTaikoToken(Carol, 1E6 * 1E8, 100 ether); bytes32 parentHash = GENESIS_BLOCK_HASH; - uint32 gasUsed = 1000000; uint256 total = conf.maxNumProposedBlocks * 10; @@ -196,7 +190,7 @@ contract TaikoL1Test is TaikoL1TestBase { bytes32 blockHash = bytes32(1E10 + blockId); bytes32 signalRoot = bytes32(1E9 + blockId); - proveBlock(Bob, gasUsed, meta, parentHash, blockHash, signalRoot); + proveBlock(Bob, meta, parentHash, blockHash, signalRoot); verifyBlock(Carol, 1); mine(total + 1 - blockId); parentHash = blockHash; diff --git a/packages/protocol/test2/TaikoL1TestBase.sol b/packages/protocol/test2/TaikoL1TestBase.sol index 10a87d0ec0b..ce0eae47ed0 100644 --- a/packages/protocol/test2/TaikoL1TestBase.sol +++ b/packages/protocol/test2/TaikoL1TestBase.sol @@ -110,7 +110,6 @@ abstract contract TaikoL1TestBase is Test { function proveBlock( address prover, - uint32 gasUsed, TaikoData.BlockMetadata memory meta, bytes32 parentHash, bytes32 blockHash, @@ -127,8 +126,7 @@ abstract contract TaikoL1TestBase is Test { parentHash: parentHash, blockHash: blockHash, signalRoot: signalRoot, - prover: prover, - gasUsed: gasUsed + prover: prover }); vm.prank(prover, prover); From 0fc5ef6a3b1fdbb6ee1fbaebaefff5ca3b699e3e Mon Sep 17 00:00:00 2001 From: Daniel Wang <99078276+dantaik@users.noreply.github.com> Date: Tue, 28 Mar 2023 09:46:39 +0800 Subject: [PATCH 13/47] feat(protocol): change time-based fee/reward calculation (#13442) --- .../protocol/contracts/L1/TaikoConfig.sol | 10 +- packages/protocol/contracts/L1/TaikoData.sol | 6 +- packages/protocol/contracts/L1/TaikoL1.sol | 10 +- ...{LibTokenomics.sol => LibL1Tokenomics.sol} | 45 ++- .../contracts/L1/libs/LibProposing.sol | 4 +- .../protocol/contracts/L1/libs/LibProving.sol | 2 +- .../protocol/contracts/L1/libs/LibUtils.sol | 2 +- .../contracts/L1/libs/LibVerifying.sol | 21 +- .../contracts/test/L1/TestTaikoL1.sol | 10 +- .../test/L1/TestTaikoL1EnableTokenomics.sol | 10 +- packages/protocol/foundry.toml | 2 +- packages/protocol/snapshot.txt | 2 +- packages/protocol/test2/LibL1Tokenomics.t.sol | 293 ++++++++++++++++++ packages/protocol/test2/LibTokenomics.t.sol | 45 --- packages/protocol/test2/TaikoL1.t.sol | 17 +- packages/protocol/test2/TaikoL2.t.sol | 2 +- .../contract-documentation/L1/TaikoData.md | 7 +- .../contract-documentation/L1/TaikoErrors.md | 6 - .../contract-documentation/L1/TaikoEvents.md | 6 + .../bridge/TokenVault.md | 9 +- 20 files changed, 357 insertions(+), 152 deletions(-) rename packages/protocol/contracts/L1/libs/{LibTokenomics.sol => LibL1Tokenomics.sol} (80%) create mode 100644 packages/protocol/test2/LibL1Tokenomics.t.sol delete mode 100644 packages/protocol/test2/LibTokenomics.t.sol diff --git a/packages/protocol/contracts/L1/TaikoConfig.sol b/packages/protocol/contracts/L1/TaikoConfig.sol index 9248800f35a..ce912aae1f0 100644 --- a/packages/protocol/contracts/L1/TaikoConfig.sol +++ b/packages/protocol/contracts/L1/TaikoConfig.sol @@ -46,17 +46,11 @@ library TaikoConfig { skipZKPVerification: false, proposingConfig: TaikoData.FeeConfig({ avgTimeMAF: 1024, - avgTimeCap: 60 seconds * 1000, - gracePeriodPctg: 200, - maxPeriodPctg: 400, - multiplerPctg: 300 + dampingFactorBips: 2500 // [125% -> 75%] }), provingConfig: TaikoData.FeeConfig({ avgTimeMAF: 1024, - avgTimeCap: 30 minutes * 1000, - gracePeriodPctg: 200, - maxPeriodPctg: 400, - multiplerPctg: 300 + dampingFactorBips: 2500 // [75% -> 125%] }) }); } diff --git a/packages/protocol/contracts/L1/TaikoData.sol b/packages/protocol/contracts/L1/TaikoData.sol index f372f0f53c1..7eff5ca49aa 100644 --- a/packages/protocol/contracts/L1/TaikoData.sol +++ b/packages/protocol/contracts/L1/TaikoData.sol @@ -9,11 +9,7 @@ pragma solidity ^0.8.18; library TaikoData { struct FeeConfig { uint16 avgTimeMAF; - uint64 avgTimeCap; // miliseconds - uint16 gracePeriodPctg; - uint16 maxPeriodPctg; - // extra fee/reward on top of baseFee - uint16 multiplerPctg; + uint16 dampingFactorBips; } struct Config { diff --git a/packages/protocol/contracts/L1/TaikoL1.sol b/packages/protocol/contracts/L1/TaikoL1.sol index 9191b8b7f8c..2330511a38b 100644 --- a/packages/protocol/contracts/L1/TaikoL1.sol +++ b/packages/protocol/contracts/L1/TaikoL1.sol @@ -9,9 +9,9 @@ pragma solidity ^0.8.18; import {AddressResolver} from "../common/AddressResolver.sol"; import {EssentialContract} from "../common/EssentialContract.sol"; import {IXchainSync} from "../common/IXchainSync.sol"; +import {LibL1Tokenomics} from "./libs/LibVerifying.sol"; import {LibProposing} from "./libs/LibProposing.sol"; import {LibProving} from "./libs/LibProving.sol"; -import {LibTokenomics} from "./libs/LibVerifying.sol"; import {LibUtils} from "./libs/LibUtils.sol"; import {LibVerifying} from "./libs/LibVerifying.sol"; import {TaikoConfig} from "./TaikoConfig.sol"; @@ -115,11 +115,11 @@ contract TaikoL1 is EssentialContract, IXchainSync, TaikoEvents, TaikoErrors { } function deposit(uint256 amount) external nonReentrant { - LibTokenomics.deposit(state, AddressResolver(this), amount); + LibL1Tokenomics.deposit(state, AddressResolver(this), amount); } function withdraw(uint256 amount) external nonReentrant { - LibTokenomics.withdraw(state, AddressResolver(this), amount); + LibL1Tokenomics.withdraw(state, AddressResolver(this), amount); } function getBalance(address addr) public view returns (uint256) { @@ -131,7 +131,7 @@ contract TaikoL1 is EssentialContract, IXchainSync, TaikoEvents, TaikoErrors { view returns (uint256 feeAmount, uint256 depositAmount) { - (, feeAmount, depositAmount) = LibTokenomics.getBlockFee( + (, feeAmount, depositAmount) = LibL1Tokenomics.getBlockFee( state, getConfig() ); @@ -141,7 +141,7 @@ contract TaikoL1 is EssentialContract, IXchainSync, TaikoEvents, TaikoErrors { uint64 provenAt, uint64 proposedAt ) public view returns (uint256 reward) { - (, reward, ) = LibTokenomics.getProofReward({ + (, reward, ) = LibL1Tokenomics.getProofReward({ state: state, config: getConfig(), provenAt: provenAt, diff --git a/packages/protocol/contracts/L1/libs/LibTokenomics.sol b/packages/protocol/contracts/L1/libs/LibL1Tokenomics.sol similarity index 80% rename from packages/protocol/contracts/L1/libs/LibTokenomics.sol rename to packages/protocol/contracts/L1/libs/LibL1Tokenomics.sol index 7cbf631367f..41342081682 100644 --- a/packages/protocol/contracts/L1/libs/LibTokenomics.sol +++ b/packages/protocol/contracts/L1/libs/LibL1Tokenomics.sol @@ -14,7 +14,7 @@ import { import {TaikoData} from "../TaikoData.sol"; import {TaikoToken} from "../TaikoToken.sol"; -library LibTokenomics { +library LibL1Tokenomics { using LibMath for uint256; uint256 private constant TWEI_TO_WEI = 1E12; @@ -69,9 +69,8 @@ library LibTokenomics { feeConfig: config.proposingConfig, feeBase: state.feeBase, isProposal: true, - tNow: block.timestamp, - tLast: state.lastProposedAt, - tAvg: state.avgBlockTime + timeUsed: block.timestamp - state.lastProposedAt, + timeAverage: state.avgBlockTime }); fee = getSlotsAdjustedFee({ state: state, @@ -104,22 +103,21 @@ library LibTokenomics { ) internal view - returns (uint256 newFeeBase, uint256 reward, uint256 tRelBp) + returns (uint256 newFeeBase, uint256 reward, uint256 premiumRate) { if (proposedAt > provenAt) revert L1_INVALID_PARAM(); if (state.lastVerifiedBlockId <= config.constantFeeRewardBlocks) { reward = state.feeBase; newFeeBase = state.feeBase; - // tRelBp = 0; + // premiumRate = 0; } else { - (newFeeBase, tRelBp) = getTimeAdjustedFee({ + (newFeeBase, premiumRate) = getTimeAdjustedFee({ feeConfig: config.provingConfig, feeBase: state.feeBase, isProposal: false, - tNow: provenAt, - tLast: proposedAt, - tAvg: state.avgProofTime + timeUsed: provenAt - proposedAt, + timeAverage: state.avgProofTime }); reward = getSlotsAdjustedFee({ state: state, @@ -159,26 +157,23 @@ library LibTokenomics { TaikoData.FeeConfig memory feeConfig, uint256 feeBase, bool isProposal, - uint256 tNow, // seconds - uint256 tLast, // seconds - uint256 tAvg // milliseconds - ) internal pure returns (uint256 newFeeBase, uint256 tRelBp) { - if (tAvg == 0 || tNow == tLast) { + uint256 timeUsed, // seconds + uint256 timeAverage // milliseconds + ) internal pure returns (uint256 newFeeBase, uint256 premiumRate) { + if (timeAverage == 0) { return (feeBase, 0); } - unchecked { - tAvg = tAvg.min(feeConfig.avgTimeCap); - uint256 max = (feeConfig.maxPeriodPctg * tAvg) / 100; - uint256 grace = (feeConfig.gracePeriodPctg * tAvg) / 100; - uint256 t = ((tNow - tLast) * 1000).max(grace).min(max); - tRelBp = (10000 * (t - grace)) / (max - grace); // [0-10000] - uint256 alpha = 10000 + (tRelBp * feeConfig.multiplerPctg) / 100; + uint p = feeConfig.dampingFactorBips; // [0-10000] + uint a = timeAverage; + uint t = (timeUsed * 1000).min(a * 2); // millisconds + + newFeeBase = (feeBase * (10000 + (t * p) / a - p)) / 10000; if (isProposal) { - newFeeBase = (feeBase * 10000) / alpha; // fee - } else { - newFeeBase = (feeBase * alpha) / 10000; // reward + newFeeBase = (feeBase * 2) - newFeeBase; + } else if (p > 0) { + premiumRate = ((t.max(a) - a) * 10000) / a; } } } diff --git a/packages/protocol/contracts/L1/libs/LibProposing.sol b/packages/protocol/contracts/L1/libs/LibProposing.sol index 44963d97236..d9ac44a22cf 100644 --- a/packages/protocol/contracts/L1/libs/LibProposing.sol +++ b/packages/protocol/contracts/L1/libs/LibProposing.sol @@ -7,7 +7,7 @@ pragma solidity ^0.8.18; import {AddressResolver} from "../../common/AddressResolver.sol"; -import {LibTokenomics} from "./LibTokenomics.sol"; +import {LibL1Tokenomics} from "./LibL1Tokenomics.sol"; import {LibUtils} from "./LibUtils.sol"; import { SafeCastUpgradeable @@ -89,7 +89,7 @@ library LibProposing { blk.proposer = msg.sender; if (config.enableTokenomics) { - (uint256 newFeeBase, uint256 fee, uint256 deposit) = LibTokenomics + (uint256 newFeeBase, uint256 fee, uint256 deposit) = LibL1Tokenomics .getBlockFee(state, config); uint256 burnAmount = fee + deposit; diff --git a/packages/protocol/contracts/L1/libs/LibProving.sol b/packages/protocol/contracts/L1/libs/LibProving.sol index 2b63a8b9162..bc51cb67192 100644 --- a/packages/protocol/contracts/L1/libs/LibProving.sol +++ b/packages/protocol/contracts/L1/libs/LibProving.sol @@ -7,7 +7,7 @@ pragma solidity ^0.8.18; import {AddressResolver} from "../../common/AddressResolver.sol"; -import {LibTokenomics} from "./LibTokenomics.sol"; +import {LibL1Tokenomics} from "./LibL1Tokenomics.sol"; import {LibUtils} from "./LibUtils.sol"; import {TaikoData} from "../../L1/TaikoData.sol"; diff --git a/packages/protocol/contracts/L1/libs/LibUtils.sol b/packages/protocol/contracts/L1/libs/LibUtils.sol index 35288749c35..38fa4eb3a2d 100644 --- a/packages/protocol/contracts/L1/libs/LibUtils.sol +++ b/packages/protocol/contracts/L1/libs/LibUtils.sol @@ -7,7 +7,7 @@ pragma solidity ^0.8.18; import {LibMath} from "../../libs/LibMath.sol"; -import {LibTokenomics} from "./LibTokenomics.sol"; +import {LibL1Tokenomics} from "./LibL1Tokenomics.sol"; import { SafeCastUpgradeable } from "@openzeppelin/contracts-upgradeable/utils/math/SafeCastUpgradeable.sol"; diff --git a/packages/protocol/contracts/L1/libs/LibVerifying.sol b/packages/protocol/contracts/L1/libs/LibVerifying.sol index 3daac9fd0fc..de7a59235a1 100644 --- a/packages/protocol/contracts/L1/libs/LibVerifying.sol +++ b/packages/protocol/contracts/L1/libs/LibVerifying.sol @@ -7,7 +7,7 @@ pragma solidity ^0.8.18; import {AddressResolver} from "../../common/AddressResolver.sol"; -import {LibTokenomics} from "./LibTokenomics.sol"; +import {LibL1Tokenomics} from "./LibL1Tokenomics.sol"; import {LibUtils} from "./LibUtils.sol"; import { SafeCastUpgradeable @@ -116,8 +116,11 @@ library LibVerifying { uint24 fcId ) private returns (bytes32 blockHash, bytes32 signalRoot) { if (config.enableTokenomics) { - (uint256 newFeeBase, uint256 amount, uint256 tRelBp) = LibTokenomics - .getProofReward({ + ( + uint256 newFeeBase, + uint256 amount, + uint256 premiumRate + ) = LibL1Tokenomics.getProofReward({ state: state, config: config, provenAt: fc.provenAt, @@ -127,10 +130,9 @@ library LibVerifying { // reward the prover _addToBalance(state, fc.prover, amount); - // refund proposer deposit for valid blocks unchecked { - // tRelBp in [0-10000] - amount = (blk.deposit * (10000 - tRelBp)) / 10000; + // premiumRate in [0-10000] + amount = (blk.deposit * (10000 - premiumRate)) / 10000; } _addToBalance(state, blk.proposer, amount); @@ -203,10 +205,7 @@ library LibVerifying { function _checkFeeConfig( TaikoData.FeeConfig memory feeConfig ) private pure { - if ( - feeConfig.avgTimeMAF <= 1 || - feeConfig.avgTimeCap == 0 || - feeConfig.gracePeriodPctg > feeConfig.maxPeriodPctg - ) revert L1_INVALID_CONFIG(); + if (feeConfig.avgTimeMAF <= 1 || feeConfig.dampingFactorBips > 10000) + revert L1_INVALID_CONFIG(); } } diff --git a/packages/protocol/contracts/test/L1/TestTaikoL1.sol b/packages/protocol/contracts/test/L1/TestTaikoL1.sol index af568997f0d..b55e87593aa 100644 --- a/packages/protocol/contracts/test/L1/TestTaikoL1.sol +++ b/packages/protocol/contracts/test/L1/TestTaikoL1.sol @@ -38,18 +38,12 @@ contract TestTaikoL1 is TaikoL1 { config.proposingConfig = TaikoData.FeeConfig({ avgTimeMAF: 64, - avgTimeCap: 48 seconds * 1000, - gracePeriodPctg: 125, - maxPeriodPctg: 375, - multiplerPctg: 300 + dampingFactorBips: 5000 }); config.provingConfig = TaikoData.FeeConfig({ avgTimeMAF: 64, - avgTimeCap: 4 seconds * 1000, - gracePeriodPctg: 125, - maxPeriodPctg: 375, - multiplerPctg: 300 + dampingFactorBips: 5000 }); } } diff --git a/packages/protocol/contracts/test/L1/TestTaikoL1EnableTokenomics.sol b/packages/protocol/contracts/test/L1/TestTaikoL1EnableTokenomics.sol index 64c14eba7d3..ee6aad6679d 100644 --- a/packages/protocol/contracts/test/L1/TestTaikoL1EnableTokenomics.sol +++ b/packages/protocol/contracts/test/L1/TestTaikoL1EnableTokenomics.sol @@ -40,18 +40,12 @@ contract TestTaikoL1EnableTokenomics is TaikoL1 { config.proposingConfig = TaikoData.FeeConfig({ avgTimeMAF: 64, - avgTimeCap: 48 seconds * 1000, - gracePeriodPctg: 125, - maxPeriodPctg: 375, - multiplerPctg: 300 + dampingFactorBips: 5000 }); config.provingConfig = TaikoData.FeeConfig({ avgTimeMAF: 64, - avgTimeCap: 5 seconds * 1000, - gracePeriodPctg: 125, - maxPeriodPctg: 375, - multiplerPctg: 300 + dampingFactorBips: 5000 }); } } diff --git a/packages/protocol/foundry.toml b/packages/protocol/foundry.toml index 80aacc34bcd..b20a5c1e9d4 100644 --- a/packages/protocol/foundry.toml +++ b/packages/protocol/foundry.toml @@ -5,6 +5,6 @@ test = 'test2' libs = ['lib'] optimizer = true optimizer_runs = 200 -gas_reports = ["TaikoL1", "TaikoL1WithConfig", "TaikoL2", "GasComparision", "SignalService", "Bridge", "BridgedERC20", "TaikoToken", "EtherVault", "TokenVault"] +gas_reports = ["TaikoL1", "TaikoWithConfig", "TaikoL2", "GasComparision", "SignalService", "Bridge", "BridgedERC20", "TaikoToken", "EtherVault", "TokenVault"] # See more config options https://github.com/foundry-rs/foundry/tree/master/config diff --git a/packages/protocol/snapshot.txt b/packages/protocol/snapshot.txt index 04538961afc..eb13359d002 100644 --- a/packages/protocol/snapshot.txt +++ b/packages/protocol/snapshot.txt @@ -8,4 +8,4 @@ TaikoL1Test:test_block_time_increases_but_fee_decreases() (gas: 18550268) TaikoL1Test:test_more_blocks_than_ring_buffer_size() (gas: 20880651) TaikoL1Test:test_multiple_blocks_in_one_L1_block() (gas: 757668) TaikoL1Test:test_verifying_multiple_blocks_once() (gas: 2724631) -TaikoL1WithConfig:test_getTimeAdjustedFee() (gas: 1461) \ No newline at end of file +TaikoWithConfig:test_getTimeAdjustedFee() (gas: 1461) \ No newline at end of file diff --git a/packages/protocol/test2/LibL1Tokenomics.t.sol b/packages/protocol/test2/LibL1Tokenomics.t.sol new file mode 100644 index 00000000000..61da8fd4fc6 --- /dev/null +++ b/packages/protocol/test2/LibL1Tokenomics.t.sol @@ -0,0 +1,293 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity ^0.8.18; + +import {Test} from "forge-std/Test.sol"; +import {console2} from "forge-std/console2.sol"; +import {TaikoData} from "../contracts/L1/TaikoData.sol"; +import {LibL1Tokenomics} from "../contracts/L1/libs/LibL1Tokenomics.sol"; + +contract TestLibL1Tokenomics is Test { + struct FeeConfig { + uint64 avgTimeMAF; + uint64 avgTimeCap; + uint64 gracePeriodPctg; + uint64 maxPeriodPctg; + // extra fee/reward on top of baseFee + uint64 multiplerPctg; + } + + function testTokenomicsFeeCalcWithNonZeroStartBips() public { + testTimeAdjustedFee({ + feeBase: 100 ether, + timeAverageSec: 40 seconds, + timeUsedSec: 0 seconds, + isProposal: true, + dampingFactorBips: 4000, // 40% + expectedFeeBase: 140 ether, + expectedPreimumRate: 0 + }); + + testTimeAdjustedFee({ + feeBase: 100 ether, + timeAverageSec: 40 seconds, + timeUsedSec: 20 seconds, + isProposal: true, + dampingFactorBips: 4000, // 40% + expectedFeeBase: 120 ether, + expectedPreimumRate: 0 + }); + + testTimeAdjustedFee({ + feeBase: 100 ether, + timeAverageSec: 40 seconds, + timeUsedSec: 40 seconds, + isProposal: true, + dampingFactorBips: 4000, // 40% + expectedFeeBase: 100 ether, + expectedPreimumRate: 0 + }); + + testTimeAdjustedFee({ + feeBase: 100 ether, + timeAverageSec: 40 seconds, + timeUsedSec: 60 seconds, + isProposal: true, + dampingFactorBips: 4000, // 40% + expectedFeeBase: 80 ether, + expectedPreimumRate: 0 + }); + + testTimeAdjustedFee({ + feeBase: 100 ether, + timeAverageSec: 40 seconds, + timeUsedSec: 80 seconds, + isProposal: true, + dampingFactorBips: 4000, // 40% + expectedFeeBase: 60 ether, + expectedPreimumRate: 0 + }); + + testTimeAdjustedFee({ + feeBase: 100 ether, + timeAverageSec: 40 seconds, + timeUsedSec: 81 seconds, + isProposal: true, + dampingFactorBips: 4000, // 40% + expectedFeeBase: 60 ether, + expectedPreimumRate: 0 + }); + } + + function testTokenomicsFeeCalcWithZeroStartBips() public { + testTimeAdjustedFee({ + feeBase: 100 ether, + timeAverageSec: 40 seconds, + timeUsedSec: 0 seconds, + isProposal: true, + dampingFactorBips: 0, // 0% + expectedFeeBase: 100 ether, + expectedPreimumRate: 0 + }); + + testTimeAdjustedFee({ + feeBase: 100 ether, + timeAverageSec: 40 seconds, + timeUsedSec: 20 seconds, + isProposal: true, + dampingFactorBips: 0, // 0% + expectedFeeBase: 100 ether, + expectedPreimumRate: 0 + }); + + testTimeAdjustedFee({ + feeBase: 100 ether, + timeAverageSec: 40 seconds, + timeUsedSec: 40 seconds, + isProposal: true, + dampingFactorBips: 0, // 0% + expectedFeeBase: 100 ether, + expectedPreimumRate: 0 + }); + + testTimeAdjustedFee({ + feeBase: 100 ether, + timeAverageSec: 40 seconds, + timeUsedSec: 60 seconds, + isProposal: true, + dampingFactorBips: 0, // 0% + expectedFeeBase: 100 ether, + expectedPreimumRate: 0 + }); + + testTimeAdjustedFee({ + feeBase: 100 ether, + timeAverageSec: 40 seconds, + timeUsedSec: 80 seconds, + isProposal: true, + dampingFactorBips: 0, // 0% + expectedFeeBase: 100 ether, + expectedPreimumRate: 0 + }); + + testTimeAdjustedFee({ + feeBase: 100 ether, + timeAverageSec: 40 seconds, + timeUsedSec: 81 seconds, + isProposal: true, + dampingFactorBips: 0, // 0% + expectedFeeBase: 100 ether, + expectedPreimumRate: 0 + }); + } + + function testTokenomicsRewardCalcWithNonZeroStartBips() public { + testTimeAdjustedFee({ + feeBase: 100 ether, + timeAverageSec: 40 seconds, + timeUsedSec: 0 seconds, + isProposal: false, + dampingFactorBips: 4000, // 40% + expectedFeeBase: 60 ether, + expectedPreimumRate: 0 + }); + + testTimeAdjustedFee({ + feeBase: 100 ether, + timeAverageSec: 40 seconds, + timeUsedSec: 20 seconds, + isProposal: false, + dampingFactorBips: 4000, // 40% + expectedFeeBase: 80 ether, + expectedPreimumRate: 0 + }); + + testTimeAdjustedFee({ + feeBase: 100 ether, + timeAverageSec: 40 seconds, + timeUsedSec: 40 seconds, + isProposal: false, + dampingFactorBips: 4000, // 40% + expectedFeeBase: 100 ether, + expectedPreimumRate: 0 + }); + + testTimeAdjustedFee({ + feeBase: 100 ether, + timeAverageSec: 40 seconds, + timeUsedSec: 60 seconds, + isProposal: false, + dampingFactorBips: 4000, // 40% + expectedFeeBase: 120 ether, + expectedPreimumRate: 5000 + }); + + testTimeAdjustedFee({ + feeBase: 100 ether, + timeAverageSec: 40 seconds, + timeUsedSec: 80 seconds, + isProposal: false, + dampingFactorBips: 4000, // 40% + expectedFeeBase: 140 ether, + expectedPreimumRate: 10000 + }); + + testTimeAdjustedFee({ + feeBase: 100 ether, + timeAverageSec: 40 seconds, + timeUsedSec: 81 seconds, + isProposal: false, + dampingFactorBips: 4000, // 40% + expectedFeeBase: 140 ether, + expectedPreimumRate: 10000 + }); + } + + function testTokenomicsRewardCalcWithZeroStartBips() public { + testTimeAdjustedFee({ + feeBase: 100 ether, + timeAverageSec: 40 seconds, + timeUsedSec: 0 seconds, + isProposal: false, + dampingFactorBips: 0, // 0% + expectedFeeBase: 100 ether, + expectedPreimumRate: 0 + }); + + testTimeAdjustedFee({ + feeBase: 100 ether, + timeAverageSec: 40 seconds, + timeUsedSec: 20 seconds, + isProposal: false, + dampingFactorBips: 0, // 0% + expectedFeeBase: 100 ether, + expectedPreimumRate: 0 + }); + + testTimeAdjustedFee({ + feeBase: 100 ether, + timeAverageSec: 40 seconds, + timeUsedSec: 40 seconds, + isProposal: false, + dampingFactorBips: 0, // 0% + expectedFeeBase: 100 ether, + expectedPreimumRate: 0 + }); + + testTimeAdjustedFee({ + feeBase: 100 ether, + timeAverageSec: 40 seconds, + timeUsedSec: 60 seconds, + isProposal: false, + dampingFactorBips: 0, // 0% + expectedFeeBase: 100 ether, + expectedPreimumRate: 0 + }); + + testTimeAdjustedFee({ + feeBase: 100 ether, + timeAverageSec: 40 seconds, + timeUsedSec: 80 seconds, + isProposal: false, + dampingFactorBips: 0, // 0% + expectedFeeBase: 100 ether, + expectedPreimumRate: 0 + }); + + testTimeAdjustedFee({ + feeBase: 100 ether, + timeAverageSec: 40 seconds, + timeUsedSec: 81 seconds, + isProposal: false, + dampingFactorBips: 0, // 0% + expectedFeeBase: 100 ether, + expectedPreimumRate: 0 + }); + } + + function testTimeAdjustedFee( + uint256 feeBase, + uint256 timeAverageSec, + uint256 timeUsedSec, + bool isProposal, + uint16 dampingFactorBips, + uint256 expectedFeeBase, + uint256 expectedPreimumRate + ) private { + TaikoData.FeeConfig memory feeConfig = TaikoData.FeeConfig({ + avgTimeMAF: 1024, + dampingFactorBips: dampingFactorBips + }); + + (uint256 _feeBase, uint256 _premiumRate) = LibL1Tokenomics + .getTimeAdjustedFee( + feeConfig, + feeBase, + isProposal, + timeUsedSec, + timeAverageSec * 1000 + ); + + assertEq(_premiumRate, expectedPreimumRate); + assertEq(_feeBase, expectedFeeBase); + } +} diff --git a/packages/protocol/test2/LibTokenomics.t.sol b/packages/protocol/test2/LibTokenomics.t.sol deleted file mode 100644 index 8aab7e0bd0b..00000000000 --- a/packages/protocol/test2/LibTokenomics.t.sol +++ /dev/null @@ -1,45 +0,0 @@ -// SPDX-License-Identifier: UNLICENSED -pragma solidity ^0.8.18; - -import {Test} from "forge-std/Test.sol"; -import {console2} from "forge-std/console2.sol"; -import {TaikoData} from "../contracts/L1/TaikoData.sol"; -import {LibTokenomics} from "../contracts/L1/libs/LibTokenomics.sol"; - -contract TaikoL1WithConfig is Test { - struct FeeConfig { - uint64 avgTimeMAF; - uint64 avgTimeCap; - uint64 gracePeriodPctg; - uint64 maxPeriodPctg; - // extra fee/reward on top of baseFee - uint64 multiplerPctg; - } - - function test_getTimeAdjustedFee() public { - uint256 feeBase = 10 * 1E8; - uint256 tLast = 100000; - uint256 tAvg = 40; - uint256 tNow = tLast + tAvg; - - TaikoData.FeeConfig memory feeConfig = TaikoData.FeeConfig({ - avgTimeMAF: 1024, - avgTimeCap: uint16(tAvg * 1000), - gracePeriodPctg: 100, - maxPeriodPctg: 400, - multiplerPctg: 200 - }); - - (uint256 newFeeBase, uint256 tRelBp) = LibTokenomics.getTimeAdjustedFee( - feeConfig, - feeBase, - true, - tNow, // seconds - tLast, // seconds - (tAvg * 1000) // miliseconds - ); - - assertEq(newFeeBase, feeBase); - assertEq(tRelBp, 0); - } -} diff --git a/packages/protocol/test2/TaikoL1.t.sol b/packages/protocol/test2/TaikoL1.t.sol index 31b035787cf..cd87527c94a 100644 --- a/packages/protocol/test2/TaikoL1.t.sol +++ b/packages/protocol/test2/TaikoL1.t.sol @@ -36,18 +36,12 @@ contract TaikoL1WithConfig is TaikoL1 { config.proposingConfig = TaikoData.FeeConfig({ avgTimeMAF: 64, - avgTimeCap: 10 minutes * 1000, - gracePeriodPctg: 100, - maxPeriodPctg: 400, - multiplerPctg: 400 + dampingFactorBips: 5000 }); config.provingConfig = TaikoData.FeeConfig({ avgTimeMAF: 64, - avgTimeCap: 10 minutes * 1000, - gracePeriodPctg: 100, - maxPeriodPctg: 400, - multiplerPctg: 400 + dampingFactorBips: 5000 }); } } @@ -145,8 +139,8 @@ contract TaikoL1Test is TaikoL1TestBase { printVariables("after verify"); } - /// @dev Test block timeincrease and fee shall decrease. - function test_block_time_increases_but_fee_decreases() external { + /// @dev Test block time increases and fee decreases. + function test_block_time_increases_and_fee_decreases() external { _depositTaikoToken(Alice, 1E6 * 1E8, 100 ether); _depositTaikoToken(Bob, 1E6 * 1E8, 100 ether); _depositTaikoToken(Carol, 1E6 * 1E8, 100 ether); @@ -172,8 +166,7 @@ contract TaikoL1Test is TaikoL1TestBase { printVariables(""); } - /// @dev Test block time goes down lover time and the fee should remain - // the same. + /// @dev Test block time decreases and the fee increases function test_block_time_decreases_but_fee_remains() external { _depositTaikoToken(Alice, 1E6 * 1E8, 100 ether); _depositTaikoToken(Bob, 1E6 * 1E8, 100 ether); diff --git a/packages/protocol/test2/TaikoL2.t.sol b/packages/protocol/test2/TaikoL2.t.sol index 02e37a5f036..f8f5525e045 100644 --- a/packages/protocol/test2/TaikoL2.t.sol +++ b/packages/protocol/test2/TaikoL2.t.sol @@ -5,7 +5,7 @@ import "forge-std/Test.sol"; import "forge-std/console2.sol"; import "../contracts/L2/TaikoL2.sol"; -contract ReadBlockhashVsCalldata is Test { +contract TestTaikoL2 is Test { TaikoL2 public L2; function setUp() public { diff --git a/packages/website/pages/docs/reference/contract-documentation/L1/TaikoData.md b/packages/website/pages/docs/reference/contract-documentation/L1/TaikoData.md index a7a9fb0f75d..64febe555b0 100644 --- a/packages/website/pages/docs/reference/contract-documentation/L1/TaikoData.md +++ b/packages/website/pages/docs/reference/contract-documentation/L1/TaikoData.md @@ -9,10 +9,7 @@ title: TaikoData ```solidity struct FeeConfig { uint16 avgTimeMAF; - uint64 avgTimeCap; - uint16 gracePeriodPctg; - uint16 maxPeriodPctg; - uint16 multiplerPctg; + uint16 dampingFactorBips; } ``` @@ -30,7 +27,6 @@ struct Config { uint256 maxBytesPerTxList; uint256 minTxGasLimit; uint256 slotSmoothingFactor; - uint256 anchorTxGasLimit; uint256 rewardBurnBips; uint256 proposerDepositPctg; uint256 feeBaseMAF; @@ -110,7 +106,6 @@ struct BlockEvidence { bytes32 blockHash; bytes32 signalRoot; address prover; - uint32 gasUsed; } ``` diff --git a/packages/website/pages/docs/reference/contract-documentation/L1/TaikoErrors.md b/packages/website/pages/docs/reference/contract-documentation/L1/TaikoErrors.md index d783ef3470c..4028d4ecf94 100644 --- a/packages/website/pages/docs/reference/contract-documentation/L1/TaikoErrors.md +++ b/packages/website/pages/docs/reference/contract-documentation/L1/TaikoErrors.md @@ -16,12 +16,6 @@ error L1_ALREADY_PROVEN() error L1_BLOCK_ID() ``` -### L1_CONFLICT_PROOF - -```solidity -error L1_CONFLICT_PROOF() -``` - ### L1_CONTRACT_NOT_ALLOWED ```solidity diff --git a/packages/website/pages/docs/reference/contract-documentation/L1/TaikoEvents.md b/packages/website/pages/docs/reference/contract-documentation/L1/TaikoEvents.md index 0fe2a1627e8..e80c2e6d47c 100644 --- a/packages/website/pages/docs/reference/contract-documentation/L1/TaikoEvents.md +++ b/packages/website/pages/docs/reference/contract-documentation/L1/TaikoEvents.md @@ -16,6 +16,12 @@ event BlockProposed(uint256 id, struct TaikoData.BlockMetadata meta, bool txList event BlockProven(uint256 id, bytes32 parentHash, bytes32 blockHash, bytes32 signalRoot, address prover) ``` +### ConflictingProof + +```solidity +event ConflictingProof(uint64 blockId, bytes32 parentHash, bytes32 conflictingBlockHash, bytes32 conflictingSignalRoot, bytes32 blockHash, bytes32 signalRoot) +``` + ### BlockVerified ```solidity diff --git a/packages/website/pages/docs/reference/contract-documentation/bridge/TokenVault.md b/packages/website/pages/docs/reference/contract-documentation/bridge/TokenVault.md index a41b923110d..7be15ffaecd 100644 --- a/packages/website/pages/docs/reference/contract-documentation/bridge/TokenVault.md +++ b/packages/website/pages/docs/reference/contract-documentation/bridge/TokenVault.md @@ -98,12 +98,6 @@ error TOKENVAULT_INVALID_TO() error TOKENVAULT_INVALID_VALUE() ``` -### TOKENVAULT_INVALID_CALL_VALUE - -```solidity -error TOKENVAULT_INVALID_CALL_VALUE() -``` - ### TOKENVAULT_INVALID_TOKEN ```solidity @@ -161,6 +155,9 @@ function sendEther(uint256 destChainId, address to, uint256 gasLimit, uint256 pr Receives Ether and constructs a Bridge message. Sends the Ether and message along to the Bridge. +_This function doesn't' seem to belong here as it has nothing to +do with ERC20 tokens. It's added here only for convenience._ + #### Parameters | Name | Type | Description | From 0e803e227c010dfb00b0cecebf109c6e361e4c81 Mon Sep 17 00:00:00 2001 From: Daniel Wang <99078276+dantaik@users.noreply.github.com> Date: Wed, 29 Mar 2023 17:15:36 +0800 Subject: [PATCH 14/47] feat(protocol): add foundry deployment scripts (#13447) Co-authored-by: David --- .github/workflows/protocol.yml | 9 +- packages/protocol/.gitignore | 3 + packages/protocol/hardhat.config.ts | 3 - packages/protocol/package.json | 6 +- packages/protocol/script/DeployOnL1.s.sol | 237 ++++++++++++ .../{scripts => script}/download_solc.sh | 0 packages/protocol/tasks/compile_yul.ts | 30 -- packages/protocol/tasks/config.ts | 3 - packages/protocol/tasks/deploy_L1.ts | 357 ------------------ packages/protocol/tasks/log.ts | 37 -- packages/protocol/tasks/utils.ts | 155 -------- .../test/bridge/libs/LibBridgeRetry.test.ts | 23 +- .../protocol/test/libs/Lib1559Math.test.ts | 1 - .../protocol/test/libs/LibBlockHeader.test.ts | 7 +- pnpm-lock.yaml | 49 +-- 15 files changed, 266 insertions(+), 654 deletions(-) create mode 100644 packages/protocol/script/DeployOnL1.s.sol rename packages/protocol/{scripts => script}/download_solc.sh (100%) delete mode 100644 packages/protocol/tasks/compile_yul.ts delete mode 100644 packages/protocol/tasks/config.ts delete mode 100644 packages/protocol/tasks/deploy_L1.ts delete mode 100644 packages/protocol/tasks/log.ts delete mode 100644 packages/protocol/tasks/utils.ts diff --git a/.github/workflows/protocol.yml b/.github/workflows/protocol.yml index abf353d8257..a59d3f9a298 100644 --- a/.github/workflows/protocol.yml +++ b/.github/workflows/protocol.yml @@ -31,7 +31,7 @@ jobs: - name: protocol - Run snapshot (foundry) run: forge snapshot - + - name: Install pnpm dependencies uses: ./.github/actions/install-pnpm-dependencies @@ -65,7 +65,12 @@ jobs: - name: protocol - Deploy L1 Contracts working-directory: ./packages/protocol - run: pnpm deploy:hardhat + run: | + anvil & + while ! nc -z localhost 8545; do + sleep 1 + done + pnpm deploy:foundry - name: protocol - Upload coverage to Codecov uses: codecov/codecov-action@v3 diff --git a/packages/protocol/.gitignore b/packages/protocol/.gitignore index 238cb7bbda3..9761ac497fa 100644 --- a/packages/protocol/.gitignore +++ b/packages/protocol/.gitignore @@ -21,5 +21,8 @@ cache_forge cache_hardhat out +# Foundry +broadcast + # Editors .vscode diff --git a/packages/protocol/hardhat.config.ts b/packages/protocol/hardhat.config.ts index d9ed1b6a8b7..975acabd6ec 100644 --- a/packages/protocol/hardhat.config.ts +++ b/packages/protocol/hardhat.config.ts @@ -2,7 +2,6 @@ import "@nomiclabs/hardhat-etherscan"; import "@nomiclabs/hardhat-waffle"; // import "@nomicfoundation/hardhat-foundry"; import "@openzeppelin/hardhat-upgrades"; -import "hardhat-preprocessor"; import "@typechain/hardhat"; import "hardhat-abi-exporter"; import "hardhat-contract-sizer"; @@ -10,8 +9,6 @@ import "hardhat-gas-reporter"; import { HardhatUserConfig } from "hardhat/config"; import "solidity-coverage"; import "solidity-docgen"; -import "./tasks/compile_yul"; -import "./tasks/deploy_L1"; const hardhatMnemonic = "test test test test test test test test test test test taik"; diff --git a/packages/protocol/package.json b/packages/protocol/package.json index 120f9414c4e..fbc4c0bbca2 100644 --- a/packages/protocol/package.json +++ b/packages/protocol/package.json @@ -5,14 +5,13 @@ "scripts": { "compile": "pnpm hardhat compile", "compile:foundry": "forge build", - "compile:yul": "LOG_LEVEL=debug pnpm hardhat compile_yul", "export:abi": "pnpm hardhat clear-abi && pnpm hardhat export-abi", "export:docs": "pnpm hardhat docgen && pnpm prettier --write ../website/pages/docs/reference/contract-documentation/**/*.md", "clean": "rm -rf abis cache && pnpm hardhat clean", "lint:sol": "pnpm prettier '**/*.sol' --write && pnpm solhint 'contracts/**/*.sol' --fix", "eslint": "pnpm exec eslint --ignore-path .eslintignore --ext .js,.ts .", "eslint:fix": "pnpm exec eslint --ignore-path .eslintignore --ext .js,.ts . --fix", - "test": "./scripts/download_solc.sh && pnpm hardhat test --grep '^[^integration]'", + "test": "./script/download_solc.sh && pnpm hardhat test --grep '^[^integration]'", "coverage": "pnpm hardhat coverage --solcoverjs ./.solcover.js --show-stack-traces", "test:coverage": "pnpm coverage", "test:foundry": "forge test -vvv --gas-report", @@ -22,7 +21,7 @@ "test:integration": "TEST_TYPE=integration ./test/test_integration.sh", "test:tokenomics": "TEST_TYPE=tokenomics ./test/test_integration.sh", "test:all": "pnpm run test && pnpm run test:integration && pnpm run test:tokenomics && pnpm run test:genesis", - "deploy:hardhat": "./scripts/download_solc.sh && LOG_LEVEL=debug pnpm hardhat deploy_L1 --network hardhat --dao-vault 0xdf08f82de32b8d460adbe8d72043e3a7e25a3b39 --team-vault 0xdf08f82de32b8d460adbe8d72043e3a7e25a3b39 --l2-genesis-block-hash 0xee1950562d42f0da28bd4550d88886bc90894c77c9c9eaefef775d4c8223f259 --bridge-funder-private-key ddbf12f72c946bb1e6de5eaf580c51db51828ba198d9b0dba9c7d48ec748dc04 --bridge-fund 0xff --oracle-prover 0xdf08f82de32b8d460adbe8d72043e3a7e25a3b39 --solo-proposer 0xdf08f82de32b8d460adbe8d72043e3a7e25a3b39 --confirmations 1", + "deploy:foundry": "./script/download_solc.sh && PRIVATE_KEY=ac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80 ORACLE_PROVER_ADDRESS=0xa0Ee7A142d267C1f36714E4a8F75612F20a79720 SOLO_PROPOSER=0xa0Ee7A142d267C1f36714E4a8F75612F20a79720 OWNER=0x70997970C51812dc3A010C7d01b50e0d17dc79C8 TAIKO_L2_ADDRESS=0xa0Ee7A142d267C1f36714E4a8F75612F20a79720 TAIKO_TOKEN_PREMINT_RECIPIENT=0xa0Ee7A142d267C1f36714E4a8F75612F20a79720 TAIKO_TOKEN_PREMINT_AMOUNT=0xffff L2_GENESIS_HASH=0xee1950562d42f0da28bd4550d88886bc90894c77c9c9eaefef775d4c8223f259 L2_CHAIN_ID=167001 forge script script/DeployOnL1.s.sol:DeployOnL1 --fork-url http://localhost:8545 --broadcast --ffi -vvvv --via-ir", "lint-staged": "lint-staged --allow-empty", "sizer": "pnpm hardhat size-contracts" }, @@ -74,7 +73,6 @@ "hardhat-contract-sizer": "^2.8.0", "hardhat-docgen": "^1.3.0", "hardhat-gas-reporter": "^1.0.9", - "hardhat-preprocessor": "^0.1.5", "lint-staged": "^12.5.0", "merkle-patricia-tree": "^4.2.4", "prettier": "^2.8.4", diff --git a/packages/protocol/script/DeployOnL1.s.sol b/packages/protocol/script/DeployOnL1.s.sol new file mode 100644 index 00000000000..96873fa3762 --- /dev/null +++ b/packages/protocol/script/DeployOnL1.s.sol @@ -0,0 +1,237 @@ +// SPDX-License-Identifier: MIT +// _____ _ _ _ _ +// |_ _|_ _(_) |_____ | | __ _| |__ ___ +// | |/ _` | | / / _ \ | |__/ _` | '_ (_-< +// |_|\__,_|_|_\_\___/ |____\__,_|_.__/__/ + +pragma solidity ^0.8.18; + +import "forge-std/Script.sol"; +import "forge-std/console2.sol"; +import "@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol"; +import "../contracts/common/AddressResolver.sol"; +import "../contracts/L1/TaikoToken.sol"; +import "../contracts/L1/TaikoL1.sol"; +import "../contracts/bridge/Bridge.sol"; +import "../contracts/bridge/TokenVault.sol"; +import "../contracts/signal/SignalService.sol"; +import "../contracts/thirdparty/AddressManager.sol"; +import "../contracts/test/erc20/FreeMintERC20.sol"; +import "../contracts/test/erc20/MayFailFreeMintERC20.sol"; + +contract DeployOnL1 is Script, AddressResolver { + uint256 public l2ChainId = vm.envUint("L2_CHAIN_ID"); + + bytes32 public l2GensisHash = vm.envBytes32("L2_GENESIS_HASH"); + + uint256 public deployerPrivateKey = vm.envUint("PRIVATE_KEY"); + + address public taikoL2Address = vm.envAddress("TAIKO_L2_ADDRESS"); + + address public owner = vm.envAddress("OWNER"); + + address public oracleProver = vm.envAddress("ORACLE_PROVER_ADDRESS"); + + address public soloProposer = vm.envAddress("SOLO_PROPOSER"); + + address public taikoTokenPremintRecipient = + vm.envAddress("TAIKO_TOKEN_PREMINT_RECIPIENT"); + + uint256 public taikoTokenPremintAmount = + vm.envUint("TAIKO_TOKEN_PREMINT_AMOUNT"); + + address public addressManagerProxy; + + error FAILED_TO_DEPLOY_PLONK_VERIFIER(string contractPath); + + function run() external { + require(l2ChainId != block.chainid, "same chainid"); + require(owner != address(0), "owner is zero"); + require(taikoL2Address != address(0), "taikoL2Address is zero"); + require( + taikoTokenPremintRecipient != address(0), + "taikoTokenPremintRecipient is zero" + ); + require( + taikoTokenPremintAmount < type(uint64).max, + "premint too large" + ); + + vm.startBroadcast(deployerPrivateKey); + + // AddressManager + AddressManager addressManager = new AddressManager(); + addressManagerProxy = deployProxy( + "address_manager", + address(addressManager), + bytes.concat(addressManager.init.selector) + ); + + setAddress(l2ChainId, "taiko", taikoL2Address); + setAddress("oracle_prover", oracleProver); + setAddress("solo_proposer", soloProposer); + + // TaikoToken + TaikoToken taikoToken = new TaikoToken(); + + address[] memory premintRecipients = new address[](1); + uint256[] memory premintAmounts = new uint256[](1); + premintRecipients[0] = taikoTokenPremintRecipient; + premintAmounts[0] = taikoTokenPremintAmount; + + deployProxy( + "taiko_token", + address(taikoToken), + bytes.concat( + taikoToken.init.selector, + abi.encode( + addressManagerProxy, + "Taiko Token", + "TKO", + premintRecipients, + premintAmounts + ) + ) + ); + + // HorseToken && BullToken + address horseToken = address(new FreeMintERC20("Horse Token", "HORSE")); + console.log("HorseToken", horseToken); + + address bullToken = address( + new MayFailFreeMintERC20("Bull Token", "BLL") + ); + console.log("BullToken", bullToken); + + // TaikoL1 + TaikoL1 taikoL1 = new TaikoL1(); + uint64 feeBase = 1 ** 8; // Taiko Token's decimals is 8, not 18 + address taikoL1Proxy = deployProxy( + "taiko", + address(taikoL1), + bytes.concat( + taikoL1.init.selector, + abi.encode(addressManagerProxy, l2GensisHash, feeBase) + ) + ); + setAddress("proto_broker", taikoL1Proxy); + + // Bridge + Bridge bridge = new Bridge(); + deployProxy( + "bridge", + address(bridge), + bytes.concat(bridge.init.selector, abi.encode(addressManagerProxy)) + ); + + // TokenVault + TokenVault tokenVault = new TokenVault(); + deployProxy( + "token_vault", + address(tokenVault), + bytes.concat( + tokenVault.init.selector, + abi.encode(addressManagerProxy) + ) + ); + + // SignalService + SignalService signalService = new SignalService(); + deployProxy( + "signal_service", + address(signalService), + bytes.concat( + signalService.init.selector, + abi.encode(addressManagerProxy) + ) + ); + + // PlonkVerifier + deployPlonkVerifiers(); + + vm.stopBroadcast(); + } + + function deployPlonkVerifiers() private { + address[] memory plonkVerifiers = new address[](2); + plonkVerifiers[0] = deployYulContract( + "contracts/libs/yul/PlonkVerifier_10_txs.yulp" + ); + plonkVerifiers[1] = deployYulContract( + "contracts/libs/yul/PlonkVerifier_80_txs.yulp" + ); + + for (uint16 i = 0; i < plonkVerifiers.length; ++i) { + setAddress( + string(abi.encodePacked("verifier_", i)), + plonkVerifiers[i] + ); + } + } + + function deployYulContract( + string memory contractPath + ) private returns (address) { + string[] memory cmds = new string[](3); + cmds[0] = "bash"; + cmds[1] = "-c"; + cmds[2] = string.concat( + vm.projectRoot(), + "/bin/solc --yul --bin ", + string.concat(vm.projectRoot(), "/", contractPath), + " | grep -A1 Binary | tail -1" + ); + + bytes memory bytecode = vm.ffi(cmds); + + address deployedAddress; + assembly { + deployedAddress := create(0, add(bytecode, 0x20), mload(bytecode)) + } + + if (deployedAddress == address(0)) + revert FAILED_TO_DEPLOY_PLONK_VERIFIER(contractPath); + + console.log(contractPath, deployedAddress); + + return deployedAddress; + } + + function deployProxy( + string memory name, + address implementation, + bytes memory data + ) private returns (address proxy) { + proxy = address( + new TransparentUpgradeableProxy(implementation, owner, data) + ); + + console.log(name, "(impl) ->", implementation); + console.log(name, "(proxy) ->", proxy); + + if (addressManagerProxy != address(0)) { + AddressManager(addressManagerProxy).setAddress( + keyForName(block.chainid, name), + proxy + ); + } + } + + function setAddress(string memory name, address addr) private { + setAddress(block.chainid, name, addr); + } + + function setAddress( + uint256 chainId, + string memory name, + address addr + ) private { + console.log(chainId, name, "--->", addr); + if (addr != address(0)) { + AddressManager(addressManagerProxy).setAddress( + keyForName(chainId, name), + addr + ); + } + } +} diff --git a/packages/protocol/scripts/download_solc.sh b/packages/protocol/script/download_solc.sh similarity index 100% rename from packages/protocol/scripts/download_solc.sh rename to packages/protocol/script/download_solc.sh diff --git a/packages/protocol/tasks/compile_yul.ts b/packages/protocol/tasks/compile_yul.ts deleted file mode 100644 index e2ec2563ee4..00000000000 --- a/packages/protocol/tasks/compile_yul.ts +++ /dev/null @@ -1,30 +0,0 @@ -import { task } from "hardhat/config"; -import * as glob from "glob"; -import * as path from "path"; -import * as utils from "./utils"; -import * as fs from "fs"; -import * as log from "./log"; - -task("compile_yul").setAction(async function () { - const yulContracts = glob.sync( - path.join(__dirname, "../contracts/**/*.yulp") - ); - const outputDir = path.join(__dirname, "../artifacts/yul"); - - if (!fs.existsSync(outputDir)) { - fs.mkdirSync(outputDir, { recursive: true }); - } - - log.debug({ yulContracts }); - - for (const yulContractPath of yulContracts) { - const bytecode = utils.compileYulContract(yulContractPath); - const contractName = path.parse(path.basename(yulContractPath)).name; - const jsonOutputPath = path.join(outputDir, `${contractName}.json`); - - fs.writeFileSync( - jsonOutputPath, - JSON.stringify({ contractName, bytecode }) - ); - } -}); diff --git a/packages/protocol/tasks/config.ts b/packages/protocol/tasks/config.ts deleted file mode 100644 index cc9ebfd4334..00000000000 --- a/packages/protocol/tasks/config.ts +++ /dev/null @@ -1,3 +0,0 @@ -// https://github.com/ethereum-lists/chains/pull/1611 -export const K_CHAIN_ID = 167; -export const K_DEPLOY_CONFIRMATIONS = 12; diff --git a/packages/protocol/tasks/deploy_L1.ts b/packages/protocol/tasks/deploy_L1.ts deleted file mode 100644 index f3e4c6a9e2e..00000000000 --- a/packages/protocol/tasks/deploy_L1.ts +++ /dev/null @@ -1,357 +0,0 @@ -import * as ethers from "ethers"; -import { task } from "hardhat/config"; -import * as types from "hardhat/internal/core/params/argumentTypes"; -import * as config from "./config"; -import * as log from "./log"; -import * as utils from "./utils"; - -task("deploy_L1") - .addParam("daoVault", "The DAO vault address") - .addParam("teamVault", "The team vault address") - .addOptionalParam( - "taikoL2", - "The TaikoL2 address", - ethers.constants.AddressZero - ) - .addOptionalParam( - "l2GenesisBlockHash", - "L2 genesis block hash", - ethers.constants.HashZero - ) - .addOptionalParam("l2ChainId", "L2 chain id", config.K_CHAIN_ID, types.int) - .addOptionalParam( - "bridgeFunderPrivateKey", - "Private key of the L1 bridge funder", - "", - types.string - ) - .addOptionalParam( - "bridgeFund", - "L1 bridge's initial fund in hex", - "", - types.string - ) - .addOptionalParam( - "oracleProver", - "Address of the oracle prover", - "", - types.string - ) - .addOptionalParam( - "soloProposer", - "Address of the solo proposer", - "", - types.string - ) - .addOptionalParam( - "confirmations", - "Number of confirmations to wait for deploy transaction.", - config.K_DEPLOY_CONFIRMATIONS, - types.int - ) - .setAction(async (args, hre: any) => { - if ( - hre.network.name === "localhost" || - hre.network.name === "hardhat" - ) { - args.confirmations = 1; - } else if ( - hre.network.name === "ropsten" || - hre.network.name === "goerli" - ) { - args.confirmations = 6; - } - - hre.args = args; - await deployContracts(hre); - }); - -export async function deployContracts(hre: any) { - const network = hre.network.name; - const { chainId } = await hre.ethers.provider.getNetwork(); - const deployer = await utils.getDeployer(hre); - const daoVault = hre.args.daoVault; - const teamVault = hre.args.teamVault; - const l2GenesisBlockHash = hre.args.l2GenesisBlockHash; - const taikoL2Address = hre.args.taikoL2; - const l2ChainId = hre.args.l2ChainId; - const bridgeFunderPrivateKey = hre.args.bridgeFunderPrivateKey; - const bridgeFund = hre.args.bridgeFund; - const oracleProver = hre.args.oracleProver; - const soloProposer = hre.args.soloProposer; - - log.debug(`network: ${network}`); - log.debug(`chainId: ${chainId}`); - log.debug(`deployer: ${deployer}`); - log.debug(`daoVault: ${daoVault}`); - log.debug(`l2GenesisBlockHash: ${l2GenesisBlockHash}`); - log.debug(`taikoL2Address: ${taikoL2Address}`); - log.debug(`l2ChainId: ${l2ChainId}`); - log.debug(`bridgeFunderPrivateKey: ${bridgeFunderPrivateKey}`); - log.debug(`bridgeFund: ${bridgeFund}`); - log.debug(`oracleProver: ${oracleProver}`); - log.debug(`soloProposer: ${soloProposer}`); - log.debug(`confirmations: ${hre.args.confirmations}`); - log.debug(); - - // AddressManager - const AddressManager = await utils.deployContract(hre, "AddressManager"); - await utils.waitTx(hre, await AddressManager.init()); - - await utils.waitTx( - hre, - await AddressManager.setAddress(`${chainId}.dao_vault`, daoVault) - ); - await utils.waitTx( - hre, - await AddressManager.setAddress(`${chainId}.team_vault`, teamVault) - ); - // Used by LibProving - await utils.waitTx( - hre, - await AddressManager.setAddress(`${l2ChainId}.taiko`, taikoL2Address) - ); - - // TaikoToken - const TaikoToken = await utils.deployContract(hre, "TaikoToken"); - await utils.waitTx( - hre, - await TaikoToken.init( - AddressManager.address, - "Test Taiko Token", - "TTKO", - [], - [] - ) - ); - await utils.waitTx( - hre, - await AddressManager.setAddress( - `${chainId}.taiko_token`, - TaikoToken.address - ) - ); - - // HorseToken - const HorseToken = await utils.deployContract(hre, "FreeMintERC20", {}, [ - "Horse Token", - "HORSE", - ]); - - // BullToken - const BullToken = await utils.deployContract( - hre, - "MayFailFreeMintERC20", - {}, - ["Bull Token", "BLL"] - ); - - // TaikoL1 - const TaikoL1 = await utils.deployContract( - hre, - "TaikoL1" - // await deployBaseLibs(hre) - ); - - const feeBase = hre.ethers.BigNumber.from(10).pow(18); - - await utils.waitTx( - hre, - await TaikoL1.init(AddressManager.address, l2GenesisBlockHash, feeBase) - ); - - // Used by LibBridgeRead - await utils.waitTx( - hre, - await AddressManager.setAddress(`${chainId}.taiko`, TaikoL1.address) - ); - - // Used by TaikoToken - await utils.waitTx( - hre, - await AddressManager.setAddress( - `${chainId}.proto_broker`, - TaikoL1.address - ) - ); - - // Bridge - const Bridge = await deployBridge(hre, AddressManager.address); - - // TokenVault - const TokenVault = await deployTokenVault(hre, AddressManager.address); - - // Used by TokenVault - await utils.waitTx( - hre, - await AddressManager.setAddress(`${chainId}.bridge`, Bridge.address) - ); - - // Fund L1 bridge, which is necessary when there is a L2 faucet - if ( - bridgeFunderPrivateKey.length && - hre.ethers.utils.isHexString(bridgeFund) - ) { - const funder = new hre.ethers.Wallet( - bridgeFunderPrivateKey, - hre.ethers.provider - ); - - await utils.waitTx( - hre, - await funder.sendTransaction({ - to: Bridge.address, - value: hre.ethers.BigNumber.from(bridgeFund), - }) - ); - - log.debug( - `L1 bridge balance: ${hre.ethers.utils.hexlify( - await hre.ethers.provider.getBalance(Bridge.address) - )}` - ); - } - - // SignalService - const SignalService = await deploySignalService( - hre, - AddressManager.address - ); - - // Used by Bridge - await utils.waitTx( - hre, - await AddressManager.setAddress( - `${chainId}.signal_service`, - SignalService.address - ) - ); - - // PlonkVerifier - const PlonkVerifiers = await deployPlonkVerifiers(hre); - - // Used by ProofVerifier - for (let i = 0; i < PlonkVerifiers.length; i++) { - await utils.waitTx( - hre, - await AddressManager.setAddress( - // string(abi.encodePacked("plonk_verifier_", i)) - `${chainId}.${Buffer.from( - ethers.utils.arrayify( - ethers.utils.solidityPack( - ["string", "uint16"], - ["verifier_", i] - ) - ) - ).toString()}`, - PlonkVerifiers[i].address - ) - ); - } - - if (ethers.utils.isAddress(oracleProver)) { - await utils.waitTx( - hre, - await AddressManager.setAddress( - `${chainId}.oracle_prover`, - oracleProver - ) - ); - } - - if (ethers.utils.isAddress(soloProposer)) { - await utils.waitTx( - hre, - await AddressManager.setAddress( - `${chainId}.solo_proposer`, - soloProposer - ) - ); - } - - // save deployments - const deployments = { - network, - chainId, - deployer, - l2GenesisBlockHash, - contracts: Object.assign( - { AddressManager: AddressManager.address }, - { TaikoToken: TaikoToken.address }, - { TaikoL1: TaikoL1.address }, - { Bridge: Bridge.address }, - { SignalService: SignalService.address }, - { TokenVault: TokenVault.address }, - { BullToken: BullToken.address }, - { HorseToken: HorseToken.address } - ), - }; - - utils.saveDeployments(`${network}_L1`, deployments); - - return deployments; -} - -async function deployBridge(hre: any, addressManager: string): Promise { - const libTrieProof = await utils.deployContract(hre, "LibTrieProof"); - - const Bridge = await utils.deployContract(hre, "Bridge", { - LibTrieProof: libTrieProof.address, - }); - - await utils.waitTx(hre, await Bridge.init(addressManager)); - - return Bridge; -} - -async function deployTokenVault( - hre: any, - addressManager: string -): Promise { - const TokenVault = await utils.deployContract(hre, "TokenVault"); - - await utils.waitTx(hre, await TokenVault.init(addressManager)); - - return TokenVault; -} - -async function deploySignalService( - hre: any, - addressManager: string -): Promise { - const libTrieProof = await utils.deployContract(hre, "LibTrieProof"); - - const SignalService = await utils.deployContract(hre, "SignalService", { - LibTrieProof: libTrieProof.address, - }); - - await utils.waitTx(hre, await SignalService.init(addressManager)); - - return SignalService; -} - -async function deployPlonkVerifiers(hre: any): Promise { - const PlonkVerifier10TxsByteCode = utils.compileYulContract( - "../contracts/libs/yul/PlonkVerifier_10_txs.yulp" - ); - const PlonkVerifier80TxsByteCode = utils.compileYulContract( - "../contracts/libs/yul/PlonkVerifier_80_txs.yulp" - ); - - return [ - { - address: await utils.deployBytecode( - hre, - PlonkVerifier10TxsByteCode, - "PlonkVerifier_10_txs" - ), - }, - { - address: await utils.deployBytecode( - hre, - PlonkVerifier80TxsByteCode, - "PlonkVerifier_80_txs" - ), - }, - ]; -} diff --git a/packages/protocol/tasks/log.ts b/packages/protocol/tasks/log.ts deleted file mode 100644 index 45733800e77..00000000000 --- a/packages/protocol/tasks/log.ts +++ /dev/null @@ -1,37 +0,0 @@ -import * as chalk from "chalk"; - -// default LOG_LEVEL: INFO -function isInfoEnabled() { - return ( - !process.env.LOG_LEVEL || - (process.env.LOG_LEVEL && - process.env.LOG_LEVEL.toUpperCase() === "INFO") || - isDebugEnabled() - ); -} - -function isDebugEnabled() { - return ( - process.env.LOG_LEVEL && process.env.LOG_LEVEL.toUpperCase() === "DEBUG" - ); -} - -export function info(...args: any[]) { - if (isInfoEnabled()) { - console.log(chalk.blue.bold(["[INFO]", ...args].join(" "))); - } -} - -export function debug(...args: any[]) { - if (isDebugEnabled()) { - console.log(...args); - } -} - -export function warn(...args: any[]) { - console.log(chalk.magenta.bold(["[WARN]", ...args].join(" "))); -} - -export function error(...args: any[]) { - console.log(chalk.red.bold.underline(["[ERROR]", ...args].join(" "))); -} diff --git a/packages/protocol/tasks/utils.ts b/packages/protocol/tasks/utils.ts deleted file mode 100644 index ce256168405..00000000000 --- a/packages/protocol/tasks/utils.ts +++ /dev/null @@ -1,155 +0,0 @@ -import * as childProcess from "child_process"; -import * as fs from "fs"; -import * as path from "path"; -import * as log from "./log"; - -async function deployContract( - hre: any, - contractName: string, - libraries = {}, - args: any[] = [], - overrides = {} -) { - const contractArgs = args || []; - const contractArtifacts = await hre.ethers.getContractFactory( - contractName, - { - libraries: libraries, - } - ); - - const deployed = await contractArtifacts.deploy(...contractArgs, overrides); - log.debug( - `${contractName} deploying, tx ${deployed.deployTransaction.hash}, waiting for confirmations` - ); - - await deployed.deployed(); - - log.debug(`${contractName} deployed at ${deployed.address}`); - return deployed; -} - -function compileYulContract(contractPath: string): string { - const SOLC_COMMAND = path.join(__dirname, "../bin/solc"); - - if (!fs.existsSync(SOLC_COMMAND)) { - throw new Error( - `sloc command not found in ${SOLC_COMMAND}, please run "./scripts/download_solc.sh".` - ); - } - - if (!path.isAbsolute(contractPath)) { - contractPath = path.join(__dirname, contractPath); - } - - const compile = childProcess.spawnSync(SOLC_COMMAND, [ - "--yul", - "--bin", - contractPath, - ]); - - let isNextLineByteCode = false; - let byteCode = null; - for (const line of compile.stdout.toString().split("\n")) { - if (isNextLineByteCode) { - byteCode = line; - break; - } - - if (line.includes("Binary representation:")) { - isNextLineByteCode = true; - } - } - - if (!byteCode) { - throw new Error( - `failed to compile PlonkVerifier, sloc: ${SOLC_COMMAND}, contract: ${contractPath}` - ); - } - - log.debug( - `${contractPath} compiled successfully, byte code length: ${byteCode.length}` - ); - - if (!byteCode.startsWith("0x")) { - byteCode = `0x${byteCode}`; - } - - return byteCode; -} - -async function deployBytecode( - hre: any, - byteCode: string, - name: string -): Promise { - const [signer] = await hre.ethers.getSigners(); - - const tx = await signer.sendTransaction({ data: byteCode }); - const receipt = await tx.wait(); - - log.debug(`${name} deploying, tx ${tx.hash}, waiting for confirmations`); - - if (receipt.status !== 1) { - throw new Error( - `failed to create ${name} contract, transaction ${tx.hash} reverted` - ); - } - - return receipt.contractAddress; -} - -async function getDeployer(hre: any) { - const accounts = await hre.ethers.provider.listAccounts(); - if (accounts[0] !== undefined) { - return accounts[0]; - } - - throw new Error( - `Could not get account, check hardhat.config.ts: networks.${hre.network.name}.accounts` - ); -} - -async function waitTx(hre: any, tx: any) { - return tx.wait(hre.args.confirmations); -} - -async function getContract(hre: any, abi: string[], contractAddress: string) { - const signers = await hre.ethers.getSigners(); - - if (!signers || signers.length === 0) { - throw new Error( - `Could not get account, check hardhat.config.ts. network: ${hre.network.name}` - ); - } - - return new hre.ethers.Contract(contractAddress, abi, signers[0]); -} - -function saveDeployments(_fileName: string, deployments: any) { - const fileName = `deployments/${_fileName}.json`; - fs.writeFileSync(fileName, JSON.stringify(deployments, undefined, 2)); - log.debug(`deployments saved to ${fileName}`); -} - -function getDeployments(_fileName: string) { - const fileName = `deployments/${_fileName}.json`; - const json = fs.readFileSync(fileName); - return JSON.parse(`${json}`); -} - -async function decode(hre: any, type: any, data: any) { - return hre.ethers.utils.defaultAbiCoder.decode([type], data).toString(); -} - -export { - deployContract, - compileYulContract, - deployBytecode, - getDeployer, - waitTx, - getContract, - saveDeployments, - getDeployments, - decode, -}; diff --git a/packages/protocol/test/bridge/libs/LibBridgeRetry.test.ts b/packages/protocol/test/bridge/libs/LibBridgeRetry.test.ts index d89a4adf30a..146c512e58b 100644 --- a/packages/protocol/test/bridge/libs/LibBridgeRetry.test.ts +++ b/packages/protocol/test/bridge/libs/LibBridgeRetry.test.ts @@ -1,12 +1,6 @@ import * as helpers from "@nomicfoundation/hardhat-network-helpers"; import { expect } from "chai"; import hre, { ethers } from "hardhat"; -import { - getMessageStatusSlot, - Message, - MessageStatus, -} from "../../utils/message"; -import { decode } from "../../../tasks/utils"; import { AddressManager, EtherVault, @@ -16,6 +10,11 @@ import { TestReceiver, } from "../../../typechain"; import deployAddressManager from "../../utils/addressManager"; +import { + getMessageStatusSlot, + Message, + MessageStatus, +} from "../../utils/message"; // TODO(roger): we should deprecate these test and test Bridge.sol // as a whole. @@ -194,7 +193,7 @@ describe("LibBridgeRetry", function () { await badLibRetry.retryMessage(message, false); const newToBalance = await testReceiver.getBalance(); expect( - await decode( + decode( hre, "uint256", await ethers.provider.getStorageAt( @@ -244,7 +243,7 @@ describe("LibBridgeRetry", function () { const balancePlusRefund = await refundAddress.getBalance(); expect( - await decode( + decode( hre, "uint256", await ethers.provider.getStorageAt( @@ -300,7 +299,7 @@ describe("LibBridgeRetry", function () { ); expect( - await decode( + decode( hre, "uint256", await ethers.provider.getStorageAt( @@ -350,7 +349,7 @@ describe("LibBridgeRetry", function () { const newToBalance = await testReceiver.getBalance(); expect( - await decode( + decode( hre, "uint256", await ethers.provider.getStorageAt( @@ -366,3 +365,7 @@ describe("LibBridgeRetry", function () { }); }); }); + +function decode(hre: any, type: any, data: any) { + return hre.ethers.utils.defaultAbiCoder.decode([type], data).toString(); +} diff --git a/packages/protocol/test/libs/Lib1559Math.test.ts b/packages/protocol/test/libs/Lib1559Math.test.ts index 29c949fee93..fde48e435ab 100644 --- a/packages/protocol/test/libs/Lib1559Math.test.ts +++ b/packages/protocol/test/libs/Lib1559Math.test.ts @@ -1,5 +1,4 @@ import { expect } from "chai"; -// import * as log from "../tasks/log" const hre = require("hardhat"); const ethers = hre.ethers; diff --git a/packages/protocol/test/libs/LibBlockHeader.test.ts b/packages/protocol/test/libs/LibBlockHeader.test.ts index ba37b402a56..994eaa765bf 100644 --- a/packages/protocol/test/libs/LibBlockHeader.test.ts +++ b/packages/protocol/test/libs/LibBlockHeader.test.ts @@ -1,5 +1,4 @@ import { expect } from "chai"; -import * as log from "../../tasks/log"; const hre = require("hardhat"); const ethers = hre.ethers; const EBN = ethers.BigNumber; @@ -52,7 +51,7 @@ describe("LibBlockHeader tests", function () { const headerComputed = await libBlockHeader.hashBlockHeader( l2BlockHeader ); - log.debug("headerComputed:", headerComputed); + console.debug("headerComputed:", headerComputed); expect(headerComputed).to.equal(blockHash); }); @@ -138,7 +137,7 @@ describe("LibBlockHeader tests", function () { const headerComputed = await libBlockHeader.hashBlockHeader( l2BlockHeader ); - log.debug("headerComputed:", headerComputed); + console.debug("headerComputed:", headerComputed); expect(headerComputed).to.equal(blockHash); }); @@ -183,7 +182,7 @@ describe("LibBlockHeader tests", function () { const headerComputed = await libBlockHeader.hashBlockHeader( l2BlockHeader ); - log.debug("headerComputed:", headerComputed); + console.debug("headerComputed:", headerComputed); expect(headerComputed).to.equal(blockHash); }); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 881472a3f0c..e2d36ced475 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -163,7 +163,6 @@ importers: hardhat-contract-sizer: ^2.8.0 hardhat-docgen: ^1.3.0 hardhat-gas-reporter: ^1.0.9 - hardhat-preprocessor: ^0.1.5 lint-staged: ^12.5.0 merkle-patricia-tree: ^4.2.4 prettier: ^2.8.4 @@ -214,7 +213,6 @@ importers: hardhat-contract-sizer: 2.8.0_hardhat@2.13.0 hardhat-docgen: 1.3.0_hardhat@2.13.0 hardhat-gas-reporter: 1.0.9_hardhat@2.13.0 - hardhat-preprocessor: 0.1.5_hardhat@2.13.0 lint-staged: 12.5.0 merkle-patricia-tree: 4.2.4 prettier: 2.8.4 @@ -8516,10 +8514,6 @@ packages: engines: {node: '>= 4'} dev: true - /encode-utf8/1.0.3: - resolution: {integrity: sha512-ucAnuBEhUK4boH2HjVYG5Q2mQyPorvv0u/ocS+zhdw0S8AlHYY+GOFhP1Gio5z4icpP2ivFSvhtFjQi8+T9ppw==} - dev: true - /encodeurl/1.0.2: resolution: {integrity: sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==} engines: {node: '>= 0.8'} @@ -10268,12 +10262,6 @@ packages: resolution: {integrity: sha512-rDjbZUKpN8OYhB0IE/vY/I8UWO/602IIJEU/76Tv4LvYnwHCk0BCsvz4eRr9n+FQcri7L5cyaXOo0+/Kh4HisA==} dev: true - /fmix/0.1.0: - resolution: {integrity: sha512-Y6hyofImk9JdzU8k5INtTXX1cu8LDlePWDFU5sftm9H+zKCr5SGrVjdhkvsim646cw5zD0nADj8oHyXMZmCZ9w==} - dependencies: - imul: 1.0.1 - dev: true - /focus-visible/5.2.0: resolution: {integrity: sha512-Rwix9pBtC1Nuy5wysTmKy+UjbDJpIfg8eHjw0rjZ1mX4GNLz1Bmd16uDpI3Gk1i70Fgcs8Csg2lPm8HULFg9DQ==} dev: false @@ -10286,19 +10274,6 @@ packages: peerDependenciesMeta: debug: optional: true - dev: false - - /follow-redirects/1.15.2_debug@4.3.4: - resolution: {integrity: sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==} - engines: {node: '>=4.0'} - peerDependencies: - debug: '*' - peerDependenciesMeta: - debug: - optional: true - dependencies: - debug: 4.3.4 - dev: true /for-each/0.3.3: resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} @@ -11070,15 +11045,6 @@ packages: - '@codechecks/client' dev: true - /hardhat-preprocessor/0.1.5_hardhat@2.13.0: - resolution: {integrity: sha512-j8m44mmPxpxAAd0G8fPHRHOas/INZdzptSur0TNJvMEGcFdLDhbHHxBcqZVQ/bmiW42q4gC60AP4CXn9EF018g==} - peerDependencies: - hardhat: ^2.0.5 - dependencies: - hardhat: 2.13.0_6qtx7vkbdhwvdm4crzlegk4mvi - murmur-128: 0.2.1 - dev: true - /hardhat/2.13.0_6qtx7vkbdhwvdm4crzlegk4mvi: resolution: {integrity: sha512-ZlzBOLML1QGlm6JWyVAG8lVTEAoOaVm1in/RU2zoGAnYEoD1Rp4T+ZMvrLNhHaaeS9hfjJ1gJUBfiDr4cx+htQ==} engines: {node: '>=14.0.0'} @@ -11637,11 +11603,6 @@ packages: resolve-cwd: 3.0.0 dev: true - /imul/1.0.1: - resolution: {integrity: sha512-WFAgfwPLAjU66EKt6vRdTlKj4nAgIDQzh29JonLa4Bqtl6D8JrIMvWjCnx7xEjVNmP3U0fM5o8ZObk7d0f62bA==} - engines: {node: '>=0.10.0'} - dev: true - /imurmurhash/0.1.4: resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} engines: {node: '>=0.8.19'} @@ -14850,14 +14811,6 @@ packages: dev: true optional: true - /murmur-128/0.2.1: - resolution: {integrity: sha512-WseEgiRkI6aMFBbj8Cg9yBj/y+OdipwVC7zUo3W2W1JAJITwouUOtpqsmGSg67EQmwwSyod7hsVsWY5LsrfQVg==} - dependencies: - encode-utf8: 1.0.3 - fmix: 0.1.0 - imul: 1.0.1 - dev: true - /nan/2.17.0: resolution: {integrity: sha512-2ZTgtl0nJsO0KQCjEpxcIr5D+Yv90plTitZt9JBfQvVJDS5seMl3FOvsh3+9CoYWXf/1l5OaZzzF6nDm4cagaQ==} dev: true @@ -17741,7 +17694,7 @@ packages: dependencies: command-exists: 1.2.9 commander: 3.0.2 - follow-redirects: 1.15.2_debug@4.3.4 + follow-redirects: 1.15.2 fs-extra: 0.30.0 js-sha3: 0.8.0 memorystream: 0.3.1 From 935ba36ea40259de9fe2e42ce6e45709dee97f10 Mon Sep 17 00:00:00 2001 From: Daniel Wang Date: Sat, 1 Apr 2023 03:02:17 +0800 Subject: [PATCH 15/47] feat(protocol): enable graffiti for provers (#13512) Co-authored-by: Daniel Wang --- packages/protocol/contracts/L1/TaikoData.sol | 1 + packages/protocol/contracts/L1/libs/LibProving.sol | 9 +++++---- packages/protocol/test2/TaikoL1TestBase.sol | 1 + 3 files changed, 7 insertions(+), 4 deletions(-) diff --git a/packages/protocol/contracts/L1/TaikoData.sol b/packages/protocol/contracts/L1/TaikoData.sol index 7eff5ca49aa..ad2d4682284 100644 --- a/packages/protocol/contracts/L1/TaikoData.sol +++ b/packages/protocol/contracts/L1/TaikoData.sol @@ -86,6 +86,7 @@ library TaikoData { bytes32 parentHash; bytes32 blockHash; bytes32 signalRoot; + bytes32 graffiti; address prover; } diff --git a/packages/protocol/contracts/L1/libs/LibProving.sol b/packages/protocol/contracts/L1/libs/LibProving.sol index bc51cb67192..23810f362c9 100644 --- a/packages/protocol/contracts/L1/libs/LibProving.sol +++ b/packages/protocol/contracts/L1/libs/LibProving.sol @@ -144,18 +144,19 @@ library LibProving { false ); - bytes32[8] memory inputs; + bytes32[9] memory inputs; inputs[0] = bytes32(uint256(uint160(l1SignalService))); inputs[1] = bytes32(uint256(uint160(l2SignalService))); inputs[2] = bytes32(uint256(uint160(taikoL2))); inputs[3] = evidence.parentHash; inputs[4] = evidence.blockHash; inputs[5] = evidence.signalRoot; - inputs[6] = bytes32(uint256(uint160(evidence.prover))); - inputs[7] = blk.metaHash; + inputs[6] = evidence.graffiti; + inputs[7] = bytes32(uint256(uint160(evidence.prover))); + inputs[8] = blk.metaHash; assembly { - instance := keccak256(inputs, mul(32, 8)) + instance := keccak256(inputs, mul(32, 9)) } } diff --git a/packages/protocol/test2/TaikoL1TestBase.sol b/packages/protocol/test2/TaikoL1TestBase.sol index ce0eae47ed0..0ac865e5fea 100644 --- a/packages/protocol/test2/TaikoL1TestBase.sol +++ b/packages/protocol/test2/TaikoL1TestBase.sol @@ -126,6 +126,7 @@ abstract contract TaikoL1TestBase is Test { parentHash: parentHash, blockHash: blockHash, signalRoot: signalRoot, + graffiti: 0x0, prover: prover }); From f91185bbb3eb75cd8d3e36991c9a47cd51203f21 Mon Sep 17 00:00:00 2001 From: Daniel Wang <99078276+dantaik@users.noreply.github.com> Date: Sun, 2 Apr 2023 14:03:33 +0800 Subject: [PATCH 16/47] refactor(protocol): remove prefix in hashMessage() (#13510) --- packages/protocol/contracts/bridge/libs/LibBridgeData.sol | 5 ++--- packages/protocol/test/constants/messages.ts | 3 --- 2 files changed, 2 insertions(+), 6 deletions(-) delete mode 100644 packages/protocol/test/constants/messages.ts diff --git a/packages/protocol/contracts/bridge/libs/LibBridgeData.sol b/packages/protocol/contracts/bridge/libs/LibBridgeData.sol index 3fc01957803..e5067a18140 100644 --- a/packages/protocol/contracts/bridge/libs/LibBridgeData.sol +++ b/packages/protocol/contracts/bridge/libs/LibBridgeData.sol @@ -38,12 +38,11 @@ library LibBridgeData { event DestChainEnabled(uint256 indexed chainId, bool enabled); /** - * @return msgHash The keccak256 hash of the message encoded with - * "TAIKO_BRIDGE_MESSAGE". + * @return msgHash The keccak256 hash of the message. */ function hashMessage( IBridge.Message memory message ) internal pure returns (bytes32) { - return keccak256(abi.encode("TAIKO_BRIDGE_MESSAGE", message)); + return keccak256(abi.encode(message)); } } diff --git a/packages/protocol/test/constants/messages.ts b/packages/protocol/test/constants/messages.ts deleted file mode 100644 index c519885a5e4..00000000000 --- a/packages/protocol/test/constants/messages.ts +++ /dev/null @@ -1,3 +0,0 @@ -const K_BRIDGE_MESSAGE = "TAIKO_BRIDGE_MESSAGE"; - -export { K_BRIDGE_MESSAGE }; From fb1721b97a36692dee1eaa1a5ad4a8a85f98c067 Mon Sep 17 00:00:00 2001 From: David Date: Sun, 2 Apr 2023 22:01:14 +0800 Subject: [PATCH 17/47] Update packages/protocol/contracts/L1/libs/LibVerifying.sol --- packages/protocol/contracts/L1/libs/LibVerifying.sol | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/protocol/contracts/L1/libs/LibVerifying.sol b/packages/protocol/contracts/L1/libs/LibVerifying.sol index de7a59235a1..455b418f4fb 100644 --- a/packages/protocol/contracts/L1/libs/LibVerifying.sol +++ b/packages/protocol/contracts/L1/libs/LibVerifying.sol @@ -36,7 +36,7 @@ library LibVerifying { _checkConfig(config); uint64 timeNow = uint64(block.timestamp); - state.genesisHeight = timeNow; + state.genesisHeight = uint64(block.number); state.genesisTimestamp = timeNow; state.feeBase = feeBase; state.numBlocks = 1; From e5509acaaaa75ba0e261e6fc4af660d7391190a5 Mon Sep 17 00:00:00 2001 From: Daniel Wang Date: Wed, 5 Apr 2023 13:22:36 +0800 Subject: [PATCH 18/47] fix --- pnpm-lock.yaml | 7302 +++++++++++++++++++++++++----------------------- 1 file changed, 3817 insertions(+), 3485 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index e2d36ced475..eeaf03b7125 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1,517 +1,727 @@ -lockfileVersion: 5.4 +lockfileVersion: '6.0' importers: .: - specifiers: - husky: ^8.0.3 devDependencies: - husky: 8.0.3 + husky: + specifier: ^8.0.3 + version: 8.0.3 - packages/branding: - specifiers: {} + packages/branding: {} packages/bridge-ui: - specifiers: - '@babel/preset-env': ^7.16.0 - '@coinbase/wallet-sdk': ^3.6.3 - '@ethersproject/experimental': ^5.7.0 - '@lottiefiles/svelte-lottie-player': ^0.2.0 - '@sveltejs/vite-plugin-svelte': ^1.0.1 - '@sveltestack/svelte-query': ^1.6.0 - '@tsconfig/svelte': ^3.0.0 - '@types/eslint': ^8.2.1 - '@types/estree': ^0.0.50 - '@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/parser': ^5.16.0 - '@wagmi/connectors': ^0.1.1 - '@wagmi/core': ^0.8.0 - '@zerodevx/svelte-toast': ^0.6.3 - autoprefixer: ^10.4.13 - axios: ^1.2.0 - babel-jest: ^27.3.1 - babel-plugin-transform-es2015-modules-commonjs: ^6.26.2 - buffer: ^6.0.3 - daisyui: 1.16.6 - eslint-plugin-jest: ^27.2.1 - eslint-plugin-svelte3: ^4.0.0 - ethers: ^5.7.1 - identicon.js: ^2.3.3 - jest: ^27.5.1 - lint-staged: ^12.3.4 - node-sass: ^7.0.1 - postcss: ^8.4.19 - postcss-cli: ^7.1.2 - postcss-loader: ^6.2.0 - prettier: 2.7.1 - prettier-plugin-svelte: ^2.9.0 - rollup-plugin-node-builtins: ^2.0.0 - rollup-plugin-polyfill-node: ^0.10.2 - svelte: ^3.53.1 - svelte-check: ^2.8.0 - svelte-heros-v2: ^0.3.10 - svelte-i18n: ^3.5.1 - svelte-jester: ^2.1.5 - svelte-loader: ^3.1.2 - svelte-preprocess: ^4.10.7 - svelte-spa-router: ^3.2.0 - tailwindcss: ^3.2.4 - theme-change: ^2.2.0 - ts-jest: ^27.0.7 - ts-jest-mock-import-meta: ^0.12.0 - ts-loader: ^9.2.6 - tslib: ^2.4.0 - typescript: ^4.6.4 - vite: ^3.0.0 - vite-plugin-static-copy: ^0.12.0 - dependencies: - '@coinbase/wallet-sdk': 3.6.3 - '@ethersproject/experimental': 5.7.0 - '@lottiefiles/svelte-lottie-player': 0.2.0 - '@sveltestack/svelte-query': 1.6.0 - '@wagmi/connectors': 0.1.1_lpbbub423epmm6q3g5mjjnmjwe - '@wagmi/core': 0.8.4_5mvh6ls5vdjonfqgvwoj34otni - axios: 1.2.0 - buffer: 6.0.3 - ethers: 5.7.2 - identicon.js: 2.3.3 - svelte-i18n: 3.5.2_svelte@3.53.1 - svelte-spa-router: 3.3.0 + dependencies: + '@coinbase/wallet-sdk': + specifier: ^3.6.3 + version: 3.6.3(@babel/core@7.20.2) + '@ethersproject/experimental': + specifier: ^5.7.0 + version: 5.7.0 + '@lottiefiles/svelte-lottie-player': + specifier: ^0.2.0 + version: 0.2.0 + '@sveltestack/svelte-query': + specifier: ^1.6.0 + version: 1.6.0 + '@wagmi/connectors': + specifier: ^0.1.1 + version: 0.1.1(@babel/core@7.20.2)(@wagmi/core@0.8.4)(ethers@5.7.2)(typescript@4.9.3) + '@wagmi/core': + specifier: ^0.8.0 + version: 0.8.4(@babel/core@7.20.2)(@coinbase/wallet-sdk@3.6.3)(ethers@5.7.2)(react@18.2.0)(typescript@4.9.3) + axios: + specifier: ^1.2.0 + version: 1.2.0 + buffer: + specifier: ^6.0.3 + version: 6.0.3 + ethers: + specifier: ^5.7.1 + version: 5.7.2 + identicon.js: + specifier: ^2.3.3 + version: 2.3.3 + svelte-i18n: + specifier: ^3.5.1 + version: 3.5.2(svelte@3.53.1) + svelte-spa-router: + specifier: ^3.2.0 + version: 3.3.0 devDependencies: - '@babel/preset-env': 7.20.2 - '@sveltejs/vite-plugin-svelte': 1.3.1_svelte@3.53.1+vite@3.2.4 - '@tsconfig/svelte': 3.0.0 - '@types/eslint': 8.4.10 - '@types/estree': 0.0.50 - '@types/jest': 27.5.2 - '@types/mixpanel': 2.14.4 - '@types/sanitize-html': 2.6.2 - '@typescript-eslint/eslint-plugin': 5.44.0_c5rgyxfozmk6acmvyot27wcp74 - '@typescript-eslint/parser': 5.44.0_typescript@4.9.3 - '@zerodevx/svelte-toast': 0.6.3 - autoprefixer: 10.4.13_postcss@8.4.19 - babel-jest: 27.5.1 - babel-plugin-transform-es2015-modules-commonjs: 6.26.2 - daisyui: 1.16.6 - eslint-plugin-jest: 27.2.1_jnnvroutqvszjic6xgfk2wgrhu - eslint-plugin-svelte3: 4.0.0_svelte@3.53.1 - jest: 27.5.1 - lint-staged: 12.5.0 - node-sass: 7.0.3 - postcss: 8.4.19 - postcss-cli: 7.1.2 - postcss-loader: 6.2.1_postcss@8.4.19 - prettier: 2.7.1 - prettier-plugin-svelte: 2.9.0_nryolsexf6k3znhuh4uzpugsem - rollup-plugin-node-builtins: 2.1.2 - rollup-plugin-polyfill-node: 0.10.2 - svelte: 3.53.1 - svelte-check: 2.9.2_dfqi3dk7soqznqtir4fhqm6z5i - svelte-heros-v2: 0.3.10 - svelte-jester: 2.3.2_jest@27.5.1+svelte@3.53.1 - svelte-loader: 3.1.4_svelte@3.53.1 - svelte-preprocess: 4.10.7_d6lifvqr42ebgwtwt2nbwt433a - tailwindcss: 3.2.4_postcss@8.4.19 - theme-change: 2.2.0 - ts-jest: 27.1.5_ucbcg4iu5zhznj2s67mybtqili - ts-jest-mock-import-meta: 0.12.0_ts-jest@27.1.5 - ts-loader: 9.4.1_typescript@4.9.3 - tslib: 2.4.1 - typescript: 4.9.3 - vite: 3.2.4 - vite-plugin-static-copy: 0.12.0_vite@3.2.4 + '@babel/preset-env': + specifier: ^7.16.0 + version: 7.20.2(@babel/core@7.20.2) + '@sveltejs/vite-plugin-svelte': + specifier: ^1.0.1 + version: 1.3.1(svelte@3.53.1)(vite@3.2.4) + '@tsconfig/svelte': + specifier: ^3.0.0 + version: 3.0.0 + '@types/eslint': + specifier: ^8.2.1 + version: 8.4.10 + '@types/estree': + specifier: ^0.0.50 + version: 0.0.50 + '@types/jest': + specifier: ^27.0.2 + version: 27.5.2 + '@types/mixpanel': + specifier: ^2.14.3 + version: 2.14.4 + '@types/sanitize-html': + specifier: ^2.6.2 + version: 2.6.2 + '@typescript-eslint/eslint-plugin': + specifier: ^5.16.0 + version: 5.44.0(@typescript-eslint/parser@5.44.0)(eslint@8.37.0)(typescript@4.9.3) + '@typescript-eslint/parser': + specifier: ^5.16.0 + version: 5.44.0(eslint@8.37.0)(typescript@4.9.3) + '@zerodevx/svelte-toast': + specifier: ^0.6.3 + version: 0.6.3 + autoprefixer: + specifier: ^10.4.13 + version: 10.4.13(postcss@8.4.19) + babel-jest: + specifier: ^27.3.1 + version: 27.5.1(@babel/core@7.20.2) + babel-plugin-transform-es2015-modules-commonjs: + specifier: ^6.26.2 + version: 6.26.2 + daisyui: + specifier: 1.16.6 + version: 1.16.6 + eslint-plugin-jest: + specifier: ^27.2.1 + version: 27.2.1(@typescript-eslint/eslint-plugin@5.44.0)(eslint@8.37.0)(jest@27.5.1)(typescript@4.9.3) + eslint-plugin-simple-import-sort: + specifier: ^10.0.0 + version: 10.0.0(eslint@8.37.0) + eslint-plugin-svelte3: + specifier: ^4.0.0 + version: 4.0.0(eslint@8.37.0)(svelte@3.53.1) + jest: + specifier: ^27.5.1 + version: 27.5.1 + lint-staged: + specifier: ^12.3.4 + version: 12.5.0 + node-sass: + specifier: ^7.0.1 + version: 7.0.3 + postcss: + specifier: ^8.4.19 + version: 8.4.19 + postcss-cli: + specifier: ^7.1.2 + version: 7.1.2 + postcss-loader: + specifier: ^6.2.0 + version: 6.2.1(postcss@8.4.19)(webpack@5.75.0) + prettier: + specifier: 2.7.1 + version: 2.7.1 + prettier-plugin-svelte: + specifier: ^2.9.0 + version: 2.9.0(prettier@2.7.1)(svelte@3.53.1) + rollup-plugin-node-builtins: + specifier: ^2.0.0 + version: 2.1.2 + rollup-plugin-polyfill-node: + specifier: ^0.10.2 + version: 0.10.2(rollup@2.79.1) + svelte: + specifier: ^3.53.1 + version: 3.53.1 + svelte-check: + specifier: ^2.8.0 + version: 2.9.2(@babel/core@7.20.2)(node-sass@7.0.3)(postcss@8.4.19)(svelte@3.53.1) + svelte-heros-v2: + specifier: ^0.3.10 + version: 0.3.10 + svelte-jester: + specifier: ^2.1.5 + version: 2.3.2(jest@27.5.1)(svelte@3.53.1) + svelte-loader: + specifier: ^3.1.2 + version: 3.1.4(svelte@3.53.1) + svelte-preprocess: + specifier: ^4.10.7 + version: 4.10.7(@babel/core@7.20.2)(node-sass@7.0.3)(postcss@8.4.19)(svelte@3.53.1)(typescript@4.9.3) + tailwindcss: + specifier: ^3.2.4 + version: 3.2.4(postcss@8.4.19) + theme-change: + specifier: ^2.2.0 + version: 2.2.0 + ts-jest: + specifier: ^27.0.7 + version: 27.1.5(@babel/core@7.20.2)(@types/jest@27.5.2)(babel-jest@27.5.1)(jest@27.5.1)(typescript@4.9.3) + ts-jest-mock-import-meta: + specifier: ^0.12.0 + version: 0.12.0(ts-jest@27.1.5) + ts-loader: + specifier: ^9.2.6 + version: 9.4.1(typescript@4.9.3)(webpack@5.75.0) + tslib: + specifier: ^2.4.0 + version: 2.4.1 + typescript: + specifier: ^4.6.4 + version: 4.9.3 + vite: + specifier: ^3.0.0 + version: 3.2.4 + vite-plugin-static-copy: + specifier: ^0.12.0 + version: 0.12.0(vite@3.2.4) + + packages/eventindexer: {} packages/protocol: - specifiers: - '@defi-wonderland/smock': ^2.3.4 - '@foundry-rs/hardhat-forge': ^0.1.17 - '@gnosis.pm/zodiac': ^1.1.9 - '@nomicfoundation/hardhat-network-helpers': ^1.0.8 - '@nomiclabs/hardhat-ethers': ^2.2.2 - '@nomiclabs/hardhat-etherscan': ^3.1.7 - '@nomiclabs/hardhat-waffle': ^2.0.5 - '@openzeppelin/contracts': ^4.8.2 - '@openzeppelin/contracts-upgradeable': ^4.8.2 - '@openzeppelin/hardhat-upgrades': ^1.22.1 - '@typechain/ethers-v5': ^7.2.0 - '@typechain/hardhat': ^2.3.1 - '@types/chai': ^4.3.4 - '@types/glob': ^8.1.0 - '@types/mocha': ^9.1.1 - '@types/node': ^12.20.55 - '@typescript-eslint/eslint-plugin': ^4.33.0 - '@typescript-eslint/parser': ^4.33.0 - chai: ^4.3.7 - chalk: 4.1.2 - channel-ts: ^0.1.2 - dotenv: ^10.0.0 - eslint: ^7.32.0 - eslint-config-prettier: ^8.6.0 - eslint-config-standard: ^16.0.3 - eslint-plugin-import: ^2.27.5 - eslint-plugin-node: ^11.1.0 - eslint-plugin-prettier: ^3.4.1 - eslint-plugin-promise: ^5.2.0 - ethereum-waffle: ^3.4.4 - ethers: ^5.7.2 - glob: ^8.1.0 - hardhat: ^2.13.0 - hardhat-abi-exporter: ^2.10.1 - hardhat-contract-sizer: ^2.8.0 - hardhat-docgen: ^1.3.0 - hardhat-gas-reporter: ^1.0.9 - lint-staged: ^12.5.0 - merkle-patricia-tree: ^4.2.4 - prettier: ^2.8.4 - prettier-plugin-solidity: ^1.1.3 - rlp: ^3.0.0 - solhint: ^3.4.0 - solidity-coverage: github:taikoxyz/solidity-coverage - solidity-docgen: 0.6.0-beta.35 - ts-node: ^10.9.1 - typechain: ^5.2.0 - typescript: ^4.9.5 - dependencies: - '@gnosis.pm/zodiac': 1.1.9 - '@openzeppelin/contracts': 4.8.2 - '@openzeppelin/contracts-upgradeable': 4.8.2 - channel-ts: 0.1.2 + dependencies: + '@gnosis.pm/zodiac': + specifier: ^1.1.9 + version: 1.1.9 + '@openzeppelin/contracts': + specifier: ^4.8.2 + version: 4.8.2 + '@openzeppelin/contracts-upgradeable': + specifier: ^4.8.2 + version: 4.8.2 + channel-ts: + specifier: ^0.1.2 + version: 0.1.2 devDependencies: - '@defi-wonderland/smock': 2.3.4_u3rpjeimcwsavv62fpribvk5fm - '@foundry-rs/hardhat-forge': 0.1.17_fwz6j6oy647sr4tch7c5jpqkoq - '@nomicfoundation/hardhat-network-helpers': 1.0.8_hardhat@2.13.0 - '@nomiclabs/hardhat-ethers': 2.2.2_wknqauzjtp3mhprkntsmqpccee - '@nomiclabs/hardhat-etherscan': 3.1.7_hardhat@2.13.0 - '@nomiclabs/hardhat-waffle': 2.0.5_fwz6j6oy647sr4tch7c5jpqkoq - '@openzeppelin/hardhat-upgrades': 1.22.1_3tghbxmzql23z7wrs7ihu6h3ki - '@typechain/ethers-v5': 7.2.0_jcns4h3uqvirgzfg2h4tj32z6y - '@typechain/hardhat': 2.3.1_72qu7yerczljvjdavmwb3bv7oy - '@types/chai': 4.3.4 - '@types/glob': 8.1.0 - '@types/mocha': 9.1.1 - '@types/node': 12.20.55 - '@typescript-eslint/eslint-plugin': 4.33.0_s2qqtxhzmb7vugvfoyripfgp7i - '@typescript-eslint/parser': 4.33.0_jofidmxrjzhj7l6vknpw5ecvfe - chai: 4.3.7 - chalk: 4.1.2 - dotenv: 10.0.0 - eslint: 7.32.0 - eslint-config-prettier: 8.6.0_eslint@7.32.0 - eslint-config-standard: 16.0.3_s3p4dyzitdtgac5nictnavtxa4 - eslint-plugin-import: 2.27.5_ffi3uiz42rv3jyhs6cr7p7qqry - eslint-plugin-node: 11.1.0_eslint@7.32.0 - eslint-plugin-prettier: 3.4.1_2fbugv7hbzbahj5qm3ztcno6by - eslint-plugin-promise: 5.2.0_eslint@7.32.0 - ethereum-waffle: 3.4.4_typescript@4.9.5 - ethers: 5.7.2 - glob: 8.1.0 - hardhat: 2.13.0_6qtx7vkbdhwvdm4crzlegk4mvi - hardhat-abi-exporter: 2.10.1_hardhat@2.13.0 - hardhat-contract-sizer: 2.8.0_hardhat@2.13.0 - hardhat-docgen: 1.3.0_hardhat@2.13.0 - hardhat-gas-reporter: 1.0.9_hardhat@2.13.0 - lint-staged: 12.5.0 - merkle-patricia-tree: 4.2.4 - prettier: 2.8.4 - prettier-plugin-solidity: 1.1.3_prettier@2.8.4 - rlp: 3.0.0 - solhint: 3.4.0 - solidity-coverage: github.com/taikoxyz/solidity-coverage/ceb49fd1f6041e4fcd26079dfb0d3b0f58c812e5_hardhat@2.13.0 - solidity-docgen: 0.6.0-beta.35_hardhat@2.13.0 - ts-node: 10.9.1_prfxyxghnskheluimpb6dvby4q - typechain: 5.2.0_typescript@4.9.5 - typescript: 4.9.5 + '@defi-wonderland/smock': + specifier: ^2.3.4 + version: 2.3.4(@ethersproject/abi@5.7.0)(@ethersproject/abstract-provider@5.7.0)(@ethersproject/abstract-signer@5.7.0)(@nomiclabs/hardhat-ethers@2.2.2)(ethers@5.7.2)(hardhat@2.13.0) + '@foundry-rs/hardhat-forge': + specifier: ^0.1.17 + version: 0.1.17(@nomiclabs/hardhat-ethers@2.2.2)(ethereum-waffle@3.4.4)(ethers@5.7.2)(hardhat@2.13.0) + '@nomicfoundation/hardhat-network-helpers': + specifier: ^1.0.8 + version: 1.0.8(hardhat@2.13.0) + '@nomiclabs/hardhat-ethers': + specifier: ^2.2.2 + version: 2.2.2(ethers@5.7.2)(hardhat@2.13.0) + '@nomiclabs/hardhat-etherscan': + specifier: ^3.1.7 + version: 3.1.7(hardhat@2.13.0) + '@nomiclabs/hardhat-waffle': + specifier: ^2.0.5 + version: 2.0.5(@nomiclabs/hardhat-ethers@2.2.2)(ethereum-waffle@3.4.4)(ethers@5.7.2)(hardhat@2.13.0) + '@openzeppelin/hardhat-upgrades': + specifier: ^1.22.1 + version: 1.22.1(@nomiclabs/hardhat-ethers@2.2.2)(@nomiclabs/hardhat-etherscan@3.1.7)(ethers@5.7.2)(hardhat@2.13.0) + '@typechain/ethers-v5': + specifier: ^7.2.0 + version: 7.2.0(@ethersproject/abi@5.7.0)(@ethersproject/bytes@5.7.0)(@ethersproject/providers@5.7.2)(ethers@5.7.2)(typechain@5.2.0)(typescript@4.9.5) + '@typechain/hardhat': + specifier: ^2.3.1 + version: 2.3.1(hardhat@2.13.0)(lodash@4.17.21)(typechain@5.2.0) + '@types/chai': + specifier: ^4.3.4 + version: 4.3.4 + '@types/glob': + specifier: ^8.1.0 + version: 8.1.0 + '@types/mocha': + specifier: ^9.1.1 + version: 9.1.1 + '@types/node': + 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) + '@typescript-eslint/parser': + specifier: ^4.33.0 + version: 4.33.0(eslint@7.32.0)(typescript@4.9.5) + chai: + specifier: ^4.3.7 + version: 4.3.7 + chalk: + specifier: 4.1.2 + version: 4.1.2 + dotenv: + specifier: ^10.0.0 + version: 10.0.0 + eslint: + specifier: ^7.32.0 + version: 7.32.0 + eslint-config-prettier: + specifier: ^8.6.0 + version: 8.6.0(eslint@7.32.0) + eslint-config-standard: + specifier: ^16.0.3 + version: 16.0.3(eslint-plugin-import@2.27.5)(eslint-plugin-node@11.1.0)(eslint-plugin-promise@5.2.0)(eslint@7.32.0) + eslint-plugin-import: + specifier: ^2.27.5 + version: 2.27.5(@typescript-eslint/parser@4.33.0)(eslint@7.32.0) + eslint-plugin-node: + specifier: ^11.1.0 + version: 11.1.0(eslint@7.32.0) + eslint-plugin-prettier: + specifier: ^3.4.1 + version: 3.4.1(eslint-config-prettier@8.6.0)(eslint@7.32.0)(prettier@2.8.4) + eslint-plugin-promise: + specifier: ^5.2.0 + version: 5.2.0(eslint@7.32.0) + ethereum-waffle: + specifier: ^3.4.4 + version: 3.4.4(typescript@4.9.5) + ethers: + specifier: ^5.7.2 + version: 5.7.2 + glob: + specifier: ^8.1.0 + version: 8.1.0 + hardhat: + specifier: ^2.13.0 + version: 2.13.0(ts-node@10.9.1)(typescript@4.9.5) + hardhat-abi-exporter: + specifier: ^2.10.1 + version: 2.10.1(hardhat@2.13.0) + hardhat-contract-sizer: + specifier: ^2.8.0 + version: 2.8.0(hardhat@2.13.0) + hardhat-docgen: + specifier: ^1.3.0 + version: 1.3.0(hardhat@2.13.0)(lodash@4.17.21) + hardhat-gas-reporter: + specifier: ^1.0.9 + version: 1.0.9(hardhat@2.13.0) + lint-staged: + specifier: ^12.5.0 + version: 12.5.0 + merkle-patricia-tree: + specifier: ^4.2.4 + version: 4.2.4 + prettier: + specifier: ^2.8.4 + version: 2.8.4 + prettier-plugin-solidity: + specifier: ^1.1.3 + version: 1.1.3(prettier@2.8.4) + rlp: + specifier: ^3.0.0 + version: 3.0.0 + solhint: + specifier: ^3.4.0 + version: 3.4.0 + solidity-coverage: + specifier: github:taikoxyz/solidity-coverage + version: github.com/taikoxyz/solidity-coverage/ceb49fd1f6041e4fcd26079dfb0d3b0f58c812e5(hardhat@2.13.0) + solidity-docgen: + specifier: 0.6.0-beta.35 + version: 0.6.0-beta.35(hardhat@2.13.0) + ts-node: + specifier: ^10.9.1 + version: 10.9.1(@types/node@12.20.55)(typescript@4.9.5) + typechain: + specifier: ^5.2.0 + version: 5.2.0(typescript@4.9.5) + typescript: + specifier: ^4.9.5 + version: 4.9.5 - packages/relayer: - specifiers: {} + packages/relayer: {} packages/starter-dapp: - specifiers: - '@babel/preset-env': ^7.16.0 - '@coinbase/wallet-sdk': ^3.6.3 - '@ethersproject/experimental': ^5.7.0 - '@lottiefiles/svelte-lottie-player': ^0.2.0 - '@sveltejs/vite-plugin-svelte': ^1.0.1 - '@sveltestack/svelte-query': ^1.6.0 - '@tsconfig/svelte': ^3.0.0 - '@types/eslint': ^8.2.1 - '@types/estree': ^0.0.50 - '@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/parser': ^5.16.0 - '@wagmi/connectors': ^0.1.1 - '@wagmi/core': ^0.8.0 - '@zerodevx/svelte-toast': ^0.6.3 - autoprefixer: ^10.4.13 - axios: ^1.2.0 - babel-jest: ^27.3.1 - babel-plugin-transform-es2015-modules-commonjs: ^6.26.2 - buffer: ^6.0.3 - daisyui: 1.16.6 - ethers: ^5.7.1 - identicon.js: ^2.3.3 - jest: ^27.5.1 - node-sass: ^7.0.1 - postcss: ^8.4.19 - postcss-cli: ^7.1.2 - postcss-loader: ^6.2.0 - prettier: 2.7.1 - rollup-plugin-node-builtins: ^2.0.0 - rollup-plugin-polyfill-node: ^0.10.2 - svelte: ^3.53.1 - svelte-check: ^2.8.0 - svelte-heros-v2: ^0.3.10 - svelte-i18n: ^3.5.1 - svelte-jester: ^2.1.5 - svelte-loader: ^3.1.2 - svelte-preprocess: ^4.10.7 - svelte-spa-router: ^3.2.0 - tailwindcss: ^3.2.4 - theme-change: ^2.2.0 - ts-jest: ^27.0.7 - ts-jest-mock-import-meta: ^0.12.0 - ts-loader: ^9.2.6 - tslib: ^2.4.0 - typescript: ^4.6.4 - vite: ^3.0.0 - vite-plugin-static-copy: ^0.12.0 - dependencies: - '@coinbase/wallet-sdk': 3.6.3 - '@ethersproject/experimental': 5.7.0 - '@lottiefiles/svelte-lottie-player': 0.2.0 - '@sveltestack/svelte-query': 1.6.0 - '@wagmi/connectors': 0.1.1_qumsokfsavwbqmluzzd5y4jcfa - '@wagmi/core': 0.8.4_km5vcydjtqolcouev6sh7bgmoy - axios: 1.2.0 - buffer: 6.0.3 - ethers: 5.7.2 - identicon.js: 2.3.3 - svelte-i18n: 3.5.2_svelte@3.53.1 - svelte-spa-router: 3.3.0 + dependencies: + '@coinbase/wallet-sdk': + specifier: ^3.6.3 + version: 3.6.3(@babel/core@7.20.2) + '@ethersproject/experimental': + specifier: ^5.7.0 + version: 5.7.0 + '@lottiefiles/svelte-lottie-player': + specifier: ^0.2.0 + version: 0.2.0 + '@sveltestack/svelte-query': + specifier: ^1.6.0 + version: 1.6.0 + '@wagmi/connectors': + specifier: ^0.1.1 + version: 0.1.1(@babel/core@7.20.2)(@wagmi/core@0.8.4)(ethers@5.7.2)(typescript@4.9.5) + '@wagmi/core': + specifier: ^0.8.0 + version: 0.8.4(@babel/core@7.20.2)(@coinbase/wallet-sdk@3.6.3)(ethers@5.7.2)(react@18.2.0)(typescript@4.9.5) + axios: + specifier: ^1.2.0 + version: 1.2.0 + buffer: + specifier: ^6.0.3 + version: 6.0.3 + ethers: + specifier: ^5.7.1 + version: 5.7.2 + identicon.js: + specifier: ^2.3.3 + version: 2.3.3 + svelte-i18n: + specifier: ^3.5.1 + version: 3.5.2(svelte@3.53.1) + svelte-spa-router: + specifier: ^3.2.0 + version: 3.3.0 devDependencies: - '@babel/preset-env': 7.20.2 - '@sveltejs/vite-plugin-svelte': 1.3.1_svelte@3.53.1+vite@3.2.4 - '@tsconfig/svelte': 3.0.0 - '@types/eslint': 8.4.10 - '@types/estree': 0.0.50 - '@types/jest': 27.5.2 - '@types/mixpanel': 2.14.4 - '@types/sanitize-html': 2.6.2 - '@typescript-eslint/eslint-plugin': 5.44.0_7kywactpvjpcexyctx5cege4cm - '@typescript-eslint/parser': 5.44.0_typescript@4.9.5 - '@zerodevx/svelte-toast': 0.6.3 - autoprefixer: 10.4.13_postcss@8.4.21 - babel-jest: 27.5.1 - babel-plugin-transform-es2015-modules-commonjs: 6.26.2 - daisyui: 1.16.6 - jest: 27.5.1 - node-sass: 7.0.3 - postcss: 8.4.21 - postcss-cli: 7.1.2 - postcss-loader: 6.2.1_postcss@8.4.21 - prettier: 2.7.1 - rollup-plugin-node-builtins: 2.1.2 - rollup-plugin-polyfill-node: 0.10.2 - svelte: 3.53.1 - svelte-check: 2.9.2_zerbpdatqmtl23l4lmflabtkhm - svelte-heros-v2: 0.3.10 - svelte-jester: 2.3.2_jest@27.5.1+svelte@3.53.1 - svelte-loader: 3.1.4_svelte@3.53.1 - svelte-preprocess: 4.10.7_urj4ueeh3k3dx7qcxhluquyqdy - tailwindcss: 3.2.6_postcss@8.4.21 - theme-change: 2.2.0 - ts-jest: 27.1.5_gy2w2unevcycrhih2qxqkdetla - ts-jest-mock-import-meta: 0.12.0_ts-jest@27.1.5 - ts-loader: 9.4.1_typescript@4.9.5 - tslib: 2.5.0 - typescript: 4.9.5 - vite: 3.2.4 - vite-plugin-static-copy: 0.12.0_vite@3.2.4 + '@babel/preset-env': + specifier: ^7.16.0 + version: 7.20.2(@babel/core@7.20.2) + '@sveltejs/vite-plugin-svelte': + specifier: ^1.0.1 + version: 1.3.1(svelte@3.53.1)(vite@3.2.4) + '@tsconfig/svelte': + specifier: ^3.0.0 + version: 3.0.0 + '@types/eslint': + specifier: ^8.2.1 + version: 8.4.10 + '@types/estree': + specifier: ^0.0.50 + version: 0.0.50 + '@types/jest': + specifier: ^27.0.2 + version: 27.5.2 + '@types/mixpanel': + specifier: ^2.14.3 + version: 2.14.4 + '@types/sanitize-html': + specifier: ^2.6.2 + version: 2.6.2 + '@typescript-eslint/eslint-plugin': + specifier: ^5.16.0 + version: 5.44.0(@typescript-eslint/parser@5.44.0)(eslint@7.32.0)(typescript@4.9.5) + '@typescript-eslint/parser': + specifier: ^5.16.0 + version: 5.44.0(eslint@7.32.0)(typescript@4.9.5) + '@zerodevx/svelte-toast': + specifier: ^0.6.3 + version: 0.6.3 + autoprefixer: + specifier: ^10.4.13 + version: 10.4.13(postcss@8.4.21) + babel-jest: + specifier: ^27.3.1 + version: 27.5.1(@babel/core@7.20.2) + babel-plugin-transform-es2015-modules-commonjs: + specifier: ^6.26.2 + version: 6.26.2 + daisyui: + specifier: 1.16.6 + version: 1.16.6 + jest: + specifier: ^27.5.1 + version: 27.5.1 + node-sass: + specifier: ^7.0.1 + version: 7.0.3 + postcss: + specifier: ^8.4.19 + version: 8.4.21 + postcss-cli: + specifier: ^7.1.2 + version: 7.1.2 + postcss-loader: + specifier: ^6.2.0 + version: 6.2.1(postcss@8.4.21)(webpack@5.75.0) + prettier: + specifier: 2.7.1 + version: 2.7.1 + rollup-plugin-node-builtins: + specifier: ^2.0.0 + version: 2.1.2 + rollup-plugin-polyfill-node: + specifier: ^0.10.2 + version: 0.10.2(rollup@2.79.1) + svelte: + specifier: ^3.53.1 + version: 3.53.1 + svelte-check: + specifier: ^2.8.0 + version: 2.9.2(@babel/core@7.20.2)(node-sass@7.0.3)(postcss@8.4.21)(svelte@3.53.1) + svelte-heros-v2: + specifier: ^0.3.10 + version: 0.3.10 + svelte-jester: + specifier: ^2.1.5 + version: 2.3.2(jest@27.5.1)(svelte@3.53.1) + svelte-loader: + specifier: ^3.1.2 + version: 3.1.4(svelte@3.53.1) + svelte-preprocess: + specifier: ^4.10.7 + version: 4.10.7(@babel/core@7.20.2)(node-sass@7.0.3)(postcss@8.4.21)(svelte@3.53.1)(typescript@4.9.5) + tailwindcss: + specifier: ^3.2.4 + version: 3.2.6(postcss@8.4.21) + theme-change: + specifier: ^2.2.0 + version: 2.2.0 + ts-jest: + specifier: ^27.0.7 + version: 27.1.5(@babel/core@7.20.2)(@types/jest@27.5.2)(babel-jest@27.5.1)(jest@27.5.1)(typescript@4.9.5) + ts-jest-mock-import-meta: + specifier: ^0.12.0 + version: 0.12.0(ts-jest@27.1.5) + ts-loader: + specifier: ^9.2.6 + version: 9.4.1(typescript@4.9.5)(webpack@5.75.0) + tslib: + specifier: ^2.4.0 + version: 2.5.0 + typescript: + specifier: ^4.6.4 + version: 4.9.5 + vite: + specifier: ^3.0.0 + version: 3.2.4 + vite-plugin-static-copy: + specifier: ^0.12.0 + version: 0.12.0(vite@3.2.4) packages/status-page: - specifiers: - '@babel/preset-env': ^7.16.0 - '@coinbase/wallet-sdk': ^3.6.3 - '@ethersproject/experimental': ^5.7.0 - '@lottiefiles/svelte-lottie-player': ^0.2.0 - '@sveltejs/vite-plugin-svelte': ^1.0.1 - '@sveltestack/svelte-query': ^1.6.0 - '@tsconfig/svelte': ^3.0.0 - '@types/eslint': ^8.2.1 - '@types/estree': ^0.0.50 - '@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/parser': ^5.16.0 - '@wagmi/connectors': ^0.1.1 - '@wagmi/core': ^0.8.0 - '@zerodevx/svelte-toast': ^0.6.3 - autoprefixer: ^10.4.13 - axios: ^1.2.0 - babel-jest: ^27.3.1 - babel-plugin-transform-es2015-modules-commonjs: ^6.26.2 - buffer: ^6.0.3 - daisyui: 1.16.6 - ethers: ^5.7.1 - identicon.js: ^2.3.3 - jest: ^27.5.1 - node-sass: ^7.0.1 - postcss: ^8.4.19 - postcss-cli: ^7.1.2 - postcss-loader: ^6.2.0 - prettier: 2.7.1 - rollup-plugin-node-builtins: ^2.0.0 - rollup-plugin-polyfill-node: ^0.10.2 - svelte: ^3.53.1 - svelte-check: ^2.8.0 - svelte-heros-v2: ^0.3.10 - svelte-i18n: ^3.5.1 - svelte-jester: ^2.1.5 - svelte-loader: ^3.1.2 - svelte-preprocess: ^4.10.7 - svelte-spa-router: ^3.2.0 - tailwindcss: ^3.2.4 - theme-change: ^2.2.0 - ts-jest: ^27.0.7 - ts-jest-mock-import-meta: ^0.12.0 - ts-loader: ^9.2.6 - tslib: ^2.4.0 - typescript: ^4.6.4 - vite: ^3.0.0 - vite-plugin-static-copy: ^0.12.0 - dependencies: - '@coinbase/wallet-sdk': 3.6.3 - '@ethersproject/experimental': 5.7.0 - '@lottiefiles/svelte-lottie-player': 0.2.0 - '@sveltestack/svelte-query': 1.6.0 - '@wagmi/connectors': 0.1.1_lpbbub423epmm6q3g5mjjnmjwe - '@wagmi/core': 0.8.4_5mvh6ls5vdjonfqgvwoj34otni - axios: 1.2.0 - buffer: 6.0.3 - ethers: 5.7.2 - identicon.js: 2.3.3 - svelte-i18n: 3.5.2_svelte@3.53.1 - svelte-spa-router: 3.3.0 + dependencies: + '@coinbase/wallet-sdk': + specifier: ^3.6.3 + version: 3.6.3(@babel/core@7.20.2) + '@ethersproject/experimental': + specifier: ^5.7.0 + version: 5.7.0 + '@lottiefiles/svelte-lottie-player': + specifier: ^0.2.0 + version: 0.2.0 + '@sveltestack/svelte-query': + specifier: ^1.6.0 + version: 1.6.0 + '@wagmi/connectors': + specifier: ^0.1.1 + version: 0.1.1(@babel/core@7.20.2)(@wagmi/core@0.8.4)(ethers@5.7.2)(typescript@4.9.3) + '@wagmi/core': + specifier: ^0.8.0 + version: 0.8.4(@babel/core@7.20.2)(@coinbase/wallet-sdk@3.6.3)(ethers@5.7.2)(react@18.2.0)(typescript@4.9.3) + axios: + specifier: ^1.2.0 + version: 1.2.0 + buffer: + specifier: ^6.0.3 + version: 6.0.3 + ethers: + specifier: ^5.7.1 + version: 5.7.2 + identicon.js: + specifier: ^2.3.3 + version: 2.3.3 + svelte-i18n: + specifier: ^3.5.1 + version: 3.5.2(svelte@3.53.1) + svelte-spa-router: + specifier: ^3.2.0 + version: 3.3.0 devDependencies: - '@babel/preset-env': 7.20.2 - '@sveltejs/vite-plugin-svelte': 1.3.1_svelte@3.53.1+vite@3.2.4 - '@tsconfig/svelte': 3.0.0 - '@types/eslint': 8.4.10 - '@types/estree': 0.0.50 - '@types/jest': 27.5.2 - '@types/mixpanel': 2.14.4 - '@types/sanitize-html': 2.6.2 - '@typescript-eslint/eslint-plugin': 5.44.0_c5rgyxfozmk6acmvyot27wcp74 - '@typescript-eslint/parser': 5.44.0_typescript@4.9.3 - '@zerodevx/svelte-toast': 0.6.3 - autoprefixer: 10.4.13_postcss@8.4.19 - babel-jest: 27.5.1 - babel-plugin-transform-es2015-modules-commonjs: 6.26.2 - daisyui: 1.16.6 - jest: 27.5.1 - node-sass: 7.0.3 - postcss: 8.4.19 - postcss-cli: 7.1.2 - postcss-loader: 6.2.1_postcss@8.4.19 - prettier: 2.7.1 - rollup-plugin-node-builtins: 2.1.2 - rollup-plugin-polyfill-node: 0.10.2 - svelte: 3.53.1 - svelte-check: 2.9.2_dfqi3dk7soqznqtir4fhqm6z5i - svelte-heros-v2: 0.3.10 - svelte-jester: 2.3.2_jest@27.5.1+svelte@3.53.1 - svelte-loader: 3.1.4_svelte@3.53.1 - svelte-preprocess: 4.10.7_d6lifvqr42ebgwtwt2nbwt433a - tailwindcss: 3.2.4_postcss@8.4.19 - theme-change: 2.2.0 - ts-jest: 27.1.5_ucbcg4iu5zhznj2s67mybtqili - ts-jest-mock-import-meta: 0.12.0_ts-jest@27.1.5 - ts-loader: 9.4.1_typescript@4.9.3 - tslib: 2.4.1 - typescript: 4.9.3 - vite: 3.2.4 - vite-plugin-static-copy: 0.12.0_vite@3.2.4 + '@babel/preset-env': + specifier: ^7.16.0 + version: 7.20.2(@babel/core@7.20.2) + '@sveltejs/vite-plugin-svelte': + specifier: ^1.0.1 + version: 1.3.1(svelte@3.53.1)(vite@3.2.4) + '@tsconfig/svelte': + specifier: ^3.0.0 + version: 3.0.0 + '@types/eslint': + specifier: ^8.2.1 + version: 8.4.10 + '@types/estree': + specifier: ^0.0.50 + version: 0.0.50 + '@types/jest': + specifier: ^27.0.2 + version: 27.5.2 + '@types/mixpanel': + specifier: ^2.14.3 + version: 2.14.4 + '@types/sanitize-html': + specifier: ^2.6.2 + version: 2.6.2 + '@typescript-eslint/eslint-plugin': + specifier: ^5.16.0 + version: 5.44.0(@typescript-eslint/parser@5.44.0)(eslint@7.32.0)(typescript@4.9.3) + '@typescript-eslint/parser': + specifier: ^5.16.0 + version: 5.44.0(eslint@7.32.0)(typescript@4.9.3) + '@zerodevx/svelte-toast': + specifier: ^0.6.3 + version: 0.6.3 + autoprefixer: + specifier: ^10.4.13 + version: 10.4.13(postcss@8.4.19) + babel-jest: + specifier: ^27.3.1 + version: 27.5.1(@babel/core@7.20.2) + babel-plugin-transform-es2015-modules-commonjs: + specifier: ^6.26.2 + version: 6.26.2 + daisyui: + specifier: 1.16.6 + version: 1.16.6 + jest: + specifier: ^27.5.1 + version: 27.5.1 + node-sass: + specifier: ^7.0.1 + version: 7.0.3 + postcss: + specifier: ^8.4.19 + version: 8.4.19 + postcss-cli: + specifier: ^7.1.2 + version: 7.1.2 + postcss-loader: + specifier: ^6.2.0 + version: 6.2.1(postcss@8.4.19)(webpack@5.75.0) + prettier: + specifier: 2.7.1 + version: 2.7.1 + rollup-plugin-node-builtins: + specifier: ^2.0.0 + version: 2.1.2 + rollup-plugin-polyfill-node: + specifier: ^0.10.2 + version: 0.10.2(rollup@2.79.1) + svelte: + specifier: ^3.53.1 + version: 3.53.1 + svelte-check: + specifier: ^2.8.0 + version: 2.9.2(@babel/core@7.20.2)(node-sass@7.0.3)(postcss@8.4.19)(svelte@3.53.1) + svelte-heros-v2: + specifier: ^0.3.10 + version: 0.3.10 + svelte-jester: + specifier: ^2.1.5 + version: 2.3.2(jest@27.5.1)(svelte@3.53.1) + svelte-loader: + specifier: ^3.1.2 + version: 3.1.4(svelte@3.53.1) + svelte-preprocess: + specifier: ^4.10.7 + version: 4.10.7(@babel/core@7.20.2)(node-sass@7.0.3)(postcss@8.4.19)(svelte@3.53.1)(typescript@4.9.3) + tailwindcss: + specifier: ^3.2.4 + version: 3.2.4(postcss@8.4.19) + theme-change: + specifier: ^2.2.0 + version: 2.2.0 + ts-jest: + specifier: ^27.0.7 + version: 27.1.5(@babel/core@7.20.2)(@types/jest@27.5.2)(babel-jest@27.5.1)(jest@27.5.1)(typescript@4.9.3) + ts-jest-mock-import-meta: + specifier: ^0.12.0 + version: 0.12.0(ts-jest@27.1.5) + ts-loader: + specifier: ^9.2.6 + version: 9.4.1(typescript@4.9.3)(webpack@5.75.0) + tslib: + specifier: ^2.4.0 + version: 2.4.1 + typescript: + specifier: ^4.6.4 + version: 4.9.3 + vite: + specifier: ^3.0.0 + version: 3.2.4 + vite-plugin-static-copy: + specifier: ^0.12.0 + version: 0.12.0(vite@3.2.4) - packages/tokenomics: - specifiers: {} + packages/tokenomics: {} packages/website: - specifiers: - '@heroicons/react': ^2.0.16 - '@types/node': ^18.15.1 - '@types/react': ^18.0.28 - autoprefixer: ^10.4.14 - next: ^13.2.4 - next-themes: ^0.2.1 - nextra: ^2.2.19 - nextra-theme-docs: ^2.2.19 - postcss: ^8.4.21 - react: ^18.2.0 - react-dom: ^18.2.0 - sharp: ^0.31.3 - tailwindcss: ^3.2.7 - typescript: ^4.9.5 - dependencies: - next: 13.2.4_biqbaboplfbrettd7655fr4n2y - next-themes: 0.2.1_ld2jel3hspngo3u5lti2kgl2sq - nextra: 2.2.19_ld2jel3hspngo3u5lti2kgl2sq - nextra-theme-docs: 2.2.19_i765vautotixoofbdi6dinfkwe - react: 18.2.0 - react-dom: 18.2.0_react@18.2.0 - sharp: 0.31.3 + dependencies: + next: + specifier: ^13.2.4 + version: 13.2.4(react-dom@18.2.0)(react@18.2.0) + next-themes: + specifier: ^0.2.1 + version: 0.2.1(next@13.2.4)(react-dom@18.2.0)(react@18.2.0) + nextra: + specifier: ^2.2.19 + version: 2.2.19(next@13.2.4)(react-dom@18.2.0)(react@18.2.0) + nextra-theme-docs: + specifier: ^2.2.19 + version: 2.2.19(next@13.2.4)(nextra@2.2.19)(react-dom@18.2.0)(react@18.2.0) + react: + specifier: ^18.2.0 + version: 18.2.0 + react-dom: + specifier: ^18.2.0 + version: 18.2.0(react@18.2.0) + sharp: + specifier: ^0.31.3 + version: 0.31.3 devDependencies: - '@heroicons/react': 2.0.16_react@18.2.0 - '@types/node': 18.15.1 - '@types/react': 18.0.28 - autoprefixer: 10.4.14_postcss@8.4.21 - postcss: 8.4.21 - tailwindcss: 3.2.7_postcss@8.4.21 - typescript: 4.9.5 + '@heroicons/react': + specifier: ^2.0.16 + version: 2.0.16(react@18.2.0) + '@types/node': + specifier: ^18.15.1 + version: 18.15.1 + '@types/react': + specifier: ^18.0.28 + version: 18.0.28 + autoprefixer: + specifier: ^10.4.14 + version: 10.4.14(postcss@8.4.21) + postcss: + specifier: ^8.4.21 + version: 8.4.21 + tailwindcss: + specifier: ^3.2.7 + version: 3.2.7(postcss@8.4.21) + typescript: + specifier: ^4.9.5 + version: 4.9.5 - packages/whitepaper: - specifiers: {} + packages/whitepaper: {} packages: - /@ampproject/remapping/2.2.0: + /@ampproject/remapping@2.2.0: resolution: {integrity: sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==} engines: {node: '>=6.0.0'} dependencies: '@jridgewell/gen-mapping': 0.1.1 '@jridgewell/trace-mapping': 0.3.17 - dev: true - /@babel/code-frame/7.12.11: + /@babel/code-frame@7.12.11: resolution: {integrity: sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==} dependencies: '@babel/highlight': 7.18.6 dev: true - /@babel/code-frame/7.18.6: + /@babel/code-frame@7.18.6: resolution: {integrity: sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==} engines: {node: '>=6.9.0'} dependencies: '@babel/highlight': 7.18.6 - dev: true - /@babel/compat-data/7.20.1: + /@babel/compat-data@7.20.1: resolution: {integrity: sha512-EWZ4mE2diW3QALKvDMiXnbZpRvlj+nayZ112nK93SnhqOtpdsbVD4W+2tEoT3YNBAG9RBR0ISY758ZkOgsn6pQ==} engines: {node: '>=6.9.0'} - /@babel/core/7.20.2: + /@babel/core@7.20.2: resolution: {integrity: sha512-w7DbG8DtMrJcFOi4VrLm+8QM4az8Mo+PuLBKLp2zrYRCow8W/f9xiXm5sN53C8HksCyDQwCKha9JiDoIyPjT2g==} engines: {node: '>=6.9.0'} dependencies: '@ampproject/remapping': 2.2.0 '@babel/code-frame': 7.18.6 '@babel/generator': 7.20.4 - '@babel/helper-compilation-targets': 7.20.0_@babel+core@7.20.2 + '@babel/helper-compilation-targets': 7.20.0(@babel/core@7.20.2) '@babel/helper-module-transforms': 7.20.2 '@babel/helpers': 7.20.1 '@babel/parser': 7.20.3 @@ -519,31 +729,29 @@ packages: '@babel/traverse': 7.20.1 '@babel/types': 7.20.2 convert-source-map: 1.9.0 - debug: 4.3.4 + debug: 4.3.4(supports-color@8.1.1) gensync: 1.0.0-beta.2 json5: 2.2.1 semver: 6.3.0 transitivePeerDependencies: - supports-color - dev: true - /@babel/generator/7.20.4: + /@babel/generator@7.20.4: resolution: {integrity: sha512-luCf7yk/cm7yab6CAW1aiFnmEfBJplb/JojV56MYEK7ziWfGmFlTfmL9Ehwfy4gFhbjBfWO1wj7/TuSbVNEEtA==} engines: {node: '>=6.9.0'} dependencies: '@babel/types': 7.20.2 '@jridgewell/gen-mapping': 0.3.2 jsesc: 2.5.2 - dev: true - /@babel/helper-annotate-as-pure/7.18.6: + /@babel/helper-annotate-as-pure@7.18.6: resolution: {integrity: sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA==} engines: {node: '>=6.9.0'} dependencies: '@babel/types': 7.20.2 dev: true - /@babel/helper-builder-binary-assignment-operator-visitor/7.18.9: + /@babel/helper-builder-binary-assignment-operator-visitor@7.18.9: resolution: {integrity: sha512-yFQ0YCHoIqarl8BCRwBL8ulYUaZpz3bNsA7oFepAzee+8/+ImtADXNOmO5vJvsPff3qi+hvpkY/NYBTrBQgdNw==} engines: {node: '>=6.9.0'} dependencies: @@ -551,18 +759,7 @@ packages: '@babel/types': 7.20.2 dev: true - /@babel/helper-compilation-targets/7.20.0: - resolution: {integrity: sha512-0jp//vDGp9e8hZzBc6N/KwA5ZK3Wsm/pfm4CrY7vzegkVxc65SgSn6wYOnwHe9Js9HRQ1YTCKLGPzDtaS3RoLQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - dependencies: - '@babel/compat-data': 7.20.1 - '@babel/helper-validator-option': 7.18.6 - browserslist: 4.21.5 - semver: 6.3.0 - - /@babel/helper-compilation-targets/7.20.0_@babel+core@7.20.2: + /@babel/helper-compilation-targets@7.20.0(@babel/core@7.20.2): resolution: {integrity: sha512-0jp//vDGp9e8hZzBc6N/KwA5ZK3Wsm/pfm4CrY7vzegkVxc65SgSn6wYOnwHe9Js9HRQ1YTCKLGPzDtaS3RoLQ==} engines: {node: '>=6.9.0'} peerDependencies: @@ -573,14 +770,14 @@ packages: '@babel/helper-validator-option': 7.18.6 browserslist: 4.21.5 semver: 6.3.0 - dev: true - /@babel/helper-create-class-features-plugin/7.20.2: + /@babel/helper-create-class-features-plugin@7.20.2(@babel/core@7.20.2): resolution: {integrity: sha512-k22GoYRAHPYr9I+Gvy2ZQlAe5mGy8BqWst2wRt8cwIufWTxrsVshhIBvYNqC80N0GSFWTsqRVexOtfzlgOEDvA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: + '@babel/core': 7.20.2 '@babel/helper-annotate-as-pure': 7.18.6 '@babel/helper-environment-visitor': 7.18.9 '@babel/helper-function-name': 7.19.0 @@ -592,71 +789,70 @@ packages: - supports-color dev: true - /@babel/helper-create-regexp-features-plugin/7.19.0: + /@babel/helper-create-regexp-features-plugin@7.19.0(@babel/core@7.20.2): resolution: {integrity: sha512-htnV+mHX32DF81amCDrwIDr8nrp1PTm+3wfBN9/v8QJOLEioOCOG7qNyq0nHeFiWbT3Eb7gsPwEmV64UCQ1jzw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: + '@babel/core': 7.20.2 '@babel/helper-annotate-as-pure': 7.18.6 regexpu-core: 5.2.2 dev: true - /@babel/helper-define-polyfill-provider/0.3.3: + /@babel/helper-define-polyfill-provider@0.3.3(@babel/core@7.20.2): resolution: {integrity: sha512-z5aQKU4IzbqCC1XH0nAqfsFLMVSo22SBKUc0BxGrLkolTdPTructy0ToNnlO2zA4j9Q/7pjMZf0DSY+DSTYzww==} peerDependencies: '@babel/core': ^7.4.0-0 dependencies: - '@babel/helper-compilation-targets': 7.20.0 + '@babel/core': 7.20.2 + '@babel/helper-compilation-targets': 7.20.0(@babel/core@7.20.2) '@babel/helper-plugin-utils': 7.20.2 - debug: 4.3.4 + debug: 4.3.4(supports-color@8.1.1) lodash.debounce: 4.0.8 resolve: 1.22.1 semver: 6.3.0 transitivePeerDependencies: - supports-color - /@babel/helper-environment-visitor/7.18.9: + /@babel/helper-environment-visitor@7.18.9: resolution: {integrity: sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==} engines: {node: '>=6.9.0'} - dev: true - /@babel/helper-explode-assignable-expression/7.18.6: + /@babel/helper-explode-assignable-expression@7.18.6: resolution: {integrity: sha512-eyAYAsQmB80jNfg4baAtLeWAQHfHFiR483rzFK+BhETlGZaQC9bsfrugfXDCbRHLQbIA7U5NxhhOxN7p/dWIcg==} engines: {node: '>=6.9.0'} dependencies: '@babel/types': 7.20.2 dev: true - /@babel/helper-function-name/7.19.0: + /@babel/helper-function-name@7.19.0: resolution: {integrity: sha512-WAwHBINyrpqywkUH0nTnNgI5ina5TFn85HKS0pbPDfxFfhyR/aNQEn4hGi1P1JyT//I0t4OgXUlofzWILRvS5w==} engines: {node: '>=6.9.0'} dependencies: '@babel/template': 7.18.10 '@babel/types': 7.20.2 - dev: true - /@babel/helper-hoist-variables/7.18.6: + /@babel/helper-hoist-variables@7.18.6: resolution: {integrity: sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==} engines: {node: '>=6.9.0'} dependencies: '@babel/types': 7.20.2 - dev: true - /@babel/helper-member-expression-to-functions/7.18.9: + /@babel/helper-member-expression-to-functions@7.18.9: resolution: {integrity: sha512-RxifAh2ZoVU67PyKIO4AMi1wTenGfMR/O/ae0CCRqwgBAt5v7xjdtRw7UoSbsreKrQn5t7r89eruK/9JjYHuDg==} engines: {node: '>=6.9.0'} dependencies: '@babel/types': 7.20.2 dev: true - /@babel/helper-module-imports/7.18.6: + /@babel/helper-module-imports@7.18.6: resolution: {integrity: sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==} engines: {node: '>=6.9.0'} dependencies: '@babel/types': 7.20.2 - /@babel/helper-module-transforms/7.20.2: + /@babel/helper-module-transforms@7.20.2: resolution: {integrity: sha512-zvBKyJXRbmK07XhMuujYoJ48B5yvvmM6+wcpv6Ivj4Yg6qO7NOZOSnvZN9CRl1zz1Z4cKf8YejmCMh8clOoOeA==} engines: {node: '>=6.9.0'} dependencies: @@ -670,25 +866,25 @@ packages: '@babel/types': 7.20.2 transitivePeerDependencies: - supports-color - dev: true - /@babel/helper-optimise-call-expression/7.18.6: + /@babel/helper-optimise-call-expression@7.18.6: resolution: {integrity: sha512-HP59oD9/fEHQkdcbgFCnbmgH5vIQTJbxh2yf+CdM89/glUNnuzr87Q8GIjGEnOktTROemO0Pe0iPAYbqZuOUiA==} engines: {node: '>=6.9.0'} dependencies: '@babel/types': 7.20.2 dev: true - /@babel/helper-plugin-utils/7.20.2: + /@babel/helper-plugin-utils@7.20.2: resolution: {integrity: sha512-8RvlJG2mj4huQ4pZ+rU9lqKi9ZKiRmuvGuM2HlWmkmgOhbs6zEAw6IEiJ5cQqGbDzGZOhwuOQNtZMi/ENLjZoQ==} engines: {node: '>=6.9.0'} - /@babel/helper-remap-async-to-generator/7.18.9: + /@babel/helper-remap-async-to-generator@7.18.9(@babel/core@7.20.2): resolution: {integrity: sha512-dI7q50YKd8BAv3VEfgg7PS7yD3Rtbi2J1XMXaalXO0W0164hYLnh8zpjRS0mte9MfVp/tltvr/cfdXPvJr1opA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: + '@babel/core': 7.20.2 '@babel/helper-annotate-as-pure': 7.18.6 '@babel/helper-environment-visitor': 7.18.9 '@babel/helper-wrap-function': 7.19.0 @@ -697,7 +893,7 @@ packages: - supports-color dev: true - /@babel/helper-replace-supers/7.19.1: + /@babel/helper-replace-supers@7.19.1: resolution: {integrity: sha512-T7ahH7wV0Hfs46SFh5Jz3s0B6+o8g3c+7TMxu7xKfmHikg7EAZ3I2Qk9LFhjxXq8sL7UkP5JflezNwoZa8WvWw==} engines: {node: '>=6.9.0'} dependencies: @@ -710,40 +906,38 @@ packages: - supports-color dev: true - /@babel/helper-simple-access/7.20.2: + /@babel/helper-simple-access@7.20.2: resolution: {integrity: sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA==} engines: {node: '>=6.9.0'} dependencies: '@babel/types': 7.20.2 - dev: true - /@babel/helper-skip-transparent-expression-wrappers/7.20.0: + /@babel/helper-skip-transparent-expression-wrappers@7.20.0: resolution: {integrity: sha512-5y1JYeNKfvnT8sZcK9DVRtpTbGiomYIHviSP3OQWmDPU3DeH4a1ZlT/N2lyQ5P8egjcRaT/Y9aNqUxK0WsnIIg==} engines: {node: '>=6.9.0'} dependencies: '@babel/types': 7.20.2 dev: true - /@babel/helper-split-export-declaration/7.18.6: + /@babel/helper-split-export-declaration@7.18.6: resolution: {integrity: sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==} engines: {node: '>=6.9.0'} dependencies: '@babel/types': 7.20.2 - dev: true - /@babel/helper-string-parser/7.19.4: + /@babel/helper-string-parser@7.19.4: resolution: {integrity: sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==} engines: {node: '>=6.9.0'} - /@babel/helper-validator-identifier/7.19.1: + /@babel/helper-validator-identifier@7.19.1: resolution: {integrity: sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==} engines: {node: '>=6.9.0'} - /@babel/helper-validator-option/7.18.6: + /@babel/helper-validator-option@7.18.6: resolution: {integrity: sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw==} engines: {node: '>=6.9.0'} - /@babel/helper-wrap-function/7.19.0: + /@babel/helper-wrap-function@7.19.0: resolution: {integrity: sha512-txX8aN8CZyYGTwcLhlk87KRqncAzhh5TpQamZUa0/u3an36NtDpUP6bQgBCBcLeBs09R/OwQu3OjK0k/HwfNDg==} engines: {node: '>=6.9.0'} dependencies: @@ -755,7 +949,7 @@ packages: - supports-color dev: true - /@babel/helpers/7.20.1: + /@babel/helpers@7.20.1: resolution: {integrity: sha512-J77mUVaDTUJFZ5BpP6mMn6OIl3rEWymk2ZxDBQJUG3P+PbmyMcF3bYWvz0ma69Af1oobDqT/iAsvzhB58xhQUg==} engines: {node: '>=6.9.0'} dependencies: @@ -764,26 +958,23 @@ packages: '@babel/types': 7.20.2 transitivePeerDependencies: - supports-color - dev: true - /@babel/highlight/7.18.6: + /@babel/highlight@7.18.6: resolution: {integrity: sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==} engines: {node: '>=6.9.0'} dependencies: '@babel/helper-validator-identifier': 7.19.1 chalk: 2.4.2 js-tokens: 4.0.0 - dev: true - /@babel/parser/7.20.3: + /@babel/parser@7.20.3: resolution: {integrity: sha512-OP/s5a94frIPXwjzEcv5S/tpQfc6XhxYUnmWpgdqMWGgYCuErA3SzozaRAMQgSZWKeTJxht9aWAkUY+0UzvOFg==} engines: {node: '>=6.0.0'} hasBin: true dependencies: '@babel/types': 7.20.2 - dev: true - /@babel/parser/7.21.2: + /@babel/parser@7.21.2: resolution: {integrity: sha512-URpaIJQwEkEC2T9Kn+Ai6Xe/02iNaVCuT/PtoRz3GPVJVDpPd7mLo+VddTbhCRU9TXqW5mSrQfXZyi8kDKOVpQ==} engines: {node: '>=6.0.0'} hasBin: true @@ -791,204 +982,213 @@ packages: '@babel/types': 7.21.2 dev: true - /@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/7.18.6: + /@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.18.6(@babel/core@7.20.2): resolution: {integrity: sha512-Dgxsyg54Fx1d4Nge8UnvTrED63vrwOdPmyvPzlNN/boaliRP54pm3pGzZD1SJUwrBA+Cs/xdG8kXX6Mn/RfISQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: + '@babel/core': 7.20.2 '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/7.18.9: + /@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.18.9(@babel/core@7.20.2): resolution: {integrity: sha512-AHrP9jadvH7qlOj6PINbgSuphjQUAK7AOT7DPjBo9EHoLhQTnnK5u45e1Hd4DbSQEO9nqPWtQ89r+XEOWFScKg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.13.0 dependencies: + '@babel/core': 7.20.2 '@babel/helper-plugin-utils': 7.20.2 '@babel/helper-skip-transparent-expression-wrappers': 7.20.0 - '@babel/plugin-proposal-optional-chaining': 7.18.9 + '@babel/plugin-proposal-optional-chaining': 7.18.9(@babel/core@7.20.2) dev: true - /@babel/plugin-proposal-async-generator-functions/7.20.1: + /@babel/plugin-proposal-async-generator-functions@7.20.1(@babel/core@7.20.2): resolution: {integrity: sha512-Gh5rchzSwE4kC+o/6T8waD0WHEQIsDmjltY8WnWRXHUdH8axZhuH86Ov9M72YhJfDrZseQwuuWaaIT/TmePp3g==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: + '@babel/core': 7.20.2 '@babel/helper-environment-visitor': 7.18.9 '@babel/helper-plugin-utils': 7.20.2 - '@babel/helper-remap-async-to-generator': 7.18.9 - '@babel/plugin-syntax-async-generators': 7.8.4 + '@babel/helper-remap-async-to-generator': 7.18.9(@babel/core@7.20.2) + '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.20.2) transitivePeerDependencies: - supports-color dev: true - /@babel/plugin-proposal-class-properties/7.18.6: + /@babel/plugin-proposal-class-properties@7.18.6(@babel/core@7.20.2): resolution: {integrity: sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/helper-create-class-features-plugin': 7.20.2 + '@babel/core': 7.20.2 + '@babel/helper-create-class-features-plugin': 7.20.2(@babel/core@7.20.2) '@babel/helper-plugin-utils': 7.20.2 transitivePeerDependencies: - supports-color dev: true - /@babel/plugin-proposal-class-static-block/7.18.6: + /@babel/plugin-proposal-class-static-block@7.18.6(@babel/core@7.20.2): resolution: {integrity: sha512-+I3oIiNxrCpup3Gi8n5IGMwj0gOCAjcJUSQEcotNnCCPMEnixawOQ+KeJPlgfjzx+FKQ1QSyZOWe7wmoJp7vhw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.12.0 dependencies: - '@babel/helper-create-class-features-plugin': 7.20.2 + '@babel/core': 7.20.2 + '@babel/helper-create-class-features-plugin': 7.20.2(@babel/core@7.20.2) '@babel/helper-plugin-utils': 7.20.2 - '@babel/plugin-syntax-class-static-block': 7.14.5 + '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.20.2) transitivePeerDependencies: - supports-color dev: true - /@babel/plugin-proposal-dynamic-import/7.18.6: + /@babel/plugin-proposal-dynamic-import@7.18.6(@babel/core@7.20.2): resolution: {integrity: sha512-1auuwmK+Rz13SJj36R+jqFPMJWyKEDd7lLSdOj4oJK0UTgGueSAtkrCvz9ewmgyU/P941Rv2fQwZJN8s6QruXw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: + '@babel/core': 7.20.2 '@babel/helper-plugin-utils': 7.20.2 - '@babel/plugin-syntax-dynamic-import': 7.8.3 + '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.20.2) dev: true - /@babel/plugin-proposal-export-namespace-from/7.18.9: + /@babel/plugin-proposal-export-namespace-from@7.18.9(@babel/core@7.20.2): resolution: {integrity: sha512-k1NtHyOMvlDDFeb9G5PhUXuGj8m/wiwojgQVEhJ/fsVsMCpLyOP4h0uGEjYJKrRI+EVPlb5Jk+Gt9P97lOGwtA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: + '@babel/core': 7.20.2 '@babel/helper-plugin-utils': 7.20.2 - '@babel/plugin-syntax-export-namespace-from': 7.8.3 + '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.20.2) dev: true - /@babel/plugin-proposal-json-strings/7.18.6: + /@babel/plugin-proposal-json-strings@7.18.6(@babel/core@7.20.2): resolution: {integrity: sha512-lr1peyn9kOdbYc0xr0OdHTZ5FMqS6Di+H0Fz2I/JwMzGmzJETNeOFq2pBySw6X/KFL5EWDjlJuMsUGRFb8fQgQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: + '@babel/core': 7.20.2 '@babel/helper-plugin-utils': 7.20.2 - '@babel/plugin-syntax-json-strings': 7.8.3 + '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.20.2) dev: true - /@babel/plugin-proposal-logical-assignment-operators/7.18.9: + /@babel/plugin-proposal-logical-assignment-operators@7.18.9(@babel/core@7.20.2): resolution: {integrity: sha512-128YbMpjCrP35IOExw2Fq+x55LMP42DzhOhX2aNNIdI9avSWl2PI0yuBWarr3RYpZBSPtabfadkH2yeRiMD61Q==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: + '@babel/core': 7.20.2 '@babel/helper-plugin-utils': 7.20.2 - '@babel/plugin-syntax-logical-assignment-operators': 7.10.4 + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.20.2) dev: true - /@babel/plugin-proposal-nullish-coalescing-operator/7.18.6: + /@babel/plugin-proposal-nullish-coalescing-operator@7.18.6(@babel/core@7.20.2): resolution: {integrity: sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: + '@babel/core': 7.20.2 '@babel/helper-plugin-utils': 7.20.2 - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3 + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.20.2) dev: true - /@babel/plugin-proposal-numeric-separator/7.18.6: + /@babel/plugin-proposal-numeric-separator@7.18.6(@babel/core@7.20.2): resolution: {integrity: sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: + '@babel/core': 7.20.2 '@babel/helper-plugin-utils': 7.20.2 - '@babel/plugin-syntax-numeric-separator': 7.10.4 + '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.20.2) dev: true - /@babel/plugin-proposal-object-rest-spread/7.20.2: + /@babel/plugin-proposal-object-rest-spread@7.20.2(@babel/core@7.20.2): resolution: {integrity: sha512-Ks6uej9WFK+fvIMesSqbAto5dD8Dz4VuuFvGJFKgIGSkJuRGcrwGECPA1fDgQK3/DbExBJpEkTeYeB8geIFCSQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: '@babel/compat-data': 7.20.1 - '@babel/helper-compilation-targets': 7.20.0 + '@babel/core': 7.20.2 + '@babel/helper-compilation-targets': 7.20.0(@babel/core@7.20.2) '@babel/helper-plugin-utils': 7.20.2 - '@babel/plugin-syntax-object-rest-spread': 7.8.3 - '@babel/plugin-transform-parameters': 7.20.3 + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.20.2) + '@babel/plugin-transform-parameters': 7.20.3(@babel/core@7.20.2) dev: true - /@babel/plugin-proposal-optional-catch-binding/7.18.6: + /@babel/plugin-proposal-optional-catch-binding@7.18.6(@babel/core@7.20.2): resolution: {integrity: sha512-Q40HEhs9DJQyaZfUjjn6vE8Cv4GmMHCYuMGIWUnlxH6400VGxOuwWsPt4FxXxJkC/5eOzgn0z21M9gMT4MOhbw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: + '@babel/core': 7.20.2 '@babel/helper-plugin-utils': 7.20.2 - '@babel/plugin-syntax-optional-catch-binding': 7.8.3 + '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.20.2) dev: true - /@babel/plugin-proposal-optional-chaining/7.18.9: + /@babel/plugin-proposal-optional-chaining@7.18.9(@babel/core@7.20.2): resolution: {integrity: sha512-v5nwt4IqBXihxGsW2QmCWMDS3B3bzGIk/EQVZz2ei7f3NJl8NzAJVvUmpDW5q1CRNY+Beb/k58UAH1Km1N411w==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: + '@babel/core': 7.20.2 '@babel/helper-plugin-utils': 7.20.2 '@babel/helper-skip-transparent-expression-wrappers': 7.20.0 - '@babel/plugin-syntax-optional-chaining': 7.8.3 + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.20.2) dev: true - /@babel/plugin-proposal-private-methods/7.18.6: + /@babel/plugin-proposal-private-methods@7.18.6(@babel/core@7.20.2): resolution: {integrity: sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/helper-create-class-features-plugin': 7.20.2 + '@babel/core': 7.20.2 + '@babel/helper-create-class-features-plugin': 7.20.2(@babel/core@7.20.2) '@babel/helper-plugin-utils': 7.20.2 transitivePeerDependencies: - supports-color dev: true - /@babel/plugin-proposal-private-property-in-object/7.18.6: + /@babel/plugin-proposal-private-property-in-object@7.18.6(@babel/core@7.20.2): resolution: {integrity: sha512-9Rysx7FOctvT5ouj5JODjAFAkgGoudQuLPamZb0v1TGLpapdNaftzifU8NTWQm0IRjqoYypdrSmyWgkocDQ8Dw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: + '@babel/core': 7.20.2 '@babel/helper-annotate-as-pure': 7.18.6 - '@babel/helper-create-class-features-plugin': 7.20.2 + '@babel/helper-create-class-features-plugin': 7.20.2(@babel/core@7.20.2) '@babel/helper-plugin-utils': 7.20.2 - '@babel/plugin-syntax-private-property-in-object': 7.14.5 + '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.20.2) transitivePeerDependencies: - supports-color dev: true - /@babel/plugin-proposal-unicode-property-regex/7.18.6: + /@babel/plugin-proposal-unicode-property-regex@7.18.6(@babel/core@7.20.2): resolution: {integrity: sha512-2BShG/d5yoZyXZfVePH91urL5wTG6ASZU9M4o03lKK8u8UW1y08OMttBSOADTcJrnPMpvDXRG3G8fyLh4ovs8w==} engines: {node: '>=4'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/helper-create-regexp-features-plugin': 7.19.0 - '@babel/helper-plugin-utils': 7.20.2 - dev: true - - /@babel/plugin-syntax-async-generators/7.8.4: - resolution: {integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: + '@babel/core': 7.20.2 + '@babel/helper-create-regexp-features-plugin': 7.19.0(@babel/core@7.20.2) '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-syntax-async-generators/7.8.4_@babel+core@7.20.2: + /@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.20.2): resolution: {integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==} peerDependencies: '@babel/core': ^7.0.0-0 @@ -997,15 +1197,7 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-syntax-bigint/7.8.3: - resolution: {integrity: sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/helper-plugin-utils': 7.20.2 - dev: true - - /@babel/plugin-syntax-bigint/7.8.3_@babel+core@7.20.2: + /@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.20.2): resolution: {integrity: sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==} peerDependencies: '@babel/core': ^7.0.0-0 @@ -1014,15 +1206,7 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-syntax-class-properties/7.12.13: - resolution: {integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/helper-plugin-utils': 7.20.2 - dev: true - - /@babel/plugin-syntax-class-properties/7.12.13_@babel+core@7.20.2: + /@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.20.2): resolution: {integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==} peerDependencies: '@babel/core': ^7.0.0-0 @@ -1031,49 +1215,45 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-syntax-class-static-block/7.14.5: + /@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.20.2): resolution: {integrity: sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: + '@babel/core': 7.20.2 '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-syntax-dynamic-import/7.8.3: + /@babel/plugin-syntax-dynamic-import@7.8.3(@babel/core@7.20.2): resolution: {integrity: sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: + '@babel/core': 7.20.2 '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-syntax-export-namespace-from/7.8.3: + /@babel/plugin-syntax-export-namespace-from@7.8.3(@babel/core@7.20.2): resolution: {integrity: sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: + '@babel/core': 7.20.2 '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-syntax-import-assertions/7.20.0: + /@babel/plugin-syntax-import-assertions@7.20.0(@babel/core@7.20.2): resolution: {integrity: sha512-IUh1vakzNoWalR8ch/areW7qFopR2AEw03JlG7BbrDqmQ4X3q9uuipQwSGrUn7oGiemKjtSLDhNtQHzMHr1JdQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: + '@babel/core': 7.20.2 '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-syntax-import-meta/7.10.4: - resolution: {integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/helper-plugin-utils': 7.20.2 - dev: true - - /@babel/plugin-syntax-import-meta/7.10.4_@babel+core@7.20.2: + /@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.20.2): resolution: {integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==} peerDependencies: '@babel/core': ^7.0.0-0 @@ -1082,15 +1262,7 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-syntax-json-strings/7.8.3: - resolution: {integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/helper-plugin-utils': 7.20.2 - dev: true - - /@babel/plugin-syntax-json-strings/7.8.3_@babel+core@7.20.2: + /@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.20.2): resolution: {integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==} peerDependencies: '@babel/core': ^7.0.0-0 @@ -1099,15 +1271,7 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-syntax-logical-assignment-operators/7.10.4: - resolution: {integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/helper-plugin-utils': 7.20.2 - dev: true - - /@babel/plugin-syntax-logical-assignment-operators/7.10.4_@babel+core@7.20.2: + /@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.20.2): resolution: {integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==} peerDependencies: '@babel/core': ^7.0.0-0 @@ -1116,15 +1280,7 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-syntax-nullish-coalescing-operator/7.8.3: - resolution: {integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/helper-plugin-utils': 7.20.2 - dev: true - - /@babel/plugin-syntax-nullish-coalescing-operator/7.8.3_@babel+core@7.20.2: + /@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.20.2): resolution: {integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==} peerDependencies: '@babel/core': ^7.0.0-0 @@ -1133,15 +1289,7 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-syntax-numeric-separator/7.10.4: - resolution: {integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/helper-plugin-utils': 7.20.2 - dev: true - - /@babel/plugin-syntax-numeric-separator/7.10.4_@babel+core@7.20.2: + /@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.20.2): resolution: {integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==} peerDependencies: '@babel/core': ^7.0.0-0 @@ -1150,15 +1298,7 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-syntax-object-rest-spread/7.8.3: - resolution: {integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/helper-plugin-utils': 7.20.2 - dev: true - - /@babel/plugin-syntax-object-rest-spread/7.8.3_@babel+core@7.20.2: + /@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.20.2): resolution: {integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==} peerDependencies: '@babel/core': ^7.0.0-0 @@ -1167,15 +1307,7 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-syntax-optional-catch-binding/7.8.3: - resolution: {integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/helper-plugin-utils': 7.20.2 - dev: true - - /@babel/plugin-syntax-optional-catch-binding/7.8.3_@babel+core@7.20.2: + /@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.20.2): resolution: {integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==} peerDependencies: '@babel/core': ^7.0.0-0 @@ -1184,15 +1316,7 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-syntax-optional-chaining/7.8.3: - resolution: {integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/helper-plugin-utils': 7.20.2 - dev: true - - /@babel/plugin-syntax-optional-chaining/7.8.3_@babel+core@7.20.2: + /@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.20.2): resolution: {integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==} peerDependencies: '@babel/core': ^7.0.0-0 @@ -1201,25 +1325,17 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-syntax-private-property-in-object/7.14.5: + /@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.20.2): resolution: {integrity: sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: + '@babel/core': 7.20.2 '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-syntax-top-level-await/7.14.5: - resolution: {integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/helper-plugin-utils': 7.20.2 - dev: true - - /@babel/plugin-syntax-top-level-await/7.14.5_@babel+core@7.20.2: + /@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.20.2): resolution: {integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==} engines: {node: '>=6.9.0'} peerDependencies: @@ -1229,7 +1345,7 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-syntax-typescript/7.20.0_@babel+core@7.20.2: + /@babel/plugin-syntax-typescript@7.20.0(@babel/core@7.20.2): resolution: {integrity: sha512-rd9TkG+u1CExzS4SM1BlMEhMXwFLKVjOAFFCDx9PbX5ycJWDoWMcwdJH9RhkPu1dOgn5TrxLot/Gx6lWFuAUNQ==} engines: {node: '>=6.9.0'} peerDependencies: @@ -1239,54 +1355,59 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-transform-arrow-functions/7.18.6: + /@babel/plugin-transform-arrow-functions@7.18.6(@babel/core@7.20.2): resolution: {integrity: sha512-9S9X9RUefzrsHZmKMbDXxweEH+YlE8JJEuat9FdvW9Qh1cw7W64jELCtWNkPBPX5En45uy28KGvA/AySqUh8CQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: + '@babel/core': 7.20.2 '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-transform-async-to-generator/7.18.6: + /@babel/plugin-transform-async-to-generator@7.18.6(@babel/core@7.20.2): resolution: {integrity: sha512-ARE5wZLKnTgPW7/1ftQmSi1CmkqqHo2DNmtztFhvgtOWSDfq0Cq9/9L+KnZNYSNrydBekhW3rwShduf59RoXag==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: + '@babel/core': 7.20.2 '@babel/helper-module-imports': 7.18.6 '@babel/helper-plugin-utils': 7.20.2 - '@babel/helper-remap-async-to-generator': 7.18.9 + '@babel/helper-remap-async-to-generator': 7.18.9(@babel/core@7.20.2) transitivePeerDependencies: - supports-color dev: true - /@babel/plugin-transform-block-scoped-functions/7.18.6: + /@babel/plugin-transform-block-scoped-functions@7.18.6(@babel/core@7.20.2): resolution: {integrity: sha512-ExUcOqpPWnliRcPqves5HJcJOvHvIIWfuS4sroBUenPuMdmW+SMHDakmtS7qOo13sVppmUijqeTv7qqGsvURpQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: + '@babel/core': 7.20.2 '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-transform-block-scoping/7.20.2: + /@babel/plugin-transform-block-scoping@7.20.2(@babel/core@7.20.2): resolution: {integrity: sha512-y5V15+04ry69OV2wULmwhEA6jwSWXO1TwAtIwiPXcvHcoOQUqpyMVd2bDsQJMW8AurjulIyUV8kDqtjSwHy1uQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: + '@babel/core': 7.20.2 '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-transform-classes/7.20.2: + /@babel/plugin-transform-classes@7.20.2(@babel/core@7.20.2): resolution: {integrity: sha512-9rbPp0lCVVoagvtEyQKSo5L8oo0nQS/iif+lwlAz29MccX2642vWDlSZK+2T2buxbopotId2ld7zZAzRfz9j1g==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: + '@babel/core': 7.20.2 '@babel/helper-annotate-as-pure': 7.18.6 - '@babel/helper-compilation-targets': 7.20.0 + '@babel/helper-compilation-targets': 7.20.0(@babel/core@7.20.2) '@babel/helper-environment-visitor': 7.18.9 '@babel/helper-function-name': 7.19.0 '@babel/helper-optimise-call-expression': 7.18.6 @@ -1298,109 +1419,120 @@ packages: - supports-color dev: true - /@babel/plugin-transform-computed-properties/7.18.9: + /@babel/plugin-transform-computed-properties@7.18.9(@babel/core@7.20.2): resolution: {integrity: sha512-+i0ZU1bCDymKakLxn5srGHrsAPRELC2WIbzwjLhHW9SIE1cPYkLCL0NlnXMZaM1vhfgA2+M7hySk42VBvrkBRw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: + '@babel/core': 7.20.2 '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-transform-destructuring/7.20.2: + /@babel/plugin-transform-destructuring@7.20.2(@babel/core@7.20.2): resolution: {integrity: sha512-mENM+ZHrvEgxLTBXUiQ621rRXZes3KWUv6NdQlrnr1TkWVw+hUjQBZuP2X32qKlrlG2BzgR95gkuCRSkJl8vIw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: + '@babel/core': 7.20.2 '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-transform-dotall-regex/7.18.6: + /@babel/plugin-transform-dotall-regex@7.18.6(@babel/core@7.20.2): resolution: {integrity: sha512-6S3jpun1eEbAxq7TdjLotAsl4WpQI9DxfkycRcKrjhQYzU87qpXdknpBg/e+TdcMehqGnLFi7tnFUBR02Vq6wg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/helper-create-regexp-features-plugin': 7.19.0 + '@babel/core': 7.20.2 + '@babel/helper-create-regexp-features-plugin': 7.19.0(@babel/core@7.20.2) '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-transform-duplicate-keys/7.18.9: + /@babel/plugin-transform-duplicate-keys@7.18.9(@babel/core@7.20.2): resolution: {integrity: sha512-d2bmXCtZXYc59/0SanQKbiWINadaJXqtvIQIzd4+hNwkWBgyCd5F/2t1kXoUdvPMrxzPvhK6EMQRROxsue+mfw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: + '@babel/core': 7.20.2 '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-transform-exponentiation-operator/7.18.6: + /@babel/plugin-transform-exponentiation-operator@7.18.6(@babel/core@7.20.2): resolution: {integrity: sha512-wzEtc0+2c88FVR34aQmiz56dxEkxr2g8DQb/KfaFa1JYXOFVsbhvAonFN6PwVWj++fKmku8NP80plJ5Et4wqHw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: + '@babel/core': 7.20.2 '@babel/helper-builder-binary-assignment-operator-visitor': 7.18.9 '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-transform-for-of/7.18.8: + /@babel/plugin-transform-for-of@7.18.8(@babel/core@7.20.2): resolution: {integrity: sha512-yEfTRnjuskWYo0k1mHUqrVWaZwrdq8AYbfrpqULOJOaucGSp4mNMVps+YtA8byoevxS/urwU75vyhQIxcCgiBQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: + '@babel/core': 7.20.2 '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-transform-function-name/7.18.9: + /@babel/plugin-transform-function-name@7.18.9(@babel/core@7.20.2): resolution: {integrity: sha512-WvIBoRPaJQ5yVHzcnJFor7oS5Ls0PYixlTYE63lCj2RtdQEl15M68FXQlxnG6wdraJIXRdR7KI+hQ7q/9QjrCQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/helper-compilation-targets': 7.20.0 + '@babel/core': 7.20.2 + '@babel/helper-compilation-targets': 7.20.0(@babel/core@7.20.2) '@babel/helper-function-name': 7.19.0 '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-transform-literals/7.18.9: + /@babel/plugin-transform-literals@7.18.9(@babel/core@7.20.2): resolution: {integrity: sha512-IFQDSRoTPnrAIrI5zoZv73IFeZu2dhu6irxQjY9rNjTT53VmKg9fenjvoiOWOkJ6mm4jKVPtdMzBY98Fp4Z4cg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: + '@babel/core': 7.20.2 '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-transform-member-expression-literals/7.18.6: + /@babel/plugin-transform-member-expression-literals@7.18.6(@babel/core@7.20.2): resolution: {integrity: sha512-qSF1ihLGO3q+/g48k85tUjD033C29TNTVB2paCwZPVmOsjn9pClvYYrM2VeJpBY2bcNkuny0YUyTNRyRxJ54KA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: + '@babel/core': 7.20.2 '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-transform-modules-amd/7.19.6: + /@babel/plugin-transform-modules-amd@7.19.6(@babel/core@7.20.2): resolution: {integrity: sha512-uG3od2mXvAtIFQIh0xrpLH6r5fpSQN04gIVovl+ODLdUMANokxQLZnPBHcjmv3GxRjnqwLuHvppjjcelqUFZvg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: + '@babel/core': 7.20.2 '@babel/helper-module-transforms': 7.20.2 '@babel/helper-plugin-utils': 7.20.2 transitivePeerDependencies: - supports-color dev: true - /@babel/plugin-transform-modules-commonjs/7.19.6: + /@babel/plugin-transform-modules-commonjs@7.19.6(@babel/core@7.20.2): resolution: {integrity: sha512-8PIa1ym4XRTKuSsOUXqDG0YaOlEuTVvHMe5JCfgBMOtHvJKw/4NGovEGN33viISshG/rZNVrACiBmPQLvWN8xQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: + '@babel/core': 7.20.2 '@babel/helper-module-transforms': 7.20.2 '@babel/helper-plugin-utils': 7.20.2 '@babel/helper-simple-access': 7.20.2 @@ -1408,12 +1540,13 @@ packages: - supports-color dev: true - /@babel/plugin-transform-modules-systemjs/7.19.6: + /@babel/plugin-transform-modules-systemjs@7.19.6(@babel/core@7.20.2): resolution: {integrity: sha512-fqGLBepcc3kErfR9R3DnVpURmckXP7gj7bAlrTQyBxrigFqszZCkFkcoxzCp2v32XmwXLvbw+8Yq9/b+QqksjQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: + '@babel/core': 7.20.2 '@babel/helper-hoist-variables': 7.18.6 '@babel/helper-module-transforms': 7.20.2 '@babel/helper-plugin-utils': 7.20.2 @@ -1422,287 +1555,304 @@ packages: - supports-color dev: true - /@babel/plugin-transform-modules-umd/7.18.6: + /@babel/plugin-transform-modules-umd@7.18.6(@babel/core@7.20.2): resolution: {integrity: sha512-dcegErExVeXcRqNtkRU/z8WlBLnvD4MRnHgNs3MytRO1Mn1sHRyhbcpYbVMGclAqOjdW+9cfkdZno9dFdfKLfQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: + '@babel/core': 7.20.2 '@babel/helper-module-transforms': 7.20.2 '@babel/helper-plugin-utils': 7.20.2 transitivePeerDependencies: - supports-color dev: true - /@babel/plugin-transform-named-capturing-groups-regex/7.19.1: + /@babel/plugin-transform-named-capturing-groups-regex@7.19.1(@babel/core@7.20.2): resolution: {integrity: sha512-oWk9l9WItWBQYS4FgXD4Uyy5kq898lvkXpXQxoJEY1RnvPk4R/Dvu2ebXU9q8lP+rlMwUQTFf2Ok6d78ODa0kw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/helper-create-regexp-features-plugin': 7.19.0 + '@babel/core': 7.20.2 + '@babel/helper-create-regexp-features-plugin': 7.19.0(@babel/core@7.20.2) '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-transform-new-target/7.18.6: + /@babel/plugin-transform-new-target@7.18.6(@babel/core@7.20.2): resolution: {integrity: sha512-DjwFA/9Iu3Z+vrAn+8pBUGcjhxKguSMlsFqeCKbhb9BAV756v0krzVK04CRDi/4aqmk8BsHb4a/gFcaA5joXRw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: + '@babel/core': 7.20.2 '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-transform-object-super/7.18.6: + /@babel/plugin-transform-object-super@7.18.6(@babel/core@7.20.2): resolution: {integrity: sha512-uvGz6zk+pZoS1aTZrOvrbj6Pp/kK2mp45t2B+bTDre2UgsZZ8EZLSJtUg7m/no0zOJUWgFONpB7Zv9W2tSaFlA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: + '@babel/core': 7.20.2 '@babel/helper-plugin-utils': 7.20.2 '@babel/helper-replace-supers': 7.19.1 transitivePeerDependencies: - supports-color dev: true - /@babel/plugin-transform-parameters/7.20.3: + /@babel/plugin-transform-parameters@7.20.3(@babel/core@7.20.2): resolution: {integrity: sha512-oZg/Fpx0YDrj13KsLyO8I/CX3Zdw7z0O9qOd95SqcoIzuqy/WTGWvePeHAnZCN54SfdyjHcb1S30gc8zlzlHcA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: + '@babel/core': 7.20.2 '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-transform-property-literals/7.18.6: + /@babel/plugin-transform-property-literals@7.18.6(@babel/core@7.20.2): resolution: {integrity: sha512-cYcs6qlgafTud3PAzrrRNbQtfpQ8+y/+M5tKmksS9+M1ckbH6kzY8MrexEM9mcA6JDsukE19iIRvAyYl463sMg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: + '@babel/core': 7.20.2 '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-transform-regenerator/7.18.6: + /@babel/plugin-transform-regenerator@7.18.6(@babel/core@7.20.2): resolution: {integrity: sha512-poqRI2+qiSdeldcz4wTSTXBRryoq3Gc70ye7m7UD5Ww0nE29IXqMl6r7Nd15WBgRd74vloEMlShtH6CKxVzfmQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: + '@babel/core': 7.20.2 '@babel/helper-plugin-utils': 7.20.2 regenerator-transform: 0.15.1 dev: true - /@babel/plugin-transform-reserved-words/7.18.6: + /@babel/plugin-transform-reserved-words@7.18.6(@babel/core@7.20.2): resolution: {integrity: sha512-oX/4MyMoypzHjFrT1CdivfKZ+XvIPMFXwwxHp/r0Ddy2Vuomt4HDFGmft1TAY2yiTKiNSsh3kjBAzcM8kSdsjA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: + '@babel/core': 7.20.2 '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-transform-runtime/7.19.6: + /@babel/plugin-transform-runtime@7.19.6(@babel/core@7.20.2): resolution: {integrity: sha512-PRH37lz4JU156lYFW1p8OxE5i7d6Sl/zV58ooyr+q1J1lnQPyg5tIiXlIwNVhJaY4W3TmOtdc8jqdXQcB1v5Yw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: + '@babel/core': 7.20.2 '@babel/helper-module-imports': 7.18.6 '@babel/helper-plugin-utils': 7.20.2 - babel-plugin-polyfill-corejs2: 0.3.3 - babel-plugin-polyfill-corejs3: 0.6.0 - babel-plugin-polyfill-regenerator: 0.4.1 + babel-plugin-polyfill-corejs2: 0.3.3(@babel/core@7.20.2) + babel-plugin-polyfill-corejs3: 0.6.0(@babel/core@7.20.2) + babel-plugin-polyfill-regenerator: 0.4.1(@babel/core@7.20.2) semver: 6.3.0 transitivePeerDependencies: - supports-color dev: false - /@babel/plugin-transform-shorthand-properties/7.18.6: + /@babel/plugin-transform-shorthand-properties@7.18.6(@babel/core@7.20.2): resolution: {integrity: sha512-eCLXXJqv8okzg86ywZJbRn19YJHU4XUa55oz2wbHhaQVn/MM+XhukiT7SYqp/7o00dg52Rj51Ny+Ecw4oyoygw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: + '@babel/core': 7.20.2 '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-transform-spread/7.19.0: + /@babel/plugin-transform-spread@7.19.0(@babel/core@7.20.2): resolution: {integrity: sha512-RsuMk7j6n+r752EtzyScnWkQyuJdli6LdO5Klv8Yx0OfPVTcQkIUfS8clx5e9yHXzlnhOZF3CbQ8C2uP5j074w==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: + '@babel/core': 7.20.2 '@babel/helper-plugin-utils': 7.20.2 '@babel/helper-skip-transparent-expression-wrappers': 7.20.0 dev: true - /@babel/plugin-transform-sticky-regex/7.18.6: + /@babel/plugin-transform-sticky-regex@7.18.6(@babel/core@7.20.2): resolution: {integrity: sha512-kfiDrDQ+PBsQDO85yj1icueWMfGfJFKN1KCkndygtu/C9+XUfydLC8Iv5UYJqRwy4zk8EcplRxEOeLyjq1gm6Q==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: + '@babel/core': 7.20.2 '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-transform-template-literals/7.18.9: + /@babel/plugin-transform-template-literals@7.18.9(@babel/core@7.20.2): resolution: {integrity: sha512-S8cOWfT82gTezpYOiVaGHrCbhlHgKhQt8XH5ES46P2XWmX92yisoZywf5km75wv5sYcXDUCLMmMxOLCtthDgMA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: + '@babel/core': 7.20.2 '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-transform-typeof-symbol/7.18.9: + /@babel/plugin-transform-typeof-symbol@7.18.9(@babel/core@7.20.2): resolution: {integrity: sha512-SRfwTtF11G2aemAZWivL7PD+C9z52v9EvMqH9BuYbabyPuKUvSWks3oCg6041pT925L4zVFqaVBeECwsmlguEw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: + '@babel/core': 7.20.2 '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-transform-unicode-escapes/7.18.10: + /@babel/plugin-transform-unicode-escapes@7.18.10(@babel/core@7.20.2): resolution: {integrity: sha512-kKAdAI+YzPgGY/ftStBFXTI1LZFju38rYThnfMykS+IXy8BVx+res7s2fxf1l8I35DV2T97ezo6+SGrXz6B3iQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: + '@babel/core': 7.20.2 '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-transform-unicode-regex/7.18.6: + /@babel/plugin-transform-unicode-regex@7.18.6(@babel/core@7.20.2): resolution: {integrity: sha512-gE7A6Lt7YLnNOL3Pb9BNeZvi+d8l7tcRrG4+pwJjK9hD2xX4mEvjlQW60G9EEmfXVYRPv9VRQcyegIVHCql/AA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/helper-create-regexp-features-plugin': 7.19.0 + '@babel/core': 7.20.2 + '@babel/helper-create-regexp-features-plugin': 7.19.0(@babel/core@7.20.2) '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/preset-env/7.20.2: + /@babel/preset-env@7.20.2(@babel/core@7.20.2): resolution: {integrity: sha512-1G0efQEWR1EHkKvKHqbG+IN/QdgwfByUpM5V5QroDzGV2t3S/WXNQd693cHiHTlCFMpr9B6FkPFXDA2lQcKoDg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: '@babel/compat-data': 7.20.1 - '@babel/helper-compilation-targets': 7.20.0 + '@babel/core': 7.20.2 + '@babel/helper-compilation-targets': 7.20.0(@babel/core@7.20.2) '@babel/helper-plugin-utils': 7.20.2 '@babel/helper-validator-option': 7.18.6 - '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.18.6 - '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.18.9 - '@babel/plugin-proposal-async-generator-functions': 7.20.1 - '@babel/plugin-proposal-class-properties': 7.18.6 - '@babel/plugin-proposal-class-static-block': 7.18.6 - '@babel/plugin-proposal-dynamic-import': 7.18.6 - '@babel/plugin-proposal-export-namespace-from': 7.18.9 - '@babel/plugin-proposal-json-strings': 7.18.6 - '@babel/plugin-proposal-logical-assignment-operators': 7.18.9 - '@babel/plugin-proposal-nullish-coalescing-operator': 7.18.6 - '@babel/plugin-proposal-numeric-separator': 7.18.6 - '@babel/plugin-proposal-object-rest-spread': 7.20.2 - '@babel/plugin-proposal-optional-catch-binding': 7.18.6 - '@babel/plugin-proposal-optional-chaining': 7.18.9 - '@babel/plugin-proposal-private-methods': 7.18.6 - '@babel/plugin-proposal-private-property-in-object': 7.18.6 - '@babel/plugin-proposal-unicode-property-regex': 7.18.6 - '@babel/plugin-syntax-async-generators': 7.8.4 - '@babel/plugin-syntax-class-properties': 7.12.13 - '@babel/plugin-syntax-class-static-block': 7.14.5 - '@babel/plugin-syntax-dynamic-import': 7.8.3 - '@babel/plugin-syntax-export-namespace-from': 7.8.3 - '@babel/plugin-syntax-import-assertions': 7.20.0 - '@babel/plugin-syntax-json-strings': 7.8.3 - '@babel/plugin-syntax-logical-assignment-operators': 7.10.4 - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3 - '@babel/plugin-syntax-numeric-separator': 7.10.4 - '@babel/plugin-syntax-object-rest-spread': 7.8.3 - '@babel/plugin-syntax-optional-catch-binding': 7.8.3 - '@babel/plugin-syntax-optional-chaining': 7.8.3 - '@babel/plugin-syntax-private-property-in-object': 7.14.5 - '@babel/plugin-syntax-top-level-await': 7.14.5 - '@babel/plugin-transform-arrow-functions': 7.18.6 - '@babel/plugin-transform-async-to-generator': 7.18.6 - '@babel/plugin-transform-block-scoped-functions': 7.18.6 - '@babel/plugin-transform-block-scoping': 7.20.2 - '@babel/plugin-transform-classes': 7.20.2 - '@babel/plugin-transform-computed-properties': 7.18.9 - '@babel/plugin-transform-destructuring': 7.20.2 - '@babel/plugin-transform-dotall-regex': 7.18.6 - '@babel/plugin-transform-duplicate-keys': 7.18.9 - '@babel/plugin-transform-exponentiation-operator': 7.18.6 - '@babel/plugin-transform-for-of': 7.18.8 - '@babel/plugin-transform-function-name': 7.18.9 - '@babel/plugin-transform-literals': 7.18.9 - '@babel/plugin-transform-member-expression-literals': 7.18.6 - '@babel/plugin-transform-modules-amd': 7.19.6 - '@babel/plugin-transform-modules-commonjs': 7.19.6 - '@babel/plugin-transform-modules-systemjs': 7.19.6 - '@babel/plugin-transform-modules-umd': 7.18.6 - '@babel/plugin-transform-named-capturing-groups-regex': 7.19.1 - '@babel/plugin-transform-new-target': 7.18.6 - '@babel/plugin-transform-object-super': 7.18.6 - '@babel/plugin-transform-parameters': 7.20.3 - '@babel/plugin-transform-property-literals': 7.18.6 - '@babel/plugin-transform-regenerator': 7.18.6 - '@babel/plugin-transform-reserved-words': 7.18.6 - '@babel/plugin-transform-shorthand-properties': 7.18.6 - '@babel/plugin-transform-spread': 7.19.0 - '@babel/plugin-transform-sticky-regex': 7.18.6 - '@babel/plugin-transform-template-literals': 7.18.9 - '@babel/plugin-transform-typeof-symbol': 7.18.9 - '@babel/plugin-transform-unicode-escapes': 7.18.10 - '@babel/plugin-transform-unicode-regex': 7.18.6 - '@babel/preset-modules': 0.1.5 + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.18.6(@babel/core@7.20.2) + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.18.9(@babel/core@7.20.2) + '@babel/plugin-proposal-async-generator-functions': 7.20.1(@babel/core@7.20.2) + '@babel/plugin-proposal-class-properties': 7.18.6(@babel/core@7.20.2) + '@babel/plugin-proposal-class-static-block': 7.18.6(@babel/core@7.20.2) + '@babel/plugin-proposal-dynamic-import': 7.18.6(@babel/core@7.20.2) + '@babel/plugin-proposal-export-namespace-from': 7.18.9(@babel/core@7.20.2) + '@babel/plugin-proposal-json-strings': 7.18.6(@babel/core@7.20.2) + '@babel/plugin-proposal-logical-assignment-operators': 7.18.9(@babel/core@7.20.2) + '@babel/plugin-proposal-nullish-coalescing-operator': 7.18.6(@babel/core@7.20.2) + '@babel/plugin-proposal-numeric-separator': 7.18.6(@babel/core@7.20.2) + '@babel/plugin-proposal-object-rest-spread': 7.20.2(@babel/core@7.20.2) + '@babel/plugin-proposal-optional-catch-binding': 7.18.6(@babel/core@7.20.2) + '@babel/plugin-proposal-optional-chaining': 7.18.9(@babel/core@7.20.2) + '@babel/plugin-proposal-private-methods': 7.18.6(@babel/core@7.20.2) + '@babel/plugin-proposal-private-property-in-object': 7.18.6(@babel/core@7.20.2) + '@babel/plugin-proposal-unicode-property-regex': 7.18.6(@babel/core@7.20.2) + '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.20.2) + '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.20.2) + '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.20.2) + '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.20.2) + '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.20.2) + '@babel/plugin-syntax-import-assertions': 7.20.0(@babel/core@7.20.2) + '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.20.2) + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.20.2) + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.20.2) + '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.20.2) + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.20.2) + '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.20.2) + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.20.2) + '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.20.2) + '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.20.2) + '@babel/plugin-transform-arrow-functions': 7.18.6(@babel/core@7.20.2) + '@babel/plugin-transform-async-to-generator': 7.18.6(@babel/core@7.20.2) + '@babel/plugin-transform-block-scoped-functions': 7.18.6(@babel/core@7.20.2) + '@babel/plugin-transform-block-scoping': 7.20.2(@babel/core@7.20.2) + '@babel/plugin-transform-classes': 7.20.2(@babel/core@7.20.2) + '@babel/plugin-transform-computed-properties': 7.18.9(@babel/core@7.20.2) + '@babel/plugin-transform-destructuring': 7.20.2(@babel/core@7.20.2) + '@babel/plugin-transform-dotall-regex': 7.18.6(@babel/core@7.20.2) + '@babel/plugin-transform-duplicate-keys': 7.18.9(@babel/core@7.20.2) + '@babel/plugin-transform-exponentiation-operator': 7.18.6(@babel/core@7.20.2) + '@babel/plugin-transform-for-of': 7.18.8(@babel/core@7.20.2) + '@babel/plugin-transform-function-name': 7.18.9(@babel/core@7.20.2) + '@babel/plugin-transform-literals': 7.18.9(@babel/core@7.20.2) + '@babel/plugin-transform-member-expression-literals': 7.18.6(@babel/core@7.20.2) + '@babel/plugin-transform-modules-amd': 7.19.6(@babel/core@7.20.2) + '@babel/plugin-transform-modules-commonjs': 7.19.6(@babel/core@7.20.2) + '@babel/plugin-transform-modules-systemjs': 7.19.6(@babel/core@7.20.2) + '@babel/plugin-transform-modules-umd': 7.18.6(@babel/core@7.20.2) + '@babel/plugin-transform-named-capturing-groups-regex': 7.19.1(@babel/core@7.20.2) + '@babel/plugin-transform-new-target': 7.18.6(@babel/core@7.20.2) + '@babel/plugin-transform-object-super': 7.18.6(@babel/core@7.20.2) + '@babel/plugin-transform-parameters': 7.20.3(@babel/core@7.20.2) + '@babel/plugin-transform-property-literals': 7.18.6(@babel/core@7.20.2) + '@babel/plugin-transform-regenerator': 7.18.6(@babel/core@7.20.2) + '@babel/plugin-transform-reserved-words': 7.18.6(@babel/core@7.20.2) + '@babel/plugin-transform-shorthand-properties': 7.18.6(@babel/core@7.20.2) + '@babel/plugin-transform-spread': 7.19.0(@babel/core@7.20.2) + '@babel/plugin-transform-sticky-regex': 7.18.6(@babel/core@7.20.2) + '@babel/plugin-transform-template-literals': 7.18.9(@babel/core@7.20.2) + '@babel/plugin-transform-typeof-symbol': 7.18.9(@babel/core@7.20.2) + '@babel/plugin-transform-unicode-escapes': 7.18.10(@babel/core@7.20.2) + '@babel/plugin-transform-unicode-regex': 7.18.6(@babel/core@7.20.2) + '@babel/preset-modules': 0.1.5(@babel/core@7.20.2) '@babel/types': 7.20.2 - babel-plugin-polyfill-corejs2: 0.3.3 - babel-plugin-polyfill-corejs3: 0.6.0 - babel-plugin-polyfill-regenerator: 0.4.1 + babel-plugin-polyfill-corejs2: 0.3.3(@babel/core@7.20.2) + babel-plugin-polyfill-corejs3: 0.6.0(@babel/core@7.20.2) + babel-plugin-polyfill-regenerator: 0.4.1(@babel/core@7.20.2) core-js-compat: 3.26.1 semver: 6.3.0 transitivePeerDependencies: - supports-color dev: true - /@babel/preset-modules/0.1.5: + /@babel/preset-modules@0.1.5(@babel/core@7.20.2): resolution: {integrity: sha512-A57th6YRG7oR3cq/yt/Y84MvGgE0eJG2F1JLhKuyG+jFxEgrd/HAMJatiFtmOiZurz+0DkrvbheCLaV5f2JfjA==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: + '@babel/core': 7.20.2 '@babel/helper-plugin-utils': 7.20.2 - '@babel/plugin-proposal-unicode-property-regex': 7.18.6 - '@babel/plugin-transform-dotall-regex': 7.18.6 + '@babel/plugin-proposal-unicode-property-regex': 7.18.6(@babel/core@7.20.2) + '@babel/plugin-transform-dotall-regex': 7.18.6(@babel/core@7.20.2) '@babel/types': 7.20.2 esutils: 2.0.3 dev: true - /@babel/runtime/7.20.13: + /@babel/runtime@7.20.13: resolution: {integrity: sha512-gt3PKXs0DBoL9xCvOIIZ2NEqAGZqHjAnmVbfQtB620V0uReIQutpel14KcneZuer7UioY8ALKZ7iocavvzTNFA==} engines: {node: '>=6.9.0'} dependencies: regenerator-runtime: 0.13.11 - /@babel/runtime/7.21.0: + /@babel/runtime@7.21.0: resolution: {integrity: sha512-xwII0//EObnq89Ji5AKYQaRYiW/nZ3llSv29d49IuxPhKbtJoLP+9QUUZ4nVragQVtaVGeZrpB+ZtG/Pdy/POw==} engines: {node: '>=6.9.0'} dependencies: regenerator-runtime: 0.13.11 dev: false - /@babel/template/7.18.10: + /@babel/template@7.18.10: resolution: {integrity: sha512-TI+rCtooWHr3QJ27kJxfjutghu44DLnasDMwpDqCXVTal9RLp3RSYNh4NdBrRP2cQAoG9A8juOQl6P6oZG4JxA==} engines: {node: '>=6.9.0'} dependencies: '@babel/code-frame': 7.18.6 '@babel/parser': 7.20.3 '@babel/types': 7.20.2 - dev: true - /@babel/traverse/7.20.1: + /@babel/traverse@7.20.1: resolution: {integrity: sha512-d3tN8fkVJwFLkHkBN479SOsw4DMZnz8cdbL/gvuDuzy3TS6Nfw80HuQqhw1pITbIruHyh7d1fMA47kWzmcUEGA==} engines: {node: '>=6.9.0'} dependencies: @@ -1714,13 +1864,12 @@ packages: '@babel/helper-split-export-declaration': 7.18.6 '@babel/parser': 7.20.3 '@babel/types': 7.20.2 - debug: 4.3.4 + debug: 4.3.4(supports-color@8.1.1) globals: 11.12.0 transitivePeerDependencies: - supports-color - dev: true - /@babel/types/7.20.2: + /@babel/types@7.20.2: resolution: {integrity: sha512-FnnvsNWgZCr232sqtXggapvlkk/tuwR/qhGzcmxI0GXLCjmPYQPzio2FbdlWuY6y1sHFfQKk+rRbUZ9VStQMog==} engines: {node: '>=6.9.0'} dependencies: @@ -1728,7 +1877,7 @@ packages: '@babel/helper-validator-identifier': 7.19.1 to-fast-properties: 2.0.0 - /@babel/types/7.21.2: + /@babel/types@7.21.2: resolution: {integrity: sha512-3wRZSs7jiFaB8AjxiiD+VqN5DTG2iRvJGQ+qYFrs/654lg6kGTQWIOFjlBo5RaXuAZjBmP3+OQH4dmhqiiyYxw==} engines: {node: '>=6.9.0'} dependencies: @@ -1737,11 +1886,11 @@ packages: to-fast-properties: 2.0.0 dev: true - /@bcoe/v8-coverage/0.2.3: + /@bcoe/v8-coverage@0.2.3: resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} dev: true - /@coinbase/wallet-sdk/3.6.3: + /@coinbase/wallet-sdk@3.6.3(@babel/core@7.20.2): resolution: {integrity: sha512-XUR4poOJE+dKzwBTdlM693CdLFitr046oZOVY3iDnbFcRrrQswhbDji7q4CmUcD4HxbfViX7PFoIwl79YQcukg==} engines: {node: '>= 10.0.0'} dependencies: @@ -1751,7 +1900,7 @@ packages: bn.js: 5.2.1 buffer: 6.0.3 clsx: 1.2.1 - eth-block-tracker: 4.4.3 + eth-block-tracker: 4.4.3(@babel/core@7.20.2) eth-json-rpc-filters: 4.2.2 eth-rpc-errors: 4.0.2 json-rpc-engine: 6.1.0 @@ -1770,21 +1919,21 @@ packages: - utf-8-validate dev: false - /@colors/colors/1.5.0: + /@colors/colors@1.5.0: resolution: {integrity: sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==} engines: {node: '>=0.1.90'} requiresBuild: true dev: true optional: true - /@cspotcode/source-map-support/0.8.1: + /@cspotcode/source-map-support@0.8.1: resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} engines: {node: '>=12'} dependencies: '@jridgewell/trace-mapping': 0.3.9 dev: true - /@defi-wonderland/smock/2.3.4_u3rpjeimcwsavv62fpribvk5fm: + /@defi-wonderland/smock@2.3.4(@ethersproject/abi@5.7.0)(@ethersproject/abstract-provider@5.7.0)(@ethersproject/abstract-signer@5.7.0)(@nomiclabs/hardhat-ethers@2.2.2)(ethers@5.7.2)(hardhat@2.13.0): resolution: {integrity: sha512-VYJbsoCOdFRyGkAwvaQhQRrU6V8AjK3five8xdbo41DEE9n3qXzUNBUxyD9HhXB/dWWPFWT21IGw5Ztl6Qw3Ew==} peerDependencies: '@ethersproject/abi': ^5 @@ -1794,13 +1943,16 @@ packages: ethers: ^5 hardhat: ^2 dependencies: + '@ethersproject/abi': 5.7.0 + '@ethersproject/abstract-provider': 5.7.0 + '@ethersproject/abstract-signer': 5.7.0 '@nomicfoundation/ethereumjs-evm': 1.0.0 '@nomicfoundation/ethereumjs-util': 8.0.0 '@nomicfoundation/ethereumjs-vm': 6.0.0 - '@nomiclabs/hardhat-ethers': 2.2.2_wknqauzjtp3mhprkntsmqpccee + '@nomiclabs/hardhat-ethers': 2.2.2(ethers@5.7.2)(hardhat@2.13.0) diff: 5.1.0 ethers: 5.7.2 - hardhat: 2.13.0_6qtx7vkbdhwvdm4crzlegk4mvi + hardhat: 2.13.0(ts-node@10.9.1)(typescript@4.9.5) lodash.isequal: 4.5.0 lodash.isequalwith: 4.4.0 rxjs: 7.8.0 @@ -1809,7 +1961,7 @@ packages: - supports-color dev: true - /@ensdomains/ens/0.4.5: + /@ensdomains/ens@0.4.5: resolution: {integrity: sha512-JSvpj1iNMFjK6K+uVl4unqMoa9rf5jopb8cya5UGBWz23Nw8hSNT7efgUx4BTlAPAgpNlEioUfeTyQ6J9ZvTVw==} deprecated: Please use @ensdomains/ens-contracts dependencies: @@ -1820,12 +1972,12 @@ packages: web3-utils: 1.8.2 dev: true - /@ensdomains/resolver/0.2.4: + /@ensdomains/resolver@0.2.4: resolution: {integrity: sha512-bvaTH34PMCbv6anRa9I/0zjLJgY4EuznbEMgbV77JBCQ9KNC46rzi0avuxpOfu+xDjPEtSFGqVEOr5GlUSGudA==} deprecated: Please use @ensdomains/ens-contracts dev: true - /@esbuild/android-arm/0.15.15: + /@esbuild/android-arm@0.15.15: resolution: {integrity: sha512-JJjZjJi2eBL01QJuWjfCdZxcIgot+VoK6Fq7eKF9w4YHm9hwl7nhBR1o2Wnt/WcANk5l9SkpvrldW1PLuXxcbw==} engines: {node: '>=12'} cpu: [arm] @@ -1834,7 +1986,7 @@ packages: dev: true optional: true - /@esbuild/linux-loong64/0.15.15: + /@esbuild/linux-loong64@0.15.15: resolution: {integrity: sha512-lhz6UNPMDXUhtXSulw8XlFAtSYO26WmHQnCi2Lg2p+/TMiJKNLtZCYUxV4wG6rZMzXmr8InGpNwk+DLT2Hm0PA==} engines: {node: '>=12'} cpu: [loong64] @@ -1843,12 +1995,27 @@ packages: dev: true optional: true - /@eslint/eslintrc/0.4.3: + /@eslint-community/eslint-utils@4.4.0(eslint@8.37.0): + resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + dependencies: + eslint: 8.37.0 + eslint-visitor-keys: 3.4.0 + dev: true + + /@eslint-community/regexpp@4.5.0: + resolution: {integrity: sha512-vITaYzIcNmjn5tF5uxcZ/ft7/RXGrMUIS9HalWckEOF6ESiwXKoMzAQf2UW0aVd6rnOeExTJVd5hmWXucBKGXQ==} + engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} + dev: true + + /@eslint/eslintrc@0.4.3: resolution: {integrity: sha512-J6KFFz5QCYUJq3pf0mjEcCJVERbzv71PUIDczuh9JkwGEzced6CO5ADLHB1rbf/+oPBtoPfMYNOpGDzCANlbXw==} engines: {node: ^10.12.0 || >=12.0.0} dependencies: ajv: 6.12.6 - debug: 4.3.4 + debug: 4.3.4(supports-color@8.1.1) espree: 7.3.1 globals: 13.20.0 ignore: 4.0.6 @@ -1860,7 +2027,29 @@ packages: - supports-color dev: true - /@ethereum-waffle/chai/3.4.4: + /@eslint/eslintrc@2.0.2: + resolution: {integrity: sha512-3W4f5tDUra+pA+FzgugqL2pRimUTDJWKr7BINqOpkZrC0uYI0NIc0/JFgBROCU07HR6GieA5m3/rsPIhDmCXTQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + ajv: 6.12.6 + debug: 4.3.4(supports-color@8.1.1) + espree: 9.5.1 + globals: 13.20.0 + ignore: 5.2.4 + import-fresh: 3.3.0 + js-yaml: 4.1.0 + minimatch: 3.1.2 + strip-json-comments: 3.1.1 + transitivePeerDependencies: + - supports-color + dev: true + + /@eslint/js@8.37.0: + resolution: {integrity: sha512-x5vzdtOOGgFVDCUs81QRB2+liax8rFg3+7hqM+QhBG0/G3F1ZsoYl97UrqgHgQ9KKT7G6c4V+aTUCgu/n22v1A==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dev: true + + /@ethereum-waffle/chai@3.4.4: resolution: {integrity: sha512-/K8czydBtXXkcM9X6q29EqEkc5dN3oYenyH2a9hF7rGAApAJUpH8QBtojxOY/xQ2up5W332jqgxwp0yPiYug1g==} engines: {node: '>=10.0'} dependencies: @@ -1873,13 +2062,13 @@ packages: - utf-8-validate dev: true - /@ethereum-waffle/compiler/3.4.4_typescript@4.9.5: + /@ethereum-waffle/compiler@3.4.4(typescript@4.9.5): resolution: {integrity: sha512-RUK3axJ8IkD5xpWjWoJgyHclOeEzDLQFga6gKpeGxiS/zBu+HB0W2FvsrrLalTFIaPw/CGYACRBSIxqiCqwqTQ==} engines: {node: '>=10.0'} dependencies: '@resolver-engine/imports': 0.3.3 '@resolver-engine/imports-fs': 0.3.3 - '@typechain/ethers-v5': 2.0.0_qm5qgbtbzj2awa7q5l4ce4se5a + '@typechain/ethers-v5': 2.0.0(ethers@5.7.2)(typechain@3.0.0) '@types/mkdirp': 0.5.2 '@types/node-fetch': 2.6.2 ethers: 5.7.2 @@ -1887,7 +2076,7 @@ packages: node-fetch: 2.6.9 solc: 0.6.12 ts-generator: 0.1.1 - typechain: 3.0.0_typescript@4.9.5 + typechain: 3.0.0(typescript@4.9.5) transitivePeerDependencies: - bufferutil - encoding @@ -1896,7 +2085,7 @@ packages: - utf-8-validate dev: true - /@ethereum-waffle/ens/3.4.4: + /@ethereum-waffle/ens@3.4.4: resolution: {integrity: sha512-0m4NdwWxliy3heBYva1Wr4WbJKLnwXizmy5FfSSr5PMbjI7SIGCdCB59U7/ZzY773/hY3bLnzLwvG5mggVjJWg==} engines: {node: '>=10.0'} dependencies: @@ -1908,7 +2097,7 @@ packages: - utf-8-validate dev: true - /@ethereum-waffle/mock-contract/3.4.4: + /@ethereum-waffle/mock-contract@3.4.4: resolution: {integrity: sha512-Mp0iB2YNWYGUV+VMl5tjPsaXKbKo8MDH9wSJ702l9EBjdxFf/vBvnMBAC1Fub1lLtmD0JHtp1pq+mWzg/xlLnA==} engines: {node: '>=10.0'} dependencies: @@ -1919,7 +2108,7 @@ packages: - utf-8-validate dev: true - /@ethereum-waffle/provider/3.4.4: + /@ethereum-waffle/provider@3.4.4: resolution: {integrity: sha512-GK8oKJAM8+PKy2nK08yDgl4A80mFuI8zBkE0C9GqTRYQqvuxIyXoLmJ5NZU9lIwyWVv5/KsoA11BgAv2jXE82g==} engines: {node: '>=10.0'} dependencies: @@ -1935,7 +2124,7 @@ packages: - utf-8-validate dev: true - /@ethersproject/abi/5.0.0-beta.153: + /@ethersproject/abi@5.0.0-beta.153: resolution: {integrity: sha512-aXweZ1Z7vMNzJdLpR1CZUAIgnwjrZeUSvN9syCwlBaEBUFJmFY+HHnfuTI5vIhVs/mRkfJVrbEyl51JZQqyjAg==} dependencies: '@ethersproject/address': 5.7.0 @@ -1950,7 +2139,7 @@ packages: dev: true optional: true - /@ethersproject/abi/5.7.0: + /@ethersproject/abi@5.7.0: resolution: {integrity: sha512-351ktp42TiRcYB3H1OP8yajPeAQstMW/yCFokj/AthP9bLHzQFPlOrxOcwYEDkUAICmOHljvN4K39OMTMUa9RA==} dependencies: '@ethersproject/address': 5.7.0 @@ -1963,7 +2152,7 @@ packages: '@ethersproject/properties': 5.7.0 '@ethersproject/strings': 5.7.0 - /@ethersproject/abstract-provider/5.7.0: + /@ethersproject/abstract-provider@5.7.0: resolution: {integrity: sha512-R41c9UkchKCpAqStMYUpdunjo3pkEvZC3FAwZn5S5MGbXoMQOHIdHItezTETxAO5bevtMApSyEhn9+CHcDsWBw==} dependencies: '@ethersproject/bignumber': 5.7.0 @@ -1974,7 +2163,7 @@ packages: '@ethersproject/transactions': 5.7.0 '@ethersproject/web': 5.7.1 - /@ethersproject/abstract-signer/5.7.0: + /@ethersproject/abstract-signer@5.7.0: resolution: {integrity: sha512-a16V8bq1/Cz+TGCkE2OPMTOUDLS3grCpdjoJCYNnVBbdYEMSgKrU0+B90s8b6H+ByYTBZN7a3g76jdIJi7UfKQ==} dependencies: '@ethersproject/abstract-provider': 5.7.0 @@ -1983,7 +2172,7 @@ packages: '@ethersproject/logger': 5.7.0 '@ethersproject/properties': 5.7.0 - /@ethersproject/address/5.7.0: + /@ethersproject/address@5.7.0: resolution: {integrity: sha512-9wYhYt7aghVGo758POM5nqcOMaE168Q6aRLJZwUmiqSrAungkG74gSSeKEIR7ukixesdRZGPgVqme6vmxs1fkA==} dependencies: '@ethersproject/bignumber': 5.7.0 @@ -1992,35 +2181,35 @@ packages: '@ethersproject/logger': 5.7.0 '@ethersproject/rlp': 5.7.0 - /@ethersproject/base64/5.7.0: + /@ethersproject/base64@5.7.0: resolution: {integrity: sha512-Dr8tcHt2mEbsZr/mwTPIQAf3Ai0Bks/7gTw9dSqk1mQvhW3XvRlmDJr/4n+wg1JmCl16NZue17CDh8xb/vZ0sQ==} dependencies: '@ethersproject/bytes': 5.7.0 - /@ethersproject/basex/5.7.0: + /@ethersproject/basex@5.7.0: resolution: {integrity: sha512-ywlh43GwZLv2Voc2gQVTKBoVQ1mti3d8HK5aMxsfu/nRDnMmNqaSJ3r3n85HBByT8OpoY96SXM1FogC533T4zw==} dependencies: '@ethersproject/bytes': 5.7.0 '@ethersproject/properties': 5.7.0 - /@ethersproject/bignumber/5.7.0: + /@ethersproject/bignumber@5.7.0: resolution: {integrity: sha512-n1CAdIHRWjSucQO3MC1zPSVgV/6dy/fjL9pMrPP9peL+QxEg9wOsVqwD4+818B6LUEtaXzVHQiuivzRoxPxUGw==} dependencies: '@ethersproject/bytes': 5.7.0 '@ethersproject/logger': 5.7.0 bn.js: 5.2.1 - /@ethersproject/bytes/5.7.0: + /@ethersproject/bytes@5.7.0: resolution: {integrity: sha512-nsbxwgFXWh9NyYWo+U8atvmMsSdKJprTcICAkvbBffT75qDocbuggBU0SJiVK2MuTrp0q+xvLkTnGMPK1+uA9A==} dependencies: '@ethersproject/logger': 5.7.0 - /@ethersproject/constants/5.7.0: + /@ethersproject/constants@5.7.0: resolution: {integrity: sha512-DHI+y5dBNvkpYUMiRQyxRBYBefZkJfo70VUkUAsRjcPs47muV9evftfZ0PJVCXYbAiCgght0DtcF9srFQmIgWA==} dependencies: '@ethersproject/bignumber': 5.7.0 - /@ethersproject/contracts/5.7.0: + /@ethersproject/contracts@5.7.0: resolution: {integrity: sha512-5GJbzEU3X+d33CdfPhcyS+z8MzsTrBGk/sc+G+59+tPa9yFkl6HQ9D6L0QMgNTA9q8dT0XKxxkyp883XsQvbbg==} dependencies: '@ethersproject/abi': 5.7.0 @@ -2034,7 +2223,7 @@ packages: '@ethersproject/properties': 5.7.0 '@ethersproject/transactions': 5.7.0 - /@ethersproject/experimental/5.7.0: + /@ethersproject/experimental@5.7.0: resolution: {integrity: sha512-DWvhuw7Dg8JPyhMbh/CNYOwsTLjXRx/HGkacIL5rBocG8jJC0kmixwoK/J3YblO4vtcyBLMa+sV74RJZK2iyHg==} dependencies: '@ethersproject/web': 5.7.1 @@ -2045,7 +2234,7 @@ packages: - utf-8-validate dev: false - /@ethersproject/hash/5.7.0: + /@ethersproject/hash@5.7.0: resolution: {integrity: sha512-qX5WrQfnah1EFnO5zJv1v46a8HW0+E5xuBBDTwMFZLuVTx0tbU2kkx15NqdjxecrLGatQN9FGQKpb1FKdHCt+g==} dependencies: '@ethersproject/abstract-signer': 5.7.0 @@ -2058,7 +2247,7 @@ packages: '@ethersproject/properties': 5.7.0 '@ethersproject/strings': 5.7.0 - /@ethersproject/hdnode/5.7.0: + /@ethersproject/hdnode@5.7.0: resolution: {integrity: sha512-OmyYo9EENBPPf4ERhR7oj6uAtUAhYGqOnIS+jE5pTXvdKBS99ikzq1E7Iv0ZQZ5V36Lqx1qZLeak0Ra16qpeOg==} dependencies: '@ethersproject/abstract-signer': 5.7.0 @@ -2074,7 +2263,7 @@ packages: '@ethersproject/transactions': 5.7.0 '@ethersproject/wordlists': 5.7.0 - /@ethersproject/json-wallets/5.7.0: + /@ethersproject/json-wallets@5.7.0: resolution: {integrity: sha512-8oee5Xgu6+RKgJTkvEMl2wDgSPSAQ9MB/3JYjFV9jlKvcYHUXZC+cQp0njgmxdHkYWn8s6/IqIZYm0YWCjO/0g==} dependencies: '@ethersproject/abstract-signer': 5.7.0 @@ -2091,32 +2280,32 @@ packages: aes-js: 3.0.0 scrypt-js: 3.0.1 - /@ethersproject/keccak256/5.7.0: + /@ethersproject/keccak256@5.7.0: resolution: {integrity: sha512-2UcPboeL/iW+pSg6vZ6ydF8tCnv3Iu/8tUmLLzWWGzxWKFFqOBQFLo6uLUv6BDrLgCDfN28RJ/wtByx+jZ4KBg==} dependencies: '@ethersproject/bytes': 5.7.0 js-sha3: 0.8.0 - /@ethersproject/logger/5.7.0: + /@ethersproject/logger@5.7.0: resolution: {integrity: sha512-0odtFdXu/XHtjQXJYA3u9G0G8btm0ND5Cu8M7i5vhEcE8/HmF4Lbdqanwyv4uQTr2tx6b7fQRmgLrsnpQlmnig==} - /@ethersproject/networks/5.7.1: + /@ethersproject/networks@5.7.1: resolution: {integrity: sha512-n/MufjFYv3yFcUyfhnXotyDlNdFb7onmkSy8aQERi2PjNcnWQ66xXxa3XlS8nCcA8aJKJjIIMNJTC7tu80GwpQ==} dependencies: '@ethersproject/logger': 5.7.0 - /@ethersproject/pbkdf2/5.7.0: + /@ethersproject/pbkdf2@5.7.0: resolution: {integrity: sha512-oR/dBRZR6GTyaofd86DehG72hY6NpAjhabkhxgr3X2FpJtJuodEl2auADWBZfhDHgVCbu3/H/Ocq2uC6dpNjjw==} dependencies: '@ethersproject/bytes': 5.7.0 '@ethersproject/sha2': 5.7.0 - /@ethersproject/properties/5.7.0: + /@ethersproject/properties@5.7.0: resolution: {integrity: sha512-J87jy8suntrAkIZtecpxEPxY//szqr1mlBaYlQ0r4RCaiD2hjheqF9s1LVE8vVuJCXisjIP+JgtK/Do54ej4Sw==} dependencies: '@ethersproject/logger': 5.7.0 - /@ethersproject/providers/5.7.2: + /@ethersproject/providers@5.7.2: resolution: {integrity: sha512-g34EWZ1WWAVgr4aptGlVBF8mhl3VWjv+8hoAnzStu8Ah22VHBsuGzP17eb6xDVRzw895G4W7vvx60lFFur/1Rg==} dependencies: '@ethersproject/abstract-provider': 5.7.0 @@ -2143,26 +2332,26 @@ packages: - bufferutil - utf-8-validate - /@ethersproject/random/5.7.0: + /@ethersproject/random@5.7.0: resolution: {integrity: sha512-19WjScqRA8IIeWclFme75VMXSBvi4e6InrUNuaR4s5pTF2qNhcGdCUwdxUVGtDDqC00sDLCO93jPQoDUH4HVmQ==} dependencies: '@ethersproject/bytes': 5.7.0 '@ethersproject/logger': 5.7.0 - /@ethersproject/rlp/5.7.0: + /@ethersproject/rlp@5.7.0: resolution: {integrity: sha512-rBxzX2vK8mVF7b0Tol44t5Tb8gomOHkj5guL+HhzQ1yBh/ydjGnpw6at+X6Iw0Kp3OzzzkcKp8N9r0W4kYSs9w==} dependencies: '@ethersproject/bytes': 5.7.0 '@ethersproject/logger': 5.7.0 - /@ethersproject/sha2/5.7.0: + /@ethersproject/sha2@5.7.0: resolution: {integrity: sha512-gKlH42riwb3KYp0reLsFTokByAKoJdgFCwI+CCiX/k+Jm2mbNs6oOaCjYQSlI1+XBVejwH2KrmCbMAT/GnRDQw==} dependencies: '@ethersproject/bytes': 5.7.0 '@ethersproject/logger': 5.7.0 hash.js: 1.1.7 - /@ethersproject/signing-key/5.7.0: + /@ethersproject/signing-key@5.7.0: resolution: {integrity: sha512-MZdy2nL3wO0u7gkB4nA/pEf8lu1TlFswPNmy8AiYkfKTdO6eXBJyUdmHO/ehm/htHw9K/qF8ujnTyUAD+Ry54Q==} dependencies: '@ethersproject/bytes': 5.7.0 @@ -2172,7 +2361,7 @@ packages: elliptic: 6.5.4 hash.js: 1.1.7 - /@ethersproject/solidity/5.7.0: + /@ethersproject/solidity@5.7.0: resolution: {integrity: sha512-HmabMd2Dt/raavyaGukF4XxizWKhKQ24DoLtdNbBmNKUOPqwjsKQSdV9GQtj9CBEea9DlzETlVER1gYeXXBGaA==} dependencies: '@ethersproject/bignumber': 5.7.0 @@ -2182,14 +2371,14 @@ packages: '@ethersproject/sha2': 5.7.0 '@ethersproject/strings': 5.7.0 - /@ethersproject/strings/5.7.0: + /@ethersproject/strings@5.7.0: resolution: {integrity: sha512-/9nu+lj0YswRNSH0NXYqrh8775XNyEdUQAuf3f+SmOrnVewcJ5SBNAjF7lpgehKi4abvNNXyf+HX86czCdJ8Mg==} dependencies: '@ethersproject/bytes': 5.7.0 '@ethersproject/constants': 5.7.0 '@ethersproject/logger': 5.7.0 - /@ethersproject/transactions/5.7.0: + /@ethersproject/transactions@5.7.0: resolution: {integrity: sha512-kmcNicCp1lp8qanMTC3RIikGgoJ80ztTyvtsFvCYpSCfkjhD0jZ2LOrnbcuxuToLIUYYf+4XwD1rP+B/erDIhQ==} dependencies: '@ethersproject/address': 5.7.0 @@ -2202,14 +2391,14 @@ packages: '@ethersproject/rlp': 5.7.0 '@ethersproject/signing-key': 5.7.0 - /@ethersproject/units/5.7.0: + /@ethersproject/units@5.7.0: resolution: {integrity: sha512-pD3xLMy3SJu9kG5xDGI7+xhTEmGXlEqXU4OfNapmfnxLVY4EMSSRp7j1k7eezutBPH7RBN/7QPnwR7hzNlEFeg==} dependencies: '@ethersproject/bignumber': 5.7.0 '@ethersproject/constants': 5.7.0 '@ethersproject/logger': 5.7.0 - /@ethersproject/wallet/5.7.0: + /@ethersproject/wallet@5.7.0: resolution: {integrity: sha512-MhmXlJXEJFBFVKrDLB4ZdDzxcBxQ3rLyCkhNqVu3CDYvR97E+8r01UgrI+TI99Le+aYm/in/0vp86guJuM7FCA==} dependencies: '@ethersproject/abstract-provider': 5.7.0 @@ -2228,7 +2417,7 @@ packages: '@ethersproject/transactions': 5.7.0 '@ethersproject/wordlists': 5.7.0 - /@ethersproject/web/5.7.1: + /@ethersproject/web@5.7.1: resolution: {integrity: sha512-Gueu8lSvyjBWL4cYsWsjh6MtMwM0+H4HvqFPZfB6dV8ctbP9zFAO73VG1cMWae0FLPCtz0peKPpZY8/ugJJX2w==} dependencies: '@ethersproject/base64': 5.7.0 @@ -2237,7 +2426,7 @@ packages: '@ethersproject/properties': 5.7.0 '@ethersproject/strings': 5.7.0 - /@ethersproject/wordlists/5.7.0: + /@ethersproject/wordlists@5.7.0: resolution: {integrity: sha512-S2TFNJNfHWVHNE6cNDjbVlZ6MgE17MIxMbMg2zv3wn+3XSJGosL1m9ZVv3GXCf/2ymSsQ+hRI5IzoMJTG6aoVA==} dependencies: '@ethersproject/bytes': 5.7.0 @@ -2246,20 +2435,20 @@ packages: '@ethersproject/properties': 5.7.0 '@ethersproject/strings': 5.7.0 - /@formatjs/ecma402-abstract/1.11.4: + /@formatjs/ecma402-abstract@1.11.4: resolution: {integrity: sha512-EBikYFp2JCdIfGEb5G9dyCkTGDmC57KSHhRQOC3aYxoPWVZvfWCDjZwkGYHN7Lis/fmuWl906bnNTJifDQ3sXw==} dependencies: '@formatjs/intl-localematcher': 0.2.25 tslib: 2.5.0 dev: false - /@formatjs/fast-memoize/1.2.1: + /@formatjs/fast-memoize@1.2.1: resolution: {integrity: sha512-Rg0e76nomkz3vF9IPlKeV+Qynok0r7YZjL6syLz4/urSg0IbjPZCB/iYUMNsYA643gh4mgrX3T7KEIFIxJBQeg==} dependencies: tslib: 2.5.0 dev: false - /@formatjs/icu-messageformat-parser/2.1.0: + /@formatjs/icu-messageformat-parser@2.1.0: resolution: {integrity: sha512-Qxv/lmCN6hKpBSss2uQ8IROVnta2r9jd3ymUEIjm2UyIkUCHVcbUVRGL/KS/wv7876edvsPe+hjHVJ4z8YuVaw==} dependencies: '@formatjs/ecma402-abstract': 1.11.4 @@ -2267,27 +2456,27 @@ packages: tslib: 2.5.0 dev: false - /@formatjs/icu-skeleton-parser/1.3.6: + /@formatjs/icu-skeleton-parser@1.3.6: resolution: {integrity: sha512-I96mOxvml/YLrwU2Txnd4klA7V8fRhb6JG/4hm3VMNmeJo1F03IpV2L3wWt7EweqNLES59SZ4d6hVOPCSf80Bg==} dependencies: '@formatjs/ecma402-abstract': 1.11.4 tslib: 2.5.0 dev: false - /@formatjs/intl-localematcher/0.2.25: + /@formatjs/intl-localematcher@0.2.25: resolution: {integrity: sha512-YmLcX70BxoSopLFdLr1Ds99NdlTI2oWoLbaUW2M406lxOIPzE1KQhRz2fPUkq34xVZQaihCoU29h0KK7An3bhA==} dependencies: tslib: 2.5.0 dev: false - /@foundry-rs/easy-foundryup/0.1.3: + /@foundry-rs/easy-foundryup@0.1.3: resolution: {integrity: sha512-Funb4hrSBeikKCmccFT/d3Ud5o92tlIZHTJeMCVk5b54/+CHZHr4g7MmtvO5xrGhxrOebQ0L+ojIj+VixgW7ug==} dependencies: command-exists: 1.2.9 ts-interface-checker: 0.1.13 dev: true - /@foundry-rs/hardhat-forge/0.1.17_fwz6j6oy647sr4tch7c5jpqkoq: + /@foundry-rs/hardhat-forge@0.1.17(@nomiclabs/hardhat-ethers@2.2.2)(ethereum-waffle@3.4.4)(ethers@5.7.2)(hardhat@2.13.0): resolution: {integrity: sha512-2wxzxA12CQmT11PH/KigyVTNm/4vzsVtzVZow6gwCbC41fTyf73a5qbggHZFRR74JXfmvVSkX1BJitTmdzQvxw==} peerDependencies: '@nomiclabs/hardhat-ethers': ^2.0.0 @@ -2296,32 +2485,32 @@ packages: hardhat: ^2.0.0 dependencies: '@foundry-rs/easy-foundryup': 0.1.3 - '@nomiclabs/hardhat-ethers': 2.2.2_wknqauzjtp3mhprkntsmqpccee - '@nomiclabs/hardhat-waffle': 2.0.5_fwz6j6oy647sr4tch7c5jpqkoq + '@nomiclabs/hardhat-ethers': 2.2.2(ethers@5.7.2)(hardhat@2.13.0) + '@nomiclabs/hardhat-waffle': 2.0.5(@nomiclabs/hardhat-ethers@2.2.2)(ethereum-waffle@3.4.4)(ethers@5.7.2)(hardhat@2.13.0) '@types/sinon-chai': 3.2.9 '@types/web3': 1.0.19 camelcase-keys: 7.0.2 - debug: 4.3.4 - ethereum-waffle: 3.4.4_typescript@4.9.5 + debug: 4.3.4(supports-color@8.1.1) + ethereum-waffle: 3.4.4(typescript@4.9.5) ethers: 5.7.2 fs-extra: 10.1.0 glob: 7.2.3 - hardhat: 2.13.0_6qtx7vkbdhwvdm4crzlegk4mvi + hardhat: 2.13.0(ts-node@10.9.1)(typescript@4.9.5) true-case-path: 2.2.1 ts-interface-checker: 0.1.13 transitivePeerDependencies: - supports-color dev: true - /@gar/promisify/1.1.3: + /@gar/promisify@1.1.3: resolution: {integrity: sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==} dev: true - /@gnosis.pm/mock-contract/4.0.0: + /@gnosis.pm/mock-contract@4.0.0: resolution: {integrity: sha512-SkRq2KwPx6vo0LAjSc8JhgQstrQFXRyn2yqquIfub7r2WHi5nUbF8beeSSXsd36hvBcQxQfmOIYNYRpj9JOhrQ==} dev: false - /@gnosis.pm/safe-contracts/1.3.0_ethers@5.7.2: + /@gnosis.pm/safe-contracts@1.3.0(ethers@5.7.2): resolution: {integrity: sha512-1p+1HwGvxGUVzVkFjNzglwHrLNA67U/axP0Ct85FzzH8yhGJb4t9jDjPYocVMzLorDoWAfKicGy1akPY9jXRVw==} peerDependencies: ethers: ^5.1.4 @@ -2329,11 +2518,11 @@ packages: ethers: 5.7.2 dev: false - /@gnosis.pm/zodiac/1.1.9: + /@gnosis.pm/zodiac@1.1.9: resolution: {integrity: sha512-+XY7husTz/GhpyIWLJVDe9C687VW0U4KFETRJeDze6DOh1+wTiCHhCcpGTY4abE0F4x/JhVVHL9ciHCsDzveHQ==} dependencies: '@gnosis.pm/mock-contract': 4.0.0 - '@gnosis.pm/safe-contracts': 1.3.0_ethers@5.7.2 + '@gnosis.pm/safe-contracts': 1.3.0(ethers@5.7.2) '@openzeppelin/contracts': 4.8.2 '@openzeppelin/contracts-upgradeable': 4.8.2 argv: 0.0.2 @@ -2347,7 +2536,7 @@ packages: - utf-8-validate dev: false - /@headlessui/react/1.7.13_biqbaboplfbrettd7655fr4n2y: + /@headlessui/react@1.7.13(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-9n+EQKRtD9266xIHXdY5MfiXPDfYwl7zBM7KOx2Ae3Gdgxy8QML1FkCMjq6AsOf0l6N9uvI4HcFtuFlenaldKg==} engines: {node: '>=10'} peerDependencies: @@ -2356,10 +2545,10 @@ packages: dependencies: client-only: 0.0.1 react: 18.2.0 - react-dom: 18.2.0_react@18.2.0 + react-dom: 18.2.0(react@18.2.0) dev: false - /@heroicons/react/2.0.16_react@18.2.0: + /@heroicons/react@2.0.16(react@18.2.0): resolution: {integrity: sha512-x89rFxH3SRdYaA+JCXwfe+RkE1SFTo9GcOkZettHer71Y3T7V+ogKmfw5CjTazgS3d0ClJ7p1NA+SP7VQLQcLw==} peerDependencies: react: '>= 16' @@ -2367,22 +2556,38 @@ packages: react: 18.2.0 dev: true - /@humanwhocodes/config-array/0.5.0: + /@humanwhocodes/config-array@0.11.8: + resolution: {integrity: sha512-UybHIJzJnR5Qc/MsD9Kr+RpO2h+/P1GhOwdiLPXK5TWk5sgTdu88bTD9UP+CKbPPh5Rni1u0GjAdYQLemG8g+g==} + engines: {node: '>=10.10.0'} + dependencies: + '@humanwhocodes/object-schema': 1.2.1 + debug: 4.3.4(supports-color@8.1.1) + minimatch: 3.1.2 + transitivePeerDependencies: + - supports-color + dev: true + + /@humanwhocodes/config-array@0.5.0: resolution: {integrity: sha512-FagtKFz74XrTl7y6HCzQpwDfXP0yhxe9lHLD1UZxjvZIcbyRz8zTFF/yYNfSfzU414eDwZ1SrO0Qvtyf+wFMQg==} engines: {node: '>=10.10.0'} dependencies: '@humanwhocodes/object-schema': 1.2.1 - debug: 4.3.4 + debug: 4.3.4(supports-color@8.1.1) minimatch: 3.1.2 transitivePeerDependencies: - supports-color dev: true - /@humanwhocodes/object-schema/1.2.1: + /@humanwhocodes/module-importer@1.0.1: + resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} + engines: {node: '>=12.22'} + dev: true + + /@humanwhocodes/object-schema@1.2.1: resolution: {integrity: sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==} dev: true - /@istanbuljs/load-nyc-config/1.1.0: + /@istanbuljs/load-nyc-config@1.1.0: resolution: {integrity: sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==} engines: {node: '>=8'} dependencies: @@ -2393,12 +2598,12 @@ packages: resolve-from: 5.0.0 dev: true - /@istanbuljs/schema/0.1.3: + /@istanbuljs/schema@0.1.3: resolution: {integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==} engines: {node: '>=8'} dev: true - /@jest/console/27.5.1: + /@jest/console@27.5.1: resolution: {integrity: sha512-kZ/tNpS3NXn0mlXXXPNuDZnb4c0oZ20r4K5eemM2k30ZC3G0T02nXUvyhf5YdbXWHPEJLc9qGLxEZ216MdL+Zg==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: @@ -2410,7 +2615,7 @@ packages: slash: 3.0.0 dev: true - /@jest/core/27.5.1: + /@jest/core@27.5.1: resolution: {integrity: sha512-AK6/UTrvQD0Cd24NSqmIA6rKsu0tKIxfiCducZvqxYdmMisOYAsdItspT+fQDQYARPf8XgjAFZi0ogW2agH5nQ==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} peerDependencies: @@ -2455,29 +2660,29 @@ packages: - utf-8-validate dev: true - /@jest/environment/27.5.1: + /@jest/environment@27.5.1: resolution: {integrity: sha512-/WQjhPJe3/ghaol/4Bq480JKXV/Rfw8nQdN7f41fM8VDHLcxKXou6QyXAh3EFr9/bVG3x74z1NWDkP87EiY8gA==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: '@jest/fake-timers': 27.5.1 '@jest/types': 27.5.1 - '@types/node': 18.14.2 + '@types/node': 18.15.1 jest-mock: 27.5.1 dev: true - /@jest/fake-timers/27.5.1: + /@jest/fake-timers@27.5.1: resolution: {integrity: sha512-/aPowoolwa07k7/oM3aASneNeBGCmGQsc3ugN4u6s4C/+s5M64MFo/+djTdiwcbQlRfFElGuDXWzaWj6QgKObQ==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: '@jest/types': 27.5.1 '@sinonjs/fake-timers': 8.1.0 - '@types/node': 18.14.2 + '@types/node': 18.15.1 jest-message-util: 27.5.1 jest-mock: 27.5.1 jest-util: 27.5.1 dev: true - /@jest/globals/27.5.1: + /@jest/globals@27.5.1: resolution: {integrity: sha512-ZEJNB41OBQQgGzgyInAv0UUfDDj3upmHydjieSxFvTRuZElrx7tXg/uVQ5hYVEwiXs3+aMsAeEc9X7xiSKCm4Q==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: @@ -2486,7 +2691,7 @@ packages: expect: 27.5.1 dev: true - /@jest/reporters/27.5.1: + /@jest/reporters@27.5.1: resolution: {integrity: sha512-cPXh9hWIlVJMQkVk84aIvXuBB4uQQmFqZiacloFuGiP3ah1sbCxCosidXFDfqG8+6fO1oR2dTJTlsOy4VFmUfw==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} peerDependencies: @@ -2524,7 +2729,7 @@ packages: - supports-color dev: true - /@jest/source-map/27.5.1: + /@jest/source-map@27.5.1: resolution: {integrity: sha512-y9NIHUYF3PJRlHk98NdC/N1gl88BL08aQQgu4k4ZopQkCw9t9cV8mtl3TV8b/YCB8XaVTFrmUTAJvjsntDireg==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: @@ -2533,7 +2738,7 @@ packages: source-map: 0.6.1 dev: true - /@jest/test-result/27.5.1: + /@jest/test-result@27.5.1: resolution: {integrity: sha512-EW35l2RYFUcUQxFJz5Cv5MTOxlJIQs4I7gxzi2zVU7PJhOwfYq1MdC5nhSmYjX1gmMmLPvB3sIaC+BkcHRBfag==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: @@ -2543,7 +2748,7 @@ packages: collect-v8-coverage: 1.0.1 dev: true - /@jest/test-sequencer/27.5.1: + /@jest/test-sequencer@27.5.1: resolution: {integrity: sha512-LCheJF7WB2+9JuCS7VB/EmGIdQuhtqjRNI9A43idHv3E4KltCTsPsLxvdaubFHSYwY/fNjMWjl6vNRhDiN7vpQ==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: @@ -2555,7 +2760,7 @@ packages: - supports-color dev: true - /@jest/transform/27.5.1: + /@jest/transform@27.5.1: resolution: {integrity: sha512-ipON6WtYgl/1329g5AIJVbUuEh0wZVbdpGwC99Jw4LwuoBNS95MVphU6zOeD9pDkon+LLbFL7lOQRapbB8SCHw==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: @@ -2578,7 +2783,7 @@ packages: - supports-color dev: true - /@jest/types/27.5.1: + /@jest/types@27.5.1: resolution: {integrity: sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: @@ -2589,59 +2794,53 @@ packages: chalk: 4.1.2 dev: true - /@jridgewell/gen-mapping/0.1.1: + /@jridgewell/gen-mapping@0.1.1: resolution: {integrity: sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==} engines: {node: '>=6.0.0'} dependencies: '@jridgewell/set-array': 1.1.2 '@jridgewell/sourcemap-codec': 1.4.14 - dev: true - /@jridgewell/gen-mapping/0.3.2: + /@jridgewell/gen-mapping@0.3.2: resolution: {integrity: sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==} engines: {node: '>=6.0.0'} dependencies: '@jridgewell/set-array': 1.1.2 '@jridgewell/sourcemap-codec': 1.4.14 '@jridgewell/trace-mapping': 0.3.17 - dev: true - /@jridgewell/resolve-uri/3.1.0: + /@jridgewell/resolve-uri@3.1.0: resolution: {integrity: sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==} engines: {node: '>=6.0.0'} - dev: true - /@jridgewell/set-array/1.1.2: + /@jridgewell/set-array@1.1.2: resolution: {integrity: sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==} engines: {node: '>=6.0.0'} - dev: true - /@jridgewell/source-map/0.3.2: + /@jridgewell/source-map@0.3.2: resolution: {integrity: sha512-m7O9o2uR8k2ObDysZYzdfhb08VuEml5oWGiosa1VdaPZ/A6QyPkAJuwN0Q1lhULOf6B7MtQmHENS743hWtCrgw==} dependencies: '@jridgewell/gen-mapping': 0.3.2 '@jridgewell/trace-mapping': 0.3.17 dev: true - /@jridgewell/sourcemap-codec/1.4.14: + /@jridgewell/sourcemap-codec@1.4.14: resolution: {integrity: sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==} - dev: true - /@jridgewell/trace-mapping/0.3.17: + /@jridgewell/trace-mapping@0.3.17: resolution: {integrity: sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==} dependencies: '@jridgewell/resolve-uri': 3.1.0 '@jridgewell/sourcemap-codec': 1.4.14 - dev: true - /@jridgewell/trace-mapping/0.3.9: + /@jridgewell/trace-mapping@0.3.9: resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} dependencies: '@jridgewell/resolve-uri': 3.1.0 '@jridgewell/sourcemap-codec': 1.4.14 dev: true - /@json-rpc-tools/provider/1.7.6: + /@json-rpc-tools/provider@1.7.6: resolution: {integrity: sha512-z7D3xvJ33UfCGv77n40lbzOYjZKVM3k2+5cV7xS8G6SCvKTzMkhkUYuD/qzQUNT4cG/lv0e9mRToweEEVLVVmA==} deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. dependencies: @@ -2655,14 +2854,14 @@ packages: - utf-8-validate dev: false - /@json-rpc-tools/types/1.7.6: + /@json-rpc-tools/types@1.7.6: resolution: {integrity: sha512-nDSqmyRNEqEK9TZHtM15uNnDljczhCUdBmRhpNZ95bIPKEDQ+nTDmGMFd2lLin3upc5h2VVVd9tkTDdbXUhDIQ==} deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. dependencies: keyvaluestorage-interface: 1.0.0 dev: false - /@json-rpc-tools/utils/1.7.6: + /@json-rpc-tools/utils@1.7.6: resolution: {integrity: sha512-HjA8x/U/Q78HRRe19yh8HVKoZ+Iaoo3YZjakJYxR+rw52NHo6jM+VE9b8+7ygkCFXl/EHID5wh/MkXaE/jGyYw==} deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. dependencies: @@ -2670,17 +2869,17 @@ packages: '@pedrouid/environment': 1.0.1 dev: false - /@ledgerhq/connect-kit-loader/1.0.1: + /@ledgerhq/connect-kit-loader@1.0.1: resolution: {integrity: sha512-OAJh9rMaypS1ttrSMwPznXqglJGcP3WPTTgz9YAKfkaMyUtZcHx7hCj4d6f7DdSVZOgWcyEYfZ8M2QrA2gtvgQ==} dev: false - /@lottiefiles/svelte-lottie-player/0.2.0: + /@lottiefiles/svelte-lottie-player@0.2.0: resolution: {integrity: sha512-sV8YkO8hCDGq67LCCqjT+JW6cAbVCIw9wtgrOWz+Ao6Q8cD7ZvdsCiipSIMIH55Ja6MWwEXP4N4nKD+jL3XQLg==} dependencies: lottie-web: 5.10.0 dev: false - /@mdx-js/mdx/2.3.0: + /@mdx-js/mdx@2.3.0: resolution: {integrity: sha512-jLuwRlz8DQfQNiUCJR50Y09CGPq3fLtmtUQfVrj79E0JWu3dvsVcxVIcfhR5h0iXu+/z++zDrYeiJqifRynJkA==} dependencies: '@types/estree-jsx': 1.0.0 @@ -2704,7 +2903,7 @@ packages: - supports-color dev: false - /@mdx-js/react/2.3.0_react@18.2.0: + /@mdx-js/react@2.3.0(react@18.2.0): resolution: {integrity: sha512-zQH//gdOmuu7nt2oJR29vFhDv88oGPmVw6BggmrHeMI+xgEkp1B2dX9/bMBSYtK0dyLX/aOmesKS09g222K1/g==} peerDependencies: react: '>=16' @@ -2714,7 +2913,7 @@ packages: react: 18.2.0 dev: false - /@metamask/eth-sig-util/4.0.1: + /@metamask/eth-sig-util@4.0.1: resolution: {integrity: sha512-tghyZKLHZjcdlDqCA3gNZmLeR0XvOE9U1qoQO9ohyAZT6Pya+H9vkBPcsyXytmYLNgVoin7CKCmweo/R43V+tQ==} engines: {node: '>=12.0.0'} dependencies: @@ -2725,11 +2924,11 @@ packages: tweetnacl-util: 0.15.1 dev: true - /@metamask/safe-event-emitter/2.0.0: + /@metamask/safe-event-emitter@2.0.0: resolution: {integrity: sha512-/kSXhY692qiV1MXu6EeOZvg5nECLclxNXcKCxJ3cXQgYuRymRHpdx/t7JXfsK+JLjwA1e1c1/SBrlQYpusC29Q==} dev: false - /@napi-rs/simple-git-android-arm-eabi/0.1.8: + /@napi-rs/simple-git-android-arm-eabi@0.1.8: resolution: {integrity: sha512-JJCejHBB1G6O8nxjQLT4quWCcvLpC3oRdJJ9G3MFYSCoYS8i1bWCWeU+K7Br+xT+D6s1t9q8kNJAwJv9Ygpi0g==} engines: {node: '>= 10'} cpu: [arm] @@ -2738,7 +2937,7 @@ packages: dev: false optional: true - /@napi-rs/simple-git-android-arm64/0.1.8: + /@napi-rs/simple-git-android-arm64@0.1.8: resolution: {integrity: sha512-mraHzwWBw3tdRetNOS5KnFSjvdAbNBnjFLA8I4PwTCPJj3Q4txrigcPp2d59cJ0TC51xpnPXnZjYdNwwSI9g6g==} engines: {node: '>= 10'} cpu: [arm64] @@ -2747,7 +2946,7 @@ packages: dev: false optional: true - /@napi-rs/simple-git-darwin-arm64/0.1.8: + /@napi-rs/simple-git-darwin-arm64@0.1.8: resolution: {integrity: sha512-ufy/36eI/j4UskEuvqSH7uXtp3oXeLDmjQCfKJz3u5Vx98KmOMKrqAm2H81AB2WOtCo5mqS6PbBeUXR8BJX8lQ==} engines: {node: '>= 10'} cpu: [arm64] @@ -2756,7 +2955,7 @@ packages: dev: false optional: true - /@napi-rs/simple-git-darwin-x64/0.1.8: + /@napi-rs/simple-git-darwin-x64@0.1.8: resolution: {integrity: sha512-Vb21U+v3tPJNl+8JtIHHT8HGe6WZ8o1Tq3f6p+Jx9Cz71zEbcIiB9FCEMY1knS/jwQEOuhhlI9Qk7d4HY+rprA==} engines: {node: '>= 10'} cpu: [x64] @@ -2765,7 +2964,7 @@ packages: dev: false optional: true - /@napi-rs/simple-git-linux-arm-gnueabihf/0.1.8: + /@napi-rs/simple-git-linux-arm-gnueabihf@0.1.8: resolution: {integrity: sha512-6BPTJ7CzpSm2t54mRLVaUr3S7ORJfVJoCk2rQ8v8oDg0XAMKvmQQxOsAgqKBo9gYNHJnqrOx3AEuEgvB586BuQ==} engines: {node: '>= 10'} cpu: [arm] @@ -2774,7 +2973,7 @@ packages: dev: false optional: true - /@napi-rs/simple-git-linux-arm64-gnu/0.1.8: + /@napi-rs/simple-git-linux-arm64-gnu@0.1.8: resolution: {integrity: sha512-qfESqUCAA/XoQpRXHptSQ8gIFnETCQt1zY9VOkplx6tgYk9PCeaX4B1Xuzrh3eZamSCMJFn+1YB9Ut8NwyGgAA==} engines: {node: '>= 10'} cpu: [arm64] @@ -2783,7 +2982,7 @@ packages: dev: false optional: true - /@napi-rs/simple-git-linux-arm64-musl/0.1.8: + /@napi-rs/simple-git-linux-arm64-musl@0.1.8: resolution: {integrity: sha512-G80BQPpaRmQpn8dJGHp4I2/YVhWDUNJwcCrJAtAdbKFDCMyCHJBln2ERL/+IEUlIAT05zK/c1Z5WEprvXEdXow==} engines: {node: '>= 10'} cpu: [arm64] @@ -2792,7 +2991,7 @@ packages: dev: false optional: true - /@napi-rs/simple-git-linux-x64-gnu/0.1.8: + /@napi-rs/simple-git-linux-x64-gnu@0.1.8: resolution: {integrity: sha512-NI6o1sZYEf6vPtNWJAm9w8BxJt+LlSFW0liSjYe3lc3e4dhMfV240f0ALeqlwdIldRPaDFwZSJX5/QbS7nMzhw==} engines: {node: '>= 10'} cpu: [x64] @@ -2801,7 +3000,7 @@ packages: dev: false optional: true - /@napi-rs/simple-git-linux-x64-musl/0.1.8: + /@napi-rs/simple-git-linux-x64-musl@0.1.8: resolution: {integrity: sha512-wljGAEOW41er45VTiU8kXJmO480pQKzsgRCvPlJJSCaEVBbmo6XXbFIXnZy1a2J3Zyy2IOsRB4PVkUZaNuPkZQ==} engines: {node: '>= 10'} cpu: [x64] @@ -2810,7 +3009,7 @@ packages: dev: false optional: true - /@napi-rs/simple-git-win32-arm64-msvc/0.1.8: + /@napi-rs/simple-git-win32-arm64-msvc@0.1.8: resolution: {integrity: sha512-QuV4QILyKPfbWHoQKrhXqjiCClx0SxbCTVogkR89BwivekqJMd9UlMxZdoCmwLWutRx4z9KmzQqokvYI5QeepA==} engines: {node: '>= 10'} cpu: [arm64] @@ -2819,7 +3018,7 @@ packages: dev: false optional: true - /@napi-rs/simple-git-win32-x64-msvc/0.1.8: + /@napi-rs/simple-git-win32-x64-msvc@0.1.8: resolution: {integrity: sha512-UzNS4JtjhZhZ5hRLq7BIUq+4JOwt1ThIKv11CsF1ag2l99f0123XvfEpjczKTaa94nHtjXYc2Mv9TjccBqYOew==} engines: {node: '>= 10'} cpu: [x64] @@ -2828,7 +3027,7 @@ packages: dev: false optional: true - /@napi-rs/simple-git/0.1.8: + /@napi-rs/simple-git@0.1.8: resolution: {integrity: sha512-BvOMdkkofTz6lEE35itJ/laUokPhr/5ToMGlOH25YnhLD2yN1KpRAT4blW9tT8281/1aZjW3xyi73bs//IrDKA==} engines: {node: '>= 10'} optionalDependencies: @@ -2845,11 +3044,11 @@ packages: '@napi-rs/simple-git-win32-x64-msvc': 0.1.8 dev: false - /@next/env/13.2.4: + /@next/env@13.2.4: resolution: {integrity: sha512-+Mq3TtpkeeKFZanPturjcXt+KHfKYnLlX6jMLyCrmpq6OOs4i1GqBOAauSkii9QeKCMTYzGppar21JU57b/GEA==} dev: false - /@next/swc-android-arm-eabi/13.2.4: + /@next/swc-android-arm-eabi@13.2.4: resolution: {integrity: sha512-DWlalTSkLjDU11MY11jg17O1gGQzpRccM9Oes2yTqj2DpHndajrXHGxj9HGtJ+idq2k7ImUdJVWS2h2l/EDJOw==} engines: {node: '>= 10'} cpu: [arm] @@ -2858,7 +3057,7 @@ packages: dev: false optional: true - /@next/swc-android-arm64/13.2.4: + /@next/swc-android-arm64@13.2.4: resolution: {integrity: sha512-sRavmUImUCf332Gy+PjIfLkMhiRX1Ez4SI+3vFDRs1N5eXp+uNzjFUK/oLMMOzk6KFSkbiK/3Wt8+dHQR/flNg==} engines: {node: '>= 10'} cpu: [arm64] @@ -2867,7 +3066,7 @@ packages: dev: false optional: true - /@next/swc-darwin-arm64/13.2.4: + /@next/swc-darwin-arm64@13.2.4: resolution: {integrity: sha512-S6vBl+OrInP47TM3LlYx65betocKUUlTZDDKzTiRDbsRESeyIkBtZ6Qi5uT2zQs4imqllJznVjFd1bXLx3Aa6A==} engines: {node: '>= 10'} cpu: [arm64] @@ -2876,7 +3075,7 @@ packages: dev: false optional: true - /@next/swc-darwin-x64/13.2.4: + /@next/swc-darwin-x64@13.2.4: resolution: {integrity: sha512-a6LBuoYGcFOPGd4o8TPo7wmv5FnMr+Prz+vYHopEDuhDoMSHOnC+v+Ab4D7F0NMZkvQjEJQdJS3rqgFhlZmKlw==} engines: {node: '>= 10'} cpu: [x64] @@ -2885,7 +3084,7 @@ packages: dev: false optional: true - /@next/swc-freebsd-x64/13.2.4: + /@next/swc-freebsd-x64@13.2.4: resolution: {integrity: sha512-kkbzKVZGPaXRBPisoAQkh3xh22r+TD+5HwoC5bOkALraJ0dsOQgSMAvzMXKsN3tMzJUPS0tjtRf1cTzrQ0I5vQ==} engines: {node: '>= 10'} cpu: [x64] @@ -2894,7 +3093,7 @@ packages: dev: false optional: true - /@next/swc-linux-arm-gnueabihf/13.2.4: + /@next/swc-linux-arm-gnueabihf@13.2.4: resolution: {integrity: sha512-7qA1++UY0fjprqtjBZaOA6cas/7GekpjVsZn/0uHvquuITFCdKGFCsKNBx3S0Rpxmx6WYo0GcmhNRM9ru08BGg==} engines: {node: '>= 10'} cpu: [arm] @@ -2903,7 +3102,7 @@ packages: dev: false optional: true - /@next/swc-linux-arm64-gnu/13.2.4: + /@next/swc-linux-arm64-gnu@13.2.4: resolution: {integrity: sha512-xzYZdAeq883MwXgcwc72hqo/F/dwUxCukpDOkx/j1HTq/J0wJthMGjinN9wH5bPR98Mfeh1MZJ91WWPnZOedOg==} engines: {node: '>= 10'} cpu: [arm64] @@ -2912,7 +3111,7 @@ packages: dev: false optional: true - /@next/swc-linux-arm64-musl/13.2.4: + /@next/swc-linux-arm64-musl@13.2.4: resolution: {integrity: sha512-8rXr3WfmqSiYkb71qzuDP6I6R2T2tpkmf83elDN8z783N9nvTJf2E7eLx86wu2OJCi4T05nuxCsh4IOU3LQ5xw==} engines: {node: '>= 10'} cpu: [arm64] @@ -2921,7 +3120,7 @@ packages: dev: false optional: true - /@next/swc-linux-x64-gnu/13.2.4: + /@next/swc-linux-x64-gnu@13.2.4: resolution: {integrity: sha512-Ngxh51zGSlYJ4EfpKG4LI6WfquulNdtmHg1yuOYlaAr33KyPJp4HeN/tivBnAHcZkoNy0hh/SbwDyCnz5PFJQQ==} engines: {node: '>= 10'} cpu: [x64] @@ -2930,7 +3129,7 @@ packages: dev: false optional: true - /@next/swc-linux-x64-musl/13.2.4: + /@next/swc-linux-x64-musl@13.2.4: resolution: {integrity: sha512-gOvwIYoSxd+j14LOcvJr+ekd9fwYT1RyMAHOp7znA10+l40wkFiMONPLWiZuHxfRk+Dy7YdNdDh3ImumvL6VwA==} engines: {node: '>= 10'} cpu: [x64] @@ -2939,7 +3138,7 @@ packages: dev: false optional: true - /@next/swc-win32-arm64-msvc/13.2.4: + /@next/swc-win32-arm64-msvc@13.2.4: resolution: {integrity: sha512-q3NJzcfClgBm4HvdcnoEncmztxrA5GXqKeiZ/hADvC56pwNALt3ngDC6t6qr1YW9V/EPDxCYeaX4zYxHciW4Dw==} engines: {node: '>= 10'} cpu: [arm64] @@ -2948,7 +3147,7 @@ packages: dev: false optional: true - /@next/swc-win32-ia32-msvc/13.2.4: + /@next/swc-win32-ia32-msvc@13.2.4: resolution: {integrity: sha512-/eZ5ncmHUYtD2fc6EUmAIZlAJnVT2YmxDsKs1Ourx0ttTtvtma/WKlMV5NoUsyOez0f9ExLyOpeCoz5aj+MPXw==} engines: {node: '>= 10'} cpu: [ia32] @@ -2957,7 +3156,7 @@ packages: dev: false optional: true - /@next/swc-win32-x64-msvc/13.2.4: + /@next/swc-win32-x64-msvc@13.2.4: resolution: {integrity: sha512-0MffFmyv7tBLlji01qc0IaPP/LVExzvj7/R5x1Jph1bTAIj4Vu81yFQWHHQAP6r4ff9Ukj1mBK6MDNVXm7Tcvw==} engines: {node: '>= 10'} cpu: [x64] @@ -2966,27 +3165,27 @@ packages: dev: false optional: true - /@noble/ed25519/1.7.1: + /@noble/ed25519@1.7.1: resolution: {integrity: sha512-Rk4SkJFaXZiznFyC/t77Q0NKS4FL7TLJJsVG2V2oiEq3kJVeTdxysEe/yRWSpnWMe808XRDJ+VFh5pt/FN5plw==} dev: false - /@noble/hashes/1.1.2: + /@noble/hashes@1.1.2: resolution: {integrity: sha512-KYRCASVTv6aeUi1tsF8/vpyR7zpfs3FUzy2Jqm+MU+LmUKhQ0y2FpfwqkCcxSg2ua4GALJd8k2R76WxwZGbQpA==} dev: false - /@noble/hashes/1.2.0: + /@noble/hashes@1.2.0: resolution: {integrity: sha512-FZfhjEDbT5GRswV3C6uvLPHMiVD6lQBmpoX5+eSiPaMTXte/IKqI5dykDxzZB/WBeK/CDuQRBWarPdi3FNY2zQ==} dev: true - /@noble/secp256k1/1.6.3: + /@noble/secp256k1@1.6.3: resolution: {integrity: sha512-T04e4iTurVy7I8Sw4+c5OSN9/RkPlo1uKxAomtxQNLq8j1uPAqnsqG1bqvY3Jv7c13gyr6dui0zmh/I3+f/JaQ==} dev: false - /@noble/secp256k1/1.7.1: + /@noble/secp256k1@1.7.1: resolution: {integrity: sha512-hOUk6AyBFmqVrv7k5WAw/LpszxVbj9gGN4JRkIX52fdFAj1UA61KXmZDvqVEm+pOyec3+fIeZB02LYa/pWOArw==} dev: true - /@nodelib/fs.scandir/2.1.5: + /@nodelib/fs.scandir@2.1.5: resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} engines: {node: '>= 8'} dependencies: @@ -2994,12 +3193,12 @@ packages: run-parallel: 1.2.0 dev: true - /@nodelib/fs.stat/2.0.5: + /@nodelib/fs.stat@2.0.5: resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} engines: {node: '>= 8'} dev: true - /@nodelib/fs.walk/1.2.8: + /@nodelib/fs.walk@1.2.8: resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} engines: {node: '>= 8'} dependencies: @@ -3007,7 +3206,7 @@ packages: fastq: 1.15.0 dev: true - /@nomicfoundation/ethereumjs-block/4.0.0: + /@nomicfoundation/ethereumjs-block@4.0.0: resolution: {integrity: sha512-bk8uP8VuexLgyIZAHExH1QEovqx0Lzhc9Ntm63nCRKLHXIZkobaFaeCVwTESV7YkPKUk7NiK11s8ryed4CS9yA==} engines: {node: '>=14'} dependencies: @@ -3019,7 +3218,7 @@ packages: ethereum-cryptography: 0.1.3 dev: true - /@nomicfoundation/ethereumjs-blockchain/6.0.0: + /@nomicfoundation/ethereumjs-blockchain@6.0.0: resolution: {integrity: sha512-pLFEoea6MWd81QQYSReLlLfH7N9v7lH66JC/NMPN848ySPPQA5renWnE7wPByfQFzNrPBuDDRFFULMDmj1C0xw==} engines: {node: '>=14'} dependencies: @@ -3030,7 +3229,7 @@ packages: '@nomicfoundation/ethereumjs-trie': 5.0.0 '@nomicfoundation/ethereumjs-util': 8.0.0 abstract-level: 1.0.3 - debug: 4.3.4 + debug: 4.3.4(supports-color@8.1.1) ethereum-cryptography: 0.1.3 level: 8.0.0 lru-cache: 5.1.1 @@ -3039,14 +3238,14 @@ packages: - supports-color dev: true - /@nomicfoundation/ethereumjs-common/3.0.0: + /@nomicfoundation/ethereumjs-common@3.0.0: resolution: {integrity: sha512-WS7qSshQfxoZOpHG/XqlHEGRG1zmyjYrvmATvc4c62+gZXgre1ymYP8ZNgx/3FyZY0TWe9OjFlKOfLqmgOeYwA==} dependencies: '@nomicfoundation/ethereumjs-util': 8.0.0 crc-32: 1.2.2 dev: true - /@nomicfoundation/ethereumjs-ethash/2.0.0: + /@nomicfoundation/ethereumjs-ethash@2.0.0: resolution: {integrity: sha512-WpDvnRncfDUuXdsAXlI4lXbqUDOA+adYRQaEezIkxqDkc+LDyYDbd/xairmY98GnQzo1zIqsIL6GB5MoMSJDew==} engines: {node: '>=14'} dependencies: @@ -3058,7 +3257,7 @@ packages: ethereum-cryptography: 0.1.3 dev: true - /@nomicfoundation/ethereumjs-evm/1.0.0: + /@nomicfoundation/ethereumjs-evm@1.0.0: resolution: {integrity: sha512-hVS6qRo3V1PLKCO210UfcEQHvlG7GqR8iFzp0yyjTg2TmJQizcChKgWo8KFsdMw6AyoLgLhHGHw4HdlP8a4i+Q==} engines: {node: '>=14'} dependencies: @@ -3066,7 +3265,7 @@ packages: '@nomicfoundation/ethereumjs-util': 8.0.0 '@types/async-eventemitter': 0.2.1 async-eventemitter: 0.2.4 - debug: 4.3.4 + debug: 4.3.4(supports-color@8.1.1) ethereum-cryptography: 0.1.3 mcl-wasm: 0.7.9 rustbn.js: 0.2.0 @@ -3074,27 +3273,27 @@ packages: - supports-color dev: true - /@nomicfoundation/ethereumjs-rlp/4.0.0: + /@nomicfoundation/ethereumjs-rlp@4.0.0: resolution: {integrity: sha512-GaSOGk5QbUk4eBP5qFbpXoZoZUj/NrW7MRa0tKY4Ew4c2HAS0GXArEMAamtFrkazp0BO4K5p2ZCG3b2FmbShmw==} engines: {node: '>=14'} hasBin: true dev: true - /@nomicfoundation/ethereumjs-statemanager/1.0.0: + /@nomicfoundation/ethereumjs-statemanager@1.0.0: resolution: {integrity: sha512-jCtqFjcd2QejtuAMjQzbil/4NHf5aAWxUc+CvS0JclQpl+7M0bxMofR2AJdtz+P3u0ke2euhYREDiE7iSO31vQ==} dependencies: '@nomicfoundation/ethereumjs-common': 3.0.0 '@nomicfoundation/ethereumjs-rlp': 4.0.0 '@nomicfoundation/ethereumjs-trie': 5.0.0 '@nomicfoundation/ethereumjs-util': 8.0.0 - debug: 4.3.4 + debug: 4.3.4(supports-color@8.1.1) ethereum-cryptography: 0.1.3 functional-red-black-tree: 1.0.1 transitivePeerDependencies: - supports-color dev: true - /@nomicfoundation/ethereumjs-trie/5.0.0: + /@nomicfoundation/ethereumjs-trie@5.0.0: resolution: {integrity: sha512-LIj5XdE+s+t6WSuq/ttegJzZ1vliwg6wlb+Y9f4RlBpuK35B9K02bO7xU+E6Rgg9RGptkWd6TVLdedTI4eNc2A==} engines: {node: '>=14'} dependencies: @@ -3104,7 +3303,7 @@ packages: readable-stream: 3.6.2 dev: true - /@nomicfoundation/ethereumjs-tx/4.0.0: + /@nomicfoundation/ethereumjs-tx@4.0.0: resolution: {integrity: sha512-Gg3Lir2lNUck43Kp/3x6TfBNwcWC9Z1wYue9Nz3v4xjdcv6oDW9QSMJxqsKw9QEGoBBZ+gqwpW7+F05/rs/g1w==} engines: {node: '>=14'} dependencies: @@ -3114,7 +3313,7 @@ packages: ethereum-cryptography: 0.1.3 dev: true - /@nomicfoundation/ethereumjs-util/8.0.0: + /@nomicfoundation/ethereumjs-util@8.0.0: resolution: {integrity: sha512-2emi0NJ/HmTG+CGY58fa+DQuAoroFeSH9gKu9O6JnwTtlzJtgfTixuoOqLEgyyzZVvwfIpRueuePb8TonL1y+A==} engines: {node: '>=14'} dependencies: @@ -3122,7 +3321,7 @@ packages: ethereum-cryptography: 0.1.3 dev: true - /@nomicfoundation/ethereumjs-vm/6.0.0: + /@nomicfoundation/ethereumjs-vm@6.0.0: resolution: {integrity: sha512-JMPxvPQ3fzD063Sg3Tp+UdwUkVxMoo1uML6KSzFhMH3hoQi/LMuXBoEHAoW83/vyNS9BxEe6jm6LmT5xdeEJ6w==} engines: {node: '>=14'} dependencies: @@ -3137,7 +3336,7 @@ packages: '@nomicfoundation/ethereumjs-util': 8.0.0 '@types/async-eventemitter': 0.2.1 async-eventemitter: 0.2.4 - debug: 4.3.4 + debug: 4.3.4(supports-color@8.1.1) ethereum-cryptography: 0.1.3 functional-red-black-tree: 1.0.1 mcl-wasm: 0.7.9 @@ -3146,16 +3345,16 @@ packages: - supports-color dev: true - /@nomicfoundation/hardhat-network-helpers/1.0.8_hardhat@2.13.0: + /@nomicfoundation/hardhat-network-helpers@1.0.8(hardhat@2.13.0): resolution: {integrity: sha512-MNqQbzUJZnCMIYvlniC3U+kcavz/PhhQSsY90tbEtUyMj/IQqsLwIRZa4ctjABh3Bz0KCh9OXUZ7Yk/d9hr45Q==} peerDependencies: hardhat: ^2.9.5 dependencies: ethereumjs-util: 7.1.5 - hardhat: 2.13.0_6qtx7vkbdhwvdm4crzlegk4mvi + hardhat: 2.13.0(ts-node@10.9.1)(typescript@4.9.5) dev: true - /@nomicfoundation/solidity-analyzer-darwin-arm64/0.1.1: + /@nomicfoundation/solidity-analyzer-darwin-arm64@0.1.1: resolution: {integrity: sha512-KcTodaQw8ivDZyF+D76FokN/HdpgGpfjc/gFCImdLUyqB6eSWVaZPazMbeAjmfhx3R0zm/NYVzxwAokFKgrc0w==} engines: {node: '>= 10'} cpu: [arm64] @@ -3164,7 +3363,7 @@ packages: dev: true optional: true - /@nomicfoundation/solidity-analyzer-darwin-x64/0.1.1: + /@nomicfoundation/solidity-analyzer-darwin-x64@0.1.1: resolution: {integrity: sha512-XhQG4BaJE6cIbjAVtzGOGbK3sn1BO9W29uhk9J8y8fZF1DYz0Doj8QDMfpMu+A6TjPDs61lbsmeYodIDnfveSA==} engines: {node: '>= 10'} cpu: [x64] @@ -3173,7 +3372,7 @@ packages: dev: true optional: true - /@nomicfoundation/solidity-analyzer-freebsd-x64/0.1.1: + /@nomicfoundation/solidity-analyzer-freebsd-x64@0.1.1: resolution: {integrity: sha512-GHF1VKRdHW3G8CndkwdaeLkVBi5A9u2jwtlS7SLhBc8b5U/GcoL39Q+1CSO3hYqePNP+eV5YI7Zgm0ea6kMHoA==} engines: {node: '>= 10'} cpu: [x64] @@ -3182,7 +3381,7 @@ packages: dev: true optional: true - /@nomicfoundation/solidity-analyzer-linux-arm64-gnu/0.1.1: + /@nomicfoundation/solidity-analyzer-linux-arm64-gnu@0.1.1: resolution: {integrity: sha512-g4Cv2fO37ZsUENQ2vwPnZc2zRenHyAxHcyBjKcjaSmmkKrFr64yvzeNO8S3GBFCo90rfochLs99wFVGT/0owpg==} engines: {node: '>= 10'} cpu: [arm64] @@ -3191,7 +3390,7 @@ packages: dev: true optional: true - /@nomicfoundation/solidity-analyzer-linux-arm64-musl/0.1.1: + /@nomicfoundation/solidity-analyzer-linux-arm64-musl@0.1.1: resolution: {integrity: sha512-WJ3CE5Oek25OGE3WwzK7oaopY8xMw9Lhb0mlYuJl/maZVo+WtP36XoQTb7bW/i8aAdHW5Z+BqrHMux23pvxG3w==} engines: {node: '>= 10'} cpu: [arm64] @@ -3200,7 +3399,7 @@ packages: dev: true optional: true - /@nomicfoundation/solidity-analyzer-linux-x64-gnu/0.1.1: + /@nomicfoundation/solidity-analyzer-linux-x64-gnu@0.1.1: resolution: {integrity: sha512-5WN7leSr5fkUBBjE4f3wKENUy9HQStu7HmWqbtknfXkkil+eNWiBV275IOlpXku7v3uLsXTOKpnnGHJYI2qsdA==} engines: {node: '>= 10'} cpu: [x64] @@ -3209,7 +3408,7 @@ packages: dev: true optional: true - /@nomicfoundation/solidity-analyzer-linux-x64-musl/0.1.1: + /@nomicfoundation/solidity-analyzer-linux-x64-musl@0.1.1: resolution: {integrity: sha512-KdYMkJOq0SYPQMmErv/63CwGwMm5XHenEna9X9aB8mQmhDBrYrlAOSsIPgFCUSL0hjxE3xHP65/EPXR/InD2+w==} engines: {node: '>= 10'} cpu: [x64] @@ -3218,7 +3417,7 @@ packages: dev: true optional: true - /@nomicfoundation/solidity-analyzer-win32-arm64-msvc/0.1.1: + /@nomicfoundation/solidity-analyzer-win32-arm64-msvc@0.1.1: resolution: {integrity: sha512-VFZASBfl4qiBYwW5xeY20exWhmv6ww9sWu/krWSesv3q5hA0o1JuzmPHR4LPN6SUZj5vcqci0O6JOL8BPw+APg==} engines: {node: '>= 10'} cpu: [arm64] @@ -3227,7 +3426,7 @@ packages: dev: true optional: true - /@nomicfoundation/solidity-analyzer-win32-ia32-msvc/0.1.1: + /@nomicfoundation/solidity-analyzer-win32-ia32-msvc@0.1.1: resolution: {integrity: sha512-JnFkYuyCSA70j6Si6cS1A9Gh1aHTEb8kOTBApp/c7NRTFGNMH8eaInKlyuuiIbvYFhlXW4LicqyYuWNNq9hkpQ==} engines: {node: '>= 10'} cpu: [ia32] @@ -3236,7 +3435,7 @@ packages: dev: true optional: true - /@nomicfoundation/solidity-analyzer-win32-x64-msvc/0.1.1: + /@nomicfoundation/solidity-analyzer-win32-x64-msvc@0.1.1: resolution: {integrity: sha512-HrVJr6+WjIXGnw3Q9u6KQcbZCtk0caVWhCdFADySvRyUxJ8PnzlaP+MhwNE8oyT8OZ6ejHBRrrgjSqDCFXGirw==} engines: {node: '>= 10'} cpu: [x64] @@ -3245,7 +3444,7 @@ packages: dev: true optional: true - /@nomicfoundation/solidity-analyzer/0.1.1: + /@nomicfoundation/solidity-analyzer@0.1.1: resolution: {integrity: sha512-1LMtXj1puAxyFusBgUIy5pZk3073cNXYnXUpuNKFghHbIit/xZgbk0AokpUADbNm3gyD6bFWl3LRFh3dhVdREg==} engines: {node: '>= 12'} optionalDependencies: @@ -3261,17 +3460,17 @@ packages: '@nomicfoundation/solidity-analyzer-win32-x64-msvc': 0.1.1 dev: true - /@nomiclabs/hardhat-ethers/2.2.2_wknqauzjtp3mhprkntsmqpccee: + /@nomiclabs/hardhat-ethers@2.2.2(ethers@5.7.2)(hardhat@2.13.0): resolution: {integrity: sha512-NLDlDFL2us07C0jB/9wzvR0kuLivChJWCXTKcj3yqjZqMoYp7g7wwS157F70VHx/+9gHIBGzak5pKDwG8gEefA==} peerDependencies: ethers: ^5.0.0 hardhat: ^2.0.0 dependencies: ethers: 5.7.2 - hardhat: 2.13.0_6qtx7vkbdhwvdm4crzlegk4mvi + hardhat: 2.13.0(ts-node@10.9.1)(typescript@4.9.5) dev: true - /@nomiclabs/hardhat-etherscan/3.1.7_hardhat@2.13.0: + /@nomiclabs/hardhat-etherscan@3.1.7(hardhat@2.13.0): resolution: {integrity: sha512-tZ3TvSgpvsQ6B6OGmo1/Au6u8BrAkvs1mIC/eURA3xgIfznUZBhmpne8hv7BXUzw9xNL3fXdpOYgOQlVMTcoHQ==} peerDependencies: hardhat: ^2.0.4 @@ -3280,9 +3479,9 @@ packages: '@ethersproject/address': 5.7.0 cbor: 8.1.0 chalk: 2.4.2 - debug: 4.3.4 + debug: 4.3.4(supports-color@8.1.1) fs-extra: 7.0.1 - hardhat: 2.13.0_6qtx7vkbdhwvdm4crzlegk4mvi + hardhat: 2.13.0(ts-node@10.9.1)(typescript@4.9.5) lodash: 4.17.21 semver: 6.3.0 table: 6.8.1 @@ -3291,7 +3490,7 @@ packages: - supports-color dev: true - /@nomiclabs/hardhat-waffle/2.0.5_fwz6j6oy647sr4tch7c5jpqkoq: + /@nomiclabs/hardhat-waffle@2.0.5(@nomiclabs/hardhat-ethers@2.2.2)(ethereum-waffle@3.4.4)(ethers@5.7.2)(hardhat@2.13.0): resolution: {integrity: sha512-U1RH9OQ1mWYQfb+moX5aTgGjpVVlOcpiFI47wwnaGG4kLhcTy90cNiapoqZenxcRAITVbr0/+QSduINL5EsUIQ==} peerDependencies: '@nomiclabs/hardhat-ethers': ^2.0.0 @@ -3299,20 +3498,20 @@ packages: ethers: ^5.0.0 hardhat: ^2.0.0 dependencies: - '@nomiclabs/hardhat-ethers': 2.2.2_wknqauzjtp3mhprkntsmqpccee - ethereum-waffle: 3.4.4_typescript@4.9.5 + '@nomiclabs/hardhat-ethers': 2.2.2(ethers@5.7.2)(hardhat@2.13.0) + ethereum-waffle: 3.4.4(typescript@4.9.5) ethers: 5.7.2 - hardhat: 2.13.0_6qtx7vkbdhwvdm4crzlegk4mvi + hardhat: 2.13.0(ts-node@10.9.1)(typescript@4.9.5) dev: true - /@npmcli/fs/1.1.1: + /@npmcli/fs@1.1.1: resolution: {integrity: sha512-8KG5RD0GVP4ydEzRn/I4BNDuxDtqVbOdm8675T49OIG/NGhaK0pjPX7ZcDlvKYbA+ulvVK3ztfcF4uBdOxuJbQ==} dependencies: '@gar/promisify': 1.1.3 semver: 7.3.8 dev: true - /@npmcli/move-file/1.1.2: + /@npmcli/move-file@1.1.2: resolution: {integrity: sha512-1SUf/Cg2GzGDyaf15aR9St9TWlb+XvbZXWpDx8YKs7MLzMH/BCeopv+y9vzrzgkfykCGuWOlSu3mZhj2+FQcrg==} engines: {node: '>=10'} deprecated: This functionality has been moved to @npmcli/fs @@ -3321,15 +3520,15 @@ packages: rimraf: 3.0.2 dev: true - /@openzeppelin/contracts-upgradeable/4.8.2: + /@openzeppelin/contracts-upgradeable@4.8.2: resolution: {integrity: sha512-zIggnBwemUmmt9IS73qxi+tumALxCY4QEs3zLCII78k0Gfse2hAOdAkuAeLUzvWUpneMUfFE5sGHzEUSTvn4Ag==} dev: false - /@openzeppelin/contracts/4.8.2: + /@openzeppelin/contracts@4.8.2: resolution: {integrity: sha512-kEUOgPQszC0fSYWpbh2kT94ltOJwj1qfT2DWo+zVttmGmf97JZ99LspePNaeeaLhCImaHVeBbjaQFZQn7+Zc5g==} dev: false - /@openzeppelin/hardhat-upgrades/1.22.1_3tghbxmzql23z7wrs7ihu6h3ki: + /@openzeppelin/hardhat-upgrades@1.22.1(@nomiclabs/hardhat-ethers@2.2.2)(@nomiclabs/hardhat-etherscan@3.1.7)(ethers@5.7.2)(hardhat@2.13.0): resolution: {integrity: sha512-MdoitCTLl4zwMU8MeE/bCj+7JMWBEvd38XqJkw36PkJrXlbv6FedDVCPoumMAhpmtymm0nTwTYYklYG+L6WiiQ==} hasBin: true peerDependencies: @@ -3342,25 +3541,25 @@ packages: '@nomiclabs/harhdat-etherscan': optional: true dependencies: - '@nomiclabs/hardhat-ethers': 2.2.2_wknqauzjtp3mhprkntsmqpccee - '@nomiclabs/hardhat-etherscan': 3.1.7_hardhat@2.13.0 + '@nomiclabs/hardhat-ethers': 2.2.2(ethers@5.7.2)(hardhat@2.13.0) + '@nomiclabs/hardhat-etherscan': 3.1.7(hardhat@2.13.0) '@openzeppelin/upgrades-core': 1.24.1 chalk: 4.1.2 - debug: 4.3.4 + debug: 4.3.4(supports-color@8.1.1) ethers: 5.7.2 - hardhat: 2.13.0_6qtx7vkbdhwvdm4crzlegk4mvi + hardhat: 2.13.0(ts-node@10.9.1)(typescript@4.9.5) proper-lockfile: 4.1.2 transitivePeerDependencies: - supports-color dev: true - /@openzeppelin/upgrades-core/1.24.1: + /@openzeppelin/upgrades-core@1.24.1: resolution: {integrity: sha512-QhdIQDUykJ3vQauB6CheV7vk4zgn0e1iY+IDg7r1KqpA1m2bqIGjQCpzidW33K4bZc9zdJSPx2/Z6Um5KxCB7A==} dependencies: cbor: 8.1.0 chalk: 4.1.2 compare-versions: 5.0.3 - debug: 4.3.4 + debug: 4.3.4(supports-color@8.1.1) ethereumjs-util: 7.1.5 proper-lockfile: 4.1.2 solidity-ast: 0.4.46 @@ -3368,15 +3567,15 @@ packages: - supports-color dev: true - /@pedrouid/environment/1.0.1: + /@pedrouid/environment@1.0.1: resolution: {integrity: sha512-HaW78NszGzRZd9SeoI3JD11JqY+lubnaOx7Pewj5pfjqWXOEATpeKIFb9Z4t2WBUK2iryiXX3lzWwmYWgUL0Ug==} dev: false - /@popperjs/core/2.11.6: + /@popperjs/core@2.11.6: resolution: {integrity: sha512-50/17A98tWUfQ176raKiOGXuYpLyyVMkxxG6oylzL3BPOlA6ADGdK7EYunSa4I064xerltq9TGXs8HmOk5E+vw==} dev: false - /@resolver-engine/core/0.3.3: + /@resolver-engine/core@0.3.3: resolution: {integrity: sha512-eB8nEbKDJJBi5p5SrvrvILn4a0h42bKtbCTri3ZxCGt6UvoQyp7HnGOfki944bUjBSHKK3RvgfViHn+kqdXtnQ==} dependencies: debug: 3.2.7 @@ -3386,7 +3585,7 @@ packages: - supports-color dev: true - /@resolver-engine/fs/0.3.3: + /@resolver-engine/fs@0.3.3: resolution: {integrity: sha512-wQ9RhPUcny02Wm0IuJwYMyAG8fXVeKdmhm8xizNByD4ryZlx6PP6kRen+t/haF43cMfmaV7T3Cx6ChOdHEhFUQ==} dependencies: '@resolver-engine/core': 0.3.3 @@ -3395,7 +3594,7 @@ packages: - supports-color dev: true - /@resolver-engine/imports-fs/0.3.3: + /@resolver-engine/imports-fs@0.3.3: resolution: {integrity: sha512-7Pjg/ZAZtxpeyCFlZR5zqYkz+Wdo84ugB5LApwriT8XFeQoLwGUj4tZFFvvCuxaNCcqZzCYbonJgmGObYBzyCA==} dependencies: '@resolver-engine/fs': 0.3.3 @@ -3405,7 +3604,7 @@ packages: - supports-color dev: true - /@resolver-engine/imports/0.3.3: + /@resolver-engine/imports@0.3.3: resolution: {integrity: sha512-anHpS4wN4sRMwsAbMXhMfOD/y4a4Oo0Cw/5+rue7hSwGWsDOQaAU1ClK1OxjUC35/peazxEl8JaSRRS+Xb8t3Q==} dependencies: '@resolver-engine/core': 0.3.3 @@ -3417,17 +3616,18 @@ packages: - supports-color dev: true - /@rollup/plugin-inject/4.0.4: + /@rollup/plugin-inject@4.0.4(rollup@2.79.1): resolution: {integrity: sha512-4pbcU4J/nS+zuHk+c+OL3WtmEQhqxlZ9uqfjQMQDOHOPld7PsCd8k5LWs8h5wjwJN7MgnAn768F2sDxEP4eNFQ==} peerDependencies: rollup: ^1.20.0 || ^2.0.0 dependencies: - '@rollup/pluginutils': 3.1.0 + '@rollup/pluginutils': 3.1.0(rollup@2.79.1) estree-walker: 2.0.2 magic-string: 0.25.9 + rollup: 2.79.1 dev: true - /@rollup/pluginutils/3.1.0: + /@rollup/pluginutils@3.1.0(rollup@2.79.1): resolution: {integrity: sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==} engines: {node: '>= 8.0.0'} peerDependencies: @@ -3436,13 +3636,14 @@ packages: '@types/estree': 0.0.39 estree-walker: 1.0.1 picomatch: 2.3.1 + rollup: 2.79.1 dev: true - /@scure/base/1.1.1: + /@scure/base@1.1.1: resolution: {integrity: sha512-ZxOhsSyxYwLJj3pLZCefNitxsj093tb2vq90mp2txoYeBqbcjDjqFhyM8eUjq/uFm6zJ+mUuqxlS2FkuSY1MTA==} dev: true - /@scure/bip32/1.1.5: + /@scure/bip32@1.1.5: resolution: {integrity: sha512-XyNh1rB0SkEqd3tXcXMi+Xe1fvg+kUIcoRIEujP1Jgv7DqW2r9lg3Ah0NkFaCs9sTkQAQA8kw7xiRXzENi9Rtw==} dependencies: '@noble/hashes': 1.2.0 @@ -3450,14 +3651,14 @@ packages: '@scure/base': 1.1.1 dev: true - /@scure/bip39/1.1.1: + /@scure/bip39@1.1.1: resolution: {integrity: sha512-t+wDck2rVkh65Hmv280fYdVdY25J9YeEUIgn2LG1WM6gxFkGzcksoDiUkWVpVp3Oex9xGC68JU2dSbUfwZ2jPg==} dependencies: '@noble/hashes': 1.2.0 '@scure/base': 1.1.1 dev: true - /@sentry/core/5.30.0: + /@sentry/core@5.30.0: resolution: {integrity: sha512-TmfrII8w1PQZSZgPpUESqjB+jC6MvZJZdLtE/0hZ+SrnKhW3x5WlYLvTXZpcWePYBku7rl2wn1RZu6uT0qCTeg==} engines: {node: '>=6'} dependencies: @@ -3468,7 +3669,7 @@ packages: tslib: 1.14.1 dev: true - /@sentry/hub/5.30.0: + /@sentry/hub@5.30.0: resolution: {integrity: sha512-2tYrGnzb1gKz2EkMDQcfLrDTvmGcQPuWxLnJKXJvYTQDGLlEvi2tWz1VIHjunmOvJrB5aIQLhm+dcMRwFZDCqQ==} engines: {node: '>=6'} dependencies: @@ -3477,7 +3678,7 @@ packages: tslib: 1.14.1 dev: true - /@sentry/minimal/5.30.0: + /@sentry/minimal@5.30.0: resolution: {integrity: sha512-BwWb/owZKtkDX+Sc4zCSTNcvZUq7YcH3uAVlmh/gtR9rmUvbzAA3ewLuB3myi4wWRAMEtny6+J/FN/x+2wn9Xw==} engines: {node: '>=6'} dependencies: @@ -3486,7 +3687,7 @@ packages: tslib: 1.14.1 dev: true - /@sentry/node/5.30.0: + /@sentry/node@5.30.0: resolution: {integrity: sha512-Br5oyVBF0fZo6ZS9bxbJZG4ApAjRqAnqFFurMVJJdunNb80brh7a5Qva2kjhm+U6r9NJAB5OmDyPkA1Qnt+QVg==} engines: {node: '>=6'} dependencies: @@ -3503,7 +3704,7 @@ packages: - supports-color dev: true - /@sentry/tracing/5.30.0: + /@sentry/tracing@5.30.0: resolution: {integrity: sha512-dUFowCr0AIMwiLD7Fs314Mdzcug+gBVo/+NCMyDw8tFxJkwWAKl7Qa2OZxLQ0ZHjakcj1hNKfCQJ9rhyfOl4Aw==} engines: {node: '>=6'} dependencies: @@ -3514,12 +3715,12 @@ packages: tslib: 1.14.1 dev: true - /@sentry/types/5.30.0: + /@sentry/types@5.30.0: resolution: {integrity: sha512-R8xOqlSTZ+htqrfteCWU5Nk0CDN5ApUTvrlvBuiH1DyP6czDZ4ktbZB0hAgBlVcK0U+qpD3ag3Tqqpa5Q67rPw==} engines: {node: '>=6'} dev: true - /@sentry/utils/5.30.0: + /@sentry/utils@5.30.0: resolution: {integrity: sha512-zaYmoH0NWWtvnJjC9/CBseXMtKHm/tm40sz3YfJRxeQjyzRqNQPgivpd9R/oDJCYj999mzdW382p/qi2ypjLww==} engines: {node: '>=6'} dependencies: @@ -3527,38 +3728,38 @@ packages: tslib: 1.14.1 dev: true - /@sindresorhus/is/0.14.0: + /@sindresorhus/is@0.14.0: resolution: {integrity: sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==} engines: {node: '>=6'} dev: true optional: true - /@sindresorhus/is/4.6.0: + /@sindresorhus/is@4.6.0: resolution: {integrity: sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==} engines: {node: '>=10'} dev: true optional: true - /@sinonjs/commons/1.8.5: + /@sinonjs/commons@1.8.5: resolution: {integrity: sha512-rTpCA0wG1wUxglBSFdMMY0oTrKYvgf4fNgv/sXbfCVAdf+FnPBdKJR/7XbpTCwbCrvCbdPYnlWaUUYz4V2fPDA==} dependencies: type-detect: 4.0.8 dev: true - /@sinonjs/fake-timers/8.1.0: + /@sinonjs/fake-timers@8.1.0: resolution: {integrity: sha512-OAPJUAtgeINhh/TAlUID4QTs53Njm7xzddaVlEs/SXwgtiD1tW22zAB/W1wdqfrpmikgaWQ9Fw6Ws+hsiRm5Vg==} dependencies: '@sinonjs/commons': 1.8.5 dev: true - /@solana/buffer-layout/4.0.1: + /@solana/buffer-layout@4.0.1: resolution: {integrity: sha512-E1ImOIAD1tBZFRdjeM4/pzTiTApC0AOBGwyAMS4fwIodCWArzJ3DWdoh8cKxeFM2fElkxBh2Aqts1BPC373rHA==} engines: {node: '>=5.10'} dependencies: buffer: 6.0.3 dev: false - /@solana/web3.js/1.70.3: + /@solana/web3.js@1.70.3: resolution: {integrity: sha512-9JAFXAWB3yhUHnoahzemTz4TcsGqmITPArNlm9795e+LA/DYkIEJIXIosV4ImzDMfqolymZeRgG3O8ewNgYTTA==} engines: {node: '>=12.20.0'} dependencies: @@ -3585,25 +3786,25 @@ packages: - utf-8-validate dev: false - /@solidity-parser/parser/0.14.5: + /@solidity-parser/parser@0.14.5: resolution: {integrity: sha512-6dKnHZn7fg/iQATVEzqyUOyEidbn05q7YA2mQ9hC0MMXhhV3/JrsxmFSYZAcr7j1yUP700LLhTruvJ3MiQmjJg==} dependencies: antlr4ts: 0.5.0-alpha.4 dev: true - /@solidity-parser/parser/0.15.0: + /@solidity-parser/parser@0.15.0: resolution: {integrity: sha512-5UFJJTzWi1hgFk6aGCZ5rxG2DJkCJOzJ74qg7UkWSNCDSigW+CJLoYUb5bLiKrtI34Nr9rpFSUNHfkqtlL+N/w==} dependencies: antlr4ts: 0.5.0-alpha.4 dev: true - /@solidity-parser/parser/0.16.0: + /@solidity-parser/parser@0.16.0: resolution: {integrity: sha512-ESipEcHyRHg4Np4SqBCfcXwyxxna1DgFVz69bgpLV8vzl/NP1DtcKsJ4dJZXWQhY/Z4J2LeKBiOkOVZn9ct33Q==} dependencies: antlr4ts: 0.5.0-alpha.4 dev: true - /@sveltejs/vite-plugin-svelte/1.3.1_svelte@3.53.1+vite@3.2.4: + /@sveltejs/vite-plugin-svelte@1.3.1(svelte@3.53.1)(vite@3.2.4): resolution: {integrity: sha512-2Uu2sDdIR+XQWF7QWOVSF2jR9EU6Ciw1yWfYnfLYj8HIgnNxkh/8g22Fw2pBUI8QNyW/KxtqJUWBI+8ypamSrQ==} engines: {node: ^14.18.0 || >= 16} peerDependencies: @@ -3614,19 +3815,19 @@ packages: diff-match-patch: optional: true dependencies: - debug: 4.3.4 + debug: 4.3.4(supports-color@8.1.1) deepmerge: 4.2.2 kleur: 4.1.5 magic-string: 0.26.7 svelte: 3.53.1 - svelte-hmr: 0.15.1_svelte@3.53.1 + svelte-hmr: 0.15.1(svelte@3.53.1) vite: 3.2.4 - vitefu: 0.2.2_vite@3.2.4 + vitefu: 0.2.2(vite@3.2.4) transitivePeerDependencies: - supports-color dev: true - /@sveltestack/svelte-query/1.6.0: + /@sveltestack/svelte-query@1.6.0: resolution: {integrity: sha512-C0wWuh6av1zu3Pzwrg6EQmX3BhDZQ4gMAdYu6Tfv4bjbEZTB00uEDz52z92IZdONh+iUKuyo0xRZ2e16k2Xifg==} peerDependencies: broadcast-channel: ^4.5.0 @@ -3635,13 +3836,13 @@ packages: optional: true dev: false - /@swc/helpers/0.4.14: + /@swc/helpers@0.4.14: resolution: {integrity: sha512-4C7nX/dvpzB7za4Ql9K81xK3HPxCpHMgwTZVyf+9JQ6VUbn9jjZVN7/Nkdz/Ugzs2CSjqnL/UPXroiVBVHUWUw==} dependencies: tslib: 2.5.0 dev: false - /@szmarczak/http-timer/1.1.2: + /@szmarczak/http-timer@1.1.2: resolution: {integrity: sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA==} engines: {node: '>=6'} dependencies: @@ -3649,7 +3850,7 @@ packages: dev: true optional: true - /@szmarczak/http-timer/4.0.6: + /@szmarczak/http-timer@4.0.6: resolution: {integrity: sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==} engines: {node: '>=10'} dependencies: @@ -3657,42 +3858,42 @@ packages: dev: true optional: true - /@tootallnate/once/1.1.2: + /@tootallnate/once@1.1.2: resolution: {integrity: sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==} engines: {node: '>= 6'} dev: true - /@tsconfig/node10/1.0.9: + /@tsconfig/node10@1.0.9: resolution: {integrity: sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==} dev: true - /@tsconfig/node12/1.0.11: + /@tsconfig/node12@1.0.11: resolution: {integrity: sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==} dev: true - /@tsconfig/node14/1.0.3: + /@tsconfig/node14@1.0.3: resolution: {integrity: sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==} dev: true - /@tsconfig/node16/1.0.3: + /@tsconfig/node16@1.0.3: resolution: {integrity: sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ==} dev: true - /@tsconfig/svelte/3.0.0: + /@tsconfig/svelte@3.0.0: resolution: {integrity: sha512-pYrtLtOwku/7r1i9AMONsJMVYAtk3hzOfiGNekhtq5tYBGA7unMve8RvUclKLMT3PrihvJqUmzsRGh0RP84hKg==} dev: true - /@typechain/ethers-v5/2.0.0_qm5qgbtbzj2awa7q5l4ce4se5a: + /@typechain/ethers-v5@2.0.0(ethers@5.7.2)(typechain@3.0.0): resolution: {integrity: sha512-0xdCkyGOzdqh4h5JSf+zoWx85IusEjDcPIwNEHP8mrWSnCae4rvrqB+/gtpdNfX7zjlFlZiMeePn2r63EI3Lrw==} peerDependencies: ethers: ^5.0.0 typechain: ^3.0.0 dependencies: ethers: 5.7.2 - typechain: 3.0.0_typescript@4.9.5 + typechain: 3.0.0(typescript@4.9.5) dev: true - /@typechain/ethers-v5/7.2.0_jcns4h3uqvirgzfg2h4tj32z6y: + /@typechain/ethers-v5@7.2.0(@ethersproject/abi@5.7.0)(@ethersproject/bytes@5.7.0)(@ethersproject/providers@5.7.2)(ethers@5.7.2)(typechain@5.2.0)(typescript@4.9.5): resolution: {integrity: sha512-jfcmlTvaaJjng63QsT49MT6R1HFhtO/TBMWbyzPFSzMmVIqb2tL6prnKBs4ZJrSvmgIXWy+ttSjpaxCTq8D/Tw==} peerDependencies: '@ethersproject/abi': ^5.0.0 @@ -3702,14 +3903,17 @@ packages: typechain: ^5.0.0 typescript: '>=4.0.0' dependencies: + '@ethersproject/abi': 5.7.0 + '@ethersproject/bytes': 5.7.0 + '@ethersproject/providers': 5.7.2 ethers: 5.7.2 lodash: 4.17.21 - ts-essentials: 7.0.3_typescript@4.9.5 - typechain: 5.2.0_typescript@4.9.5 + ts-essentials: 7.0.3(typescript@4.9.5) + typechain: 5.2.0(typescript@4.9.5) typescript: 4.9.5 dev: true - /@typechain/hardhat/2.3.1_72qu7yerczljvjdavmwb3bv7oy: + /@typechain/hardhat@2.3.1(hardhat@2.13.0)(lodash@4.17.21)(typechain@5.2.0): resolution: {integrity: sha512-BQV8OKQi0KAzLXCdsPO0pZBNQQ6ra8A2ucC26uFX/kquRBtJu1yEyWnVSmtr07b5hyRoJRpzUeINLnyqz4/MAw==} peerDependencies: hardhat: ^2.0.10 @@ -3717,25 +3921,26 @@ packages: typechain: ^5.1.2 dependencies: fs-extra: 9.1.0 - hardhat: 2.13.0_6qtx7vkbdhwvdm4crzlegk4mvi - typechain: 5.2.0_typescript@4.9.5 + hardhat: 2.13.0(ts-node@10.9.1)(typescript@4.9.5) + lodash: 4.17.21 + typechain: 5.2.0(typescript@4.9.5) dev: true - /@types/abstract-leveldown/7.2.1: + /@types/abstract-leveldown@7.2.1: resolution: {integrity: sha512-YK8irIC+eMrrmtGx0H4ISn9GgzLd9dojZWJaMbjp1YHLl2VqqNFBNrL5Q3KjGf4VE3sf/4hmq6EhQZ7kZp1NoQ==} dev: true - /@types/acorn/4.0.6: + /@types/acorn@4.0.6: resolution: {integrity: sha512-veQTnWP+1D/xbxVrPC3zHnCZRjSrKfhbMUlEA43iMZLu7EsnTtkJklIuwrCPbOi8YkvDQAiW05VQQFvvz9oieQ==} dependencies: '@types/estree': 1.0.0 dev: false - /@types/async-eventemitter/0.2.1: + /@types/async-eventemitter@0.2.1: resolution: {integrity: sha512-M2P4Ng26QbAeITiH7w1d7OxtldgfAe0wobpyJzVK/XOb0cUGKU2R4pfAhqcJBXAe2ife5ZOhSv4wk7p+ffURtg==} dev: true - /@types/babel__core/7.1.20: + /@types/babel__core@7.1.20: resolution: {integrity: sha512-PVb6Bg2QuscZ30FvOU7z4guG6c926D9YRvOxEaelzndpMsvP+YM74Q/dAFASpg2l6+XLalxSGxcq/lrgYWZtyQ==} dependencies: '@babel/parser': 7.20.3 @@ -3745,37 +3950,37 @@ packages: '@types/babel__traverse': 7.18.2 dev: true - /@types/babel__generator/7.6.4: + /@types/babel__generator@7.6.4: resolution: {integrity: sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg==} dependencies: '@babel/types': 7.20.2 dev: true - /@types/babel__template/7.4.1: + /@types/babel__template@7.4.1: resolution: {integrity: sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g==} dependencies: '@babel/parser': 7.20.3 '@babel/types': 7.20.2 dev: true - /@types/babel__traverse/7.18.2: + /@types/babel__traverse@7.18.2: resolution: {integrity: sha512-FcFaxOr2V5KZCviw1TnutEMVUVsGt4D2hP1TAfXZAMKuHYW3xQhe3jTxNPWutgCJ3/X1c5yX8ZoGVEItxKbwBg==} dependencies: '@babel/types': 7.20.2 dev: true - /@types/bn.js/4.11.6: + /@types/bn.js@4.11.6: resolution: {integrity: sha512-pqr857jrp2kPuO9uRjZ3PwnJTjoQy+fcdxvBTvHm6dkmEL9q+hDD/2j/0ELOBPtPnS8LjCX0gI9nbl8lVkadpg==} dependencies: '@types/node': 18.15.1 - /@types/bn.js/5.1.1: + /@types/bn.js@5.1.1: resolution: {integrity: sha512-qNrYbZqMx0uJAfKnKclPh+dTwK33KfLHYqtyODwd5HnXOjnkhc4qgn3BrK6RWyGZm5+sIFE7Q7Vz6QQtJB7w7g==} dependencies: - '@types/node': 12.20.55 + '@types/node': 18.15.1 dev: true - /@types/cacheable-request/6.0.3: + /@types/cacheable-request@6.0.3: resolution: {integrity: sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw==} dependencies: '@types/http-cache-semantics': 4.0.1 @@ -3785,163 +3990,163 @@ packages: dev: true optional: true - /@types/chai/4.3.4: + /@types/chai@4.3.4: resolution: {integrity: sha512-KnRanxnpfpjUTqTCXslZSEdLfXExwgNxYPdiO2WGUj8+HDjFi8R3k5RVKPeSCzLjCcshCAtVO2QBbVuAV4kTnw==} dev: true - /@types/concat-stream/1.6.1: + /@types/concat-stream@1.6.1: resolution: {integrity: sha512-eHE4cQPoj6ngxBZMvVf6Hw7Mh4jMW4U9lpGmS5GBPB9RYxlFg+CHaVN7ErNY4W9XfLIEn20b4VDYaIrbq0q4uA==} dependencies: '@types/node': 18.15.1 dev: true - /@types/connect/3.4.35: + /@types/connect@3.4.35: resolution: {integrity: sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==} dependencies: '@types/node': 18.15.1 dev: false - /@types/debug/4.1.7: + /@types/debug@4.1.7: resolution: {integrity: sha512-9AonUzyTjXXhEOa0DnqpzZi6VHlqKMswga9EXjpXnnqxwLtdvPPtlO8evrI5D9S6asFRCQ6v+wpiUKbw+vKqyg==} dependencies: '@types/ms': 0.7.31 dev: false - /@types/eslint-scope/3.7.4: + /@types/eslint-scope@3.7.4: resolution: {integrity: sha512-9K4zoImiZc3HlIp6AVUDE4CWYx22a+lhSZMYNpbjW04+YF0KWj4pJXnEMjdnFTiQibFFmElcsasJXDbdI/EPhA==} dependencies: '@types/eslint': 8.21.1 '@types/estree': 0.0.51 dev: true - /@types/eslint/8.21.1: + /@types/eslint@8.21.1: resolution: {integrity: sha512-rc9K8ZpVjNcLs8Fp0dkozd5Pt2Apk1glO4Vgz8ix1u6yFByxfqo5Yavpy65o+93TAe24jr7v+eSBtFLvOQtCRQ==} dependencies: '@types/estree': 0.0.51 '@types/json-schema': 7.0.11 dev: true - /@types/eslint/8.4.10: + /@types/eslint@8.4.10: resolution: {integrity: sha512-Sl/HOqN8NKPmhWo2VBEPm0nvHnu2LL3v9vKo8MEq0EtbJ4eVzGPl41VNPvn5E1i5poMk4/XD8UriLHpJvEP/Nw==} dependencies: '@types/estree': 0.0.51 '@types/json-schema': 7.0.11 dev: true - /@types/estree-jsx/1.0.0: + /@types/estree-jsx@1.0.0: resolution: {integrity: sha512-3qvGd0z8F2ENTGr/GG1yViqfiKmRfrXVx5sJyHGFu3z7m5g5utCQtGp/g29JnjflhtQJBv1WDQukHiT58xPcYQ==} dependencies: '@types/estree': 1.0.0 dev: false - /@types/estree/0.0.39: + /@types/estree@0.0.39: resolution: {integrity: sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==} dev: true - /@types/estree/0.0.50: + /@types/estree@0.0.50: resolution: {integrity: sha512-C6N5s2ZFtuZRj54k2/zyRhNDjJwwcViAM3Nbm8zjBpbqAdZ00mr0CFxvSKeO8Y/e03WVFLpQMdHYVfUd6SB+Hw==} dev: true - /@types/estree/0.0.51: + /@types/estree@0.0.51: resolution: {integrity: sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ==} dev: true - /@types/estree/1.0.0: + /@types/estree@1.0.0: resolution: {integrity: sha512-WulqXMDUTYAXCjZnk6JtIHPigp55cVtDgDrO2gHRwhyJto21+1zbVCtOYB2L1F9w4qCQ0rOGWBnBe0FNTiEJIQ==} dev: false - /@types/form-data/0.0.33: + /@types/form-data@0.0.33: resolution: {integrity: sha512-8BSvG1kGm83cyJITQMZSulnl6QV8jqAGreJsc5tPu1Jq0vTSOiY/k24Wx82JRpWwZSqrala6sd5rWi6aNXvqcw==} dependencies: '@types/node': 18.15.1 dev: true - /@types/glob/7.2.0: + /@types/glob@7.2.0: resolution: {integrity: sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==} dependencies: '@types/minimatch': 5.1.2 '@types/node': 18.15.1 dev: true - /@types/glob/8.1.0: + /@types/glob@8.1.0: resolution: {integrity: sha512-IO+MJPVhoqz+28h1qLAcBEH2+xHMK6MTyHJc7MTnnYb6wsoLR29POVGJ7LycmVXIqyy/4/2ShP5sUwTXuOwb/w==} dependencies: '@types/minimatch': 5.1.2 '@types/node': 12.20.55 dev: true - /@types/graceful-fs/4.1.5: + /@types/graceful-fs@4.1.5: resolution: {integrity: sha512-anKkLmZZ+xm4p8JWBf4hElkM4XR+EZeA2M9BAkkTldmcyDY4mbdIJnRghDJH3Ov5ooY7/UAoENtmdMSkaAd7Cw==} dependencies: - '@types/node': 18.14.2 + '@types/node': 18.15.1 dev: true - /@types/hast/2.3.4: + /@types/hast@2.3.4: resolution: {integrity: sha512-wLEm0QvaoawEDoTRwzTXp4b4jpwiJDvR5KMnFnVodm3scufTlBOWRD6N1OBf9TZMhjlNsSfcO5V+7AF4+Vy+9g==} dependencies: '@types/unist': 2.0.6 dev: false - /@types/html-minifier-terser/6.1.0: + /@types/html-minifier-terser@6.1.0: resolution: {integrity: sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg==} dev: true - /@types/http-cache-semantics/4.0.1: + /@types/http-cache-semantics@4.0.1: resolution: {integrity: sha512-SZs7ekbP8CN0txVG2xVRH6EgKmEm31BOxA07vkFaETzZz1xh+cbt8BcI0slpymvwhx5dlFnQG2rTlPVQn+iRPQ==} dev: true optional: true - /@types/istanbul-lib-coverage/2.0.4: + /@types/istanbul-lib-coverage@2.0.4: resolution: {integrity: sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==} dev: true - /@types/istanbul-lib-report/3.0.0: + /@types/istanbul-lib-report@3.0.0: resolution: {integrity: sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==} dependencies: '@types/istanbul-lib-coverage': 2.0.4 dev: true - /@types/istanbul-reports/3.0.1: + /@types/istanbul-reports@3.0.1: resolution: {integrity: sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==} dependencies: '@types/istanbul-lib-report': 3.0.0 dev: true - /@types/jest/27.5.2: + /@types/jest@27.5.2: resolution: {integrity: sha512-mpT8LJJ4CMeeahobofYWIjFo0xonRS/HfxnVEPMPFSQdGUt1uHCnoPT7Zhb+sjDU2wz0oKV0OLUR0WzrHNgfeA==} dependencies: jest-matcher-utils: 27.5.1 pretty-format: 27.5.1 dev: true - /@types/js-yaml/4.0.5: + /@types/js-yaml@4.0.5: resolution: {integrity: sha512-FhpRzf927MNQdRZP0J5DLIdTXhjLYzeUTmLAu69mnVksLH9CJY3IuSeEgbKUki7GQZm0WqDkGzyxju2EZGD2wA==} dev: false - /@types/json-schema/7.0.11: + /@types/json-schema@7.0.11: resolution: {integrity: sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==} dev: true - /@types/json5/0.0.29: + /@types/json5@0.0.29: resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} dev: true - /@types/katex/0.11.1: + /@types/katex@0.11.1: resolution: {integrity: sha512-DUlIj2nk0YnJdlWgsFuVKcX27MLW0KbKmGVoUHmFr+74FYYNUDAaj9ZqTADvsbE8rfxuVmSFc7KczYn5Y09ozg==} dev: false - /@types/keyv/3.1.4: + /@types/keyv@3.1.4: resolution: {integrity: sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==} dependencies: '@types/node': 18.15.1 dev: true optional: true - /@types/level-errors/3.0.0: + /@types/level-errors@3.0.0: resolution: {integrity: sha512-/lMtoq/Cf/2DVOm6zE6ORyOM+3ZVm/BvzEZVxUhf6bgh8ZHglXlBqxbxSlJeVp8FCbD3IVvk/VbsaNmDjrQvqQ==} dev: true - /@types/levelup/4.3.3: + /@types/levelup@4.3.3: resolution: {integrity: sha512-K+OTIjJcZHVlZQN1HmU64VtrC0jC3dXWQozuEIR9zVvltIk90zaGPM2AgT+fIkChpzHhFE3YnvFLCbLtzAmexA==} dependencies: '@types/abstract-leveldown': 7.2.1 @@ -3949,230 +4154,257 @@ packages: '@types/node': 12.20.55 dev: true - /@types/lru-cache/5.1.1: + /@types/lru-cache@5.1.1: resolution: {integrity: sha512-ssE3Vlrys7sdIzs5LOxCzTVMsU7i9oa/IaW92wF32JFb3CVczqOkru2xspuKczHEbG3nvmPY7IFqVmGGHdNbYw==} dev: true - /@types/mdast/3.0.10: + /@types/mdast@3.0.10: resolution: {integrity: sha512-W864tg/Osz1+9f4lrGTZpCSO5/z4608eUp19tbozkq2HJK6i3z1kT0H9tlADXuYIb1YYOBByU4Jsqkk75q48qA==} dependencies: '@types/unist': 2.0.6 dev: false - /@types/mdx/2.0.3: + /@types/mdx@2.0.3: resolution: {integrity: sha512-IgHxcT3RC8LzFLhKwP3gbMPeaK7BM9eBH46OdapPA7yvuIUJ8H6zHZV53J8hGZcTSnt95jANt+rTBNUUc22ACQ==} dev: false - /@types/minimatch/5.1.2: + /@types/minimatch@5.1.2: resolution: {integrity: sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==} dev: true - /@types/minimist/1.2.2: + /@types/minimist@1.2.2: resolution: {integrity: sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ==} dev: true - /@types/mixpanel/2.14.4: + /@types/mixpanel@2.14.4: resolution: {integrity: sha512-VVnwnH+m3043pVnzwq1FNG5KQf/vxWf5abi6F8qq4ph+wQ6i/SNZo+FK34ilH2ii6p07NELCgLMVztqocdqW3A==} dev: true - /@types/mkdirp/0.5.2: + /@types/mkdirp@0.5.2: resolution: {integrity: sha512-U5icWpv7YnZYGsN4/cmh3WD2onMY0aJIiTE6+51TwJCttdHvtCYmkBNOobHlXwrJRL0nkH9jH4kD+1FAdMN4Tg==} dependencies: - '@types/node': 12.20.55 + '@types/node': 18.15.1 dev: true - /@types/mocha/9.1.1: + /@types/mocha@9.1.1: resolution: {integrity: sha512-Z61JK7DKDtdKTWwLeElSEBcWGRLY8g95ic5FoQqI9CMx0ns/Ghep3B4DfcEimiKMvtamNVULVNKEsiwV3aQmXw==} dev: true - /@types/ms/0.7.31: + /@types/ms@0.7.31: resolution: {integrity: sha512-iiUgKzV9AuaEkZqkOLDIvlQiL6ltuZd9tGcW3gwpnX8JbuiuhFlEGmmFXEXkN50Cvq7Os88IY2v0dkDqXYWVgA==} dev: false - /@types/node-fetch/2.6.2: + /@types/node-fetch@2.6.2: resolution: {integrity: sha512-DHqhlq5jeESLy19TYhLakJ07kNumXWjcDdxXsLUMJZ6ue8VZJj4kLPQVE/2mdHh3xZziNF1xppu5lwmS53HR+A==} dependencies: - '@types/node': 12.20.55 + '@types/node': 18.15.1 form-data: 3.0.1 dev: true - /@types/node/10.17.60: + /@types/node@10.17.60: resolution: {integrity: sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw==} dev: true - /@types/node/12.20.55: + /@types/node@12.20.55: resolution: {integrity: sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==} - /@types/node/18.13.0: + /@types/node@18.13.0: resolution: {integrity: sha512-gC3TazRzGoOnoKAhUx+Q0t8S9Tzs74z7m0ipwGpSqQrleP14hKxP4/JUeEQcD3W1/aIpnWl8pHowI7WokuZpXg==} dev: true - /@types/node/18.14.2: + /@types/node@18.14.2: resolution: {integrity: sha512-1uEQxww3DaghA0RxqHx0O0ppVlo43pJhepY51OxuQIKHpjbnYLA7vcdwioNPzIqmC2u3I/dmylcqjlh0e7AyUA==} dev: true - /@types/node/18.15.1: + /@types/node@18.15.1: resolution: {integrity: sha512-U2TWca8AeHSmbpi314QBESRk7oPjSZjDsR+c+H4ECC1l+kFgpZf8Ydhv3SJpPy51VyZHHqxlb6mTTqYNNRVAIw==} - /@types/node/8.10.66: + /@types/node@8.10.66: resolution: {integrity: sha512-tktOkFUA4kXx2hhhrB8bIFb5TbwzS4uOhKEmwiD+NoiL0qtP2OQ9mFldbgD4dV1djrlBYP6eBuQZiWjuHUpqFw==} dev: true - /@types/normalize-package-data/2.4.1: + /@types/normalize-package-data@2.4.1: resolution: {integrity: sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==} dev: true - /@types/parse-json/4.0.0: + /@types/parse-json@4.0.0: resolution: {integrity: sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==} dev: true - /@types/pbkdf2/3.1.0: + /@types/pbkdf2@3.1.0: resolution: {integrity: sha512-Cf63Rv7jCQ0LaL8tNXmEyqTHuIJxRdlS5vMh1mj5voN4+QFhVZnlZruezqpWYDiJ8UTzhP0VmeLXCmBk66YrMQ==} dependencies: '@types/node': 18.15.1 - /@types/prettier/2.7.1: + /@types/prettier@2.7.1: resolution: {integrity: sha512-ri0UmynRRvZiiUJdiz38MmIblKK+oH30MztdBVR95dv/Ubw6neWSb8u1XpRb72L4qsZOhz+L+z9JD40SJmfWow==} dev: true - /@types/prettier/2.7.2: + /@types/prettier@2.7.2: resolution: {integrity: sha512-KufADq8uQqo1pYKVIYzfKbJfBAc0sOeXqGbFaSpv8MRmC/zXgowNZmFcbngndGk922QDmOASEXUZCaY48gs4cg==} dev: true - /@types/prop-types/15.7.5: + /@types/prop-types@15.7.5: resolution: {integrity: sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==} - /@types/pug/2.0.6: + /@types/pug@2.0.6: resolution: {integrity: sha512-SnHmG9wN1UVmagJOnyo/qkk0Z7gejYxOYYmaAwr5u2yFYfsupN3sg10kyzN8Hep/2zbHxCnsumxOoRIRMBwKCg==} dev: true - /@types/qs/6.9.7: + /@types/qs@6.9.7: resolution: {integrity: sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==} dev: true - /@types/react/18.0.28: + /@types/react@18.0.28: resolution: {integrity: sha512-RD0ivG1kEztNBdoAK7lekI9M+azSnitIn85h4iOiaLjaTrMjzslhaqCGaI4IyCJ1RljWiLCEu4jyrLLgqxBTew==} dependencies: '@types/prop-types': 15.7.5 '@types/scheduler': 0.16.2 csstype: 3.1.1 - /@types/resolve/0.0.8: + /@types/resolve@0.0.8: resolution: {integrity: sha512-auApPaJf3NPfe18hSoJkp8EbZzer2ISk7o8mCC3M9he/a04+gbMF97NkpD2S8riMGvm4BMRI59/SZQSaLTKpsQ==} dependencies: - '@types/node': 12.20.55 + '@types/node': 18.15.1 dev: true - /@types/responselike/1.0.0: + /@types/responselike@1.0.0: resolution: {integrity: sha512-85Y2BjiufFzaMIlvJDvTTB8Fxl2xfLo4HgmHzVBz08w4wDePCTjYw66PdrolO0kzli3yam/YCgRufyo1DdQVTA==} dependencies: '@types/node': 18.15.1 dev: true optional: true - /@types/sanitize-html/2.6.2: + /@types/sanitize-html@2.6.2: resolution: {integrity: sha512-7Lu2zMQnmHHQGKXVvCOhSziQMpa+R2hMHFefzbYoYMHeaXR0uXqNeOc3JeQQQ8/6Xa2Br/P1IQTLzV09xxAiUQ==} dependencies: htmlparser2: 6.1.0 dev: true - /@types/sass/1.43.1: + /@types/sass@1.43.1: resolution: {integrity: sha512-BPdoIt1lfJ6B7rw35ncdwBZrAssjcwzI5LByIrYs+tpXlj/CAkuVdRsgZDdP4lq5EjyWzwxZCqAoFyHKFwp32g==} dependencies: '@types/node': 18.13.0 dev: true - /@types/scheduler/0.16.2: + /@types/scheduler@0.16.2: resolution: {integrity: sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew==} - /@types/secp256k1/4.0.3: + /@types/secp256k1@4.0.3: resolution: {integrity: sha512-Da66lEIFeIz9ltsdMZcpQvmrmmoqrfju8pm1BH8WbYjZSwUgCwXLb9C+9XYogwBITnbsSaMdVPb2ekf7TV+03w==} dependencies: '@types/node': 18.15.1 - /@types/semver/7.3.13: + /@types/semver@7.3.13: resolution: {integrity: sha512-21cFJr9z3g5dW8B0CVI9g2O9beqaThGQ6ZFBqHfwhzLDKUxaqTIy3vnfah/UPkfOiF2pLq+tGz+W8RyCskuslw==} dev: true - /@types/sinon-chai/3.2.9: + /@types/sinon-chai@3.2.9: resolution: {integrity: sha512-/19t63pFYU0ikrdbXKBWj9PCdnKyTd0Qkz0X91Ta081cYsq90OxYdcWwK/dwEoDa6dtXgj2HJfmzgq+QZTHdmQ==} dependencies: '@types/chai': 4.3.4 '@types/sinon': 10.0.13 dev: true - /@types/sinon/10.0.13: + /@types/sinon@10.0.13: resolution: {integrity: sha512-UVjDqJblVNQYvVNUsj0PuYYw0ELRmgt1Nt5Vk0pT5f16ROGfcKJY8o1HVuMOJOpD727RrGB9EGvoaTQE5tgxZQ==} dependencies: '@types/sinonjs__fake-timers': 8.1.2 dev: true - /@types/sinonjs__fake-timers/8.1.2: + /@types/sinonjs__fake-timers@8.1.2: resolution: {integrity: sha512-9GcLXF0/v3t80caGs5p2rRfkB+a8VBGLJZVih6CNFkx8IZ994wiKKLSRs9nuFwk1HevWs/1mnUmkApGrSGsShA==} dev: true - /@types/stack-utils/2.0.1: + /@types/stack-utils@2.0.1: resolution: {integrity: sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==} dev: true - /@types/underscore/1.11.4: + /@types/underscore@1.11.4: resolution: {integrity: sha512-uO4CD2ELOjw8tasUrAhvnn2W4A0ZECOvMjCivJr4gA9pGgjv+qxKWY9GLTMVEK8ej85BxQOocUyE7hImmSQYcg==} dev: true - /@types/unist/2.0.6: + /@types/unist@2.0.6: resolution: {integrity: sha512-PBjIUxZHOuj0R15/xuwJYjFi+KZdNFrehocChv4g5hu6aFroHue8m0lBP0POdK2nKzbw0cgV1mws8+V/JAcEkQ==} dev: false - /@types/web3/1.0.19: + /@types/web3@1.0.19: resolution: {integrity: sha512-fhZ9DyvDYDwHZUp5/STa9XW2re0E8GxoioYJ4pEUZ13YHpApSagixj7IAdoYH5uAK+UalGq6Ml8LYzmgRA/q+A==} dependencies: '@types/bn.js': 5.1.1 '@types/underscore': 1.11.4 dev: true - /@types/ws/7.4.7: + /@types/ws@7.4.7: resolution: {integrity: sha512-JQbbmxZTZehdc2iszGKs5oC3NFnjeay7mtAWrdt7qNtAVK0g19muApzAy4bm9byz79xa2ZnO/BOBC2R8RC5Lww==} dependencies: '@types/node': 18.15.1 dev: false - /@types/yargs-parser/21.0.0: + /@types/yargs-parser@21.0.0: resolution: {integrity: sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==} dev: true - /@types/yargs/16.0.4: + /@types/yargs@16.0.4: resolution: {integrity: sha512-T8Yc9wt/5LbJyCaLiHPReJa0kApcIgJ7Bn735GjItUfh08Z1pJvu8QZqb9s+mMvKV6WUQRV7K2R46YbjMXTTJw==} dependencies: '@types/yargs-parser': 21.0.0 dev: true - /@typescript-eslint/eslint-plugin/4.33.0_s2qqtxhzmb7vugvfoyripfgp7i: - resolution: {integrity: sha512-aINiAxGVdOl1eJyVjaWn/YcVAq4Gi/Yo35qHGCnqbWVz61g39D0h23veY/MA0rFFGfxK7TySg2uwDeNv+JgVpg==} - engines: {node: ^10.12.0 || >=12.0.0} + /@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} + peerDependencies: + '@typescript-eslint/parser': ^4.0.0 + eslint: ^5.0.0 || ^6.0.0 || ^7.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@typescript-eslint/experimental-utils': 4.33.0(eslint@7.32.0)(typescript@4.9.5) + '@typescript-eslint/parser': 4.33.0(eslint@7.32.0)(typescript@4.9.5) + '@typescript-eslint/scope-manager': 4.33.0 + debug: 4.3.4(supports-color@8.1.1) + eslint: 7.32.0 + functional-red-black-tree: 1.0.1 + ignore: 5.2.4 + regexpp: 3.2.0 + semver: 7.3.8 + tsutils: 3.21.0(typescript@4.9.5) + typescript: 4.9.5 + transitivePeerDependencies: + - supports-color + dev: true + + /@typescript-eslint/eslint-plugin@5.44.0(@typescript-eslint/parser@5.44.0)(eslint@7.32.0)(typescript@4.9.3): + resolution: {integrity: sha512-j5ULd7FmmekcyWeArx+i8x7sdRHzAtXTkmDPthE4amxZOWKFK7bomoJ4r7PJ8K7PoMzD16U8MmuZFAonr1ERvw==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: - '@typescript-eslint/parser': ^4.0.0 - eslint: ^5.0.0 || ^6.0.0 || ^7.0.0 + '@typescript-eslint/parser': ^5.0.0 + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 typescript: '*' peerDependenciesMeta: typescript: optional: true dependencies: - '@typescript-eslint/experimental-utils': 4.33.0_jofidmxrjzhj7l6vknpw5ecvfe - '@typescript-eslint/parser': 4.33.0_jofidmxrjzhj7l6vknpw5ecvfe - '@typescript-eslint/scope-manager': 4.33.0 - debug: 4.3.4 + '@typescript-eslint/parser': 5.44.0(eslint@7.32.0)(typescript@4.9.3) + '@typescript-eslint/scope-manager': 5.44.0 + '@typescript-eslint/type-utils': 5.44.0(eslint@7.32.0)(typescript@4.9.3) + '@typescript-eslint/utils': 5.44.0(eslint@7.32.0)(typescript@4.9.3) + debug: 4.3.4(supports-color@8.1.1) eslint: 7.32.0 - functional-red-black-tree: 1.0.1 - ignore: 5.2.4 + ignore: 5.2.0 + natural-compare-lite: 1.4.0 regexpp: 3.2.0 semver: 7.3.8 - tsutils: 3.21.0_typescript@4.9.5 - typescript: 4.9.5 + tsutils: 3.21.0(typescript@4.9.3) + typescript: 4.9.3 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/eslint-plugin/5.44.0_7kywactpvjpcexyctx5cege4cm: + /@typescript-eslint/eslint-plugin@5.44.0(@typescript-eslint/parser@5.44.0)(eslint@7.32.0)(typescript@4.9.5): resolution: {integrity: sha512-j5ULd7FmmekcyWeArx+i8x7sdRHzAtXTkmDPthE4amxZOWKFK7bomoJ4r7PJ8K7PoMzD16U8MmuZFAonr1ERvw==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: @@ -4183,22 +4415,23 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/parser': 5.44.0_typescript@4.9.5 + '@typescript-eslint/parser': 5.44.0(eslint@7.32.0)(typescript@4.9.5) '@typescript-eslint/scope-manager': 5.44.0 - '@typescript-eslint/type-utils': 5.44.0_typescript@4.9.5 - '@typescript-eslint/utils': 5.44.0_typescript@4.9.5 - debug: 4.3.4 + '@typescript-eslint/type-utils': 5.44.0(eslint@7.32.0)(typescript@4.9.5) + '@typescript-eslint/utils': 5.44.0(eslint@7.32.0)(typescript@4.9.5) + debug: 4.3.4(supports-color@8.1.1) + eslint: 7.32.0 ignore: 5.2.0 natural-compare-lite: 1.4.0 regexpp: 3.2.0 semver: 7.3.8 - tsutils: 3.21.0_typescript@4.9.5 + tsutils: 3.21.0(typescript@4.9.5) typescript: 4.9.5 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/eslint-plugin/5.44.0_c5rgyxfozmk6acmvyot27wcp74: + /@typescript-eslint/eslint-plugin@5.44.0(@typescript-eslint/parser@5.44.0)(eslint@8.37.0)(typescript@4.9.3): resolution: {integrity: sha512-j5ULd7FmmekcyWeArx+i8x7sdRHzAtXTkmDPthE4amxZOWKFK7bomoJ4r7PJ8K7PoMzD16U8MmuZFAonr1ERvw==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: @@ -4209,22 +4442,23 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/parser': 5.44.0_typescript@4.9.3 + '@typescript-eslint/parser': 5.44.0(eslint@8.37.0)(typescript@4.9.3) '@typescript-eslint/scope-manager': 5.44.0 - '@typescript-eslint/type-utils': 5.44.0_typescript@4.9.3 - '@typescript-eslint/utils': 5.44.0_typescript@4.9.3 - debug: 4.3.4 + '@typescript-eslint/type-utils': 5.44.0(eslint@8.37.0)(typescript@4.9.3) + '@typescript-eslint/utils': 5.44.0(eslint@8.37.0)(typescript@4.9.3) + debug: 4.3.4(supports-color@8.1.1) + eslint: 8.37.0 ignore: 5.2.0 natural-compare-lite: 1.4.0 regexpp: 3.2.0 semver: 7.3.8 - tsutils: 3.21.0_typescript@4.9.3 + tsutils: 3.21.0(typescript@4.9.3) typescript: 4.9.3 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/experimental-utils/4.33.0_jofidmxrjzhj7l6vknpw5ecvfe: + /@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: @@ -4233,16 +4467,16 @@ packages: '@types/json-schema': 7.0.11 '@typescript-eslint/scope-manager': 4.33.0 '@typescript-eslint/types': 4.33.0 - '@typescript-eslint/typescript-estree': 4.33.0_typescript@4.9.5 + '@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 + eslint-utils: 3.0.0(eslint@7.32.0) transitivePeerDependencies: - supports-color - typescript dev: true - /@typescript-eslint/parser/4.33.0_jofidmxrjzhj7l6vknpw5ecvfe: + /@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} peerDependencies: @@ -4254,15 +4488,15 @@ packages: dependencies: '@typescript-eslint/scope-manager': 4.33.0 '@typescript-eslint/types': 4.33.0 - '@typescript-eslint/typescript-estree': 4.33.0_typescript@4.9.5 - debug: 4.3.4 + '@typescript-eslint/typescript-estree': 4.33.0(typescript@4.9.5) + debug: 4.3.4(supports-color@8.1.1) eslint: 7.32.0 typescript: 4.9.5 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/parser/5.44.0_typescript@4.9.3: + /@typescript-eslint/parser@5.44.0(eslint@7.32.0)(typescript@4.9.3): resolution: {integrity: sha512-H7LCqbZnKqkkgQHaKLGC6KUjt3pjJDx8ETDqmwncyb6PuoigYajyAwBGz08VU/l86dZWZgI4zm5k2VaKqayYyA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: @@ -4274,14 +4508,15 @@ packages: dependencies: '@typescript-eslint/scope-manager': 5.44.0 '@typescript-eslint/types': 5.44.0 - '@typescript-eslint/typescript-estree': 5.44.0_typescript@4.9.3 - debug: 4.3.4 + '@typescript-eslint/typescript-estree': 5.44.0(typescript@4.9.3) + debug: 4.3.4(supports-color@8.1.1) + eslint: 7.32.0 typescript: 4.9.3 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/parser/5.44.0_typescript@4.9.5: + /@typescript-eslint/parser@5.44.0(eslint@7.32.0)(typescript@4.9.5): resolution: {integrity: sha512-H7LCqbZnKqkkgQHaKLGC6KUjt3pjJDx8ETDqmwncyb6PuoigYajyAwBGz08VU/l86dZWZgI4zm5k2VaKqayYyA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: @@ -4293,14 +4528,35 @@ packages: dependencies: '@typescript-eslint/scope-manager': 5.44.0 '@typescript-eslint/types': 5.44.0 - '@typescript-eslint/typescript-estree': 5.44.0_typescript@4.9.5 - debug: 4.3.4 + '@typescript-eslint/typescript-estree': 5.44.0(typescript@4.9.5) + debug: 4.3.4(supports-color@8.1.1) + eslint: 7.32.0 typescript: 4.9.5 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/scope-manager/4.33.0: + /@typescript-eslint/parser@5.44.0(eslint@8.37.0)(typescript@4.9.3): + resolution: {integrity: sha512-H7LCqbZnKqkkgQHaKLGC6KUjt3pjJDx8ETDqmwncyb6PuoigYajyAwBGz08VU/l86dZWZgI4zm5k2VaKqayYyA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@typescript-eslint/scope-manager': 5.44.0 + '@typescript-eslint/types': 5.44.0 + '@typescript-eslint/typescript-estree': 5.44.0(typescript@4.9.3) + debug: 4.3.4(supports-color@8.1.1) + eslint: 8.37.0 + typescript: 4.9.3 + transitivePeerDependencies: + - supports-color + dev: true + + /@typescript-eslint/scope-manager@4.33.0: resolution: {integrity: sha512-5IfJHpgTsTZuONKbODctL4kKuQje/bzBRkwHE8UOZ4f89Zeddg+EGZs8PD8NcN4LdM3ygHWYB3ukPAYjvl/qbQ==} engines: {node: ^8.10.0 || ^10.13.0 || >=11.10.1} dependencies: @@ -4308,7 +4564,7 @@ packages: '@typescript-eslint/visitor-keys': 4.33.0 dev: true - /@typescript-eslint/scope-manager/5.44.0: + /@typescript-eslint/scope-manager@5.44.0: resolution: {integrity: sha512-2pKml57KusI0LAhgLKae9kwWeITZ7IsZs77YxyNyIVOwQ1kToyXRaJLl+uDEXzMN5hnobKUOo2gKntK9H1YL8g==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dependencies: @@ -4316,7 +4572,7 @@ packages: '@typescript-eslint/visitor-keys': 5.44.0 dev: true - /@typescript-eslint/type-utils/5.44.0_typescript@4.9.3: + /@typescript-eslint/type-utils@5.44.0(eslint@7.32.0)(typescript@4.9.3): resolution: {integrity: sha512-A1u0Yo5wZxkXPQ7/noGkRhV4J9opcymcr31XQtOzcc5nO/IHN2E2TPMECKWYpM3e6olWEM63fq/BaL1wEYnt/w==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: @@ -4326,16 +4582,17 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/typescript-estree': 5.44.0_typescript@4.9.3 - '@typescript-eslint/utils': 5.44.0_typescript@4.9.3 - debug: 4.3.4 - tsutils: 3.21.0_typescript@4.9.3 + '@typescript-eslint/typescript-estree': 5.44.0(typescript@4.9.3) + '@typescript-eslint/utils': 5.44.0(eslint@7.32.0)(typescript@4.9.3) + debug: 4.3.4(supports-color@8.1.1) + eslint: 7.32.0 + tsutils: 3.21.0(typescript@4.9.3) typescript: 4.9.3 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/type-utils/5.44.0_typescript@4.9.5: + /@typescript-eslint/type-utils@5.44.0(eslint@7.32.0)(typescript@4.9.5): resolution: {integrity: sha512-A1u0Yo5wZxkXPQ7/noGkRhV4J9opcymcr31XQtOzcc5nO/IHN2E2TPMECKWYpM3e6olWEM63fq/BaL1wEYnt/w==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: @@ -4345,26 +4602,47 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/typescript-estree': 5.44.0_typescript@4.9.5 - '@typescript-eslint/utils': 5.44.0_typescript@4.9.5 - debug: 4.3.4 - tsutils: 3.21.0_typescript@4.9.5 + '@typescript-eslint/typescript-estree': 5.44.0(typescript@4.9.5) + '@typescript-eslint/utils': 5.44.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) typescript: 4.9.5 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/types/4.33.0: + /@typescript-eslint/type-utils@5.44.0(eslint@8.37.0)(typescript@4.9.3): + resolution: {integrity: sha512-A1u0Yo5wZxkXPQ7/noGkRhV4J9opcymcr31XQtOzcc5nO/IHN2E2TPMECKWYpM3e6olWEM63fq/BaL1wEYnt/w==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: '*' + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@typescript-eslint/typescript-estree': 5.44.0(typescript@4.9.3) + '@typescript-eslint/utils': 5.44.0(eslint@8.37.0)(typescript@4.9.3) + debug: 4.3.4(supports-color@8.1.1) + eslint: 8.37.0 + tsutils: 3.21.0(typescript@4.9.3) + typescript: 4.9.3 + transitivePeerDependencies: + - supports-color + dev: true + + /@typescript-eslint/types@4.33.0: resolution: {integrity: sha512-zKp7CjQzLQImXEpLt2BUw1tvOMPfNoTAfb8l51evhYbOEEzdWyQNmHWWGPR6hwKJDAi+1VXSBmnhL9kyVTTOuQ==} engines: {node: ^8.10.0 || ^10.13.0 || >=11.10.1} dev: true - /@typescript-eslint/types/5.44.0: + /@typescript-eslint/types@5.44.0: resolution: {integrity: sha512-Tp+zDnHmGk4qKR1l+Y1rBvpjpm5tGXX339eAlRBDg+kgZkz9Bw+pqi4dyseOZMsGuSH69fYfPJCBKBrbPCxYFQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dev: true - /@typescript-eslint/typescript-estree/4.33.0_typescript@4.9.5: + /@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} peerDependencies: @@ -4375,17 +4653,17 @@ packages: dependencies: '@typescript-eslint/types': 4.33.0 '@typescript-eslint/visitor-keys': 4.33.0 - debug: 4.3.4 + debug: 4.3.4(supports-color@8.1.1) globby: 11.1.0 is-glob: 4.0.3 semver: 7.3.8 - tsutils: 3.21.0_typescript@4.9.5 + tsutils: 3.21.0(typescript@4.9.5) typescript: 4.9.5 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/typescript-estree/5.44.0_typescript@4.9.3: + /@typescript-eslint/typescript-estree@5.44.0(typescript@4.9.3): resolution: {integrity: sha512-M6Jr+RM7M5zeRj2maSfsZK2660HKAJawv4Ud0xT+yauyvgrsHu276VtXlKDFnEmhG+nVEd0fYZNXGoAgxwDWJw==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: @@ -4396,17 +4674,17 @@ packages: dependencies: '@typescript-eslint/types': 5.44.0 '@typescript-eslint/visitor-keys': 5.44.0 - debug: 4.3.4 + debug: 4.3.4(supports-color@8.1.1) globby: 11.1.0 is-glob: 4.0.3 semver: 7.3.8 - tsutils: 3.21.0_typescript@4.9.3 + tsutils: 3.21.0(typescript@4.9.3) typescript: 4.9.3 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/typescript-estree/5.44.0_typescript@4.9.5: + /@typescript-eslint/typescript-estree@5.44.0(typescript@4.9.5): resolution: {integrity: sha512-M6Jr+RM7M5zeRj2maSfsZK2660HKAJawv4Ud0xT+yauyvgrsHu276VtXlKDFnEmhG+nVEd0fYZNXGoAgxwDWJw==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: @@ -4417,17 +4695,37 @@ packages: dependencies: '@typescript-eslint/types': 5.44.0 '@typescript-eslint/visitor-keys': 5.44.0 - debug: 4.3.4 + debug: 4.3.4(supports-color@8.1.1) globby: 11.1.0 is-glob: 4.0.3 semver: 7.3.8 - tsutils: 3.21.0_typescript@4.9.5 + tsutils: 3.21.0(typescript@4.9.5) typescript: 4.9.5 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/utils/5.44.0_typescript@4.9.3: + /@typescript-eslint/utils@5.44.0(eslint@7.32.0)(typescript@4.9.3): + resolution: {integrity: sha512-fMzA8LLQ189gaBjS0MZszw5HBdZgVwxVFShCO3QN+ws3GlPkcy9YuS3U4wkT6su0w+Byjq3mS3uamy9HE4Yfjw==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + dependencies: + '@types/json-schema': 7.0.11 + '@types/semver': 7.3.13 + '@typescript-eslint/scope-manager': 5.44.0 + '@typescript-eslint/types': 5.44.0 + '@typescript-eslint/typescript-estree': 5.44.0(typescript@4.9.3) + eslint: 7.32.0 + eslint-scope: 5.1.1 + eslint-utils: 3.0.0(eslint@7.32.0) + semver: 7.3.8 + transitivePeerDependencies: + - supports-color + - typescript + dev: true + + /@typescript-eslint/utils@5.44.0(eslint@7.32.0)(typescript@4.9.5): resolution: {integrity: sha512-fMzA8LLQ189gaBjS0MZszw5HBdZgVwxVFShCO3QN+ws3GlPkcy9YuS3U4wkT6su0w+Byjq3mS3uamy9HE4Yfjw==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: @@ -4437,16 +4735,17 @@ packages: '@types/semver': 7.3.13 '@typescript-eslint/scope-manager': 5.44.0 '@typescript-eslint/types': 5.44.0 - '@typescript-eslint/typescript-estree': 5.44.0_typescript@4.9.3 + '@typescript-eslint/typescript-estree': 5.44.0(typescript@4.9.5) + eslint: 7.32.0 eslint-scope: 5.1.1 - eslint-utils: 3.0.0 + eslint-utils: 3.0.0(eslint@7.32.0) semver: 7.3.8 transitivePeerDependencies: - supports-color - typescript dev: true - /@typescript-eslint/utils/5.44.0_typescript@4.9.5: + /@typescript-eslint/utils@5.44.0(eslint@8.37.0)(typescript@4.9.3): resolution: {integrity: sha512-fMzA8LLQ189gaBjS0MZszw5HBdZgVwxVFShCO3QN+ws3GlPkcy9YuS3U4wkT6su0w+Byjq3mS3uamy9HE4Yfjw==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: @@ -4456,16 +4755,17 @@ packages: '@types/semver': 7.3.13 '@typescript-eslint/scope-manager': 5.44.0 '@typescript-eslint/types': 5.44.0 - '@typescript-eslint/typescript-estree': 5.44.0_typescript@4.9.5 + '@typescript-eslint/typescript-estree': 5.44.0(typescript@4.9.3) + eslint: 8.37.0 eslint-scope: 5.1.1 - eslint-utils: 3.0.0 + eslint-utils: 3.0.0(eslint@8.37.0) semver: 7.3.8 transitivePeerDependencies: - supports-color - typescript dev: true - /@typescript-eslint/visitor-keys/4.33.0: + /@typescript-eslint/visitor-keys@4.33.0: resolution: {integrity: sha512-uqi/2aSz9g2ftcHWf8uLPJA70rUv6yuMW5Bohw+bwcuzaxQIHaKFZCKGoGXIrc9vkTJ3+0txM73K0Hq3d5wgIg==} engines: {node: ^8.10.0 || ^10.13.0 || >=11.10.1} dependencies: @@ -4473,7 +4773,7 @@ packages: eslint-visitor-keys: 2.1.0 dev: true - /@typescript-eslint/visitor-keys/5.44.0: + /@typescript-eslint/visitor-keys@5.44.0: resolution: {integrity: sha512-a48tLG8/4m62gPFbJ27FxwCOqPKxsb8KC3HkmYoq2As/4YyjQl1jDbRr1s63+g4FS/iIehjmN3L5UjmKva1HzQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dependencies: @@ -4481,7 +4781,7 @@ packages: eslint-visitor-keys: 3.3.0 dev: true - /@vue/compiler-sfc/2.7.14: + /@vue/compiler-sfc@2.7.14: resolution: {integrity: sha512-aNmNHyLPsw+sVvlQFQ2/8sjNuLtK54TC6cuKnVzAY93ks4ZBrvwQSnkkIh7bsbNhum5hJBS00wSDipQ937f5DA==} dependencies: '@babel/parser': 7.21.2 @@ -4489,10 +4789,10 @@ packages: source-map: 0.6.1 dev: true - /@vue/component-compiler-utils/3.3.0: + /@vue/component-compiler-utils@3.3.0(lodash@4.17.21): resolution: {integrity: sha512-97sfH2mYNU+2PzGrmK2haqffDpVASuib9/w2/noxiFi31Z54hW+q3izKQXXQZSNhtiUpAI36uSuYepeBe4wpHQ==} dependencies: - consolidate: 0.15.1 + consolidate: 0.15.1(lodash@4.17.21) hash-sum: 1.0.2 lru-cache: 4.1.5 merge-source-map: 1.1.0 @@ -4558,11 +4858,11 @@ packages: - whiskers dev: true - /@wagmi/chains/0.1.3: + /@wagmi/chains@0.1.3: resolution: {integrity: sha512-L+lUuyxsocjBB3fwak3t0miXxyMHuXntysgm/R+MIbBfidsZEHpeky44z4Qdft2TUlGtb08i5QSl+4eUEQGTNw==} dev: false - /@wagmi/connectors/0.1.1_lpbbub423epmm6q3g5mjjnmjwe: + /@wagmi/connectors@0.1.1(@babel/core@7.20.2)(@wagmi/core@0.8.4)(ethers@5.7.2)(typescript@4.9.3): resolution: {integrity: sha512-W9w73o9HCYzuBsDHuujwBT/nGGIu5qLBSqVqslXf/S1Q9OiWoudmuIs3opuYqxgw5MpWbMqhq6QaxA7Qcd6NrA==} peerDependencies: '@wagmi/core': 0.8.x @@ -4571,11 +4871,11 @@ packages: '@wagmi/core': optional: true dependencies: - '@coinbase/wallet-sdk': 3.6.3 + '@coinbase/wallet-sdk': 3.6.3(@babel/core@7.20.2) '@ledgerhq/connect-kit-loader': 1.0.1 - '@wagmi/core': 0.8.4_5mvh6ls5vdjonfqgvwoj34otni + '@wagmi/core': 0.8.4(@babel/core@7.20.2)(@coinbase/wallet-sdk@3.6.3)(ethers@5.7.2)(react@18.2.0)(typescript@4.9.3) '@walletconnect/ethereum-provider': 1.8.0 - abitype: 0.1.8_typescript@4.9.3 + abitype: 0.1.8(typescript@4.9.3) ethers: 5.7.2 eventemitter3: 4.0.7 transitivePeerDependencies: @@ -4588,7 +4888,7 @@ packages: - utf-8-validate dev: false - /@wagmi/connectors/0.1.1_qumsokfsavwbqmluzzd5y4jcfa: + /@wagmi/connectors@0.1.1(@babel/core@7.20.2)(@wagmi/core@0.8.4)(ethers@5.7.2)(typescript@4.9.5): resolution: {integrity: sha512-W9w73o9HCYzuBsDHuujwBT/nGGIu5qLBSqVqslXf/S1Q9OiWoudmuIs3opuYqxgw5MpWbMqhq6QaxA7Qcd6NrA==} peerDependencies: '@wagmi/core': 0.8.x @@ -4597,11 +4897,11 @@ packages: '@wagmi/core': optional: true dependencies: - '@coinbase/wallet-sdk': 3.6.3 + '@coinbase/wallet-sdk': 3.6.3(@babel/core@7.20.2) '@ledgerhq/connect-kit-loader': 1.0.1 - '@wagmi/core': 0.8.4_km5vcydjtqolcouev6sh7bgmoy + '@wagmi/core': 0.8.4(@babel/core@7.20.2)(@coinbase/wallet-sdk@3.6.3)(ethers@5.7.2)(react@18.2.0)(typescript@4.9.5) '@walletconnect/ethereum-provider': 1.8.0 - abitype: 0.1.8_typescript@4.9.5 + abitype: 0.1.8(typescript@4.9.5) ethers: 5.7.2 eventemitter3: 4.0.7 transitivePeerDependencies: @@ -4614,7 +4914,7 @@ packages: - utf-8-validate dev: false - /@wagmi/core/0.8.4_5mvh6ls5vdjonfqgvwoj34otni: + /@wagmi/core@0.8.4(@babel/core@7.20.2)(@coinbase/wallet-sdk@3.6.3)(ethers@5.7.2)(react@18.2.0)(typescript@4.9.3): resolution: {integrity: sha512-orFRGOei+ixH8fIU9DitjKFSnv7sEv4j0A32gin2aADLuyBsAqG7xD+5LzfVD8EarHzU98Mk9d4hmmIkMg8bXw==} peerDependencies: '@coinbase/wallet-sdk': '>=3.6.0' @@ -4626,13 +4926,13 @@ packages: '@walletconnect/ethereum-provider': optional: true dependencies: - '@coinbase/wallet-sdk': 3.6.3 + '@coinbase/wallet-sdk': 3.6.3(@babel/core@7.20.2) '@wagmi/chains': 0.1.3 - '@wagmi/connectors': 0.1.1_lpbbub423epmm6q3g5mjjnmjwe - abitype: 0.2.5_typescript@4.9.3 + '@wagmi/connectors': 0.1.1(@babel/core@7.20.2)(@wagmi/core@0.8.4)(ethers@5.7.2)(typescript@4.9.3) + abitype: 0.2.5(typescript@4.9.3) ethers: 5.7.2 eventemitter3: 4.0.7 - zustand: 4.1.4 + zustand: 4.1.4(react@18.2.0) transitivePeerDependencies: - '@babel/core' - bufferutil @@ -4646,7 +4946,7 @@ packages: - zod dev: false - /@wagmi/core/0.8.4_km5vcydjtqolcouev6sh7bgmoy: + /@wagmi/core@0.8.4(@babel/core@7.20.2)(@coinbase/wallet-sdk@3.6.3)(ethers@5.7.2)(react@18.2.0)(typescript@4.9.5): resolution: {integrity: sha512-orFRGOei+ixH8fIU9DitjKFSnv7sEv4j0A32gin2aADLuyBsAqG7xD+5LzfVD8EarHzU98Mk9d4hmmIkMg8bXw==} peerDependencies: '@coinbase/wallet-sdk': '>=3.6.0' @@ -4658,13 +4958,13 @@ packages: '@walletconnect/ethereum-provider': optional: true dependencies: - '@coinbase/wallet-sdk': 3.6.3 + '@coinbase/wallet-sdk': 3.6.3(@babel/core@7.20.2) '@wagmi/chains': 0.1.3 - '@wagmi/connectors': 0.1.1_qumsokfsavwbqmluzzd5y4jcfa - abitype: 0.2.5_typescript@4.9.5 + '@wagmi/connectors': 0.1.1(@babel/core@7.20.2)(@wagmi/core@0.8.4)(ethers@5.7.2)(typescript@4.9.5) + abitype: 0.2.5(typescript@4.9.5) ethers: 5.7.2 eventemitter3: 4.0.7 - zustand: 4.1.4 + zustand: 4.1.4(react@18.2.0) transitivePeerDependencies: - '@babel/core' - bufferutil @@ -4678,7 +4978,7 @@ packages: - zod dev: false - /@walletconnect/browser-utils/1.8.0: + /@walletconnect/browser-utils@1.8.0: resolution: {integrity: sha512-Wcqqx+wjxIo9fv6eBUFHPsW1y/bGWWRboni5dfD8PtOmrihrEpOCmvRJe4rfl7xgJW8Ea9UqKEaq0bIRLHlK4A==} dependencies: '@walletconnect/safe-json': 1.0.0 @@ -4688,7 +4988,7 @@ packages: detect-browser: 5.2.0 dev: false - /@walletconnect/client/1.8.0: + /@walletconnect/client@1.8.0: resolution: {integrity: sha512-svyBQ14NHx6Cs2j4TpkQaBI/2AF4+LXz64FojTjMtV4VMMhl81jSO1vNeg+yYhQzvjcGH/GpSwixjyCW0xFBOQ==} deprecated: 'WalletConnect''s v1 SDKs are now deprecated. Please upgrade to a v2 SDK. For details see: https://docs.walletconnect.com/' dependencies: @@ -4701,7 +5001,7 @@ packages: - utf-8-validate dev: false - /@walletconnect/core/1.8.0: + /@walletconnect/core@1.8.0: resolution: {integrity: sha512-aFTHvEEbXcZ8XdWBw6rpQDte41Rxwnuk3SgTD8/iKGSRTni50gI9S3YEzMj05jozSiOBxQci4pJDMVhIUMtarw==} dependencies: '@walletconnect/socket-transport': 1.8.0 @@ -4712,7 +5012,7 @@ packages: - utf-8-validate dev: false - /@walletconnect/crypto/1.0.3: + /@walletconnect/crypto@1.0.3: resolution: {integrity: sha512-+2jdORD7XQs76I2Odgr3wwrtyuLUXD/kprNVsjWRhhhdO9Mt6WqVzOPu0/t7OHSmgal8k7SoBQzUc5hu/8zL/g==} dependencies: '@walletconnect/encoding': 1.0.2 @@ -4723,7 +5023,7 @@ packages: tslib: 1.14.1 dev: false - /@walletconnect/encoding/1.0.2: + /@walletconnect/encoding@1.0.2: resolution: {integrity: sha512-CrwSBrjqJ7rpGQcTL3kU+Ief+Bcuu9PH6JLOb+wM6NITX1GTxR/MfNwnQfhLKK6xpRAyj2/nM04OOH6wS8Imag==} dependencies: is-typedarray: 1.0.0 @@ -4731,13 +5031,13 @@ packages: typedarray-to-buffer: 3.1.5 dev: false - /@walletconnect/environment/1.0.1: + /@walletconnect/environment@1.0.1: resolution: {integrity: sha512-T426LLZtHj8e8rYnKfzsw1aG6+M0BT1ZxayMdv/p8yM0MU+eJDISqNY3/bccxRr4LrF9csq02Rhqt08Ibl0VRg==} dependencies: tslib: 1.14.1 dev: false - /@walletconnect/ethereum-provider/1.8.0: + /@walletconnect/ethereum-provider@1.8.0: resolution: {integrity: sha512-Nq9m+oo5P0F+njsROHw9KMWdoc/8iGHYzQdkjJN/1C7DtsqFRg5k5a3hd9rzCLpbPsOC1q8Z5lRs6JQgDvPm6Q==} dependencies: '@walletconnect/client': 1.8.0 @@ -4755,7 +5055,7 @@ packages: - utf-8-validate dev: false - /@walletconnect/iso-crypto/1.8.0: + /@walletconnect/iso-crypto@1.8.0: resolution: {integrity: sha512-pWy19KCyitpfXb70hA73r9FcvklS+FvO9QUIttp3c2mfW8frxgYeRXfxLRCIQTkaYueRKvdqPjbyhPLam508XQ==} dependencies: '@walletconnect/crypto': 1.0.3 @@ -4763,7 +5063,7 @@ packages: '@walletconnect/utils': 1.8.0 dev: false - /@walletconnect/jsonrpc-http-connection/1.0.4: + /@walletconnect/jsonrpc-http-connection@1.0.4: resolution: {integrity: sha512-ji79pspdBhmIbTwve383tMaDu5Le9plW+oj5GE2aqzxIl3ib8JvRBZRn5lGEBGqVCvqB3MBJL7gBlEwpyRtoxQ==} dependencies: '@walletconnect/jsonrpc-utils': 1.0.4 @@ -4774,7 +5074,7 @@ packages: - encoding dev: false - /@walletconnect/jsonrpc-provider/1.0.6: + /@walletconnect/jsonrpc-provider@1.0.6: resolution: {integrity: sha512-f5vQxr53vUVQ51/9mRLb1OiNciT/546XZ68Byn9OYnDBGeGJXK2kQWDHp8sPWZbN5x0p7B6asdCWMVFJ6danlw==} dependencies: '@walletconnect/jsonrpc-utils': 1.0.4 @@ -4782,14 +5082,14 @@ packages: tslib: 1.14.1 dev: false - /@walletconnect/jsonrpc-types/1.0.2: + /@walletconnect/jsonrpc-types@1.0.2: resolution: {integrity: sha512-CZe8tjJX73OWdHjrBHy7HtAapJ2tT0Q3TYhPBhRxi3643lwPIQWC9En45ldY14TZwgSewkbZ0FtGBZK0G7Bbyg==} dependencies: keyvaluestorage-interface: 1.0.0 tslib: 1.14.1 dev: false - /@walletconnect/jsonrpc-utils/1.0.4: + /@walletconnect/jsonrpc-utils@1.0.4: resolution: {integrity: sha512-y0+tDxcTZ9BHBBKBJbjZxLUXb+zQZCylf7y/jTvDPNx76J0hYYc+F9zHzyqBLeorSKepLTk6yI8hw3NXbAQB3g==} dependencies: '@walletconnect/environment': 1.0.1 @@ -4797,12 +5097,12 @@ packages: tslib: 1.14.1 dev: false - /@walletconnect/mobile-registry/1.4.0: + /@walletconnect/mobile-registry@1.4.0: resolution: {integrity: sha512-ZtKRio4uCZ1JUF7LIdecmZt7FOLnX72RPSY7aUVu7mj7CSfxDwUn6gBuK6WGtH+NZCldBqDl5DenI5fFSvkKYw==} deprecated: 'Deprecated in favor of dynamic registry available from: https://github.com/walletconnect/walletconnect-registry' dev: false - /@walletconnect/qrcode-modal/1.8.0: + /@walletconnect/qrcode-modal@1.8.0: resolution: {integrity: sha512-BueaFefaAi8mawE45eUtztg3ZFbsAH4DDXh1UNwdUlsvFMjqcYzLUG0xZvDd6z2eOpbgDg2N3bl6gF0KONj1dg==} deprecated: 'WalletConnect''s v1 SDKs are now deprecated. Please upgrade to a v2 SDK. For details see: https://docs.walletconnect.com/' dependencies: @@ -4814,7 +5114,7 @@ packages: qrcode: 1.4.4 dev: false - /@walletconnect/randombytes/1.0.3: + /@walletconnect/randombytes@1.0.3: resolution: {integrity: sha512-35lpzxcHFbTN3ABefC9W+uBpNZl1GC4Wpx0ed30gibfO/y9oLdy1NznbV96HARQKSBV9J9M/rrtIvf6a23jfYw==} dependencies: '@walletconnect/encoding': 1.0.2 @@ -4823,17 +5123,17 @@ packages: tslib: 1.14.1 dev: false - /@walletconnect/safe-json/1.0.0: + /@walletconnect/safe-json@1.0.0: resolution: {integrity: sha512-QJzp/S/86sUAgWY6eh5MKYmSfZaRpIlmCJdi5uG4DJlKkZrHEF7ye7gA+VtbVzvTtpM/gRwO2plQuiooIeXjfg==} dev: false - /@walletconnect/safe-json/1.0.1: + /@walletconnect/safe-json@1.0.1: resolution: {integrity: sha512-Fm7e31oSYY15NQr8SsLJheKAy5L744udZf2lJKcz6wFmPJEzf7hOF0866o/rrldRzJnjZ4H2GJ45pFudsnLW5A==} dependencies: tslib: 1.14.1 dev: false - /@walletconnect/signer-connection/1.8.0: + /@walletconnect/signer-connection@1.8.0: resolution: {integrity: sha512-+YAaTAP52MWZJ2wWnqKClKCPlPHBo6reURFe0cWidLADh9mi/kPWGALZ5AENK22zpem1bbKV466rF5Rzvu0ehA==} dependencies: '@walletconnect/client': 1.8.0 @@ -4847,7 +5147,7 @@ packages: - utf-8-validate dev: false - /@walletconnect/socket-transport/1.8.0: + /@walletconnect/socket-transport@1.8.0: resolution: {integrity: sha512-5DyIyWrzHXTcVp0Vd93zJ5XMW61iDM6bcWT4p8DTRfFsOtW46JquruMhxOLeCOieM4D73kcr3U7WtyR4JUsGuQ==} dependencies: '@walletconnect/types': 1.8.0 @@ -4858,12 +5158,12 @@ packages: - utf-8-validate dev: false - /@walletconnect/types/1.8.0: + /@walletconnect/types@1.8.0: resolution: {integrity: sha512-Cn+3I0V0vT9ghMuzh1KzZvCkiAxTq+1TR2eSqw5E5AVWfmCtECFkVZBP6uUJZ8YjwLqXheI+rnjqPy7sVM4Fyg==} deprecated: 'WalletConnect''s v1 SDKs are now deprecated. Please upgrade to a v2 SDK. For details see: https://docs.walletconnect.com/' dev: false - /@walletconnect/utils/1.8.0: + /@walletconnect/utils@1.8.0: resolution: {integrity: sha512-zExzp8Mj1YiAIBfKNm5u622oNw44WOESzo6hj+Q3apSMIb0Jph9X3GDIdbZmvVZsNPxWDL7uodKgZcCInZv2vA==} dependencies: '@walletconnect/browser-utils': 1.8.0 @@ -4875,42 +5175,42 @@ packages: query-string: 6.13.5 dev: false - /@walletconnect/window-getters/1.0.0: + /@walletconnect/window-getters@1.0.0: resolution: {integrity: sha512-xB0SQsLaleIYIkSsl43vm8EwETpBzJ2gnzk7e0wMF3ktqiTGS6TFHxcprMl5R44KKh4tCcHCJwolMCaDSwtAaA==} dev: false - /@walletconnect/window-getters/1.0.1: + /@walletconnect/window-getters@1.0.1: resolution: {integrity: sha512-vHp+HqzGxORPAN8gY03qnbTMnhqIwjeRJNOMOAzePRg4xVEEE2WvYsI9G2NMjOknA8hnuYbU3/hwLcKbjhc8+Q==} dependencies: tslib: 1.14.1 dev: false - /@walletconnect/window-metadata/1.0.0: + /@walletconnect/window-metadata@1.0.0: resolution: {integrity: sha512-9eFvmJxIKCC3YWOL97SgRkKhlyGXkrHwamfechmqszbypFspaSk+t2jQXAEU7YClHF6Qjw5eYOmy1//zFi9/GA==} dependencies: '@walletconnect/window-getters': 1.0.1 dev: false - /@webassemblyjs/ast/1.11.1: + /@webassemblyjs/ast@1.11.1: resolution: {integrity: sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw==} dependencies: '@webassemblyjs/helper-numbers': 1.11.1 '@webassemblyjs/helper-wasm-bytecode': 1.11.1 dev: true - /@webassemblyjs/floating-point-hex-parser/1.11.1: + /@webassemblyjs/floating-point-hex-parser@1.11.1: resolution: {integrity: sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ==} dev: true - /@webassemblyjs/helper-api-error/1.11.1: + /@webassemblyjs/helper-api-error@1.11.1: resolution: {integrity: sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg==} dev: true - /@webassemblyjs/helper-buffer/1.11.1: + /@webassemblyjs/helper-buffer@1.11.1: resolution: {integrity: sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA==} dev: true - /@webassemblyjs/helper-numbers/1.11.1: + /@webassemblyjs/helper-numbers@1.11.1: resolution: {integrity: sha512-vDkbxiB8zfnPdNK9Rajcey5C0w+QJugEglN0of+kmO8l7lDb77AnlKYQF7aarZuCrv+l0UvqL+68gSDr3k9LPQ==} dependencies: '@webassemblyjs/floating-point-hex-parser': 1.11.1 @@ -4918,11 +5218,11 @@ packages: '@xtuc/long': 4.2.2 dev: true - /@webassemblyjs/helper-wasm-bytecode/1.11.1: + /@webassemblyjs/helper-wasm-bytecode@1.11.1: resolution: {integrity: sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q==} dev: true - /@webassemblyjs/helper-wasm-section/1.11.1: + /@webassemblyjs/helper-wasm-section@1.11.1: resolution: {integrity: sha512-10P9No29rYX1j7F3EVPX3JvGPQPae+AomuSTPiF9eBQeChHI6iqjMIwR9JmOJXwpnn/oVGDk7I5IlskuMwU/pg==} dependencies: '@webassemblyjs/ast': 1.11.1 @@ -4931,23 +5231,23 @@ packages: '@webassemblyjs/wasm-gen': 1.11.1 dev: true - /@webassemblyjs/ieee754/1.11.1: + /@webassemblyjs/ieee754@1.11.1: resolution: {integrity: sha512-hJ87QIPtAMKbFq6CGTkZYJivEwZDbQUgYd3qKSadTNOhVY7p+gfP6Sr0lLRVTaG1JjFj+r3YchoqRYxNH3M0GQ==} dependencies: '@xtuc/ieee754': 1.2.0 dev: true - /@webassemblyjs/leb128/1.11.1: + /@webassemblyjs/leb128@1.11.1: resolution: {integrity: sha512-BJ2P0hNZ0u+Th1YZXJpzW6miwqQUGcIHT1G/sf72gLVD9DZ5AdYTqPNbHZh6K1M5VmKvFXwGSWZADz+qBWxeRw==} dependencies: '@xtuc/long': 4.2.2 dev: true - /@webassemblyjs/utf8/1.11.1: + /@webassemblyjs/utf8@1.11.1: resolution: {integrity: sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ==} dev: true - /@webassemblyjs/wasm-edit/1.11.1: + /@webassemblyjs/wasm-edit@1.11.1: resolution: {integrity: sha512-g+RsupUC1aTHfR8CDgnsVRVZFJqdkFHpsHMfJuWQzWU3tvnLC07UqHICfP+4XyL2tnr1amvl1Sdp06TnYCmVkA==} dependencies: '@webassemblyjs/ast': 1.11.1 @@ -4960,7 +5260,7 @@ packages: '@webassemblyjs/wast-printer': 1.11.1 dev: true - /@webassemblyjs/wasm-gen/1.11.1: + /@webassemblyjs/wasm-gen@1.11.1: resolution: {integrity: sha512-F7QqKXwwNlMmsulj6+O7r4mmtAlCWfO/0HdgOxSklZfQcDu0TpLiD1mRt/zF25Bk59FIjEuGAIyn5ei4yMfLhA==} dependencies: '@webassemblyjs/ast': 1.11.1 @@ -4970,7 +5270,7 @@ packages: '@webassemblyjs/utf8': 1.11.1 dev: true - /@webassemblyjs/wasm-opt/1.11.1: + /@webassemblyjs/wasm-opt@1.11.1: resolution: {integrity: sha512-VqnkNqnZlU5EB64pp1l7hdm3hmQw7Vgqa0KF/KCNO9sIpI6Fk6brDEiX+iCOYrvMuBWDws0NkTOxYEb85XQHHw==} dependencies: '@webassemblyjs/ast': 1.11.1 @@ -4979,7 +5279,7 @@ packages: '@webassemblyjs/wasm-parser': 1.11.1 dev: true - /@webassemblyjs/wasm-parser/1.11.1: + /@webassemblyjs/wasm-parser@1.11.1: resolution: {integrity: sha512-rrBujw+dJu32gYB7/Lup6UhdkPx9S9SnobZzRVL7VcBH9Bt9bCBLEuX/YXOOtBsOZ4NQrRykKhffRWHvigQvOA==} dependencies: '@webassemblyjs/ast': 1.11.1 @@ -4990,30 +5290,30 @@ packages: '@webassemblyjs/utf8': 1.11.1 dev: true - /@webassemblyjs/wast-printer/1.11.1: + /@webassemblyjs/wast-printer@1.11.1: resolution: {integrity: sha512-IQboUWM4eKzWW+N/jij2sRatKMh99QEelo3Eb2q0qXkvPRISAj8Qxtmw5itwqK+TTkBuUIE45AxYPToqPtL5gg==} dependencies: '@webassemblyjs/ast': 1.11.1 '@xtuc/long': 4.2.2 dev: true - /@xtuc/ieee754/1.2.0: + /@xtuc/ieee754@1.2.0: resolution: {integrity: sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==} dev: true - /@xtuc/long/4.2.2: + /@xtuc/long@4.2.2: resolution: {integrity: sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==} dev: true - /@yarnpkg/lockfile/1.1.0: + /@yarnpkg/lockfile@1.1.0: resolution: {integrity: sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ==} dev: true - /@zerodevx/svelte-toast/0.6.3: + /@zerodevx/svelte-toast@0.6.3: resolution: {integrity: sha512-k0W1JFoqHIcIQaP9ij99+Rv0ugaQSSNwOuNwwmTGRjWtIqrQr+ExLDE8LQGXLlJIprqDyMWB4lJkUql/r0RAtA==} dev: true - /JSONStream/1.3.5: + /JSONStream@1.3.5: resolution: {integrity: sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==} hasBin: true dependencies: @@ -5021,15 +5321,15 @@ packages: through: 2.3.8 dev: false - /abab/2.0.6: + /abab@2.0.6: resolution: {integrity: sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==} dev: true - /abbrev/1.0.9: + /abbrev@1.0.9: resolution: {integrity: sha512-LEyx4aLEC3x6T0UguF6YILf+ntvmOaWsVfENmIW0E9H09vKlLDGelMjjSm0jkDHALj8A8quZ/HapKNigzwge+Q==} dev: true - /abitype/0.1.8_typescript@4.9.3: + /abitype@0.1.8(typescript@4.9.3): resolution: {integrity: sha512-2pde0KepTzdfu19ZrzYTYVIWo69+6UbBCY4B1RDiwWgo2XZtFSJhF6C+XThuRXbbZ823J0Rw1Y5cP0NXYVcCdQ==} engines: {pnpm: '>=7'} peerDependencies: @@ -5038,7 +5338,7 @@ packages: typescript: 4.9.3 dev: false - /abitype/0.1.8_typescript@4.9.5: + /abitype@0.1.8(typescript@4.9.5): resolution: {integrity: sha512-2pde0KepTzdfu19ZrzYTYVIWo69+6UbBCY4B1RDiwWgo2XZtFSJhF6C+XThuRXbbZ823J0Rw1Y5cP0NXYVcCdQ==} engines: {pnpm: '>=7'} peerDependencies: @@ -5047,7 +5347,7 @@ packages: typescript: 4.9.5 dev: false - /abitype/0.2.5_typescript@4.9.3: + /abitype@0.2.5(typescript@4.9.3): resolution: {integrity: sha512-t1iiokWYpkrziu4WL2Gb6YdGvaP9ZKs7WnA39TI8TsW2E99GVRgDPW/xOKhzoCdyxOYt550CNYEFluCwGaFHaA==} engines: {pnpm: '>=7'} peerDependencies: @@ -5060,7 +5360,7 @@ packages: typescript: 4.9.3 dev: false - /abitype/0.2.5_typescript@4.9.5: + /abitype@0.2.5(typescript@4.9.5): resolution: {integrity: sha512-t1iiokWYpkrziu4WL2Gb6YdGvaP9ZKs7WnA39TI8TsW2E99GVRgDPW/xOKhzoCdyxOYt550CNYEFluCwGaFHaA==} engines: {pnpm: '>=7'} peerDependencies: @@ -5073,14 +5373,14 @@ packages: typescript: 4.9.5 dev: false - /abort-controller/3.0.0: + /abort-controller@3.0.0: resolution: {integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==} engines: {node: '>=6.5'} dependencies: event-target-shim: 5.0.1 dev: true - /abstract-level/1.0.3: + /abstract-level@1.0.3: resolution: {integrity: sha512-t6jv+xHy+VYwc4xqZMn2Pa9DjcdzvzZmQGRjTFc8spIbRGHgBrEKbPq+rYXc7CCo0lxgYvSgKVg9qZAhpVQSjA==} engines: {node: '>=12'} dependencies: @@ -5093,39 +5393,39 @@ packages: queue-microtask: 1.2.3 dev: true - /abstract-leveldown/0.12.4: + /abstract-leveldown@0.12.4: resolution: {integrity: sha512-TOod9d5RDExo6STLMGa+04HGkl+TlMfbDnTyN93/ETJ9DpQ0DaYLqcMZlbXvdc4W3vVo1Qrl+WhSp8zvDsJ+jA==} dependencies: xtend: 3.0.0 dev: true - /abstract-leveldown/2.6.3: + /abstract-leveldown@2.6.3: resolution: {integrity: sha512-2++wDf/DYqkPR3o5tbfdhF96EfMApo1GpPfzOsR/ZYXdkSmELlvOOEAl9iKkRsktMPHdGjO4rtkBpf2I7TiTeA==} dependencies: xtend: 4.0.2 dev: true - /abstract-leveldown/2.7.2: + /abstract-leveldown@2.7.2: resolution: {integrity: sha512-+OVvxH2rHVEhWLdbudP6p0+dNMXu8JA1CbhP19T8paTYAcX7oJ4OVjT+ZUVpv7mITxXHqDMej+GdqXBmXkw09w==} dependencies: xtend: 4.0.2 dev: true - /abstract-leveldown/3.0.0: + /abstract-leveldown@3.0.0: resolution: {integrity: sha512-KUWx9UWGQD12zsmLNj64/pndaz4iJh/Pj7nopgkfDG6RlCcbMZvT6+9l7dchK4idog2Is8VdC/PvNbFuFmalIQ==} engines: {node: '>=4'} dependencies: xtend: 4.0.2 dev: true - /abstract-leveldown/5.0.0: + /abstract-leveldown@5.0.0: resolution: {integrity: sha512-5mU5P1gXtsMIXg65/rsYGsi93+MlogXZ9FA8JnwKurHQg64bfXwGYVdVdijNTVNOlAsuIiOwHdvFFD5JqCJQ7A==} engines: {node: '>=6'} dependencies: xtend: 4.0.2 dev: true - /abstract-leveldown/6.2.3: + /abstract-leveldown@6.2.3: resolution: {integrity: sha512-BsLm5vFMRUrrLeCcRc+G0t2qOaTzpoJQLOubq2XM72eNpjF5UdU5o/5NvlNhx95XHcAvcl8OMXr4mlg/fRgUXQ==} engines: {node: '>=6'} dependencies: @@ -5136,7 +5436,7 @@ packages: xtend: 4.0.2 dev: true - /abstract-leveldown/6.3.0: + /abstract-leveldown@6.3.0: resolution: {integrity: sha512-TU5nlYgta8YrBMNpc9FwQzRbiXsj49gsALsXadbGHt9CROPzX5fB0rWDR5mtdpOOKa5XqRFpbj1QroPAoPzVjQ==} engines: {node: '>=6'} dependencies: @@ -5147,7 +5447,7 @@ packages: xtend: 4.0.2 dev: true - /accepts/1.3.8: + /accepts@1.3.8: resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==} engines: {node: '>= 0.6'} dependencies: @@ -5156,14 +5456,14 @@ packages: dev: true optional: true - /acorn-globals/6.0.0: + /acorn-globals@6.0.0: resolution: {integrity: sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg==} dependencies: acorn: 7.4.1 acorn-walk: 7.2.0 dev: true - /acorn-import-assertions/1.8.0_acorn@8.8.2: + /acorn-import-assertions@1.8.0(acorn@8.8.2): resolution: {integrity: sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw==} peerDependencies: acorn: ^8 @@ -5171,7 +5471,7 @@ packages: acorn: 8.8.2 dev: true - /acorn-jsx/5.3.2_acorn@7.4.1: + /acorn-jsx@5.3.2(acorn@7.4.1): resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} peerDependencies: acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 @@ -5179,15 +5479,14 @@ packages: acorn: 7.4.1 dev: true - /acorn-jsx/5.3.2_acorn@8.8.2: + /acorn-jsx@5.3.2(acorn@8.8.2): resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} peerDependencies: acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 dependencies: acorn: 8.8.2 - dev: false - /acorn-node/1.8.2: + /acorn-node@1.8.2: resolution: {integrity: sha512-8mt+fslDufLYntIoPAaIMUe/lrbrehIiwmR3t2k9LljIzoigEPF27eLk2hy8zSGzmR/ogr7zbRKINMo1u0yh5A==} dependencies: acorn: 7.4.1 @@ -5195,63 +5494,63 @@ packages: xtend: 4.0.2 dev: true - /acorn-walk/7.2.0: + /acorn-walk@7.2.0: resolution: {integrity: sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==} engines: {node: '>=0.4.0'} dev: true - /acorn-walk/8.2.0: + /acorn-walk@8.2.0: resolution: {integrity: sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==} engines: {node: '>=0.4.0'} dev: true - /acorn/7.4.1: + /acorn@7.4.1: resolution: {integrity: sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==} engines: {node: '>=0.4.0'} hasBin: true dev: true - /acorn/8.8.2: + /acorn@8.8.2: resolution: {integrity: sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==} engines: {node: '>=0.4.0'} hasBin: true - /address/1.2.2: + /address@1.2.2: resolution: {integrity: sha512-4B/qKCfeE/ODUaAUpSwfzazo5x29WD4r3vXiWsB7I2mSDAihwEqKO+g8GELZUQSSAo5e1XTYh3ZVfLyxBc12nA==} engines: {node: '>= 10.0.0'} dev: true - /adm-zip/0.4.16: + /adm-zip@0.4.16: resolution: {integrity: sha512-TFi4HBKSGfIKsK5YCkKaaFG2m4PEDyViZmEwof3MTIgzimHLto6muaHVpbrljdIvIrFZzEq/p4nafOeLcYegrg==} engines: {node: '>=0.3.0'} dev: true - /aes-js/3.0.0: + /aes-js@3.0.0: resolution: {integrity: sha512-H7wUZRn8WpTq9jocdxQ2c8x2sKo9ZVmzfRE13GiNJXfp7NcKYEdvl3vspKjXox6RIG2VtaRe4JFvxG4rqp2Zuw==} - /aes-js/3.1.2: + /aes-js@3.1.2: resolution: {integrity: sha512-e5pEa2kBnBOgR4Y/p20pskXI74UEz7de8ZGVo58asOtvSVG5YAbJeELPZxOmt+Bnz3rX753YKhfIn4X4l1PPRQ==} - /agent-base/6.0.2: + /agent-base@6.0.2: resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} engines: {node: '>= 6.0.0'} dependencies: - debug: 4.3.4 + debug: 4.3.4(supports-color@8.1.1) transitivePeerDependencies: - supports-color dev: true - /agentkeepalive/4.2.1: + /agentkeepalive@4.2.1: resolution: {integrity: sha512-Zn4cw2NEqd+9fiSVWMscnjyQ1a8Yfoc5oBajLeo5w+YBHgDUcEBY2hS4YpTz6iN5f/2zQiktcuM6tS8x1p9dpA==} engines: {node: '>= 8.0.0'} dependencies: - debug: 4.3.4 + debug: 4.3.4(supports-color@8.1.1) depd: 1.1.2 humanize-ms: 1.2.1 transitivePeerDependencies: - supports-color - /aggregate-error/3.1.0: + /aggregate-error@3.1.0: resolution: {integrity: sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==} engines: {node: '>=8'} dependencies: @@ -5259,7 +5558,7 @@ packages: indent-string: 4.0.0 dev: true - /ajv-keywords/3.5.2_ajv@6.12.6: + /ajv-keywords@3.5.2(ajv@6.12.6): resolution: {integrity: sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==} peerDependencies: ajv: ^6.9.1 @@ -5267,7 +5566,7 @@ packages: ajv: 6.12.6 dev: true - /ajv/6.12.6: + /ajv@6.12.6: resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} dependencies: fast-deep-equal: 3.1.3 @@ -5276,7 +5575,7 @@ packages: uri-js: 4.4.1 dev: true - /ajv/8.12.0: + /ajv@8.12.0: resolution: {integrity: sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==} dependencies: fast-deep-equal: 3.1.3 @@ -5285,98 +5584,98 @@ packages: uri-js: 4.4.1 dev: true - /amdefine/1.0.1: + /amdefine@1.0.1: resolution: {integrity: sha512-S2Hw0TtNkMJhIabBwIojKL9YHO5T0n5eNqWJ7Lrlel/zDbftQpxpapi8tZs3X1HWa+u+QeydGmzzNU0m09+Rcg==} engines: {node: '>=0.4.2'} dev: true optional: true - /ansi-colors/3.2.3: + /ansi-colors@3.2.3: resolution: {integrity: sha512-LEHHyuhlPY3TmuUYMh2oz89lTShfvgbmzaBcxve9t/9Wuy7Dwf4yoAKcND7KFT1HAQfqZ12qtc+DUrBMeKF9nw==} engines: {node: '>=6'} dev: true - /ansi-colors/4.1.1: + /ansi-colors@4.1.1: resolution: {integrity: sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==} engines: {node: '>=6'} dev: true - /ansi-colors/4.1.3: + /ansi-colors@4.1.3: resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==} engines: {node: '>=6'} dev: true - /ansi-escapes/4.3.2: + /ansi-escapes@4.3.2: resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==} engines: {node: '>=8'} dependencies: type-fest: 0.21.3 dev: true - /ansi-regex/2.1.1: + /ansi-regex@2.1.1: resolution: {integrity: sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==} engines: {node: '>=0.10.0'} dev: true - /ansi-regex/3.0.1: + /ansi-regex@3.0.1: resolution: {integrity: sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==} engines: {node: '>=4'} dev: true - /ansi-regex/4.1.1: + /ansi-regex@4.1.1: resolution: {integrity: sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==} engines: {node: '>=6'} - /ansi-regex/5.0.1: + /ansi-regex@5.0.1: resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} engines: {node: '>=8'} - /ansi-regex/6.0.1: + /ansi-regex@6.0.1: resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==} engines: {node: '>=12'} dev: true - /ansi-sequence-parser/1.1.0: + /ansi-sequence-parser@1.1.0: resolution: {integrity: sha512-lEm8mt52to2fT8GhciPCGeCXACSz2UwIN4X2e2LJSnZ5uAbn2/dsYdOmUXq0AtWS5cpAupysIneExOgH0Vd2TQ==} dev: false - /ansi-styles/2.2.1: + /ansi-styles@2.2.1: resolution: {integrity: sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==} engines: {node: '>=0.10.0'} dev: true - /ansi-styles/3.2.1: + /ansi-styles@3.2.1: resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} engines: {node: '>=4'} dependencies: color-convert: 1.9.3 - /ansi-styles/4.3.0: + /ansi-styles@4.3.0: resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} engines: {node: '>=8'} dependencies: color-convert: 2.0.1 - /ansi-styles/5.2.0: + /ansi-styles@5.2.0: resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} engines: {node: '>=10'} dev: true - /ansi-styles/6.2.1: + /ansi-styles@6.2.1: resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} engines: {node: '>=12'} dev: true - /antlr4/4.12.0: + /antlr4@4.12.0: resolution: {integrity: sha512-23iB5IzXJZRZeK9TigzUyrNc9pSmNqAerJRBcNq1ETrmttMWRgaYZzC561IgEO3ygKsDJTYDTozABXa4b/fTQQ==} engines: {node: '>=16'} dev: true - /antlr4ts/0.5.0-alpha.4: + /antlr4ts@0.5.0-alpha.4: resolution: {integrity: sha512-WPQDt1B74OfPv/IMS2ekXAKkTZIHl88uMetg6q3OTqgFxZ/dxDXI0EWLyZid/1Pe6hTftyg5N7gel5wNAGxXyQ==} dev: true - /anymatch/3.1.3: + /anymatch@3.1.3: resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} engines: {node: '>= 8'} dependencies: @@ -5384,15 +5683,15 @@ packages: picomatch: 2.3.1 dev: true - /aproba/2.0.0: + /aproba@2.0.0: resolution: {integrity: sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==} dev: true - /arch/2.2.0: + /arch@2.2.0: resolution: {integrity: sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ==} dev: false - /are-we-there-yet/2.0.0: + /are-we-there-yet@2.0.0: resolution: {integrity: sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==} engines: {node: '>=10'} dependencies: @@ -5400,7 +5699,7 @@ packages: readable-stream: 3.6.2 dev: true - /are-we-there-yet/3.0.1: + /are-we-there-yet@3.0.1: resolution: {integrity: sha512-QZW4EDmGwlYur0Yyf/b2uGucHQMa8aFUP7eu9ddR73vvhFyt4V0Vl3QHPcTNJ8l6qYOBdxgXdnBXQrHilfRQBg==} engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} dependencies: @@ -5408,67 +5707,67 @@ packages: readable-stream: 3.6.2 dev: true - /arg/1.0.0: + /arg@1.0.0: resolution: {integrity: sha512-Wk7TEzl1KqvTGs/uyhmHO/3XLd3t1UeU4IstvPXVzGPM522cTjqjNZ99esCkcL52sjqjo8e8CTBcWhkxvGzoAw==} dev: false - /arg/4.1.3: + /arg@4.1.3: resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==} dev: true - /arg/5.0.2: + /arg@5.0.2: resolution: {integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==} dev: true - /argparse/1.0.10: + /argparse@1.0.10: resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} dependencies: sprintf-js: 1.0.3 - /argparse/2.0.1: + /argparse@2.0.1: resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} - /argv/0.0.2: + /argv@0.0.2: resolution: {integrity: sha512-dEamhpPEwRUBpLNHeuCm/v+g0anFByHahxodVO/BbAarHVBBg2MccCwf9K+o1Pof+2btdnkJelYVUWjW/VrATw==} engines: {node: '>=0.6.10'} deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. dev: false - /arr-diff/4.0.0: + /arr-diff@4.0.0: resolution: {integrity: sha512-YVIQ82gZPGBebQV/a8dar4AitzCQs0jjXwMPZllpXMaGjXPYVUawSxQrRsjhjupyVxEvbHgUmIhKVlND+j02kA==} engines: {node: '>=0.10.0'} dev: true - /arr-flatten/1.1.0: + /arr-flatten@1.1.0: resolution: {integrity: sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==} engines: {node: '>=0.10.0'} dev: true - /arr-union/3.1.0: + /arr-union@3.1.0: resolution: {integrity: sha512-sKpyeERZ02v1FeCZT8lrfJq5u6goHCtpTAzPwJYe7c8SPFOboNjNg1vz2L4VTn9T4PQxEx13TbXLmYUcS6Ug7Q==} engines: {node: '>=0.10.0'} dev: true - /array-back/1.0.4: + /array-back@1.0.4: resolution: {integrity: sha512-1WxbZvrmyhkNoeYcizokbmh5oiOCIfyvGtcqbK3Ls1v1fKcquzxnQSceOx6tzq7jmai2kFLWIpGND2cLhH6TPw==} engines: {node: '>=0.12.0'} dependencies: typical: 2.6.1 dev: true - /array-back/2.0.0: + /array-back@2.0.0: resolution: {integrity: sha512-eJv4pLLufP3g5kcZry0j6WXpIbzYw9GUB4mVJZno9wfwiBxbizTnHCw3VJb07cBihbFX48Y7oSrW9y+gt4glyw==} engines: {node: '>=4'} dependencies: typical: 2.6.1 dev: true - /array-flatten/1.1.1: + /array-flatten@1.1.1: resolution: {integrity: sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==} dev: true optional: true - /array-includes/3.1.6: + /array-includes@3.1.6: resolution: {integrity: sha512-sgTbLvL6cNnw24FnbaDyjmvddQ2ML8arZsgaJhoABMoplz/4QRhtrYS+alr1BUM1Bwp6dhx8vVCBSLG+StwOFw==} engines: {node: '>= 0.4'} dependencies: @@ -5479,22 +5778,22 @@ packages: is-string: 1.0.7 dev: true - /array-union/2.1.0: + /array-union@2.1.0: resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} engines: {node: '>=8'} dev: true - /array-uniq/1.0.3: + /array-uniq@1.0.3: resolution: {integrity: sha512-MNha4BWQ6JbwhFhj03YK552f7cb3AzoE8SzeljgChvL1dl3IcvggXVz1DilzySZkCja+CXuZbdW7yATchWn8/Q==} engines: {node: '>=0.10.0'} dev: true - /array-unique/0.3.2: + /array-unique@0.3.2: resolution: {integrity: sha512-SleRWjh9JUud2wH1hPs9rZBZ33H6T9HOiL0uwGnGx9FpE6wKGyfWugmbkEOIs6qWrZhg0LWeLziLrEwQJhs5mQ==} engines: {node: '>=0.10.0'} dev: true - /array.prototype.flat/1.3.1: + /array.prototype.flat@1.3.1: resolution: {integrity: sha512-roTU0KWIOmJ4DRLmwKd19Otg0/mT3qPNt0Qb3GWW8iObuZXxrjB/pzn0R3hqpRSWg4HCwqx+0vwOnWnvlOyeIA==} engines: {node: '>= 0.4'} dependencies: @@ -5504,7 +5803,7 @@ packages: es-shim-unscopables: 1.0.0 dev: true - /array.prototype.flatmap/1.3.1: + /array.prototype.flatmap@1.3.1: resolution: {integrity: sha512-8UGn9O1FDVvMNB0UlLv4voxRMze7+FpHyF5mSMRjWHUMlpoDViniy05870VlxhfgTnLbpuwTzvD76MTtWxB/mQ==} engines: {node: '>= 0.4'} dependencies: @@ -5514,7 +5813,7 @@ packages: es-shim-unscopables: 1.0.0 dev: true - /array.prototype.reduce/1.0.5: + /array.prototype.reduce@1.0.5: resolution: {integrity: sha512-kDdugMl7id9COE8R7MHF5jWk7Dqt/fs4Pv+JXoICnYwqpjjjbUurz6w5fT5IG6brLdJhv6/VoHB0H7oyIBXd+Q==} engines: {node: '>= 0.4'} dependencies: @@ -5525,16 +5824,16 @@ packages: is-string: 1.0.7 dev: true - /arrify/1.0.1: + /arrify@1.0.1: resolution: {integrity: sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==} engines: {node: '>=0.10.0'} dev: true - /asap/2.0.6: + /asap@2.0.6: resolution: {integrity: sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==} dev: true - /asn1.js/5.4.1: + /asn1.js@5.4.1: resolution: {integrity: sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==} dependencies: bn.js: 4.12.0 @@ -5543,91 +5842,91 @@ packages: safer-buffer: 2.1.2 dev: true - /asn1/0.2.6: + /asn1@0.2.6: resolution: {integrity: sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==} dependencies: safer-buffer: 2.1.2 dev: true - /assert-plus/1.0.0: + /assert-plus@1.0.0: resolution: {integrity: sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==} engines: {node: '>=0.8'} dev: true - /assertion-error/1.1.0: + /assertion-error@1.1.0: resolution: {integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==} dev: true - /assign-symbols/1.0.0: + /assign-symbols@1.0.0: resolution: {integrity: sha512-Q+JC7Whu8HhmTdBph/Tq59IoRtoy6KAm5zzPv00WdujX82lbAL8K7WVjne7vdCsAmbF4AYaDOPyO3k0kl8qIrw==} engines: {node: '>=0.10.0'} dev: true - /ast-parents/0.0.1: + /ast-parents@0.0.1: resolution: {integrity: sha512-XHusKxKz3zoYk1ic8Un640joHbFMhbqneyoZfoKnEGtf2ey9Uh/IdpcQplODdO/kENaMIWsD0nJm4+wX3UNLHA==} dev: true - /astral-regex/2.0.0: + /astral-regex@2.0.0: resolution: {integrity: sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==} engines: {node: '>=8'} dev: true - /astring/1.8.4: + /astring@1.8.4: resolution: {integrity: sha512-97a+l2LBU3Op3bBQEff79i/E4jMD2ZLFD8rHx9B6mXyB2uQwhJQYfiDqUwtfjF4QA1F2qs//N6Cw8LetMbQjcw==} hasBin: true dev: false - /async-eventemitter/0.2.4: + /async-eventemitter@0.2.4: resolution: {integrity: sha512-pd20BwL7Yt1zwDFy+8MX8F1+WCT8aQeKj0kQnTrH9WaeRETlRamVhD0JtRPmrV4GfOJ2F9CvdQkZeZhnh2TuHw==} dependencies: async: 2.6.4 dev: true - /async-foreach/0.1.3: + /async-foreach@0.1.3: resolution: {integrity: sha512-VUeSMD8nEGBWaZK4lizI1sf3yEC7pnAQ/mrI7pC2fBz2s/tq5jWWEngTwaf0Gruu/OoXRGLGg1XFqpYBiGTYJA==} dev: true - /async-limiter/1.0.1: + /async-limiter@1.0.1: resolution: {integrity: sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==} dev: true - /async-mutex/0.2.6: + /async-mutex@0.2.6: resolution: {integrity: sha512-Hs4R+4SPgamu6rSGW8C7cV9gaWUKEHykfzCCvIRuaVv636Ju10ZdeUbvb4TBEW0INuq2DHZqXbK4Nd3yG4RaRw==} dependencies: tslib: 2.5.0 dev: false - /async/1.5.2: + /async@1.5.2: resolution: {integrity: sha512-nSVgobk4rv61R9PUSDtYt7mPVB2olxNR5RWJcAsH676/ef11bUZwvu7+RGYrYauVdDPcO519v68wRhXQtxsV9w==} dev: true - /async/2.6.2: + /async@2.6.2: resolution: {integrity: sha512-H1qVYh1MYhEEFLsP97cVKqCGo7KfCyTt6uEWqsTBr9SO84oK9Uwbyd/yCW+6rKJLHksBNUVWZDAjfS+Ccx0Bbg==} dependencies: lodash: 4.17.21 dev: true - /async/2.6.4: + /async@2.6.4: resolution: {integrity: sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==} dependencies: lodash: 4.17.21 dev: true - /asynckit/0.4.0: + /asynckit@0.4.0: resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} - /at-least-node/1.0.0: + /at-least-node@1.0.0: resolution: {integrity: sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==} engines: {node: '>= 4.0.0'} dev: true - /atob/2.1.2: + /atob@2.1.2: resolution: {integrity: sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==} engines: {node: '>= 4.5.0'} hasBin: true dev: true - /autoprefixer/10.4.13_postcss@8.4.19: + /autoprefixer@10.4.13(postcss@8.4.19): resolution: {integrity: sha512-49vKpMqcZYsJjwotvt4+h/BCjJVnhGwcLpDt5xkcaOG3eLrG/HUYLagrihYsQ+qrIBgIzX1Rw7a6L8I/ZA1Atg==} engines: {node: ^10 || ^12 || >=14} hasBin: true @@ -5643,7 +5942,7 @@ packages: postcss-value-parser: 4.2.0 dev: true - /autoprefixer/10.4.13_postcss@8.4.21: + /autoprefixer@10.4.13(postcss@8.4.21): resolution: {integrity: sha512-49vKpMqcZYsJjwotvt4+h/BCjJVnhGwcLpDt5xkcaOG3eLrG/HUYLagrihYsQ+qrIBgIzX1Rw7a6L8I/ZA1Atg==} engines: {node: ^10 || ^12 || >=14} hasBin: true @@ -5659,7 +5958,7 @@ packages: postcss-value-parser: 4.2.0 dev: true - /autoprefixer/10.4.14_postcss@8.4.21: + /autoprefixer@10.4.14(postcss@8.4.21): resolution: {integrity: sha512-FQzyfOsTlwVzjHxKEqRIAdJx9niO6VCBCoEwax/VLSoQF29ggECcPuBqUMZ+u8jCZOPSy8b8/8KnuFbp0SaFZQ==} engines: {node: ^10 || ^12 || >=14} hasBin: true @@ -5675,37 +5974,37 @@ packages: postcss-value-parser: 4.2.0 dev: true - /available-typed-arrays/1.0.5: + /available-typed-arrays@1.0.5: resolution: {integrity: sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==} engines: {node: '>= 0.4'} - /aws-sign2/0.7.0: + /aws-sign2@0.7.0: resolution: {integrity: sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==} dev: true - /aws4/1.12.0: + /aws4@1.12.0: resolution: {integrity: sha512-NmWvPnx0F1SfrQbYwOi7OeaNGokp9XhzNioJ/CSBs8Qa4vxug81mhJEAVZwxXuBmYB5KDRfMq/F3RR0BIU7sWg==} dev: true - /axios/0.21.4: + /axios@0.21.4: resolution: {integrity: sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==} dependencies: - follow-redirects: 1.15.2 + follow-redirects: 1.15.2(debug@4.3.4) transitivePeerDependencies: - debug dev: false - /axios/1.2.0: + /axios@1.2.0: resolution: {integrity: sha512-zT7wZyNYu3N5Bu0wuZ6QccIf93Qk1eV8LOewxgjOZFd2DenOs98cJ7+Y6703d0wkaXGY6/nZd4EweJaHz9uzQw==} dependencies: - follow-redirects: 1.15.2 + follow-redirects: 1.15.2(debug@4.3.4) form-data: 4.0.0 proxy-from-env: 1.1.0 transitivePeerDependencies: - debug dev: false - /babel-code-frame/6.26.0: + /babel-code-frame@6.26.0: resolution: {integrity: sha512-XqYMR2dfdGMW+hd0IUZ2PwK+fGeFkOxZJ0wY+JaQAHzt1Zx8LcvpiZD2NiGkEG8qx0CfkAOr5xt76d1e8vG90g==} dependencies: chalk: 1.1.3 @@ -5713,7 +6012,7 @@ packages: js-tokens: 3.0.2 dev: true - /babel-core/6.26.3: + /babel-core@6.26.3: resolution: {integrity: sha512-6jyFLuDmeidKmUEb3NM+/yawG0M2bDZ9Z1qbZP59cyHLz8kYGKYwpJP0UwUKKUiTRNvxfLesJnTedqczP7cTDA==} dependencies: babel-code-frame: 6.26.0 @@ -5739,7 +6038,7 @@ packages: - supports-color dev: true - /babel-generator/6.26.1: + /babel-generator@6.26.1: resolution: {integrity: sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA==} dependencies: babel-messages: 6.23.0 @@ -5752,7 +6051,7 @@ packages: trim-right: 1.0.1 dev: true - /babel-helper-builder-binary-assignment-operator-visitor/6.24.1: + /babel-helper-builder-binary-assignment-operator-visitor@6.24.1: resolution: {integrity: sha512-gCtfYORSG1fUMX4kKraymq607FWgMWg+j42IFPc18kFQEsmtaibP4UrqsXt8FlEJle25HUd4tsoDR7H2wDhe9Q==} dependencies: babel-helper-explode-assignable-expression: 6.24.1 @@ -5762,7 +6061,7 @@ packages: - supports-color dev: true - /babel-helper-call-delegate/6.24.1: + /babel-helper-call-delegate@6.24.1: resolution: {integrity: sha512-RL8n2NiEj+kKztlrVJM9JT1cXzzAdvWFh76xh/H1I4nKwunzE4INBXn8ieCZ+wh4zWszZk7NBS1s/8HR5jDkzQ==} dependencies: babel-helper-hoist-variables: 6.24.1 @@ -5773,7 +6072,7 @@ packages: - supports-color dev: true - /babel-helper-define-map/6.26.0: + /babel-helper-define-map@6.26.0: resolution: {integrity: sha512-bHkmjcC9lM1kmZcVpA5t2om2nzT/xiZpo6TJq7UlZ3wqKfzia4veeXbIhKvJXAMzhhEBd3cR1IElL5AenWEUpA==} dependencies: babel-helper-function-name: 6.24.1 @@ -5784,7 +6083,7 @@ packages: - supports-color dev: true - /babel-helper-explode-assignable-expression/6.24.1: + /babel-helper-explode-assignable-expression@6.24.1: resolution: {integrity: sha512-qe5csbhbvq6ccry9G7tkXbzNtcDiH4r51rrPUbwwoTzZ18AqxWYRZT6AOmxrpxKnQBW0pYlBI/8vh73Z//78nQ==} dependencies: babel-runtime: 6.26.0 @@ -5794,7 +6093,7 @@ packages: - supports-color dev: true - /babel-helper-function-name/6.24.1: + /babel-helper-function-name@6.24.1: resolution: {integrity: sha512-Oo6+e2iX+o9eVvJ9Y5eKL5iryeRdsIkwRYheCuhYdVHsdEQysbc2z2QkqCLIYnNxkT5Ss3ggrHdXiDI7Dhrn4Q==} dependencies: babel-helper-get-function-arity: 6.24.1 @@ -5806,28 +6105,28 @@ packages: - supports-color dev: true - /babel-helper-get-function-arity/6.24.1: + /babel-helper-get-function-arity@6.24.1: resolution: {integrity: sha512-WfgKFX6swFB1jS2vo+DwivRN4NB8XUdM3ij0Y1gnC21y1tdBoe6xjVnd7NSI6alv+gZXCtJqvrTeMW3fR/c0ng==} dependencies: babel-runtime: 6.26.0 babel-types: 6.26.0 dev: true - /babel-helper-hoist-variables/6.24.1: + /babel-helper-hoist-variables@6.24.1: resolution: {integrity: sha512-zAYl3tqerLItvG5cKYw7f1SpvIxS9zi7ohyGHaI9cgDUjAT6YcY9jIEH5CstetP5wHIVSceXwNS7Z5BpJg+rOw==} dependencies: babel-runtime: 6.26.0 babel-types: 6.26.0 dev: true - /babel-helper-optimise-call-expression/6.24.1: + /babel-helper-optimise-call-expression@6.24.1: resolution: {integrity: sha512-Op9IhEaxhbRT8MDXx2iNuMgciu2V8lDvYCNQbDGjdBNCjaMvyLf4wl4A3b8IgndCyQF8TwfgsQ8T3VD8aX1/pA==} dependencies: babel-runtime: 6.26.0 babel-types: 6.26.0 dev: true - /babel-helper-regex/6.26.0: + /babel-helper-regex@6.26.0: resolution: {integrity: sha512-VlPiWmqmGJp0x0oK27Out1D+71nVVCTSdlbhIVoaBAj2lUgrNjBCRR9+llO4lTSb2O4r7PJg+RobRkhBrf6ofg==} dependencies: babel-runtime: 6.26.0 @@ -5835,7 +6134,7 @@ packages: lodash: 4.17.21 dev: true - /babel-helper-remap-async-to-generator/6.24.1: + /babel-helper-remap-async-to-generator@6.24.1: resolution: {integrity: sha512-RYqaPD0mQyQIFRu7Ho5wE2yvA/5jxqCIj/Lv4BXNq23mHYu/vxikOy2JueLiBxQknwapwrJeNCesvY0ZcfnlHg==} dependencies: babel-helper-function-name: 6.24.1 @@ -5847,7 +6146,7 @@ packages: - supports-color dev: true - /babel-helper-replace-supers/6.24.1: + /babel-helper-replace-supers@6.24.1: resolution: {integrity: sha512-sLI+u7sXJh6+ToqDr57Bv973kCepItDhMou0xCP2YPVmR1jkHSCY+p1no8xErbV1Siz5QE8qKT1WIwybSWlqjw==} dependencies: babel-helper-optimise-call-expression: 6.24.1 @@ -5860,7 +6159,7 @@ packages: - supports-color dev: true - /babel-helpers/6.24.1: + /babel-helpers@6.24.1: resolution: {integrity: sha512-n7pFrqQm44TCYvrCDb0MqabAF+JUBq+ijBvNMUxpkLjJaAu32faIexewMumrH5KLLJ1HDyT0PTEqRyAe/GwwuQ==} dependencies: babel-runtime: 6.26.0 @@ -5869,25 +6168,7 @@ packages: - supports-color dev: true - /babel-jest/27.5.1: - resolution: {integrity: sha512-cdQ5dXjGRd0IBRATiQ4mZGlGlRE8kJpjPOixdNRdT+m3UcNqmYWN6rK6nvtXYfY3D76cb8s/O1Ss8ea24PIwcg==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} - peerDependencies: - '@babel/core': ^7.8.0 - dependencies: - '@jest/transform': 27.5.1 - '@jest/types': 27.5.1 - '@types/babel__core': 7.1.20 - babel-plugin-istanbul: 6.1.1 - babel-preset-jest: 27.5.1 - chalk: 4.1.2 - graceful-fs: 4.2.10 - slash: 3.0.0 - transitivePeerDependencies: - - supports-color - dev: true - - /babel-jest/27.5.1_@babel+core@7.20.2: + /babel-jest@27.5.1(@babel/core@7.20.2): resolution: {integrity: sha512-cdQ5dXjGRd0IBRATiQ4mZGlGlRE8kJpjPOixdNRdT+m3UcNqmYWN6rK6nvtXYfY3D76cb8s/O1Ss8ea24PIwcg==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} peerDependencies: @@ -5898,7 +6179,7 @@ packages: '@jest/types': 27.5.1 '@types/babel__core': 7.1.20 babel-plugin-istanbul: 6.1.1 - babel-preset-jest: 27.5.1_@babel+core@7.20.2 + babel-preset-jest: 27.5.1(@babel/core@7.20.2) chalk: 4.1.2 graceful-fs: 4.2.10 slash: 3.0.0 @@ -5906,19 +6187,19 @@ packages: - supports-color dev: true - /babel-messages/6.23.0: + /babel-messages@6.23.0: resolution: {integrity: sha512-Bl3ZiA+LjqaMtNYopA9TYE9HP1tQ+E5dLxE0XrAzcIJeK2UqF0/EaqXwBn9esd4UmTfEab+P+UYQ1GnioFIb/w==} dependencies: babel-runtime: 6.26.0 dev: true - /babel-plugin-check-es2015-constants/6.22.0: + /babel-plugin-check-es2015-constants@6.22.0: resolution: {integrity: sha512-B1M5KBP29248dViEo1owyY32lk1ZSH2DaNNrXLGt8lyjjHm7pBqAdQ7VKUPR6EEDO323+OvT3MQXbCin8ooWdA==} dependencies: babel-runtime: 6.26.0 dev: true - /babel-plugin-istanbul/6.1.1: + /babel-plugin-istanbul@6.1.1: resolution: {integrity: sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==} engines: {node: '>=8'} dependencies: @@ -5931,7 +6212,7 @@ packages: - supports-color dev: true - /babel-plugin-jest-hoist/27.5.1: + /babel-plugin-jest-hoist@27.5.1: resolution: {integrity: sha512-50wCwD5EMNW4aRpOwtqzyZHIewTYNxLA4nhB+09d8BIssfNfzBRhkBIHiaPv1Si226TQSvp8gxAJm2iY2qs2hQ==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: @@ -5941,49 +6222,52 @@ packages: '@types/babel__traverse': 7.18.2 dev: true - /babel-plugin-polyfill-corejs2/0.3.3: + /babel-plugin-polyfill-corejs2@0.3.3(@babel/core@7.20.2): resolution: {integrity: sha512-8hOdmFYFSZhqg2C/JgLUQ+t52o5nirNwaWM2B9LWteozwIvM14VSwdsCAUET10qT+kmySAlseadmfeeSWFCy+Q==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: '@babel/compat-data': 7.20.1 - '@babel/helper-define-polyfill-provider': 0.3.3 + '@babel/core': 7.20.2 + '@babel/helper-define-polyfill-provider': 0.3.3(@babel/core@7.20.2) semver: 6.3.0 transitivePeerDependencies: - supports-color - /babel-plugin-polyfill-corejs3/0.6.0: + /babel-plugin-polyfill-corejs3@0.6.0(@babel/core@7.20.2): resolution: {integrity: sha512-+eHqR6OPcBhJOGgsIar7xoAB1GcSwVUA3XjAd7HJNzOXT4wv6/H7KIdA/Nc60cvUlDbKApmqNvD1B1bzOt4nyA==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/helper-define-polyfill-provider': 0.3.3 + '@babel/core': 7.20.2 + '@babel/helper-define-polyfill-provider': 0.3.3(@babel/core@7.20.2) core-js-compat: 3.26.1 transitivePeerDependencies: - supports-color - /babel-plugin-polyfill-regenerator/0.4.1: + /babel-plugin-polyfill-regenerator@0.4.1(@babel/core@7.20.2): resolution: {integrity: sha512-NtQGmyQDXjQqQ+IzRkBVwEOz9lQ4zxAQZgoAYEtU9dJjnl1Oc98qnN7jcp+bE7O7aYzVpavXE3/VKXNzUbh7aw==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/helper-define-polyfill-provider': 0.3.3 + '@babel/core': 7.20.2 + '@babel/helper-define-polyfill-provider': 0.3.3(@babel/core@7.20.2) transitivePeerDependencies: - supports-color - /babel-plugin-syntax-async-functions/6.13.0: + /babel-plugin-syntax-async-functions@6.13.0: resolution: {integrity: sha512-4Zp4unmHgw30A1eWI5EpACji2qMocisdXhAftfhXoSV9j0Tvj6nRFE3tOmRY912E0FMRm/L5xWE7MGVT2FoLnw==} dev: true - /babel-plugin-syntax-exponentiation-operator/6.13.0: + /babel-plugin-syntax-exponentiation-operator@6.13.0: resolution: {integrity: sha512-Z/flU+T9ta0aIEKl1tGEmN/pZiI1uXmCiGFRegKacQfEJzp7iNsKloZmyJlQr+75FCJtiFfGIK03SiCvCt9cPQ==} dev: true - /babel-plugin-syntax-trailing-function-commas/6.22.0: + /babel-plugin-syntax-trailing-function-commas@6.22.0: resolution: {integrity: sha512-Gx9CH3Q/3GKbhs07Bszw5fPTlU+ygrOGfAhEt7W2JICwufpC4SuO0mG0+4NykPBSYPMJhqvVlDBU17qB1D+hMQ==} dev: true - /babel-plugin-transform-async-to-generator/6.24.1: + /babel-plugin-transform-async-to-generator@6.24.1: resolution: {integrity: sha512-7BgYJujNCg0Ti3x0c/DL3tStvnKS6ktIYOmo9wginv/dfZOrbSZ+qG4IRRHMBOzZ5Awb1skTiAsQXg/+IWkZYw==} dependencies: babel-helper-remap-async-to-generator: 6.24.1 @@ -5993,19 +6277,19 @@ packages: - supports-color dev: true - /babel-plugin-transform-es2015-arrow-functions/6.22.0: + /babel-plugin-transform-es2015-arrow-functions@6.22.0: resolution: {integrity: sha512-PCqwwzODXW7JMrzu+yZIaYbPQSKjDTAsNNlK2l5Gg9g4rz2VzLnZsStvp/3c46GfXpwkyufb3NCyG9+50FF1Vg==} dependencies: babel-runtime: 6.26.0 dev: true - /babel-plugin-transform-es2015-block-scoped-functions/6.22.0: + /babel-plugin-transform-es2015-block-scoped-functions@6.22.0: resolution: {integrity: sha512-2+ujAT2UMBzYFm7tidUsYh+ZoIutxJ3pN9IYrF1/H6dCKtECfhmB8UkHVpyxDwkj0CYbQG35ykoz925TUnBc3A==} dependencies: babel-runtime: 6.26.0 dev: true - /babel-plugin-transform-es2015-block-scoping/6.26.0: + /babel-plugin-transform-es2015-block-scoping@6.26.0: resolution: {integrity: sha512-YiN6sFAQ5lML8JjCmr7uerS5Yc/EMbgg9G8ZNmk2E3nYX4ckHR01wrkeeMijEf5WHNK5TW0Sl0Uu3pv3EdOJWw==} dependencies: babel-runtime: 6.26.0 @@ -6017,7 +6301,7 @@ packages: - supports-color dev: true - /babel-plugin-transform-es2015-classes/6.24.1: + /babel-plugin-transform-es2015-classes@6.24.1: resolution: {integrity: sha512-5Dy7ZbRinGrNtmWpquZKZ3EGY8sDgIVB4CU8Om8q8tnMLrD/m94cKglVcHps0BCTdZ0TJeeAWOq2TK9MIY6cag==} dependencies: babel-helper-define-map: 6.26.0 @@ -6033,7 +6317,7 @@ packages: - supports-color dev: true - /babel-plugin-transform-es2015-computed-properties/6.24.1: + /babel-plugin-transform-es2015-computed-properties@6.24.1: resolution: {integrity: sha512-C/uAv4ktFP/Hmh01gMTvYvICrKze0XVX9f2PdIXuriCSvUmV9j+u+BB9f5fJK3+878yMK6dkdcq+Ymr9mrcLzw==} dependencies: babel-runtime: 6.26.0 @@ -6042,26 +6326,26 @@ packages: - supports-color dev: true - /babel-plugin-transform-es2015-destructuring/6.23.0: + /babel-plugin-transform-es2015-destructuring@6.23.0: resolution: {integrity: sha512-aNv/GDAW0j/f4Uy1OEPZn1mqD+Nfy9viFGBfQ5bZyT35YqOiqx7/tXdyfZkJ1sC21NyEsBdfDY6PYmLHF4r5iA==} dependencies: babel-runtime: 6.26.0 dev: true - /babel-plugin-transform-es2015-duplicate-keys/6.24.1: + /babel-plugin-transform-es2015-duplicate-keys@6.24.1: resolution: {integrity: sha512-ossocTuPOssfxO2h+Z3/Ea1Vo1wWx31Uqy9vIiJusOP4TbF7tPs9U0sJ9pX9OJPf4lXRGj5+6Gkl/HHKiAP5ug==} dependencies: babel-runtime: 6.26.0 babel-types: 6.26.0 dev: true - /babel-plugin-transform-es2015-for-of/6.23.0: + /babel-plugin-transform-es2015-for-of@6.23.0: resolution: {integrity: sha512-DLuRwoygCoXx+YfxHLkVx5/NpeSbVwfoTeBykpJK7JhYWlL/O8hgAK/reforUnZDlxasOrVPPJVI/guE3dCwkw==} dependencies: babel-runtime: 6.26.0 dev: true - /babel-plugin-transform-es2015-function-name/6.24.1: + /babel-plugin-transform-es2015-function-name@6.24.1: resolution: {integrity: sha512-iFp5KIcorf11iBqu/y/a7DK3MN5di3pNCzto61FqCNnUX4qeBwcV1SLqe10oXNnCaxBUImX3SckX2/o1nsrTcg==} dependencies: babel-helper-function-name: 6.24.1 @@ -6071,13 +6355,13 @@ packages: - supports-color dev: true - /babel-plugin-transform-es2015-literals/6.22.0: + /babel-plugin-transform-es2015-literals@6.22.0: resolution: {integrity: sha512-tjFl0cwMPpDYyoqYA9li1/7mGFit39XiNX5DKC/uCNjBctMxyL1/PT/l4rSlbvBG1pOKI88STRdUsWXB3/Q9hQ==} dependencies: babel-runtime: 6.26.0 dev: true - /babel-plugin-transform-es2015-modules-amd/6.24.1: + /babel-plugin-transform-es2015-modules-amd@6.24.1: resolution: {integrity: sha512-LnIIdGWIKdw7zwckqx+eGjcS8/cl8D74A3BpJbGjKTFFNJSMrjN4bIh22HY1AlkUbeLG6X6OZj56BDvWD+OeFA==} dependencies: babel-plugin-transform-es2015-modules-commonjs: 6.26.2 @@ -6087,7 +6371,7 @@ packages: - supports-color dev: true - /babel-plugin-transform-es2015-modules-commonjs/6.26.2: + /babel-plugin-transform-es2015-modules-commonjs@6.26.2: resolution: {integrity: sha512-CV9ROOHEdrjcwhIaJNBGMBCodN+1cfkwtM1SbUHmvyy35KGT7fohbpOxkE2uLz1o6odKK2Ck/tz47z+VqQfi9Q==} dependencies: babel-plugin-transform-strict-mode: 6.24.1 @@ -6098,7 +6382,7 @@ packages: - supports-color dev: true - /babel-plugin-transform-es2015-modules-systemjs/6.24.1: + /babel-plugin-transform-es2015-modules-systemjs@6.24.1: resolution: {integrity: sha512-ONFIPsq8y4bls5PPsAWYXH/21Hqv64TBxdje0FvU3MhIV6QM2j5YS7KvAzg/nTIVLot2D2fmFQrFWCbgHlFEjg==} dependencies: babel-helper-hoist-variables: 6.24.1 @@ -6108,7 +6392,7 @@ packages: - supports-color dev: true - /babel-plugin-transform-es2015-modules-umd/6.24.1: + /babel-plugin-transform-es2015-modules-umd@6.24.1: resolution: {integrity: sha512-LpVbiT9CLsuAIp3IG0tfbVo81QIhn6pE8xBJ7XSeCtFlMltuar5VuBV6y6Q45tpui9QWcy5i0vLQfCfrnF7Kiw==} dependencies: babel-plugin-transform-es2015-modules-amd: 6.24.1 @@ -6118,7 +6402,7 @@ packages: - supports-color dev: true - /babel-plugin-transform-es2015-object-super/6.24.1: + /babel-plugin-transform-es2015-object-super@6.24.1: resolution: {integrity: sha512-8G5hpZMecb53vpD3mjs64NhI1au24TAmokQ4B+TBFBjN9cVoGoOvotdrMMRmHvVZUEvqGUPWL514woru1ChZMA==} dependencies: babel-helper-replace-supers: 6.24.1 @@ -6127,7 +6411,7 @@ packages: - supports-color dev: true - /babel-plugin-transform-es2015-parameters/6.24.1: + /babel-plugin-transform-es2015-parameters@6.24.1: resolution: {integrity: sha512-8HxlW+BB5HqniD+nLkQ4xSAVq3bR/pcYW9IigY+2y0dI+Y7INFeTbfAQr+63T3E4UDsZGjyb+l9txUnABWxlOQ==} dependencies: babel-helper-call-delegate: 6.24.1 @@ -6140,20 +6424,20 @@ packages: - supports-color dev: true - /babel-plugin-transform-es2015-shorthand-properties/6.24.1: + /babel-plugin-transform-es2015-shorthand-properties@6.24.1: resolution: {integrity: sha512-mDdocSfUVm1/7Jw/FIRNw9vPrBQNePy6wZJlR8HAUBLybNp1w/6lr6zZ2pjMShee65t/ybR5pT8ulkLzD1xwiw==} dependencies: babel-runtime: 6.26.0 babel-types: 6.26.0 dev: true - /babel-plugin-transform-es2015-spread/6.22.0: + /babel-plugin-transform-es2015-spread@6.22.0: resolution: {integrity: sha512-3Ghhi26r4l3d0Js933E5+IhHwk0A1yiutj9gwvzmFbVV0sPMYk2lekhOufHBswX7NCoSeF4Xrl3sCIuSIa+zOg==} dependencies: babel-runtime: 6.26.0 dev: true - /babel-plugin-transform-es2015-sticky-regex/6.24.1: + /babel-plugin-transform-es2015-sticky-regex@6.24.1: resolution: {integrity: sha512-CYP359ADryTo3pCsH0oxRo/0yn6UsEZLqYohHmvLQdfS9xkf+MbCzE3/Kolw9OYIY4ZMilH25z/5CbQbwDD+lQ==} dependencies: babel-helper-regex: 6.26.0 @@ -6161,19 +6445,19 @@ packages: babel-types: 6.26.0 dev: true - /babel-plugin-transform-es2015-template-literals/6.22.0: + /babel-plugin-transform-es2015-template-literals@6.22.0: resolution: {integrity: sha512-x8b9W0ngnKzDMHimVtTfn5ryimars1ByTqsfBDwAqLibmuuQY6pgBQi5z1ErIsUOWBdw1bW9FSz5RZUojM4apg==} dependencies: babel-runtime: 6.26.0 dev: true - /babel-plugin-transform-es2015-typeof-symbol/6.23.0: + /babel-plugin-transform-es2015-typeof-symbol@6.23.0: resolution: {integrity: sha512-fz6J2Sf4gYN6gWgRZaoFXmq93X+Li/8vf+fb0sGDVtdeWvxC9y5/bTD7bvfWMEq6zetGEHpWjtzRGSugt5kNqw==} dependencies: babel-runtime: 6.26.0 dev: true - /babel-plugin-transform-es2015-unicode-regex/6.24.1: + /babel-plugin-transform-es2015-unicode-regex@6.24.1: resolution: {integrity: sha512-v61Dbbihf5XxnYjtBN04B/JBvsScY37R1cZT5r9permN1cp+b70DY3Ib3fIkgn1DI9U3tGgBJZVD8p/mE/4JbQ==} dependencies: babel-helper-regex: 6.26.0 @@ -6181,7 +6465,7 @@ packages: regexpu-core: 2.0.0 dev: true - /babel-plugin-transform-exponentiation-operator/6.24.1: + /babel-plugin-transform-exponentiation-operator@6.24.1: resolution: {integrity: sha512-LzXDmbMkklvNhprr20//RStKVcT8Cu+SQtX18eMHLhjHf2yFzwtQ0S2f0jQ+89rokoNdmwoSqYzAhq86FxlLSQ==} dependencies: babel-helper-builder-binary-assignment-operator-visitor: 6.24.1 @@ -6191,59 +6475,40 @@ packages: - supports-color dev: true - /babel-plugin-transform-regenerator/6.26.0: + /babel-plugin-transform-regenerator@6.26.0: resolution: {integrity: sha512-LS+dBkUGlNR15/5WHKe/8Neawx663qttS6AGqoOUhICc9d1KciBvtrQSuc0PI+CxQ2Q/S1aKuJ+u64GtLdcEZg==} dependencies: regenerator-transform: 0.10.1 dev: true - /babel-plugin-transform-strict-mode/6.24.1: + /babel-plugin-transform-strict-mode@6.24.1: resolution: {integrity: sha512-j3KtSpjyLSJxNoCDrhwiJad8kw0gJ9REGj8/CqL0HeRyLnvUNYV9zcqluL6QJSXh3nfsLEmSLvwRfGzrgR96Pw==} dependencies: babel-runtime: 6.26.0 babel-types: 6.26.0 dev: true - /babel-preset-current-node-syntax/1.0.1: - resolution: {integrity: sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==} - peerDependencies: - '@babel/core': ^7.0.0 - dependencies: - '@babel/plugin-syntax-async-generators': 7.8.4 - '@babel/plugin-syntax-bigint': 7.8.3 - '@babel/plugin-syntax-class-properties': 7.12.13 - '@babel/plugin-syntax-import-meta': 7.10.4 - '@babel/plugin-syntax-json-strings': 7.8.3 - '@babel/plugin-syntax-logical-assignment-operators': 7.10.4 - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3 - '@babel/plugin-syntax-numeric-separator': 7.10.4 - '@babel/plugin-syntax-object-rest-spread': 7.8.3 - '@babel/plugin-syntax-optional-catch-binding': 7.8.3 - '@babel/plugin-syntax-optional-chaining': 7.8.3 - '@babel/plugin-syntax-top-level-await': 7.14.5 - dev: true - - /babel-preset-current-node-syntax/1.0.1_@babel+core@7.20.2: + /babel-preset-current-node-syntax@1.0.1(@babel/core@7.20.2): resolution: {integrity: sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==} peerDependencies: '@babel/core': ^7.0.0 dependencies: '@babel/core': 7.20.2 - '@babel/plugin-syntax-async-generators': 7.8.4_@babel+core@7.20.2 - '@babel/plugin-syntax-bigint': 7.8.3_@babel+core@7.20.2 - '@babel/plugin-syntax-class-properties': 7.12.13_@babel+core@7.20.2 - '@babel/plugin-syntax-import-meta': 7.10.4_@babel+core@7.20.2 - '@babel/plugin-syntax-json-strings': 7.8.3_@babel+core@7.20.2 - '@babel/plugin-syntax-logical-assignment-operators': 7.10.4_@babel+core@7.20.2 - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3_@babel+core@7.20.2 - '@babel/plugin-syntax-numeric-separator': 7.10.4_@babel+core@7.20.2 - '@babel/plugin-syntax-object-rest-spread': 7.8.3_@babel+core@7.20.2 - '@babel/plugin-syntax-optional-catch-binding': 7.8.3_@babel+core@7.20.2 - '@babel/plugin-syntax-optional-chaining': 7.8.3_@babel+core@7.20.2 - '@babel/plugin-syntax-top-level-await': 7.14.5_@babel+core@7.20.2 - dev: true - - /babel-preset-env/1.7.0: + '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.20.2) + '@babel/plugin-syntax-bigint': 7.8.3(@babel/core@7.20.2) + '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.20.2) + '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.20.2) + '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.20.2) + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.20.2) + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.20.2) + '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.20.2) + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.20.2) + '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.20.2) + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.20.2) + '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.20.2) + dev: true + + /babel-preset-env@1.7.0: resolution: {integrity: sha512-9OR2afuKDneX2/q2EurSftUYM0xGu4O2D9adAhVfADDhrYDaxXV0rBbevVYoY9n6nyX1PmQW/0jtpJvUNr9CHg==} dependencies: babel-plugin-check-es2015-constants: 6.22.0 @@ -6280,17 +6545,7 @@ packages: - supports-color dev: true - /babel-preset-jest/27.5.1: - resolution: {integrity: sha512-Nptf2FzlPCWYuJg41HBqXVT8ym6bXOevuCTbhxlUpjwtysGaIWFvDEjp4y+G7fl13FgOdjs7P/DmErqH7da0Ag==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} - peerDependencies: - '@babel/core': ^7.0.0 - dependencies: - babel-plugin-jest-hoist: 27.5.1 - babel-preset-current-node-syntax: 1.0.1 - dev: true - - /babel-preset-jest/27.5.1_@babel+core@7.20.2: + /babel-preset-jest@27.5.1(@babel/core@7.20.2): resolution: {integrity: sha512-Nptf2FzlPCWYuJg41HBqXVT8ym6bXOevuCTbhxlUpjwtysGaIWFvDEjp4y+G7fl13FgOdjs7P/DmErqH7da0Ag==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} peerDependencies: @@ -6298,10 +6553,10 @@ packages: dependencies: '@babel/core': 7.20.2 babel-plugin-jest-hoist: 27.5.1 - babel-preset-current-node-syntax: 1.0.1_@babel+core@7.20.2 + babel-preset-current-node-syntax: 1.0.1(@babel/core@7.20.2) dev: true - /babel-register/6.26.0: + /babel-register@6.26.0: resolution: {integrity: sha512-veliHlHX06wjaeY8xNITbveXSiI+ASFnOqvne/LaIJIqOWi2Ogmj91KOugEz/hoh/fwMhXNBJPCv8Xaz5CyM4A==} dependencies: babel-core: 6.26.3 @@ -6315,14 +6570,14 @@ packages: - supports-color dev: true - /babel-runtime/6.26.0: + /babel-runtime@6.26.0: resolution: {integrity: sha512-ITKNuq2wKlW1fJg9sSW52eepoYgZBggvOAHC0u/CYu/qxQ9EVzThCgR69BnSXLHjy2f7SY5zaQ4yt7H9ZVxY2g==} dependencies: core-js: 2.6.12 regenerator-runtime: 0.11.1 dev: true - /babel-template/6.26.0: + /babel-template@6.26.0: resolution: {integrity: sha512-PCOcLFW7/eazGUKIoqH97sO9A2UYMahsn/yRQ7uOk37iutwjq7ODtcTNF+iFDSHNfkctqsLRjLP7URnOx0T1fg==} dependencies: babel-runtime: 6.26.0 @@ -6334,7 +6589,7 @@ packages: - supports-color dev: true - /babel-traverse/6.26.0: + /babel-traverse@6.26.0: resolution: {integrity: sha512-iSxeXx7apsjCHe9c7n8VtRXGzI2Bk1rBSOJgCCjfyXb6v1aCqE1KSEpq/8SXuVN8Ka/Rh1WDTF0MDzkvTA4MIA==} dependencies: babel-code-frame: 6.26.0 @@ -6350,7 +6605,7 @@ packages: - supports-color dev: true - /babel-types/6.26.0: + /babel-types@6.26.0: resolution: {integrity: sha512-zhe3V/26rCWsEZK8kZN+HaQj5yQ1CilTObixFzKW1UWjqG7618Twz6YEsCnjfg5gBcJh02DrpCkS9h98ZqDY+g==} dependencies: babel-runtime: 6.26.0 @@ -6359,7 +6614,7 @@ packages: to-fast-properties: 1.0.3 dev: true - /babelify/7.3.0: + /babelify@7.3.0: resolution: {integrity: sha512-vID8Fz6pPN5pJMdlUnNFSfrlcx5MUule4k9aKs/zbZPyXxMTcRrB0M4Tarw22L8afr8eYSWxDPYCob3TdrqtlA==} dependencies: babel-core: 6.26.3 @@ -6368,32 +6623,35 @@ packages: - supports-color dev: true - /babylon/6.18.0: + /babylon@6.18.0: resolution: {integrity: sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==} hasBin: true dev: true - /backoff/2.5.0: + /backoff@2.5.0: resolution: {integrity: sha512-wC5ihrnUXmR2douXmXLCe5O3zg3GKIyvRi/hi58a/XyRxVI+3/yM0PYueQOZXPXQ9pxBislYkw+sF9b7C/RuMA==} engines: {node: '>= 0.6'} dependencies: precond: 0.2.3 dev: true - /bail/2.0.2: + /bail@2.0.2: resolution: {integrity: sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==} dev: false - /balanced-match/1.0.2: + /balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} dev: true - /base-x/3.0.9: + /base-x@3.0.9: resolution: {integrity: sha512-H7JU6iBHTal1gp56aKoaa//YUxEaAOUiydvrV/pILqIHXTtqxSkATOnDA2u+jZ/61sD+L/412+7kzXRtWukhpQ==} dependencies: safe-buffer: 5.2.1 - /base/0.11.2: + /base64-js@1.5.1: + resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} + + /base@0.11.2: resolution: {integrity: sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==} engines: {node: '>=0.10.0'} dependencies: @@ -6406,23 +6664,20 @@ packages: pascalcase: 0.1.1 dev: true - /base64-js/1.5.1: - resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} - - /bcrypt-pbkdf/1.0.2: + /bcrypt-pbkdf@1.0.2: resolution: {integrity: sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==} dependencies: tweetnacl: 0.14.5 dev: true - /bech32/1.1.4: + /bech32@1.1.4: resolution: {integrity: sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ==} - /big.js/5.2.2: + /big.js@5.2.2: resolution: {integrity: sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==} dev: true - /bigint-buffer/1.1.5: + /bigint-buffer@1.1.5: resolution: {integrity: sha512-trfYco6AoZ+rKhKnxA0hgX0HAbVP/s808/EuDSe2JDzUnCp/xAsli35Orvk67UrTEcwuxZqYZDmfA2RXJgxVvA==} engines: {node: '>= 10.0.0'} requiresBuild: true @@ -6430,39 +6685,39 @@ packages: bindings: 1.5.0 dev: false - /bigint-crypto-utils/3.1.8: + /bigint-crypto-utils@3.1.8: resolution: {integrity: sha512-+VMV9Laq8pXLBKKKK49nOoq9bfR3j7NNQAtbA617a4nw9bVLo8rsqkKMBgM2AJWlNX9fEIyYaYX+d0laqYV4tw==} engines: {node: '>=10.4.0'} dependencies: bigint-mod-arith: 3.1.2 dev: true - /bigint-mod-arith/3.1.2: + /bigint-mod-arith@3.1.2: resolution: {integrity: sha512-nx8J8bBeiRR+NlsROFH9jHswW5HO8mgfOSqW0AmjicMMvaONDa8AO+5ViKDUUNytBPWiwfvZP4/Bj4Y3lUfvgQ==} engines: {node: '>=10.4.0'} dev: true - /bignumber.js/9.1.1: + /bignumber.js@9.1.1: resolution: {integrity: sha512-pHm4LsMJ6lzgNGVfZHjMoO8sdoRhOzOH4MLmY65Jg70bpxCKu5iOHNJyfF6OyvYw7t8Fpf35RuzUyqnQsj8Vig==} dev: true optional: true - /binary-extensions/2.2.0: + /binary-extensions@2.2.0: resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} engines: {node: '>=8'} dev: true - /bind-decorator/1.0.11: + /bind-decorator@1.0.11: resolution: {integrity: sha512-yzkH0uog6Vv/vQ9+rhSKxecnqGUZHYncg7qS7voz3Q76+TAi1SGiOKk2mlOvusQnFz9Dc4BC/NMkeXu11YgjJg==} dev: false - /bindings/1.5.0: + /bindings@1.5.0: resolution: {integrity: sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==} dependencies: file-uri-to-path: 1.0.0 dev: false - /bip39/2.5.0: + /bip39@2.5.0: resolution: {integrity: sha512-xwIx/8JKoT2+IPJpFEfXoWdYwP7UVAoUxxLNfGCfVowaJE7yg1Y5B1BVPqlUNsBq5/nGwmFkwRJ8xDW4sX8OdA==} dependencies: create-hash: 1.2.0 @@ -6472,13 +6727,13 @@ packages: unorm: 1.6.0 dev: true - /bl/0.8.2: + /bl@0.8.2: resolution: {integrity: sha512-pfqikmByp+lifZCS0p6j6KreV6kNU6Apzpm2nKOk+94cZb/jvle55+JxWiByUQ0Wo/+XnDXEy5MxxKMb6r0VIw==} dependencies: readable-stream: 1.0.34 dev: true - /bl/4.1.0: + /bl@4.1.0: resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} dependencies: buffer: 5.7.1 @@ -6486,28 +6741,28 @@ packages: readable-stream: 3.6.2 dev: false - /blakejs/1.2.1: + /blakejs@1.2.1: resolution: {integrity: sha512-QXUSXI3QVc/gJME0dBpXrag1kbzOqCjCX8/b54ntNyW6sjtoqxqRk3LTmXzaJoh71zMsDCjM+47jS7XiwN/+fQ==} - /bluebird/3.7.2: + /bluebird@3.7.2: resolution: {integrity: sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==} dev: true - /bn.js/4.11.6: + /bn.js@4.11.6: resolution: {integrity: sha512-XWwnNNFCuuSQ0m3r3C4LE3EiORltHd9M05pq6FOlVeiophzRbMo50Sbz1ehl8K3Z+jw9+vmgnXefY1hz8X+2wA==} dev: true - /bn.js/4.11.8: + /bn.js@4.11.8: resolution: {integrity: sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==} dev: false - /bn.js/4.12.0: + /bn.js@4.12.0: resolution: {integrity: sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==} - /bn.js/5.2.1: + /bn.js@5.2.1: resolution: {integrity: sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==} - /body-parser/1.20.1: + /body-parser@1.20.1: resolution: {integrity: sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==} engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} dependencies: @@ -6528,7 +6783,7 @@ packages: dev: true optional: true - /body-parser/1.20.2: + /body-parser@1.20.2: resolution: {integrity: sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==} engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} dependencies: @@ -6549,11 +6804,11 @@ packages: dev: true optional: true - /boolbase/1.0.0: + /boolbase@1.0.0: resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} dev: true - /borsh/0.7.0: + /borsh@0.7.0: resolution: {integrity: sha512-CLCsZGIBCFnPtkNnieW/a8wmreDmfUtjU2m9yHrzPXIlNbqVs0AQrSatSG6vdNYUqdc83tkQi2eHfF98ubzQLA==} dependencies: bn.js: 5.2.1 @@ -6561,20 +6816,20 @@ packages: text-encoding-utf-8: 1.0.2 dev: false - /brace-expansion/1.1.11: + /brace-expansion@1.1.11: resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} dependencies: balanced-match: 1.0.2 concat-map: 0.0.1 dev: true - /brace-expansion/2.0.1: + /brace-expansion@2.0.1: resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} dependencies: balanced-match: 1.0.2 dev: true - /braces/2.3.2: + /braces@2.3.2: resolution: {integrity: sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==} engines: {node: '>=0.10.0'} dependencies: @@ -6592,17 +6847,17 @@ packages: - supports-color dev: true - /braces/3.0.2: + /braces@3.0.2: resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} engines: {node: '>=8'} dependencies: fill-range: 7.0.1 dev: true - /brorand/1.1.0: + /brorand@1.1.0: resolution: {integrity: sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==} - /browser-level/1.0.1: + /browser-level@1.0.1: resolution: {integrity: sha512-XECYKJ+Dbzw0lbydyQuJzwNXtOpbMSq737qxJN11sIRTErOMShvDpbzTlgju7orJKvx4epULolZAuJGLzCmWRQ==} dependencies: abstract-level: 1.0.3 @@ -6611,15 +6866,15 @@ packages: run-parallel-limit: 1.1.0 dev: true - /browser-process-hrtime/1.0.0: + /browser-process-hrtime@1.0.0: resolution: {integrity: sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==} dev: true - /browser-stdout/1.3.1: + /browser-stdout@1.3.1: resolution: {integrity: sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==} dev: true - /browserify-aes/1.2.0: + /browserify-aes@1.2.0: resolution: {integrity: sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==} dependencies: buffer-xor: 1.0.3 @@ -6629,7 +6884,7 @@ packages: inherits: 2.0.4 safe-buffer: 5.2.1 - /browserify-cipher/1.0.1: + /browserify-cipher@1.0.1: resolution: {integrity: sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==} dependencies: browserify-aes: 1.2.0 @@ -6637,7 +6892,7 @@ packages: evp_bytestokey: 1.0.3 dev: true - /browserify-des/1.0.2: + /browserify-des@1.0.2: resolution: {integrity: sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==} dependencies: cipher-base: 1.0.4 @@ -6646,7 +6901,7 @@ packages: safe-buffer: 5.2.1 dev: true - /browserify-fs/1.0.0: + /browserify-fs@1.0.0: resolution: {integrity: sha512-8LqHRPuAEKvyTX34R6tsw4bO2ro6j9DmlYBhiYWHRM26Zv2cBw1fJOU0NeUQ0RkXkPn/PFBjhA0dm4AgaBurTg==} dependencies: level-filesystem: 1.2.0 @@ -6654,14 +6909,14 @@ packages: levelup: 0.18.6 dev: true - /browserify-rsa/4.1.0: + /browserify-rsa@4.1.0: resolution: {integrity: sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog==} dependencies: bn.js: 5.2.1 randombytes: 2.1.0 dev: true - /browserify-sign/4.2.1: + /browserify-sign@4.2.1: resolution: {integrity: sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg==} dependencies: bn.js: 5.2.1 @@ -6675,7 +6930,7 @@ packages: safe-buffer: 5.2.1 dev: true - /browserslist/3.2.8: + /browserslist@3.2.8: resolution: {integrity: sha512-WHVocJYavUwVgVViC0ORikPHQquXwVh939TaelZ4WDqpWgTX/FsGhl/+P4qBUAGcRvtOgDgC+xftNWWp2RUTAQ==} hasBin: true dependencies: @@ -6683,7 +6938,7 @@ packages: electron-to-chromium: 1.4.328 dev: true - /browserslist/4.21.4: + /browserslist@4.21.4: resolution: {integrity: sha512-CBHJJdDmgjl3daYjN5Cp5kbTf1mUhZoS+beLklHIvkOWscs83YAhLlF3Wsh/lciQYAcbBJgTOD44VtG31ZM4Hw==} engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true @@ -6691,9 +6946,9 @@ packages: caniuse-lite: 1.0.30001447 electron-to-chromium: 1.4.284 node-releases: 2.0.8 - update-browserslist-db: 1.0.10_browserslist@4.21.4 + update-browserslist-db: 1.0.10(browserslist@4.21.4) - /browserslist/4.21.5: + /browserslist@4.21.5: resolution: {integrity: sha512-tUkiguQGW7S3IhB7N+c2MV/HZPSCPAAiYBZXLsBhFB/PCy6ZKKsZrmBayHV9fdGV/ARIfJ14NkxKzRDjvp7L6w==} engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true @@ -6701,131 +6956,131 @@ packages: caniuse-lite: 1.0.30001465 electron-to-chromium: 1.4.328 node-releases: 2.0.10 - update-browserslist-db: 1.0.10_browserslist@4.21.5 + update-browserslist-db: 1.0.10(browserslist@4.21.5) - /bs-logger/0.2.6: + /bs-logger@0.2.6: resolution: {integrity: sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==} engines: {node: '>= 6'} dependencies: fast-json-stable-stringify: 2.1.0 dev: true - /bs58/4.0.1: + /bs58@4.0.1: resolution: {integrity: sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw==} dependencies: base-x: 3.0.9 - /bs58check/2.1.2: + /bs58check@2.1.2: resolution: {integrity: sha512-0TS1jicxdU09dwJMNZtVAfzPi6Q6QeN0pM1Fkzrjn+XYHvzMKPU3pHVpva+769iNVSfIYWf7LJ6WR+BuuMf8cA==} dependencies: bs58: 4.0.1 create-hash: 1.2.0 safe-buffer: 5.2.1 - /bser/2.1.1: + /bser@2.1.1: resolution: {integrity: sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==} dependencies: node-int64: 0.4.0 dev: true - /btoa/1.2.1: + /btoa@1.2.1: resolution: {integrity: sha512-SB4/MIGlsiVkMcHmT+pSmIPoNDoHg+7cMzmt3Uxt628MTz2487DKSqK/fuhFBrkuqrYv5UCEnACpF4dTFNKc/g==} engines: {node: '>= 0.4.0'} hasBin: true dev: false - /buffer-alloc-unsafe/1.1.0: + /buffer-alloc-unsafe@1.1.0: resolution: {integrity: sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==} dev: false - /buffer-alloc/1.2.0: + /buffer-alloc@1.2.0: resolution: {integrity: sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==} dependencies: buffer-alloc-unsafe: 1.1.0 buffer-fill: 1.0.0 dev: false - /buffer-crc32/0.2.13: + /buffer-crc32@0.2.13: resolution: {integrity: sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==} dev: true - /buffer-es6/4.9.3: + /buffer-es6@4.9.3: resolution: {integrity: sha512-Ibt+oXxhmeYJSsCkODPqNpPmyegefiD8rfutH1NYGhMZQhSp95Rz7haemgnJ6dxa6LT+JLLbtgOMORRluwKktw==} dev: true - /buffer-fill/1.0.0: + /buffer-fill@1.0.0: resolution: {integrity: sha512-T7zexNBwiiaCOGDg9xNX9PBmjrubblRkENuptryuI64URkXDFum9il/JGL8Lm8wYfAXpredVXXZz7eMHilimiQ==} dev: false - /buffer-from/1.1.2: + /buffer-from@1.1.2: resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} - /buffer-to-arraybuffer/0.0.5: + /buffer-to-arraybuffer@0.0.5: resolution: {integrity: sha512-3dthu5CYiVB1DEJp61FtApNnNndTckcqe4pFcLdvHtrpG+kcyekCJKg4MRiDcFW7A6AODnXB9U4dwQiCW5kzJQ==} dev: true optional: true - /buffer-xor/1.0.3: + /buffer-xor@1.0.3: resolution: {integrity: sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ==} - /buffer-xor/2.0.2: + /buffer-xor@2.0.2: resolution: {integrity: sha512-eHslX0bin3GB+Lx2p7lEYRShRewuNZL3fUl4qlVJGGiwoPGftmt8JQgk2Y9Ji5/01TnVDo33E5b5O3vUB1HdqQ==} dependencies: safe-buffer: 5.2.1 dev: true - /buffer/5.7.1: + /buffer@5.7.1: resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} dependencies: base64-js: 1.5.1 ieee754: 1.2.1 - /buffer/6.0.1: + /buffer@6.0.1: resolution: {integrity: sha512-rVAXBwEcEoYtxnHSO5iWyhzV/O1WMtkUYWlfdLS7FjU4PnSJJHEfHXi/uHPI5EwltmOA794gN3bm3/pzuctWjQ==} dependencies: base64-js: 1.5.1 ieee754: 1.2.1 dev: false - /buffer/6.0.3: + /buffer@6.0.3: resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} dependencies: base64-js: 1.5.1 ieee754: 1.2.1 - /bufferutil/4.0.7: + /bufferutil@4.0.7: resolution: {integrity: sha512-kukuqc39WOHtdxtw4UScxF/WVnMFVSQVKhtx3AjZJzhd0RGZZldcrfSEbVsWWe6KNH253574cq5F+wpv0G9pJw==} engines: {node: '>=6.14.2'} requiresBuild: true dependencies: node-gyp-build: 4.6.0 - /busboy/1.6.0: + /busboy@1.6.0: resolution: {integrity: sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==} engines: {node: '>=10.16.0'} dependencies: streamsearch: 1.1.0 dev: true - /bytes/3.1.2: + /bytes@3.1.2: resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} engines: {node: '>= 0.8'} dev: true - /bytewise-core/1.2.3: + /bytewise-core@1.2.3: resolution: {integrity: sha512-nZD//kc78OOxeYtRlVk8/zXqTB4gf/nlguL1ggWA8FuchMyOxcyHR4QPQZMUmA7czC+YnaBrPUCubqAWe50DaA==} dependencies: typewise-core: 1.2.0 dev: true - /bytewise/1.1.0: + /bytewise@1.1.0: resolution: {integrity: sha512-rHuuseJ9iQ0na6UDhnrRVDh8YnWVlU6xM3VH6q/+yHDeUH2zIhUzP+2/h3LIrhLDBtTqzWpE3p3tP/boefskKQ==} dependencies: bytewise-core: 1.2.3 typewise: 1.0.3 dev: true - /cacache/15.3.0: + /cacache@15.3.0: resolution: {integrity: sha512-VVdYzXEn+cnbXpFgWs5hTT7OScegHVmLhJIR8Ufqk3iFD6A6j5iSX1KuBTfNEv4tdJWE2PzA6IVFtcLC7fN9wQ==} engines: {node: '>= 10'} dependencies: @@ -6851,7 +7106,7 @@ packages: - bluebird dev: true - /cache-base/1.0.1: + /cache-base@1.0.1: resolution: {integrity: sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==} engines: {node: '>=0.10.0'} dependencies: @@ -6866,13 +7121,13 @@ packages: unset-value: 1.0.0 dev: true - /cacheable-lookup/5.0.4: + /cacheable-lookup@5.0.4: resolution: {integrity: sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==} engines: {node: '>=10.6.0'} dev: true optional: true - /cacheable-request/6.1.0: + /cacheable-request@6.1.0: resolution: {integrity: sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==} engines: {node: '>=8'} dependencies: @@ -6886,7 +7141,7 @@ packages: dev: true optional: true - /cacheable-request/7.0.2: + /cacheable-request@7.0.2: resolution: {integrity: sha512-pouW8/FmiPQbuGpkXQ9BAPv/Mo5xDGANgSNXzTzJ8DrKGuXOssM4wIQRjfanNRh3Yu5cfYPvcorqbhg2KIJtew==} engines: {node: '>=8'} dependencies: @@ -6900,56 +7155,56 @@ packages: dev: true optional: true - /cachedown/1.0.0: + /cachedown@1.0.0: resolution: {integrity: sha512-t+yVk82vQWCJF3PsWHMld+jhhjkkWjcAzz8NbFx1iULOXWl8Tm/FdM4smZNVw3MRr0X+lVTx9PKzvEn4Ng19RQ==} dependencies: abstract-leveldown: 2.7.2 lru-cache: 3.2.0 dev: true - /call-bind/1.0.2: + /call-bind@1.0.2: resolution: {integrity: sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==} dependencies: function-bind: 1.1.1 get-intrinsic: 1.2.0 - /caller-callsite/2.0.0: + /caller-callsite@2.0.0: resolution: {integrity: sha512-JuG3qI4QOftFsZyOn1qq87fq5grLIyk1JYd5lJmdA+fG7aQ9pA/i3JIJGcO3q0MrRcHlOt1U+ZeHW8Dq9axALQ==} engines: {node: '>=4'} dependencies: callsites: 2.0.0 dev: true - /caller-path/2.0.0: + /caller-path@2.0.0: resolution: {integrity: sha512-MCL3sf6nCSXOwCTzvPKhN18TU7AHTvdtam8DAogxcrJ8Rjfbbg7Lgng64H9Iy+vUV6VGFClN/TyxBkAebLRR4A==} engines: {node: '>=4'} dependencies: caller-callsite: 2.0.0 dev: true - /callsites/2.0.0: + /callsites@2.0.0: resolution: {integrity: sha512-ksWePWBloaWPxJYQ8TL0JHvtci6G5QTKwQ95RcWAa/lzoAKuAOflGdAK92hpHXjkwb8zLxoLNUoNYZgVsaJzvQ==} engines: {node: '>=4'} dev: true - /callsites/3.1.0: + /callsites@3.1.0: resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} engines: {node: '>=6'} dev: true - /camel-case/4.1.2: + /camel-case@4.1.2: resolution: {integrity: sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==} dependencies: pascal-case: 3.1.2 tslib: 2.5.0 dev: true - /camelcase-css/2.0.1: + /camelcase-css@2.0.1: resolution: {integrity: sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==} engines: {node: '>= 6'} dev: true - /camelcase-keys/6.2.2: + /camelcase-keys@6.2.2: resolution: {integrity: sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==} engines: {node: '>=8'} dependencies: @@ -6958,7 +7213,7 @@ packages: quick-lru: 4.0.1 dev: true - /camelcase-keys/7.0.2: + /camelcase-keys@7.0.2: resolution: {integrity: sha512-Rjs1H+A9R+Ig+4E/9oyB66UC5Mj9Xq3N//vcLf2WzgdTi/3gUu3Z9KoqmlrEG4VuuLK8wJHofxzdQXz/knhiYg==} engines: {node: '>=12'} dependencies: @@ -6968,51 +7223,51 @@ packages: type-fest: 1.4.0 dev: true - /camelcase/3.0.0: + /camelcase@3.0.0: resolution: {integrity: sha512-4nhGqUkc4BqbBBB4Q6zLuD7lzzrHYrjKGeYaEji/3tFR5VdJu9v+LilhGIVe8wxEJPPOeWo7eg8dwY13TZ1BNg==} engines: {node: '>=0.10.0'} dev: true - /camelcase/5.3.1: + /camelcase@5.3.1: resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==} engines: {node: '>=6'} - /camelcase/6.3.0: + /camelcase@6.3.0: resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} engines: {node: '>=10'} dev: true - /caniuse-lite/1.0.30001434: + /caniuse-lite@1.0.30001434: resolution: {integrity: sha512-aOBHrLmTQw//WFa2rcF1If9fa3ypkC1wzqqiKHgfdrXTWcU8C4gKVZT77eQAPWN1APys3+uQ0Df07rKauXGEYA==} dev: true - /caniuse-lite/1.0.30001447: + /caniuse-lite@1.0.30001447: resolution: {integrity: sha512-bdKU1BQDPeEXe9A39xJnGtY0uRq/z5osrnXUw0TcK+EYno45Y+U7QU9HhHEyzvMDffpYadFXi3idnSNkcwLkTw==} - /caniuse-lite/1.0.30001465: + /caniuse-lite@1.0.30001465: resolution: {integrity: sha512-HvjgL3MYAJjceTDCcjRnQGjwUz/5qec9n7JPOzUursUoOTIsYCSDOb1l7RsnZE8mjbxG78zVRCKfrBXyvChBag==} - /caseless/0.12.0: + /caseless@0.12.0: resolution: {integrity: sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==} dev: true - /catering/2.1.1: + /catering@2.1.1: resolution: {integrity: sha512-K7Qy8O9p76sL3/3m7/zLKbRkyOlSZAgzEaLhyj2mXS8PsCud2Eo4hAb8aLtZqHh0QGqLcb9dlJSu6lHRVENm1w==} engines: {node: '>=6'} dev: true - /cbor/8.1.0: + /cbor@8.1.0: resolution: {integrity: sha512-DwGjNW9omn6EwP70aXsn7FQJx5kO12tX0bZkaTjzdVFM6/7nhA4t0EENocKGx6D2Bch9PE2KzCUf5SceBdeijg==} engines: {node: '>=12.19'} dependencies: nofilter: 3.1.0 dev: true - /ccount/2.0.1: + /ccount@2.0.1: resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} dev: false - /chai/4.3.7: + /chai@4.3.7: resolution: {integrity: sha512-HLnAzZ2iupm25PlN0xFreAlBA5zaBSv3og0DdeGA4Ar6h6rJ3A0rolRUKJhSF2V10GZKDgWF/VmAEsNWjCRB+A==} engines: {node: '>=4'} dependencies: @@ -7025,7 +7280,7 @@ packages: type-detect: 4.0.8 dev: true - /chalk/1.1.3: + /chalk@1.1.3: resolution: {integrity: sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==} engines: {node: '>=0.10.0'} dependencies: @@ -7036,7 +7291,7 @@ packages: supports-color: 2.0.0 dev: true - /chalk/2.3.0: + /chalk@2.3.0: resolution: {integrity: sha512-Az5zJR2CBujap2rqXGaJKaPHyJ0IrUimvYNX+ncCy8PJP4ltOGTrHUIo097ZaL2zMeKYpiCdqDvS6zdrTFok3Q==} engines: {node: '>=4'} dependencies: @@ -7045,16 +7300,15 @@ packages: supports-color: 4.5.0 dev: false - /chalk/2.4.2: + /chalk@2.4.2: resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} engines: {node: '>=4'} dependencies: ansi-styles: 3.2.1 escape-string-regexp: 1.0.5 supports-color: 5.5.0 - dev: true - /chalk/4.1.2: + /chalk@4.1.2: resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} engines: {node: '>=10'} dependencies: @@ -7062,46 +7316,46 @@ packages: supports-color: 7.2.0 dev: true - /channel-ts/0.1.2: + /channel-ts@0.1.2: resolution: {integrity: sha512-cI/XiDF+jB0v95Xup8xlM7k93lT3xwPl0WdjEZ9w9aUMf5N+3GQevspK2EDYfMyxcKcXdN1F6PDpuYRpUfaZmg==} dev: false - /char-regex/1.0.2: + /char-regex@1.0.2: resolution: {integrity: sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==} engines: {node: '>=10'} dev: true - /character-entities-html4/2.1.0: + /character-entities-html4@2.1.0: resolution: {integrity: sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==} dev: false - /character-entities-legacy/3.0.0: + /character-entities-legacy@3.0.0: resolution: {integrity: sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==} dev: false - /character-entities/2.0.2: + /character-entities@2.0.2: resolution: {integrity: sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==} dev: false - /character-reference-invalid/2.0.1: + /character-reference-invalid@2.0.1: resolution: {integrity: sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==} dev: false - /charenc/0.0.2: + /charenc@0.0.2: resolution: {integrity: sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA==} dev: true - /check-error/1.0.2: + /check-error@1.0.2: resolution: {integrity: sha512-BrgHpW9NURQgzoNyjfq0Wu6VFO6D7IZEmJNdtgNqpzGG8RuNFHt2jQxWlAs4HMe119chBnv+34syEZtc6IhLtA==} dev: true - /checkpoint-store/1.1.0: + /checkpoint-store@1.1.0: resolution: {integrity: sha512-J/NdY2WvIx654cc6LWSq/IYFFCUf75fFTgwzFnmbqyORH4MwgiQCgswLLKBGzmsyTI5V7i5bp/So6sMbDWhedg==} dependencies: functional-red-black-tree: 1.0.1 dev: true - /chokidar/3.3.0: + /chokidar@3.3.0: resolution: {integrity: sha512-dGmKLDdT3Gdl7fBUe8XK+gAtGmzy5Fn0XkkWQuYxGIgWVPPse2CxFA5mtrlD0TOHaHjEUqkWNyP1XdHoJES/4A==} engines: {node: '>= 8.10.0'} dependencies: @@ -7116,7 +7370,7 @@ packages: fsevents: 2.1.3 dev: true - /chokidar/3.5.3: + /chokidar@3.5.3: resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} engines: {node: '>= 8.10.0'} dependencies: @@ -7131,29 +7385,29 @@ packages: fsevents: 2.3.2 dev: true - /chownr/1.1.4: + /chownr@1.1.4: resolution: {integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==} - /chownr/2.0.0: + /chownr@2.0.0: resolution: {integrity: sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==} engines: {node: '>=10'} dev: true - /chrome-trace-event/1.0.3: + /chrome-trace-event@1.0.3: resolution: {integrity: sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==} engines: {node: '>=6.0'} dev: true - /ci-info/2.0.0: + /ci-info@2.0.0: resolution: {integrity: sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==} dev: true - /ci-info/3.6.2: + /ci-info@3.6.2: resolution: {integrity: sha512-lVZdhvbEudris15CLytp2u6Y0p5EKfztae9Fqa189MfNmln9F33XuH69v5fvNfiRN5/0eAUz2yJL3mo+nhaRKg==} engines: {node: '>=8'} dev: true - /cids/0.7.5: + /cids@0.7.5: 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 @@ -7166,22 +7420,22 @@ packages: dev: true optional: true - /cipher-base/1.0.4: + /cipher-base@1.0.4: resolution: {integrity: sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==} dependencies: inherits: 2.0.4 safe-buffer: 5.2.1 - /cjs-module-lexer/1.2.2: + /cjs-module-lexer@1.2.2: resolution: {integrity: sha512-cOU9usZw8/dXIXKtwa8pM0OTJQuJkxMN6w30csNRUerHfeQ5R6U3kkU/FtJeIf3M202OHfY2U8ccInBG7/xogA==} dev: true - /class-is/1.1.0: + /class-is@1.1.0: resolution: {integrity: sha512-rhjH9AG1fvabIDoGRVH587413LPjTZgmDF9fOFCbFJQV4yuocX1mHxxvXI4g3cGwbVY9wAYIoKlg1N79frJKQw==} dev: true optional: true - /class-utils/0.3.6: + /class-utils@0.3.6: resolution: {integrity: sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==} engines: {node: '>=0.10.0'} dependencies: @@ -7191,7 +7445,7 @@ packages: static-extend: 0.1.2 dev: true - /classic-level/1.2.0: + /classic-level@1.2.0: resolution: {integrity: sha512-qw5B31ANxSluWz9xBzklRWTUAJ1SXIdaVKTVS7HcTGKOAmExx65Wo5BUICW+YGORe2FOUaDghoI9ZDxj82QcFg==} engines: {node: '>=12'} requiresBuild: true @@ -7203,19 +7457,19 @@ packages: node-gyp-build: 4.6.0 dev: true - /clean-css/5.3.2: + /clean-css@5.3.2: resolution: {integrity: sha512-JVJbM+f3d3Q704rF4bqQ5UUyTtuJ0JRKNbTKVEeujCCBoMdkEi+V+e8oktO9qGQNSvHrFTM6JZRXrUvGR1czww==} engines: {node: '>= 10.0'} dependencies: source-map: 0.6.1 dev: true - /clean-stack/2.2.0: + /clean-stack@2.2.0: resolution: {integrity: sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==} engines: {node: '>=6'} dev: true - /cli-color/2.0.3: + /cli-color@2.0.3: resolution: {integrity: sha512-OkoZnxyC4ERN3zLzZaY9Emb7f/MhBOIpePv0Ycok0fJYT+Ouo00UBEIwsVsr0yoow++n5YWlSUgST9GKhNHiRQ==} engines: {node: '>=0.10'} dependencies: @@ -7226,14 +7480,14 @@ packages: timers-ext: 0.1.7 dev: false - /cli-cursor/3.1.0: + /cli-cursor@3.1.0: resolution: {integrity: sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==} engines: {node: '>=8'} dependencies: restore-cursor: 3.1.0 dev: true - /cli-table3/0.5.1: + /cli-table3@0.5.1: resolution: {integrity: sha512-7Qg2Jrep1S/+Q3EceiZtQcDPWxhAvBw+ERf1162v4sikJrvojMHFqXt8QIVha8UlH9rgU0BeWPytZ9/TzYqlUw==} engines: {node: '>=6'} dependencies: @@ -7243,7 +7497,7 @@ packages: colors: 1.4.0 dev: true - /cli-table3/0.6.3: + /cli-table3@0.6.3: resolution: {integrity: sha512-w5Jac5SykAeZJKntOxJCrm63Eg5/4dhMWIcuTbo9rpE+brgaSZo0RuNJZeOyMgsUdhDeojvgyQLmjI+K50ZGyg==} engines: {node: 10.* || >= 12.*} dependencies: @@ -7252,7 +7506,7 @@ packages: '@colors/colors': 1.5.0 dev: true - /cli-truncate/2.1.0: + /cli-truncate@2.1.0: resolution: {integrity: sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==} engines: {node: '>=8'} dependencies: @@ -7260,7 +7514,7 @@ packages: string-width: 4.2.3 dev: true - /cli-truncate/3.1.0: + /cli-truncate@3.1.0: resolution: {integrity: sha512-wfOBkjXteqSnI59oPcJkcPl/ZmwvMMOj340qUIY1SKZCv0B9Cf4D4fAucRkIKQmsIuYK3x1rrgU7MeGRruiuiA==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} dependencies: @@ -7268,11 +7522,11 @@ packages: string-width: 5.1.2 dev: true - /client-only/0.0.1: + /client-only@0.0.1: resolution: {integrity: sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==} dev: false - /clipboardy/1.2.2: + /clipboardy@1.2.2: resolution: {integrity: sha512-16KrBOV7bHmHdxcQiCvfUFYVFyEah4FI8vYT1Fr7CGSA4G+xBWMEfUEQJS1hxeHGtI9ju1Bzs9uXSbj5HZKArw==} engines: {node: '>=4'} dependencies: @@ -7280,7 +7534,7 @@ packages: execa: 0.8.0 dev: false - /cliui/3.2.0: + /cliui@3.2.0: resolution: {integrity: sha512-0yayqDxWQbqk3ojkYqUKqaAQ6AfNKeKWRNA8kR0WXzAsdHpP4BIaOmMAG87JGuO6qcobyW4GjxHd9PmhEd+T9w==} dependencies: string-width: 1.0.2 @@ -7288,14 +7542,14 @@ packages: wrap-ansi: 2.1.0 dev: true - /cliui/5.0.0: + /cliui@5.0.0: resolution: {integrity: sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==} dependencies: string-width: 3.1.0 strip-ansi: 5.2.0 wrap-ansi: 5.1.0 - /cliui/6.0.0: + /cliui@6.0.0: resolution: {integrity: sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==} dependencies: string-width: 4.2.3 @@ -7303,7 +7557,7 @@ packages: wrap-ansi: 6.2.0 dev: true - /cliui/7.0.4: + /cliui@7.0.4: resolution: {integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==} dependencies: string-width: 4.2.3 @@ -7311,7 +7565,7 @@ packages: wrap-ansi: 7.0.0 dev: true - /cliui/8.0.1: + /cliui@8.0.1: resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} engines: {node: '>=12'} dependencies: @@ -7319,41 +7573,41 @@ packages: strip-ansi: 6.0.1 wrap-ansi: 7.0.0 - /clone-response/1.0.3: + /clone-response@1.0.3: resolution: {integrity: sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==} dependencies: mimic-response: 1.0.1 dev: true optional: true - /clone/0.1.19: + /clone@0.1.19: resolution: {integrity: sha512-IO78I0y6JcSpEPHzK4obKdsL7E7oLdRVDVOLwr2Hkbjsb+Eoz0dxW6tef0WizoKu0gLC4oZSZuEF4U2K6w1WQw==} dev: true - /clone/2.1.2: + /clone@2.1.2: resolution: {integrity: sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==} engines: {node: '>=0.8'} - /clsx/1.2.1: + /clsx@1.2.1: resolution: {integrity: sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg==} engines: {node: '>=6'} dev: false - /co/4.6.0: + /co@4.6.0: resolution: {integrity: sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==} engines: {iojs: '>= 1.0.0', node: '>= 0.12.0'} dev: true - /code-point-at/1.1.0: + /code-point-at@1.1.0: resolution: {integrity: sha512-RpAVKQA5T63xEj6/giIbUEtZwJ4UFIc3ZtvEkiaUERylqe8xb5IvqcgOurZLahv93CLKfxcw5YI+DZcUBRyLXA==} engines: {node: '>=0.10.0'} dev: true - /collect-v8-coverage/1.0.1: + /collect-v8-coverage@1.0.1: resolution: {integrity: sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg==} dev: true - /collection-visit/1.0.0: + /collection-visit@1.0.0: resolution: {integrity: sha512-lNkKvzEeMBBjUGHZ+q6z9pSJla0KWAQPvtzhEV9+iGyQYG+pBpl7xKDhxoNSOZH2hhv0v5k0y2yAM4o4SjoSkw==} engines: {node: '>=0.10.0'} dependencies: @@ -7361,36 +7615,36 @@ packages: object-visit: 1.0.1 dev: true - /color-convert/1.9.3: + /color-convert@1.9.3: resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} dependencies: color-name: 1.1.3 - /color-convert/2.0.1: + /color-convert@2.0.1: resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} engines: {node: '>=7.0.0'} dependencies: color-name: 1.1.4 - /color-name/1.1.3: + /color-name@1.1.3: resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} - /color-name/1.1.4: + /color-name@1.1.4: resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} - /color-string/1.9.1: + /color-string@1.9.1: resolution: {integrity: sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==} dependencies: color-name: 1.1.4 simple-swizzle: 0.2.2 dev: false - /color-support/1.1.3: + /color-support@1.1.3: resolution: {integrity: sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==} hasBin: true dev: true - /color/4.2.3: + /color@4.2.3: resolution: {integrity: sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==} engines: {node: '>=12.5.0'} dependencies: @@ -7398,29 +7652,29 @@ packages: color-string: 1.9.1 dev: false - /colorette/2.0.19: + /colorette@2.0.19: resolution: {integrity: sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ==} dev: true - /colors/1.4.0: + /colors@1.4.0: resolution: {integrity: sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==} engines: {node: '>=0.1.90'} dev: true - /combined-stream/1.0.8: + /combined-stream@1.0.8: resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} engines: {node: '>= 0.8'} dependencies: delayed-stream: 1.0.0 - /comma-separated-tokens/2.0.3: + /comma-separated-tokens@2.0.3: resolution: {integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==} dev: false - /command-exists/1.2.9: + /command-exists@1.2.9: resolution: {integrity: sha512-LTQ/SGc+s0Xc0Fu5WaKnR0YiygZkm9eKFvyS+fRsU7/ZWFF8ykFM6Pc9aCVf1+xasOOZpO3BAVgVrKvsqKHV7w==} - /command-line-args/4.0.7: + /command-line-args@4.0.7: resolution: {integrity: sha512-aUdPvQRAyBvQd2n7jXcsMDz68ckBJELXNzBybCHOibUWEg0mWTnaYCSRU8h9R+aNRSvDihJtssSRCiDRpLaezA==} hasBin: true dependencies: @@ -7429,44 +7683,44 @@ packages: typical: 2.6.1 dev: true - /commander/10.0.0: + /commander@10.0.0: resolution: {integrity: sha512-zS5PnTI22FIRM6ylNW8G4Ap0IEOyk62fhLSD0+uHRT9McRCLGpkVNvao4bjimpK/GShynyQkFFxHhwMcETmduA==} engines: {node: '>=14'} dev: true - /commander/2.20.3: + /commander@2.20.3: resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} - /commander/3.0.2: + /commander@3.0.2: resolution: {integrity: sha512-Gar0ASD4BDyKC4hl4DwHqDrmvjoxWKZigVnAbn5H1owvm4CxCPdb0HQDehwNYMJpla5+M2tPmPARzhtYuwpHow==} dev: true - /commander/8.3.0: + /commander@8.3.0: resolution: {integrity: sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==} engines: {node: '>= 12'} - /commander/9.5.0: + /commander@9.5.0: resolution: {integrity: sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==} engines: {node: ^12.20.0 || >=14} dev: true - /compare-versions/5.0.3: + /compare-versions@5.0.3: resolution: {integrity: sha512-4UZlZP8Z99MGEY+Ovg/uJxJuvoXuN4M6B3hKaiackiHrgzQFEe3diJi1mf1PNHbFujM7FvLrK2bpgIaImbtZ1A==} dev: true - /component-emitter/1.3.0: + /component-emitter@1.3.0: resolution: {integrity: sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==} dev: true - /compute-scroll-into-view/3.0.0: + /compute-scroll-into-view@3.0.0: resolution: {integrity: sha512-Yk1An4qzo5++Cu6peT9PsmRKIU8tALpmdoE09n//AfGQFcPfx21/tMGMsmKYmLJWaBJrGOJ5Jz5hoU+7cZZUWQ==} dev: false - /concat-map/0.0.1: + /concat-map@0.0.1: resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} dev: true - /concat-stream/1.6.2: + /concat-stream@1.6.2: resolution: {integrity: sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==} engines: {'0': node >= 0.8} dependencies: @@ -7476,11 +7730,11 @@ packages: typedarray: 0.0.6 dev: true - /console-control-strings/1.1.0: + /console-control-strings@1.1.0: resolution: {integrity: sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==} dev: true - /consolidate/0.15.1: + /consolidate@0.15.1(lodash@4.17.21): resolution: {integrity: sha512-DW46nrsMJgy9kqAbPt5rKaCr7uFtpo4mSUvLHIUbJEjm0vo+aY5QLwBUq3FK4tRnJr/X0Psc0C4jf/h+HtXSMw==} engines: {node: '>= 0.10.0'} peerDependencies: @@ -7646,9 +7900,10 @@ packages: optional: true dependencies: bluebird: 3.7.2 + lodash: 4.17.21 dev: true - /content-disposition/0.5.4: + /content-disposition@0.5.4: resolution: {integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==} engines: {node: '>= 0.6'} dependencies: @@ -7656,7 +7911,7 @@ packages: dev: true optional: true - /content-hash/2.5.2: + /content-hash@2.5.2: resolution: {integrity: sha512-FvIQKy0S1JaWV10sMsA7TRx8bpU+pqPkhbsfvOJAdjRXvYxEckAwQWGwtRjiaJfh+E0DvcWUGqcdjwMGFjsSdw==} dependencies: cids: 0.7.5 @@ -7665,73 +7920,72 @@ packages: dev: true optional: true - /content-type/1.0.5: + /content-type@1.0.5: resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==} engines: {node: '>= 0.6'} dev: true optional: true - /convert-source-map/1.9.0: + /convert-source-map@1.9.0: resolution: {integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==} - dev: true - /cookie-signature/1.0.6: + /cookie-signature@1.0.6: resolution: {integrity: sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==} dev: true optional: true - /cookie/0.4.2: + /cookie@0.4.2: resolution: {integrity: sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==} engines: {node: '>= 0.6'} dev: true - /cookie/0.5.0: + /cookie@0.5.0: resolution: {integrity: sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==} engines: {node: '>= 0.6'} dev: true optional: true - /cookiejar/2.1.4: + /cookiejar@2.1.4: resolution: {integrity: sha512-LDx6oHrK+PhzLKJU9j5S7/Y3jM/mUHvD/DeI1WQmJn652iPC5Y4TBzC9l+5OMOXlyTTA+SmVUPm0HQUwpD5Jqw==} dev: true optional: true - /copy-descriptor/0.1.1: + /copy-descriptor@0.1.1: resolution: {integrity: sha512-XgZ0pFcakEUlbwQEVNg3+QAis1FyTL3Qel9FYy8pSkQqoG3PNoT0bOCQtOXcOkur21r2Eq2kI+IE+gsmAEVlYw==} engines: {node: '>=0.10.0'} dev: true - /copy-to-clipboard/3.3.3: + /copy-to-clipboard@3.3.3: resolution: {integrity: sha512-2KV8NhB5JqC3ky0r9PMCAZKbUHSwtEo4CwCs0KXgruG43gX5PMqDEBbVU4OUzw2MuAWUfsuFmWvEKG5QRfSnJA==} dependencies: toggle-selection: 1.0.6 dev: false - /core-js-compat/3.26.1: + /core-js-compat@3.26.1: resolution: {integrity: sha512-622/KzTudvXCDLRw70iHW4KKs1aGpcRcowGWyYJr2DEBfRrd6hNJybxSWJFuZYD4ma86xhrwDDHxmDaIq4EA8A==} dependencies: browserslist: 4.21.4 - /core-js-pure/3.29.0: + /core-js-pure@3.29.0: resolution: {integrity: sha512-v94gUjN5UTe1n0yN/opTihJ8QBWD2O8i19RfTZR7foONPWArnjB96QA/wk5ozu1mm6ja3udQCzOzwQXTxi3xOQ==} requiresBuild: true dev: true - /core-js/2.6.12: + /core-js@2.6.12: resolution: {integrity: sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==} deprecated: core-js@<3.23.3 is no longer maintained and not recommended for usage due to the number of issues. Because of the V8 engine whims, feature detection in old core-js versions could cause a slowdown up to 100x even if nothing is polyfilled. Some versions have web compatibility issues. Please, upgrade your dependencies to the actual version of core-js. requiresBuild: true dev: true - /core-util-is/1.0.2: + /core-util-is@1.0.2: resolution: {integrity: sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==} dev: true - /core-util-is/1.0.3: + /core-util-is@1.0.3: resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} dev: true - /cors/2.8.5: + /cors@2.8.5: resolution: {integrity: sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==} engines: {node: '>= 0.10'} dependencies: @@ -7740,7 +7994,7 @@ packages: dev: true optional: true - /cosmiconfig/5.2.1: + /cosmiconfig@5.2.1: resolution: {integrity: sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==} engines: {node: '>=4'} dependencies: @@ -7750,7 +8004,7 @@ packages: parse-json: 4.0.0 dev: true - /cosmiconfig/7.1.0: + /cosmiconfig@7.1.0: resolution: {integrity: sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==} engines: {node: '>=10'} dependencies: @@ -7761,7 +8015,7 @@ packages: yaml: 1.10.2 dev: true - /cosmiconfig/8.1.0: + /cosmiconfig@8.1.0: resolution: {integrity: sha512-0tLZ9URlPGU7JsKq0DQOQ3FoRsYX8xDZ7xMiATQfaiGMz7EHowNkbU9u1coAOmnh9p/1ySpm0RB3JNWRXM5GCg==} engines: {node: '>=14'} dependencies: @@ -7771,20 +8025,20 @@ packages: path-type: 4.0.0 dev: true - /crc-32/1.2.2: + /crc-32@1.2.2: resolution: {integrity: sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==} engines: {node: '>=0.8'} hasBin: true dev: true - /create-ecdh/4.0.4: + /create-ecdh@4.0.4: resolution: {integrity: sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==} dependencies: bn.js: 4.12.0 elliptic: 6.5.4 dev: true - /create-hash/1.2.0: + /create-hash@1.2.0: resolution: {integrity: sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==} dependencies: cipher-base: 1.0.4 @@ -7793,7 +8047,7 @@ packages: ripemd160: 2.0.2 sha.js: 2.4.11 - /create-hmac/1.1.7: + /create-hmac@1.1.7: resolution: {integrity: sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==} dependencies: cipher-base: 1.0.4 @@ -7803,11 +8057,11 @@ packages: safe-buffer: 5.2.1 sha.js: 2.4.11 - /create-require/1.1.1: + /create-require@1.1.1: resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} dev: true - /cross-fetch/2.2.6: + /cross-fetch@2.2.6: resolution: {integrity: sha512-9JZz+vXCmfKUZ68zAptS7k4Nu8e2qcibe7WVZYps7sAgk5R8GYTc+T1WR0v1rlP9HxgARmOX1UTIJZFytajpNA==} dependencies: node-fetch: 2.6.9 @@ -7816,7 +8070,7 @@ packages: - encoding dev: true - /cross-fetch/3.1.5: + /cross-fetch@3.1.5: resolution: {integrity: sha512-lvb1SBsI0Z7GDwmuid+mU3kWVBwTVUbe7S0H52yaaAdQOXq2YktTCZdlAcNKFzE6QtRz0snpw9bNiPeOIkkQvw==} dependencies: node-fetch: 2.6.7 @@ -7824,7 +8078,7 @@ packages: - encoding dev: false - /cross-spawn/5.1.0: + /cross-spawn@5.1.0: resolution: {integrity: sha512-pTgQJ5KC0d2hcY8eyL1IzlBPYjTkyH72XRZPnLyKus2mBfNjQs3klqbJU2VILqZryAZUt9JOb3h/mWMy23/f5A==} dependencies: lru-cache: 4.1.5 @@ -7832,7 +8086,7 @@ packages: which: 1.3.1 dev: false - /cross-spawn/6.0.5: + /cross-spawn@6.0.5: resolution: {integrity: sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==} engines: {node: '>=4.8'} dependencies: @@ -7843,7 +8097,7 @@ packages: which: 1.3.1 dev: true - /cross-spawn/7.0.3: + /cross-spawn@7.0.3: resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} engines: {node: '>= 8'} dependencies: @@ -7852,11 +8106,11 @@ packages: which: 2.0.2 dev: true - /crypt/0.0.2: + /crypt@0.0.2: resolution: {integrity: sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow==} dev: true - /crypto-browserify/3.12.0: + /crypto-browserify@3.12.0: resolution: {integrity: sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==} dependencies: browserify-cipher: 1.0.1 @@ -7872,24 +8126,24 @@ packages: randomfill: 1.0.4 dev: true - /css-loader/6.7.3_webpack@5.75.0: + /css-loader@6.7.3(webpack@5.75.0): resolution: {integrity: sha512-qhOH1KlBMnZP8FzRO6YCH9UHXQhVMcEGLyNdb7Hv2cpcmJbW0YrddO+tG1ab5nT41KpHIYGsbeHqxB9xPu1pKQ==} engines: {node: '>= 12.13.0'} peerDependencies: webpack: ^5.0.0 dependencies: - icss-utils: 5.1.0_postcss@8.4.21 + icss-utils: 5.1.0(postcss@8.4.21) postcss: 8.4.21 - postcss-modules-extract-imports: 3.0.0_postcss@8.4.21 - postcss-modules-local-by-default: 4.0.0_postcss@8.4.21 - postcss-modules-scope: 3.0.0_postcss@8.4.21 - postcss-modules-values: 4.0.0_postcss@8.4.21 + postcss-modules-extract-imports: 3.0.0(postcss@8.4.21) + postcss-modules-local-by-default: 4.0.0(postcss@8.4.21) + postcss-modules-scope: 3.0.0(postcss@8.4.21) + postcss-modules-values: 4.0.0(postcss@8.4.21) postcss-value-parser: 4.2.0 semver: 7.3.8 webpack: 5.75.0 dev: true - /css-select/4.3.0: + /css-select@4.3.0: resolution: {integrity: sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==} dependencies: boolbase: 1.0.0 @@ -7899,53 +8153,53 @@ packages: nth-check: 2.1.1 dev: true - /css-what/6.1.0: + /css-what@6.1.0: resolution: {integrity: sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==} engines: {node: '>= 6'} dev: true - /cssesc/3.0.0: + /cssesc@3.0.0: resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} engines: {node: '>=4'} hasBin: true dev: true - /cssom/0.3.8: + /cssom@0.3.8: resolution: {integrity: sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==} dev: true - /cssom/0.4.4: + /cssom@0.4.4: resolution: {integrity: sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw==} dev: true - /cssstyle/2.3.0: + /cssstyle@2.3.0: resolution: {integrity: sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==} engines: {node: '>=8'} dependencies: cssom: 0.3.8 dev: true - /csstype/3.1.1: + /csstype@3.1.1: resolution: {integrity: sha512-DJR/VvkAvSZW9bTouZue2sSxDwdTN92uHjqeKVm+0dAqdfNykRzQ95tay8aXMBAAPpUiq4Qcug2L7neoRh2Egw==} - /d/1.0.1: + /d@1.0.1: resolution: {integrity: sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==} dependencies: es5-ext: 0.10.62 type: 1.2.0 - /daisyui/1.16.6: + /daisyui@1.16.6: resolution: {integrity: sha512-kso740gqMVVqritCQliQCpfPwos9lxp7/TEiEev4w6GGQyLNRyfriWY+DWxfawMY/DwGDzBl2DZtekCMf73bzw==} dev: true - /dashdash/1.14.1: + /dashdash@1.14.1: resolution: {integrity: sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==} engines: {node: '>=0.10'} dependencies: assert-plus: 1.0.0 dev: true - /data-urls/2.0.0: + /data-urls@2.0.0: resolution: {integrity: sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ==} engines: {node: '>=10'} dependencies: @@ -7954,15 +8208,15 @@ packages: whatwg-url: 8.7.0 dev: true - /de-indent/1.0.2: + /de-indent@1.0.2: resolution: {integrity: sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg==} dev: true - /death/1.1.0: + /death@1.1.0: resolution: {integrity: sha512-vsV6S4KVHvTGxbEcij7hkWRv0It+sGGWVOM67dQde/o5Xjnr+KmLjxWJii2uEObIrt1CcM9w0Yaovx+iOlIL+w==} dev: true - /debug/2.6.9: + /debug@2.6.9: resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} peerDependencies: supports-color: '*' @@ -7973,19 +8227,7 @@ packages: ms: 2.0.0 dev: true - /debug/3.2.6: - resolution: {integrity: sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==} - deprecated: Debug versions >=3.2.0 <3.2.7 || >=4 <4.3.1 have a low-severity ReDos regression when used in a Node.js environment. It is recommended you upgrade to 3.2.7 or 4.3.1. (https://github.com/visionmedia/debug/issues/797) - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - dependencies: - ms: 2.1.3 - dev: true - - /debug/3.2.6_supports-color@6.0.0: + /debug@3.2.6(supports-color@6.0.0): resolution: {integrity: sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==} deprecated: Debug versions >=3.2.0 <3.2.7 || >=4 <4.3.1 have a low-severity ReDos regression when used in a Node.js environment. It is recommended you upgrade to 3.2.7 or 4.3.1. (https://github.com/visionmedia/debug/issues/797) peerDependencies: @@ -7998,7 +8240,7 @@ packages: supports-color: 6.0.0 dev: true - /debug/3.2.7: + /debug@3.2.7: resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} peerDependencies: supports-color: '*' @@ -8009,18 +8251,7 @@ packages: ms: 2.1.3 dev: true - /debug/4.3.4: - resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} - engines: {node: '>=6.0'} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - dependencies: - ms: 2.1.2 - - /debug/4.3.4_supports-color@8.1.1: + /debug@4.3.4(supports-color@8.1.1): resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} engines: {node: '>=6.0'} peerDependencies: @@ -8031,9 +8262,8 @@ packages: dependencies: ms: 2.1.2 supports-color: 8.1.1 - dev: true - /debug/4.3.4_supports-color@9.3.1: + /debug@4.3.4(supports-color@9.3.1): resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} engines: {node: '>=6.0'} peerDependencies: @@ -8046,7 +8276,7 @@ packages: supports-color: 9.3.1 dev: true - /decamelize-keys/1.1.1: + /decamelize-keys@1.1.1: resolution: {integrity: sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==} engines: {node: '>=0.10.0'} dependencies: @@ -8054,36 +8284,36 @@ packages: map-obj: 1.0.1 dev: true - /decamelize/1.2.0: + /decamelize@1.2.0: resolution: {integrity: sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==} engines: {node: '>=0.10.0'} - /decamelize/4.0.0: + /decamelize@4.0.0: resolution: {integrity: sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==} engines: {node: '>=10'} dev: true - /decimal.js/10.4.2: + /decimal.js@10.4.2: resolution: {integrity: sha512-ic1yEvwT6GuvaYwBLLY6/aFFgjZdySKTE8en/fkU3QICTmRtgtSlFn0u0BXN06InZwtfCelR7j8LRiDI/02iGA==} dev: true - /decode-named-character-reference/1.0.2: + /decode-named-character-reference@1.0.2: resolution: {integrity: sha512-O8x12RzrUF8xyVcY0KJowWsmaJxQbmy0/EtnNtHRpsOcT7dFk5W598coHqBVpmWo1oQQfsCqfCmkZN5DJrZVdg==} dependencies: character-entities: 2.0.2 dev: false - /decode-uri-component/0.2.0: + /decode-uri-component@0.2.0: resolution: {integrity: sha512-hjf+xovcEn31w/EUYdTXQh/8smFL/dzYjohQGEIgjyNavaJfBY2p5F527Bo1VPATxv0VYTUC2bOcXvqFwk78Og==} engines: {node: '>=0.10'} dev: false - /decode-uri-component/0.2.2: + /decode-uri-component@0.2.2: resolution: {integrity: sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==} engines: {node: '>=0.10'} dev: true - /decompress-response/3.3.0: + /decompress-response@3.3.0: resolution: {integrity: sha512-BzRPQuY1ip+qDonAOz42gRm/pg9F768C+npV/4JOsxRC2sq+Rlk+Q4ZCAsOhnIaMrgarILY+RMUIvMmmX1qAEA==} engines: {node: '>=4'} dependencies: @@ -8091,24 +8321,24 @@ packages: dev: true optional: true - /decompress-response/6.0.0: + /decompress-response@6.0.0: resolution: {integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==} engines: {node: '>=10'} dependencies: mimic-response: 3.1.0 - /dedent/0.7.0: + /dedent@0.7.0: resolution: {integrity: sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==} dev: true - /deep-eql/4.1.3: + /deep-eql@4.1.3: resolution: {integrity: sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==} engines: {node: '>=6'} dependencies: type-detect: 4.0.8 dev: true - /deep-equal/1.1.1: + /deep-equal@1.1.1: resolution: {integrity: sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g==} dependencies: is-arguments: 1.1.1 @@ -8119,43 +8349,43 @@ packages: regexp.prototype.flags: 1.4.3 dev: true - /deep-extend/0.6.0: + /deep-extend@0.6.0: resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==} engines: {node: '>=4.0.0'} dev: false - /deep-is/0.1.4: + /deep-is@0.1.4: resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} dev: true - /deepmerge/4.2.2: + /deepmerge@4.2.2: resolution: {integrity: sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==} engines: {node: '>=0.10.0'} - /defer-to-connect/1.1.3: + /defer-to-connect@1.1.3: resolution: {integrity: sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==} dev: true optional: true - /defer-to-connect/2.0.1: + /defer-to-connect@2.0.1: resolution: {integrity: sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==} engines: {node: '>=10'} dev: true optional: true - /deferred-leveldown/0.2.0: + /deferred-leveldown@0.2.0: resolution: {integrity: sha512-+WCbb4+ez/SZ77Sdy1iadagFiVzMB89IKOBhglgnUkVxOxRWmmFsz8UDSNWh4Rhq+3wr/vMFlYj+rdEwWUDdng==} dependencies: abstract-leveldown: 0.12.4 dev: true - /deferred-leveldown/1.2.2: + /deferred-leveldown@1.2.2: resolution: {integrity: sha512-uukrWD2bguRtXilKt6cAWKyoXrTSMo5m7crUdLfWQmu8kIm88w3QZoUL+6nhpfKVmhHANER6Re3sKoNoZ3IKMA==} dependencies: abstract-leveldown: 2.6.3 dev: true - /deferred-leveldown/4.0.2: + /deferred-leveldown@4.0.2: resolution: {integrity: sha512-5fMC8ek8alH16QiV0lTCis610D1Zt1+LA4MS4d63JgS32lrCjTFDUFz2ao09/j2I4Bqb5jL4FZYwu7Jz0XO1ww==} engines: {node: '>=6'} dependencies: @@ -8163,7 +8393,7 @@ packages: inherits: 2.0.4 dev: true - /deferred-leveldown/5.3.0: + /deferred-leveldown@5.3.0: resolution: {integrity: sha512-a59VOT+oDy7vtAbLRCZwWgxu2BaCfd5Hk7wxJd48ei7I+nsg8Orlb9CLG0PMZienk9BSUKgeAqkO2+Lw+1+Ukw==} engines: {node: '>=6'} dependencies: @@ -8171,7 +8401,7 @@ packages: inherits: 2.0.4 dev: true - /define-properties/1.2.0: + /define-properties@1.2.0: resolution: {integrity: sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==} engines: {node: '>= 0.4'} dependencies: @@ -8179,21 +8409,21 @@ packages: object-keys: 1.1.1 dev: true - /define-property/0.2.5: + /define-property@0.2.5: resolution: {integrity: sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==} engines: {node: '>=0.10.0'} dependencies: is-descriptor: 0.1.6 dev: true - /define-property/1.0.0: + /define-property@1.0.0: resolution: {integrity: sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==} engines: {node: '>=0.10.0'} dependencies: is-descriptor: 1.0.2 dev: true - /define-property/2.0.2: + /define-property@2.0.2: resolution: {integrity: sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==} engines: {node: '>=0.10.0'} dependencies: @@ -8201,24 +8431,24 @@ packages: isobject: 3.0.1 dev: true - /defined/1.0.1: + /defined@1.0.1: resolution: {integrity: sha512-hsBd2qSVCRE+5PmNdHt1uzyrFu5d3RwmFDKzyNZMFq/EwDNJF7Ee5+D5oEKF0hU6LhtoUF1macFvOe4AskQC1Q==} dev: true - /delay/5.0.0: + /delay@5.0.0: resolution: {integrity: sha512-ReEBKkIfe4ya47wlPYf/gu5ib6yUG0/Aez0JQZQz94kiWtRQvZIQbTiehsnwHvLSWJnQdhVeqYue7Id1dKr0qw==} engines: {node: '>=10'} dev: false - /delayed-stream/1.0.0: + /delayed-stream@1.0.0: resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} engines: {node: '>=0.4.0'} - /delegates/1.0.0: + /delegates@1.0.0: resolution: {integrity: sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==} dev: true - /delete-empty/3.0.0: + /delete-empty@3.0.0: resolution: {integrity: sha512-ZUyiwo76W+DYnKsL3Kim6M/UOavPdBJgDYWOmuQhYaZvJH0AXAHbUNyEDtRbBra8wqqr686+63/0azfEk1ebUQ==} engines: {node: '>=10'} hasBin: true @@ -8229,75 +8459,75 @@ packages: rimraf: 2.7.1 dev: true - /depd/1.1.2: + /depd@1.1.2: resolution: {integrity: sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==} engines: {node: '>= 0.6'} - /depd/2.0.0: + /depd@2.0.0: resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} engines: {node: '>= 0.8'} dev: true - /dependency-graph/0.9.0: + /dependency-graph@0.9.0: resolution: {integrity: sha512-9YLIBURXj4DJMFALxXw9K3Y3rwb5Fk0X5/8ipCzaN84+gKxoHK43tVKRNakCQbiEx07E8Uwhuq21BpUagFhZ8w==} engines: {node: '>= 0.6.0'} dev: true - /dequal/2.0.3: + /dequal@2.0.3: resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} engines: {node: '>=6'} dev: false - /des.js/1.0.1: + /des.js@1.0.1: resolution: {integrity: sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA==} dependencies: inherits: 2.0.4 minimalistic-assert: 1.0.1 dev: true - /destroy/1.2.0: + /destroy@1.2.0: resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==} engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} dev: true optional: true - /detect-browser/5.2.0: + /detect-browser@5.2.0: resolution: {integrity: sha512-tr7XntDAu50BVENgQfajMLzacmSe34D+qZc4zjnniz0ZVuw/TZcLcyxHQjYpJTM36sGEkZZlYLnIM1hH7alTMA==} dev: false - /detect-indent/4.0.0: + /detect-indent@4.0.0: resolution: {integrity: sha512-BDKtmHlOzwI7iRuEkhzsnPoi5ypEhWAJB5RvHWe1kMr06js3uK5B3734i3ui5Yd+wOJV1cpE4JnivPD283GU/A==} engines: {node: '>=0.10.0'} dependencies: repeating: 2.0.1 dev: true - /detect-indent/6.1.0: + /detect-indent@6.1.0: resolution: {integrity: sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==} engines: {node: '>=8'} dev: true - /detect-libc/2.0.1: + /detect-libc@2.0.1: resolution: {integrity: sha512-463v3ZeIrcWtdgIg6vI6XUncguvr2TnGl4SzDXinkt9mSLpBJKXT3mW6xT3VQdDN11+WVs29pgvivTc4Lp8v+w==} engines: {node: '>=8'} dev: false - /detect-newline/3.1.0: + /detect-newline@3.1.0: resolution: {integrity: sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==} engines: {node: '>=8'} dev: true - /detect-port/1.5.1: + /detect-port@1.5.1: resolution: {integrity: sha512-aBzdj76lueB6uUst5iAs7+0H/oOjqI5D16XUWxlWMIMROhcM0rfsNVk93zTngq1dDNpoXRr++Sus7ETAExppAQ==} hasBin: true dependencies: address: 1.2.2 - debug: 4.3.4 + debug: 4.3.4(supports-color@8.1.1) transitivePeerDependencies: - supports-color dev: true - /detective/5.2.1: + /detective@5.2.1: resolution: {integrity: sha512-v9XE1zRnz1wRtgurGu0Bs8uHKFSTdteYZNbIPFVhUZ39L/S79ppMpdmVOZAnoz1jfEFodc48n6MX483Xo3t1yw==} engines: {node: '>=0.8.0'} hasBin: true @@ -8307,35 +8537,35 @@ packages: minimist: 1.2.8 dev: true - /didyoumean/1.2.2: + /didyoumean@1.2.2: resolution: {integrity: sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==} dev: true - /diff-sequences/27.5.1: + /diff-sequences@27.5.1: resolution: {integrity: sha512-k1gCAXAsNgLwEL+Y8Wvl+M6oEFj5bgazfZULpS5CneoPPXRaCCW7dm+q21Ky2VEE5X+VeRDBVg1Pcvvsr4TtNQ==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dev: true - /diff/3.5.0: + /diff@3.5.0: resolution: {integrity: sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==} engines: {node: '>=0.3.1'} dev: true - /diff/4.0.2: + /diff@4.0.2: resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==} engines: {node: '>=0.3.1'} dev: true - /diff/5.0.0: + /diff@5.0.0: resolution: {integrity: sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==} engines: {node: '>=0.3.1'} dev: true - /diff/5.1.0: + /diff@5.1.0: resolution: {integrity: sha512-D+mk+qE8VC/PAUrlAU34N+VfXev0ghe5ywmpqrawphmVZc1bEfn56uo9qpyGp1p4xpzOHkSW4ztBd6L7Xx4ACw==} engines: {node: '>=0.3.1'} - /diffie-hellman/5.0.3: + /diffie-hellman@5.0.3: resolution: {integrity: sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==} dependencies: bn.js: 4.12.0 @@ -8343,48 +8573,48 @@ packages: randombytes: 2.1.0 dev: true - /difflib/0.2.4: + /difflib@0.2.4: resolution: {integrity: sha512-9YVwmMb0wQHQNr5J9m6BSj6fk4pfGITGQOOs+D9Fl+INODWFOfvhIU1hNv6GgR1RBoC/9NJcwu77zShxV0kT7w==} dependencies: heap: 0.2.7 dev: true - /dijkstrajs/1.0.2: + /dijkstrajs@1.0.2: resolution: {integrity: sha512-QV6PMaHTCNmKSeP6QoXhVTw9snc9VD8MulTT0Bd99Pacp4SS1cjcrYPgBPmibqKVtMJJfqC6XvOXgPMEEPH/fg==} dev: false - /dir-glob/3.0.1: + /dir-glob@3.0.1: resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} engines: {node: '>=8'} dependencies: path-type: 4.0.0 dev: true - /dlv/1.1.3: + /dlv@1.1.3: resolution: {integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==} dev: true - /doctrine/2.1.0: + /doctrine@2.1.0: resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==} engines: {node: '>=0.10.0'} dependencies: esutils: 2.0.3 dev: true - /doctrine/3.0.0: + /doctrine@3.0.0: resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} engines: {node: '>=6.0.0'} dependencies: esutils: 2.0.3 dev: true - /dom-converter/0.2.0: + /dom-converter@0.2.0: resolution: {integrity: sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==} dependencies: utila: 0.4.0 dev: true - /dom-serializer/1.4.1: + /dom-serializer@1.4.1: resolution: {integrity: sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==} dependencies: domelementtype: 2.3.0 @@ -8392,29 +8622,29 @@ packages: entities: 2.2.0 dev: true - /dom-walk/0.1.2: + /dom-walk@0.1.2: resolution: {integrity: sha512-6QvTW9mrGeIegrFXdtQi9pk7O/nSK6lSdXW2eqUspN5LWD7UTji2Fqw5V2YLjBpHEoU9Xl/eUWNpDeZvoyOv2w==} dev: true - /domelementtype/2.3.0: + /domelementtype@2.3.0: resolution: {integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==} dev: true - /domexception/2.0.1: + /domexception@2.0.1: resolution: {integrity: sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg==} engines: {node: '>=8'} dependencies: webidl-conversions: 5.0.0 dev: true - /domhandler/4.3.1: + /domhandler@4.3.1: resolution: {integrity: sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==} engines: {node: '>= 4'} dependencies: domelementtype: 2.3.0 dev: true - /domutils/2.8.0: + /domutils@2.8.0: resolution: {integrity: sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==} dependencies: dom-serializer: 1.4.1 @@ -8422,52 +8652,52 @@ packages: domhandler: 4.3.1 dev: true - /dot-case/3.0.4: + /dot-case@3.0.4: resolution: {integrity: sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==} dependencies: no-case: 3.0.4 tslib: 2.5.0 dev: true - /dotenv/10.0.0: + /dotenv@10.0.0: resolution: {integrity: sha512-rlBi9d8jpv9Sf1klPjNfFAuWDjKLwTIJJ/VxtoTwIR6hnZxcEOQCZg2oIL3MWBYw5GpUDKOEnND7LXTbIpQ03Q==} engines: {node: '>=10'} dev: true - /dotenv/16.0.3: + /dotenv@16.0.3: resolution: {integrity: sha512-7GO6HghkA5fYG9TYnNxi14/7K9f5occMlp3zXAuSxn7CKCxt9xbNWG7yF8hTCSUchlfWSe3uLmlPfigevRItzQ==} engines: {node: '>=12'} dev: false - /dotignore/0.1.2: + /dotignore@0.1.2: resolution: {integrity: sha512-UGGGWfSauusaVJC+8fgV+NVvBXkCTmVv7sk6nojDZZvuOUNGUy0Zk4UpHQD6EDjS0jpBwcACvH4eofvyzBcRDw==} hasBin: true dependencies: minimatch: 3.1.2 dev: true - /duplexer3/0.1.5: + /duplexer3@0.1.5: resolution: {integrity: sha512-1A8za6ws41LQgv9HrE/66jyC5yuSjQ3L/KOpFtoBilsAK2iA2wuS5rTt1OCzIvtS2V7nVmedsUU+DGRcjBmOYA==} dev: true optional: true - /eastasianwidth/0.2.0: + /eastasianwidth@0.2.0: resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} dev: true - /ecc-jsbn/0.1.2: + /ecc-jsbn@0.1.2: resolution: {integrity: sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==} dependencies: jsbn: 0.1.1 safer-buffer: 2.1.2 dev: true - /ee-first/1.1.1: + /ee-first@1.1.1: resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} dev: true optional: true - /eip1193-provider/1.0.1: + /eip1193-provider@1.0.1: resolution: {integrity: sha512-kSuqwQ26d7CzuS/t3yRXo2Su2cVH0QfvyKbr2H7Be7O5YDyIq4hQGCNTo5wRdP07bt+E2R/8nPCzey4ojBHf7g==} dependencies: '@json-rpc-tools/provider': 1.7.6 @@ -8477,13 +8707,13 @@ packages: - utf-8-validate dev: false - /electron-to-chromium/1.4.284: + /electron-to-chromium@1.4.284: resolution: {integrity: sha512-M8WEXFuKXMYMVr45fo8mq0wUrrJHheiKZf6BArTKk9ZBYCKJEOU5H8cdWgDT+qCVZf7Na4lVUaZsA+h6uA9+PA==} - /electron-to-chromium/1.4.328: + /electron-to-chromium@1.4.328: resolution: {integrity: sha512-DE9tTy2PNmy1v55AZAO542ui+MLC2cvINMK4P2LXGsJdput/ThVG9t+QGecPuAZZSgC8XoI+Jh9M1OG9IoNSCw==} - /elliptic/6.5.4: + /elliptic@6.5.4: resolution: {integrity: sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==} dependencies: bn.js: 4.12.0 @@ -8494,33 +8724,33 @@ packages: minimalistic-assert: 1.0.1 minimalistic-crypto-utils: 1.0.1 - /emittery/0.8.1: + /emittery@0.8.1: resolution: {integrity: sha512-uDfvUjVrfGJJhymx/kz6prltenw1u7WrCg1oa94zYY8xxVpLLUu045LAT0dhDZdXG58/EpPL/5kA180fQ/qudg==} engines: {node: '>=10'} dev: true - /emoji-regex/7.0.3: + /emoji-regex@7.0.3: resolution: {integrity: sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==} - /emoji-regex/8.0.0: + /emoji-regex@8.0.0: resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} - /emoji-regex/9.2.2: + /emoji-regex@9.2.2: resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} dev: true - /emojis-list/3.0.0: + /emojis-list@3.0.0: resolution: {integrity: sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==} engines: {node: '>= 4'} dev: true - /encodeurl/1.0.2: + /encodeurl@1.0.2: resolution: {integrity: sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==} engines: {node: '>= 0.8'} dev: true optional: true - /encoding-down/5.0.4: + /encoding-down@5.0.4: resolution: {integrity: sha512-8CIZLDcSKxgzT+zX8ZVfgNbu8Md2wq/iqa1Y7zyVR18QBEAc0Nmzuvj/N5ykSKpfGzjM8qxbaFntLPwnVoUhZw==} engines: {node: '>=6'} dependencies: @@ -8531,7 +8761,7 @@ packages: xtend: 4.0.2 dev: true - /encoding-down/6.3.0: + /encoding-down@6.3.0: resolution: {integrity: sha512-QKrV0iKR6MZVJV08QY0wp1e7vF6QbhnbQhb07bwpEyuz4uZiZgPlEGdkCROuFkUwdxlFaiPIhjyarH1ee/3vhw==} engines: {node: '>=6'} dependencies: @@ -8541,19 +8771,19 @@ packages: level-errors: 2.0.1 dev: true - /encoding/0.1.13: + /encoding@0.1.13: resolution: {integrity: sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==} requiresBuild: true dependencies: iconv-lite: 0.6.3 dev: true - /end-of-stream/1.4.4: + /end-of-stream@1.4.4: resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} dependencies: once: 1.4.0 - /enhanced-resolve/5.12.0: + /enhanced-resolve@5.12.0: resolution: {integrity: sha512-QHTXI/sZQmko1cbDoNAa3mJ5qhWUUNAq3vR0/YiD379fWQrcfuoX1+HW2S0MTt7XmoPLapdaDKUtelUSPic7hQ==} engines: {node: '>=10.13.0'} dependencies: @@ -8561,40 +8791,40 @@ packages: tapable: 2.2.1 dev: true - /enquirer/2.3.6: + /enquirer@2.3.6: resolution: {integrity: sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==} engines: {node: '>=8.6'} dependencies: ansi-colors: 4.1.3 dev: true - /entities/2.2.0: + /entities@2.2.0: resolution: {integrity: sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==} dev: true - /env-paths/2.2.1: + /env-paths@2.2.1: resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==} engines: {node: '>=6'} dev: true - /err-code/2.0.3: + /err-code@2.0.3: resolution: {integrity: sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==} dev: true - /errno/0.1.8: + /errno@0.1.8: resolution: {integrity: sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==} hasBin: true dependencies: prr: 1.0.1 dev: true - /error-ex/1.3.2: + /error-ex@1.3.2: resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} dependencies: is-arrayish: 0.2.1 dev: true - /es-abstract/1.21.1: + /es-abstract@1.21.1: resolution: {integrity: sha512-QudMsPOz86xYz/1dG1OuGBKOELjCh99IIWHLzy5znUB6j8xG2yMA7bfTV86VSqKF+Y/H08vQPR+9jyXpuC6hfg==} engines: {node: '>= 0.4'} dependencies: @@ -8633,15 +8863,15 @@ packages: which-typed-array: 1.1.9 dev: true - /es-array-method-boxes-properly/1.0.0: + /es-array-method-boxes-properly@1.0.0: resolution: {integrity: sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA==} dev: true - /es-module-lexer/0.9.3: + /es-module-lexer@0.9.3: resolution: {integrity: sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ==} dev: true - /es-set-tostringtag/2.0.1: + /es-set-tostringtag@2.0.1: resolution: {integrity: sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==} engines: {node: '>= 0.4'} dependencies: @@ -8650,13 +8880,13 @@ packages: has-tostringtag: 1.0.0 dev: true - /es-shim-unscopables/1.0.0: + /es-shim-unscopables@1.0.0: resolution: {integrity: sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==} dependencies: has: 1.0.3 dev: true - /es-to-primitive/1.2.1: + /es-to-primitive@1.2.1: resolution: {integrity: sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==} engines: {node: '>= 0.4'} dependencies: @@ -8665,7 +8895,7 @@ packages: is-symbol: 1.0.4 dev: true - /es5-ext/0.10.62: + /es5-ext@0.10.62: resolution: {integrity: sha512-BHLqn0klhEpnOKSrzn/Xsz2UIW8j+cGmo9JLzr8BiUapV8hPL9+FliFqjwr9ngW7jWdnxv6eO+/LqyhJVqgrjA==} engines: {node: '>=0.10'} requiresBuild: true @@ -8674,34 +8904,34 @@ packages: es6-symbol: 3.1.3 next-tick: 1.1.0 - /es6-iterator/2.0.3: + /es6-iterator@2.0.3: resolution: {integrity: sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==} dependencies: d: 1.0.1 es5-ext: 0.10.62 es6-symbol: 3.1.3 - /es6-promise/3.3.1: + /es6-promise@3.3.1: resolution: {integrity: sha512-SOp9Phqvqn7jtEUxPWdWfWoLmyt2VaJ6MpvP9Comy1MceMXqE6bxvaTu4iaxpYYPzhny28Lc+M87/c2cPK6lDg==} dev: true - /es6-promise/4.2.8: + /es6-promise@4.2.8: resolution: {integrity: sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==} dev: false - /es6-promisify/5.0.0: + /es6-promisify@5.0.0: resolution: {integrity: sha512-C+d6UdsYDk0lMebHNR4S2NybQMMngAOnOwYBQjTOiv0MkoJMP0Myw2mgpDLBcpfCmRLxyFqYhS/CfOENq4SJhQ==} dependencies: es6-promise: 4.2.8 dev: false - /es6-symbol/3.1.3: + /es6-symbol@3.1.3: resolution: {integrity: sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==} dependencies: d: 1.0.1 ext: 1.7.0 - /es6-weak-map/2.0.3: + /es6-weak-map@2.0.3: resolution: {integrity: sha512-p5um32HOTO1kP+w7PRnB+5lQ43Z6muuMuIMffvDN8ZB4GcnjLBV6zGStpbASIMk4DCAvEaamhe2zhyCb/QXXsA==} dependencies: d: 1.0.1 @@ -8710,7 +8940,7 @@ packages: es6-symbol: 3.1.3 dev: false - /esbuild-android-64/0.15.15: + /esbuild-android-64@0.15.15: resolution: {integrity: sha512-F+WjjQxO+JQOva3tJWNdVjouFMLK6R6i5gjDvgUthLYJnIZJsp1HlF523k73hELY20WPyEO8xcz7aaYBVkeg5Q==} engines: {node: '>=12'} cpu: [x64] @@ -8719,7 +8949,7 @@ packages: dev: true optional: true - /esbuild-android-arm64/0.15.15: + /esbuild-android-arm64@0.15.15: resolution: {integrity: sha512-attlyhD6Y22jNyQ0fIIQ7mnPvDWKw7k6FKnsXlBvQE6s3z6s6cuEHcSgoirquQc7TmZgVCK5fD/2uxmRN+ZpcQ==} engines: {node: '>=12'} cpu: [arm64] @@ -8728,7 +8958,7 @@ packages: dev: true optional: true - /esbuild-darwin-64/0.15.15: + /esbuild-darwin-64@0.15.15: resolution: {integrity: sha512-ohZtF8W1SHJ4JWldsPVdk8st0r9ExbAOSrBOh5L+Mq47i696GVwv1ab/KlmbUoikSTNoXEhDzVpxUR/WIO19FQ==} engines: {node: '>=12'} cpu: [x64] @@ -8737,7 +8967,7 @@ packages: dev: true optional: true - /esbuild-darwin-arm64/0.15.15: + /esbuild-darwin-arm64@0.15.15: resolution: {integrity: sha512-P8jOZ5zshCNIuGn+9KehKs/cq5uIniC+BeCykvdVhx/rBXSxmtj3CUIKZz4sDCuESMbitK54drf/2QX9QHG5Ag==} engines: {node: '>=12'} cpu: [arm64] @@ -8746,7 +8976,7 @@ packages: dev: true optional: true - /esbuild-freebsd-64/0.15.15: + /esbuild-freebsd-64@0.15.15: resolution: {integrity: sha512-KkTg+AmDXz1IvA9S1gt8dE24C8Thx0X5oM0KGF322DuP+P3evwTL9YyusHAWNsh4qLsR80nvBr/EIYs29VSwuA==} engines: {node: '>=12'} cpu: [x64] @@ -8755,7 +8985,7 @@ packages: dev: true optional: true - /esbuild-freebsd-arm64/0.15.15: + /esbuild-freebsd-arm64@0.15.15: resolution: {integrity: sha512-FUcML0DRsuyqCMfAC+HoeAqvWxMeq0qXvclZZ/lt2kLU6XBnDA5uKTLUd379WYEyVD4KKFctqWd9tTuk8C/96g==} engines: {node: '>=12'} cpu: [arm64] @@ -8764,7 +8994,7 @@ packages: dev: true optional: true - /esbuild-linux-32/0.15.15: + /esbuild-linux-32@0.15.15: resolution: {integrity: sha512-q28Qn5pZgHNqug02aTkzw5sW9OklSo96b5nm17Mq0pDXrdTBcQ+M6Q9A1B+dalFeynunwh/pvfrNucjzwDXj+Q==} engines: {node: '>=12'} cpu: [ia32] @@ -8773,7 +9003,7 @@ packages: dev: true optional: true - /esbuild-linux-64/0.15.15: + /esbuild-linux-64@0.15.15: resolution: {integrity: sha512-217KPmWMirkf8liO+fj2qrPwbIbhNTGNVtvqI1TnOWJgcMjUWvd677Gq3fTzXEjilkx2yWypVnTswM2KbXgoAg==} engines: {node: '>=12'} cpu: [x64] @@ -8782,25 +9012,25 @@ packages: dev: true optional: true - /esbuild-linux-arm/0.15.15: - resolution: {integrity: sha512-RYVW9o2yN8yM7SB1yaWr378CwrjvGCyGybX3SdzPHpikUHkME2AP55Ma20uNwkNyY2eSYFX9D55kDrfQmQBR4w==} + /esbuild-linux-arm64@0.15.15: + resolution: {integrity: sha512-/ltmNFs0FivZkYsTzAsXIfLQX38lFnwJTWCJts0IbCqWZQe+jjj0vYBNbI0kmXLb3y5NljiM5USVAO1NVkdh2g==} engines: {node: '>=12'} - cpu: [arm] + cpu: [arm64] os: [linux] requiresBuild: true dev: true optional: true - /esbuild-linux-arm64/0.15.15: - resolution: {integrity: sha512-/ltmNFs0FivZkYsTzAsXIfLQX38lFnwJTWCJts0IbCqWZQe+jjj0vYBNbI0kmXLb3y5NljiM5USVAO1NVkdh2g==} + /esbuild-linux-arm@0.15.15: + resolution: {integrity: sha512-RYVW9o2yN8yM7SB1yaWr378CwrjvGCyGybX3SdzPHpikUHkME2AP55Ma20uNwkNyY2eSYFX9D55kDrfQmQBR4w==} engines: {node: '>=12'} - cpu: [arm64] + cpu: [arm] os: [linux] requiresBuild: true dev: true optional: true - /esbuild-linux-mips64le/0.15.15: + /esbuild-linux-mips64le@0.15.15: resolution: {integrity: sha512-PksEPb321/28GFFxtvL33yVPfnMZihxkEv5zME2zapXGp7fA1X2jYeiTUK+9tJ/EGgcNWuwvtawPxJG7Mmn86A==} engines: {node: '>=12'} cpu: [mips64el] @@ -8809,7 +9039,7 @@ packages: dev: true optional: true - /esbuild-linux-ppc64le/0.15.15: + /esbuild-linux-ppc64le@0.15.15: resolution: {integrity: sha512-ek8gJBEIhcpGI327eAZigBOHl58QqrJrYYIZBWQCnH3UnXoeWMrMZLeeZL8BI2XMBhP+sQ6ERctD5X+ajL/AIA==} engines: {node: '>=12'} cpu: [ppc64] @@ -8818,7 +9048,7 @@ packages: dev: true optional: true - /esbuild-linux-riscv64/0.15.15: + /esbuild-linux-riscv64@0.15.15: resolution: {integrity: sha512-H5ilTZb33/GnUBrZMNJtBk7/OXzDHDXjIzoLXHSutwwsLxSNaLxzAaMoDGDd/keZoS+GDBqNVxdCkpuiRW4OSw==} engines: {node: '>=12'} cpu: [riscv64] @@ -8827,7 +9057,7 @@ packages: dev: true optional: true - /esbuild-linux-s390x/0.15.15: + /esbuild-linux-s390x@0.15.15: resolution: {integrity: sha512-jKaLUg78mua3rrtrkpv4Or2dNTJU7bgHN4bEjT4OX4GR7nLBSA9dfJezQouTxMmIW7opwEC5/iR9mpC18utnxQ==} engines: {node: '>=12'} cpu: [s390x] @@ -8836,7 +9066,7 @@ packages: dev: true optional: true - /esbuild-netbsd-64/0.15.15: + /esbuild-netbsd-64@0.15.15: resolution: {integrity: sha512-aOvmF/UkjFuW6F36HbIlImJTTx45KUCHJndtKo+KdP8Dhq3mgLRKW9+6Ircpm8bX/RcS3zZMMmaBLkvGY06Gvw==} engines: {node: '>=12'} cpu: [x64] @@ -8845,7 +9075,7 @@ packages: dev: true optional: true - /esbuild-openbsd-64/0.15.15: + /esbuild-openbsd-64@0.15.15: resolution: {integrity: sha512-HFFX+WYedx1w2yJ1VyR1Dfo8zyYGQZf1cA69bLdrHzu9svj6KH6ZLK0k3A1/LFPhcEY9idSOhsB2UyU0tHPxgQ==} engines: {node: '>=12'} cpu: [x64] @@ -8854,7 +9084,7 @@ packages: dev: true optional: true - /esbuild-sunos-64/0.15.15: + /esbuild-sunos-64@0.15.15: resolution: {integrity: sha512-jOPBudffG4HN8yJXcK9rib/ZTFoTA5pvIKbRrt3IKAGMq1EpBi4xoVoSRrq/0d4OgZLaQbmkHp8RO9eZIn5atA==} engines: {node: '>=12'} cpu: [x64] @@ -8863,7 +9093,7 @@ packages: dev: true optional: true - /esbuild-windows-32/0.15.15: + /esbuild-windows-32@0.15.15: resolution: {integrity: sha512-MDkJ3QkjnCetKF0fKxCyYNBnOq6dmidcwstBVeMtXSgGYTy8XSwBeIE4+HuKiSsG6I/mXEb++px3IGSmTN0XiA==} engines: {node: '>=12'} cpu: [ia32] @@ -8872,7 +9102,7 @@ packages: dev: true optional: true - /esbuild-windows-64/0.15.15: + /esbuild-windows-64@0.15.15: resolution: {integrity: sha512-xaAUIB2qllE888SsMU3j9nrqyLbkqqkpQyWVkfwSil6BBPgcPk3zOFitTTncEKCLTQy3XV9RuH7PDj3aJDljWA==} engines: {node: '>=12'} cpu: [x64] @@ -8881,7 +9111,7 @@ packages: dev: true optional: true - /esbuild-windows-arm64/0.15.15: + /esbuild-windows-arm64@0.15.15: resolution: {integrity: sha512-ttuoCYCIJAFx4UUKKWYnFdrVpoXa3+3WWkXVI6s09U+YjhnyM5h96ewTq/WgQj9LFSIlABQvadHSOQyAVjW5xQ==} engines: {node: '>=12'} cpu: [arm64] @@ -8890,7 +9120,7 @@ packages: dev: true optional: true - /esbuild/0.15.15: + /esbuild@0.15.15: resolution: {integrity: sha512-TEw/lwK4Zzld9x3FedV6jy8onOUHqcEX3ADFk4k+gzPUwrxn8nWV62tH0udo8jOtjFodlEfc4ypsqX3e+WWO6w==} engines: {node: '>=12'} hasBin: true @@ -8920,35 +9150,35 @@ packages: esbuild-windows-arm64: 0.15.15 dev: true - /escalade/3.1.1: + /escalade@3.1.1: resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} engines: {node: '>=6'} - /escape-html/1.0.3: + /escape-html@1.0.3: resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} dev: true optional: true - /escape-string-regexp/1.0.5: + /escape-string-regexp@1.0.5: resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} engines: {node: '>=0.8.0'} - /escape-string-regexp/2.0.0: + /escape-string-regexp@2.0.0: resolution: {integrity: sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==} engines: {node: '>=8'} dev: true - /escape-string-regexp/4.0.0: + /escape-string-regexp@4.0.0: resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} engines: {node: '>=10'} dev: true - /escape-string-regexp/5.0.0: + /escape-string-regexp@5.0.0: resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==} engines: {node: '>=12'} dev: false - /escodegen/1.8.1: + /escodegen@1.8.1: resolution: {integrity: sha512-yhi5S+mNTOuRvyW4gWlg5W1byMaQGWWSYHXsuFZ7GBo7tpyOwi2EdzMP/QWxh9hwkD2m+wDVHJsxhRIj+v/b/A==} engines: {node: '>=0.12.0'} hasBin: true @@ -8961,7 +9191,7 @@ packages: source-map: 0.2.0 dev: true - /escodegen/2.0.0: + /escodegen@2.0.0: resolution: {integrity: sha512-mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw==} engines: {node: '>=6.0'} hasBin: true @@ -8974,7 +9204,7 @@ packages: source-map: 0.6.1 dev: true - /eslint-config-prettier/8.6.0_eslint@7.32.0: + /eslint-config-prettier@8.6.0(eslint@7.32.0): resolution: {integrity: sha512-bAF0eLpLVqP5oEVUFKpMA+NnRFICwn9X8B5jrR9FcqnYBuPbqWEjTEspPWMj5ye6czoSLDweCzSo3Ko7gGrZaA==} hasBin: true peerDependencies: @@ -8983,7 +9213,7 @@ packages: eslint: 7.32.0 dev: true - /eslint-config-standard/16.0.3_s3p4dyzitdtgac5nictnavtxa4: + /eslint-config-standard@16.0.3(eslint-plugin-import@2.27.5)(eslint-plugin-node@11.1.0)(eslint-plugin-promise@5.2.0)(eslint@7.32.0): resolution: {integrity: sha512-x4fmJL5hGqNJKGHSjnLdgA6U6h1YW/G2dW9fA+cyVur4SK6lyue8+UgNKWlZtUDTXvgKDD/Oa3GQjmB5kjtVvg==} peerDependencies: eslint: ^7.12.1 @@ -8992,12 +9222,12 @@ packages: eslint-plugin-promise: ^4.2.1 || ^5.0.0 dependencies: eslint: 7.32.0 - eslint-plugin-import: 2.27.5_ffi3uiz42rv3jyhs6cr7p7qqry - eslint-plugin-node: 11.1.0_eslint@7.32.0 - eslint-plugin-promise: 5.2.0_eslint@7.32.0 + eslint-plugin-import: 2.27.5(@typescript-eslint/parser@4.33.0)(eslint@7.32.0) + eslint-plugin-node: 11.1.0(eslint@7.32.0) + eslint-plugin-promise: 5.2.0(eslint@7.32.0) dev: true - /eslint-import-resolver-node/0.3.7: + /eslint-import-resolver-node@0.3.7: resolution: {integrity: sha512-gozW2blMLJCeFpBwugLTGyvVjNoeo1knonXAcatC6bjPBZitotxdWf7Gimr25N4c0AAOo4eOUfaG82IJPDpqCA==} dependencies: debug: 3.2.7 @@ -9007,7 +9237,7 @@ packages: - supports-color dev: true - /eslint-module-utils/2.7.4_n7wmpe4hfzj47xhbzj4etqyjdi: + /eslint-module-utils@2.7.4(@typescript-eslint/parser@4.33.0)(eslint-import-resolver-node@0.3.7)(eslint@7.32.0): resolution: {integrity: sha512-j4GT+rqzCoRKHwURX7pddtIPGySnX9Si/cgMI5ztrcqOPtk5dDEeZ34CQVPphnqkJytlc97Vuk05Um2mJ3gEQA==} engines: {node: '>=4'} peerDependencies: @@ -9028,7 +9258,7 @@ packages: eslint-import-resolver-webpack: optional: true dependencies: - '@typescript-eslint/parser': 4.33.0_jofidmxrjzhj7l6vknpw5ecvfe + '@typescript-eslint/parser': 4.33.0(eslint@7.32.0)(typescript@4.9.5) debug: 3.2.7 eslint: 7.32.0 eslint-import-resolver-node: 0.3.7 @@ -9036,7 +9266,7 @@ packages: - supports-color dev: true - /eslint-plugin-es/3.0.1_eslint@7.32.0: + /eslint-plugin-es@3.0.1(eslint@7.32.0): resolution: {integrity: sha512-GUmAsJaN4Fc7Gbtl8uOBlayo2DqhwWvEzykMHSCZHU3XdJ+NSzzZcVhXh3VxX5icqQ+oQdIEawXX8xkR3mIFmQ==} engines: {node: '>=8.10.0'} peerDependencies: @@ -9047,7 +9277,7 @@ packages: regexpp: 3.2.0 dev: true - /eslint-plugin-import/2.27.5_ffi3uiz42rv3jyhs6cr7p7qqry: + /eslint-plugin-import@2.27.5(@typescript-eslint/parser@4.33.0)(eslint@7.32.0): resolution: {integrity: sha512-LmEt3GVofgiGuiE+ORpnvP+kAm3h6MLZJ4Q5HCyHADofsb4VzXFsRiWj3c0OFiV+3DWFh0qg3v9gcPlfc3zRow==} engines: {node: '>=4'} peerDependencies: @@ -9057,7 +9287,7 @@ packages: '@typescript-eslint/parser': optional: true dependencies: - '@typescript-eslint/parser': 4.33.0_jofidmxrjzhj7l6vknpw5ecvfe + '@typescript-eslint/parser': 4.33.0(eslint@7.32.0)(typescript@4.9.5) array-includes: 3.1.6 array.prototype.flat: 1.3.1 array.prototype.flatmap: 1.3.1 @@ -9065,7 +9295,7 @@ packages: doctrine: 2.1.0 eslint: 7.32.0 eslint-import-resolver-node: 0.3.7 - eslint-module-utils: 2.7.4_n7wmpe4hfzj47xhbzj4etqyjdi + eslint-module-utils: 2.7.4(@typescript-eslint/parser@4.33.0)(eslint-import-resolver-node@0.3.7)(eslint@7.32.0) has: 1.0.3 is-core-module: 2.11.0 is-glob: 4.0.3 @@ -9080,7 +9310,7 @@ packages: - supports-color dev: true - /eslint-plugin-jest/27.2.1_jnnvroutqvszjic6xgfk2wgrhu: + /eslint-plugin-jest@27.2.1(@typescript-eslint/eslint-plugin@5.44.0)(eslint@8.37.0)(jest@27.5.1)(typescript@4.9.3): resolution: {integrity: sha512-l067Uxx7ZT8cO9NJuf+eJHvt6bqJyz2Z29wykyEdz/OtmcELQl2MQGQLX8J94O1cSJWAwUSEvCjwjA7KEK3Hmg==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} peerDependencies: @@ -9093,22 +9323,23 @@ packages: jest: optional: true dependencies: - '@typescript-eslint/eslint-plugin': 5.44.0_c5rgyxfozmk6acmvyot27wcp74 - '@typescript-eslint/utils': 5.44.0_typescript@4.9.3 + '@typescript-eslint/eslint-plugin': 5.44.0(@typescript-eslint/parser@5.44.0)(eslint@8.37.0)(typescript@4.9.3) + '@typescript-eslint/utils': 5.44.0(eslint@8.37.0)(typescript@4.9.3) + eslint: 8.37.0 jest: 27.5.1 transitivePeerDependencies: - supports-color - typescript dev: true - /eslint-plugin-node/11.1.0_eslint@7.32.0: + /eslint-plugin-node@11.1.0(eslint@7.32.0): resolution: {integrity: sha512-oUwtPJ1W0SKD0Tr+wqu92c5xuCeQqB3hSCHasn/ZgjFdA9iDGNkNf2Zi9ztY7X+hNuMib23LNGRm6+uN+KLE3g==} engines: {node: '>=8.10.0'} peerDependencies: eslint: '>=5.16.0' dependencies: eslint: 7.32.0 - eslint-plugin-es: 3.0.1_eslint@7.32.0 + eslint-plugin-es: 3.0.1(eslint@7.32.0) eslint-utils: 2.1.0 ignore: 5.2.4 minimatch: 3.1.2 @@ -9116,7 +9347,7 @@ packages: semver: 6.3.0 dev: true - /eslint-plugin-prettier/3.4.1_2fbugv7hbzbahj5qm3ztcno6by: + /eslint-plugin-prettier@3.4.1(eslint-config-prettier@8.6.0)(eslint@7.32.0)(prettier@2.8.4): resolution: {integrity: sha512-htg25EUYUeIhKHXjOinK4BgCcDwtLHjqaxCDsMy5nbnUMkKFvIhMVCp+5GFUXQ4Nr8lBsPqtGAqBenbpFqAA2g==} engines: {node: '>=6.0.0'} peerDependencies: @@ -9128,12 +9359,12 @@ packages: optional: true dependencies: eslint: 7.32.0 - eslint-config-prettier: 8.6.0_eslint@7.32.0 + eslint-config-prettier: 8.6.0(eslint@7.32.0) prettier: 2.8.4 prettier-linter-helpers: 1.0.0 dev: true - /eslint-plugin-promise/5.2.0_eslint@7.32.0: + /eslint-plugin-promise@5.2.0(eslint@7.32.0): resolution: {integrity: sha512-SftLb1pUG01QYq2A/hGAWfDRXqYD82zE7j7TopDOyNdU+7SvvoXREls/+PRTY17vUXzXnZA/zfnyKgRH6x4JJw==} engines: {node: ^10.12.0 || >=12.0.0} peerDependencies: @@ -9142,16 +9373,25 @@ packages: eslint: 7.32.0 dev: true - /eslint-plugin-svelte3/4.0.0_svelte@3.53.1: + /eslint-plugin-simple-import-sort@10.0.0(eslint@8.37.0): + resolution: {integrity: sha512-AeTvO9UCMSNzIHRkg8S6c3RPy5YEwKWSQPx3DYghLedo2ZQxowPFLGDN1AZ2evfg6r6mjBSZSLxLFsWSu3acsw==} + peerDependencies: + eslint: '>=5.0.0' + dependencies: + eslint: 8.37.0 + dev: true + + /eslint-plugin-svelte3@4.0.0(eslint@8.37.0)(svelte@3.53.1): resolution: {integrity: sha512-OIx9lgaNzD02+MDFNLw0GEUbuovNcglg+wnd/UY0fbZmlQSz7GlQiQ1f+yX0XvC07XPcDOnFcichqI3xCwp71g==} peerDependencies: eslint: '>=8.0.0' svelte: ^3.2.0 dependencies: + eslint: 8.37.0 svelte: 3.53.1 dev: true - /eslint-scope/5.1.1: + /eslint-scope@5.1.1: resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==} engines: {node: '>=8.0.0'} dependencies: @@ -9159,48 +9399,62 @@ packages: estraverse: 4.3.0 dev: true - /eslint-utils/2.1.0: + /eslint-scope@7.1.1: + resolution: {integrity: sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + esrecurse: 4.3.0 + estraverse: 5.3.0 + dev: true + + /eslint-utils@2.1.0: resolution: {integrity: sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==} engines: {node: '>=6'} dependencies: eslint-visitor-keys: 1.3.0 dev: true - /eslint-utils/3.0.0: + /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-utils/3.0.0_eslint@7.32.0: + /eslint-utils@3.0.0(eslint@8.37.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: 8.37.0 eslint-visitor-keys: 2.1.0 dev: true - /eslint-visitor-keys/1.3.0: + /eslint-visitor-keys@1.3.0: resolution: {integrity: sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==} engines: {node: '>=4'} dev: true - /eslint-visitor-keys/2.1.0: + /eslint-visitor-keys@2.1.0: resolution: {integrity: sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==} engines: {node: '>=10'} dev: true - /eslint-visitor-keys/3.3.0: + /eslint-visitor-keys@3.3.0: resolution: {integrity: sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dev: true - /eslint/7.32.0: + /eslint-visitor-keys@3.4.0: + resolution: {integrity: sha512-HPpKPUBQcAsZOsHAFwTtIKcYlCje62XB7SEAcxjtmW6TD1WVpkS6i6/hOVtTZIl4zGj/mBqpFVGvaDneik+VoQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dev: true + + /eslint@7.32.0: resolution: {integrity: sha512-VHZ8gX+EDfz+97jGcgyGCyRia/dPOd6Xh9yPv8Bl1+SoaIwD+a/vlrOmGRUyOYu7MwUhc7CxqeaDZU13S4+EpA==} engines: {node: ^10.12.0 || >=12.0.0} hasBin: true @@ -9211,7 +9465,7 @@ packages: ajv: 6.12.6 chalk: 4.1.2 cross-spawn: 7.0.3 - debug: 4.3.4 + debug: 4.3.4(supports-color@8.1.1) doctrine: 3.0.0 enquirer: 2.3.6 escape-string-regexp: 4.0.0 @@ -9249,62 +9503,120 @@ packages: - supports-color dev: true - /espree/7.3.1: + /eslint@8.37.0: + resolution: {integrity: sha512-NU3Ps9nI05GUoVMxcZx1J8CNR6xOvUT4jAUMH5+z8lpp3aEdPVCImKw6PWG4PY+Vfkpr+jvMpxs/qoE7wq0sPw==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + hasBin: true + dependencies: + '@eslint-community/eslint-utils': 4.4.0(eslint@8.37.0) + '@eslint-community/regexpp': 4.5.0 + '@eslint/eslintrc': 2.0.2 + '@eslint/js': 8.37.0 + '@humanwhocodes/config-array': 0.11.8 + '@humanwhocodes/module-importer': 1.0.1 + '@nodelib/fs.walk': 1.2.8 + ajv: 6.12.6 + chalk: 4.1.2 + cross-spawn: 7.0.3 + debug: 4.3.4(supports-color@8.1.1) + doctrine: 3.0.0 + escape-string-regexp: 4.0.0 + eslint-scope: 7.1.1 + eslint-visitor-keys: 3.4.0 + espree: 9.5.1 + esquery: 1.5.0 + esutils: 2.0.3 + fast-deep-equal: 3.1.3 + file-entry-cache: 6.0.1 + find-up: 5.0.0 + glob-parent: 6.0.2 + globals: 13.20.0 + grapheme-splitter: 1.0.4 + ignore: 5.2.4 + import-fresh: 3.3.0 + imurmurhash: 0.1.4 + is-glob: 4.0.3 + is-path-inside: 3.0.3 + js-sdsl: 4.4.0 + js-yaml: 4.1.0 + json-stable-stringify-without-jsonify: 1.0.1 + levn: 0.4.1 + lodash.merge: 4.6.2 + minimatch: 3.1.2 + natural-compare: 1.4.0 + optionator: 0.9.1 + strip-ansi: 6.0.1 + strip-json-comments: 3.1.1 + text-table: 0.2.0 + transitivePeerDependencies: + - supports-color + dev: true + + /espree@7.3.1: resolution: {integrity: sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==} engines: {node: ^10.12.0 || >=12.0.0} dependencies: acorn: 7.4.1 - acorn-jsx: 5.3.2_acorn@7.4.1 + acorn-jsx: 5.3.2(acorn@7.4.1) eslint-visitor-keys: 1.3.0 dev: true - /esprima/2.7.3: + /espree@9.5.1: + resolution: {integrity: sha512-5yxtHSZXRSW5pvv3hAlXM5+/Oswi1AUFqBmbibKb5s6bp3rGIDkyXU6xCoyuuLhijr4SFwPrXRoZjz0AZDN9tg==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + acorn: 8.8.2 + acorn-jsx: 5.3.2(acorn@8.8.2) + eslint-visitor-keys: 3.4.0 + dev: true + + /esprima@2.7.3: resolution: {integrity: sha512-OarPfz0lFCiW4/AV2Oy1Rp9qu0iusTKqykwTspGCZtPxmF81JR4MmIebvF1F9+UOKth2ZubLQ4XGGaU+hSn99A==} engines: {node: '>=0.10.0'} hasBin: true dev: true - /esprima/4.0.1: + /esprima@4.0.1: resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} engines: {node: '>=4'} hasBin: true - /esquery/1.5.0: + /esquery@1.5.0: resolution: {integrity: sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==} engines: {node: '>=0.10'} dependencies: estraverse: 5.3.0 dev: true - /esrecurse/4.3.0: + /esrecurse@4.3.0: resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} engines: {node: '>=4.0'} dependencies: estraverse: 5.3.0 dev: true - /estraverse/1.9.3: + /estraverse@1.9.3: resolution: {integrity: sha512-25w1fMXQrGdoquWnScXZGckOv+Wes+JDnuN/+7ex3SauFRS72r2lFDec0EKPt2YD1wUJ/IrfEex+9yp4hfSOJA==} engines: {node: '>=0.10.0'} dev: true - /estraverse/4.3.0: + /estraverse@4.3.0: resolution: {integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==} engines: {node: '>=4.0'} dev: true - /estraverse/5.3.0: + /estraverse@5.3.0: resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} engines: {node: '>=4.0'} dev: true - /estree-util-attach-comments/2.1.1: + /estree-util-attach-comments@2.1.1: resolution: {integrity: sha512-+5Ba/xGGS6mnwFbXIuQiDPTbuTxuMCooq3arVv7gPZtYpjp+VXH/NkHAP35OOefPhNG/UGqU3vt/LTABwcHX0w==} dependencies: '@types/estree': 1.0.0 dev: false - /estree-util-build-jsx/2.2.2: + /estree-util-build-jsx@2.2.2: resolution: {integrity: sha512-m56vOXcOBuaF+Igpb9OPAy7f9w9OIkb5yhjsZuaPm7HoGi4oTOQi0h2+yZ+AtKklYFZ+rPC4n0wYCJCEU1ONqg==} dependencies: '@types/estree-jsx': 1.0.0 @@ -9312,11 +9624,11 @@ packages: estree-walker: 3.0.3 dev: false - /estree-util-is-identifier-name/2.1.0: + /estree-util-is-identifier-name@2.1.0: resolution: {integrity: sha512-bEN9VHRyXAUOjkKVQVvArFym08BTWB0aJPppZZr0UNyAqWsLaVfAqP7hbaTJjzHifmB5ebnR8Wm7r7yGN/HonQ==} dev: false - /estree-util-to-js/1.2.0: + /estree-util-to-js@1.2.0: resolution: {integrity: sha512-IzU74r1PK5IMMGZXUVZbmiu4A1uhiPgW5hm1GjcOfr4ZzHaMPpLNJjR7HjXiIOzi25nZDrgFTobHTkV5Q6ITjA==} dependencies: '@types/estree-jsx': 1.0.0 @@ -9324,45 +9636,45 @@ packages: source-map: 0.7.4 dev: false - /estree-util-value-to-estree/1.3.0: + /estree-util-value-to-estree@1.3.0: resolution: {integrity: sha512-Y+ughcF9jSUJvncXwqRageavjrNPAI+1M/L3BI3PyLp1nmgYTGUXU6t5z1Y7OWuThoDdhPME07bQU+d5LxdJqw==} engines: {node: '>=12.0.0'} dependencies: is-plain-obj: 3.0.0 dev: false - /estree-util-visit/1.2.1: + /estree-util-visit@1.2.1: resolution: {integrity: sha512-xbgqcrkIVbIG+lI/gzbvd9SGTJL4zqJKBFttUl5pP27KhAjtMKbX/mQXJ7qgyXpMgVy/zvpm0xoQQaGL8OloOw==} dependencies: '@types/estree-jsx': 1.0.0 '@types/unist': 2.0.6 dev: false - /estree-walker/1.0.1: + /estree-walker@1.0.1: resolution: {integrity: sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==} dev: true - /estree-walker/2.0.2: + /estree-walker@2.0.2: resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} - /estree-walker/3.0.3: + /estree-walker@3.0.3: resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} dependencies: '@types/estree': 1.0.0 dev: false - /esutils/2.0.3: + /esutils@2.0.3: resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} engines: {node: '>=0.10.0'} dev: true - /etag/1.8.1: + /etag@1.8.1: resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} engines: {node: '>= 0.6'} dev: true optional: true - /eth-block-tracker/3.0.1: + /eth-block-tracker@3.0.1: resolution: {integrity: sha512-WUVxWLuhMmsfenfZvFO5sbl1qFY2IqUlw/FPVmjjdElpqLsZtSG+wPe9Dz7W/sB6e80HgFKknOmKk2eNlznHug==} dependencies: eth-query: 2.1.2 @@ -9376,10 +9688,10 @@ packages: - supports-color dev: true - /eth-block-tracker/4.4.3: + /eth-block-tracker@4.4.3(@babel/core@7.20.2): resolution: {integrity: sha512-A8tG4Z4iNg4mw5tP1Vung9N9IjgMNqpiMoJ/FouSFwNCGHv2X0mmOYwtQOJzki6XN7r7Tyo01S29p7b224I4jw==} dependencies: - '@babel/plugin-transform-runtime': 7.19.6 + '@babel/plugin-transform-runtime': 7.19.6(@babel/core@7.20.2) '@babel/runtime': 7.20.13 eth-query: 2.1.2 json-rpc-random-id: 1.0.1 @@ -9390,14 +9702,14 @@ packages: - supports-color dev: false - /eth-ens-namehash/2.0.8: + /eth-ens-namehash@2.0.8: resolution: {integrity: sha512-VWEI1+KJfz4Km//dadyvBBoBeSQ0MHTXPvr8UIXiLW6IanxvAV+DmlZAijZwAyggqGUfwQBeHf7tc9wzc1piSw==} dependencies: idna-uts46-hx: 2.3.1 js-sha3: 0.5.7 dev: true - /eth-gas-reporter/0.2.25: + /eth-gas-reporter@0.2.25: resolution: {integrity: sha512-1fRgyE4xUB8SoqLgN3eDfpDfwEfRxh2Sz1b7wzFbyQA+9TekMmvSjjoRu9SKcSVyK+vLkLIsVbJDsTWjw195OQ==} peerDependencies: '@codechecks/client': ^0.1.0 @@ -9417,12 +9729,12 @@ packages: mocha: 7.2.0 req-cwd: 2.0.0 request: 2.88.2 - request-promise-native: 1.0.9_request@2.88.2 + request-promise-native: 1.0.9(request@2.88.2) sha1: 1.1.1 sync-request: 6.1.0 dev: true - /eth-json-rpc-filters/4.2.2: + /eth-json-rpc-filters@4.2.2: resolution: {integrity: sha512-DGtqpLU7bBg63wPMWg1sCpkKCf57dJ+hj/k3zF26anXMzkmtSBDExL8IhUu7LUd34f0Zsce3PYNO2vV2GaTzaw==} dependencies: '@metamask/safe-event-emitter': 2.0.0 @@ -9435,7 +9747,7 @@ packages: - encoding dev: false - /eth-json-rpc-infura/3.2.1: + /eth-json-rpc-infura@3.2.1: resolution: {integrity: sha512-W7zR4DZvyTn23Bxc0EWsq4XGDdD63+XPUCEhV2zQvQGavDVC4ZpFDK4k99qN7bd7/fjj37+rxmuBOBeIqCA5Mw==} dependencies: cross-fetch: 2.2.6 @@ -9447,7 +9759,7 @@ packages: - supports-color dev: true - /eth-json-rpc-middleware/1.6.0: + /eth-json-rpc-middleware@1.6.0: resolution: {integrity: sha512-tDVCTlrUvdqHKqivYMjtFZsdD7TtpNLBCfKAcOpaVs7orBMS/A8HWro6dIzNtTZIR05FAbJ3bioFOnZpuCew9Q==} dependencies: async: 2.6.4 @@ -9467,7 +9779,7 @@ packages: - supports-color dev: true - /eth-json-rpc-middleware/6.0.0: + /eth-json-rpc-middleware@6.0.0: resolution: {integrity: sha512-qqBfLU2Uq1Ou15Wox1s+NX05S9OcAEL4JZ04VZox2NS0U+RtCMjSxzXhLFWekdShUPZ+P8ax3zCO2xcPrp6XJQ==} dependencies: btoa: 1.2.1 @@ -9485,7 +9797,7 @@ packages: - encoding dev: false - /eth-lib/0.1.29: + /eth-lib@0.1.29: resolution: {integrity: sha512-bfttrr3/7gG4E02HoWTDUcDDslN003OlOoBxk9virpAZQ1ja/jDgwkWB8QfJF7ojuEowrqy+lzp9VcJG7/k5bQ==} dependencies: bn.js: 4.12.0 @@ -9501,7 +9813,7 @@ packages: dev: true optional: true - /eth-lib/0.2.8: + /eth-lib@0.2.8: resolution: {integrity: sha512-ArJ7x1WcWOlSpzdoTBX8vkwlkSQ85CjjifSZtV4co64vWxSV8geWfPI9x4SVYu3DSxnX4yWFVTtGL+j9DUFLNw==} dependencies: bn.js: 4.12.0 @@ -9510,32 +9822,32 @@ packages: dev: true optional: true - /eth-query/2.1.2: + /eth-query@2.1.2: resolution: {integrity: sha512-srES0ZcvwkR/wd5OQBRA1bIJMww1skfGS0s8wlwK3/oNP4+wnds60krvu5R1QbpRQjMmpG5OMIWro5s7gvDPsA==} dependencies: json-rpc-random-id: 1.0.1 xtend: 4.0.2 - /eth-rpc-errors/3.0.0: + /eth-rpc-errors@3.0.0: resolution: {integrity: sha512-iPPNHPrLwUlR9xCSYm7HHQjWBasor3+KZfRvwEWxMz3ca0yqnlBeJrnyphkGIXZ4J7AMAaOLmwy4AWhnxOiLxg==} dependencies: fast-safe-stringify: 2.1.1 dev: false - /eth-rpc-errors/4.0.2: + /eth-rpc-errors@4.0.2: resolution: {integrity: sha512-n+Re6Gu8XGyfFy1it0AwbD1x0MUzspQs0D5UiPs1fFPCr6WAwZM+vbIhXheBFrpgosqN9bs5PqlB4Q61U/QytQ==} dependencies: fast-safe-stringify: 2.1.1 dev: false - /eth-sig-util/1.4.2: + /eth-sig-util@1.4.2: 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-util: 5.2.1 - /eth-sig-util/3.0.0: + /eth-sig-util@3.0.0: resolution: {integrity: sha512-4eFkMOhpGbTxBQ3AMzVf0haUX2uTur7DpWiHzWyTURa28BVJJtOkcb9Ok5TV0YvEPG61DODPW7ZUATbJTslioQ==} deprecated: Deprecated in favor of '@metamask/eth-sig-util' dependencies: @@ -9547,7 +9859,7 @@ packages: tweetnacl-util: 0.15.1 dev: true - /eth-tx-summary/3.2.4: + /eth-tx-summary@3.2.4: resolution: {integrity: sha512-NtlDnaVZah146Rm8HMRUNMgIwG/ED4jiqk0TME9zFheMl1jOp6jL1m0NKGjJwehXQ6ZKCPr16MTr+qspKpEXNg==} dependencies: async: 2.6.4 @@ -9562,7 +9874,7 @@ packages: through2: 2.0.5 dev: true - /ethashjs/0.0.8: + /ethashjs@0.0.8: resolution: {integrity: sha512-/MSbf/r2/Ld8o0l15AymjOTlPqpN8Cr4ByUEA9GtR4x0yAh3TdtDzEg29zMjXCNPI7u6E5fOQdj/Cf9Tc7oVNw==} deprecated: 'New package name format for new versions: @ethereumjs/ethash. Please update.' dependencies: @@ -9572,21 +9884,21 @@ packages: miller-rabin: 4.0.1 dev: true - /ethereum-bloom-filters/1.0.10: + /ethereum-bloom-filters@1.0.10: resolution: {integrity: sha512-rxJ5OFN3RwjQxDcFP2Z5+Q9ho4eIdEmSc2ht0fCu8Se9nbXjZ7/031uXoUYJ87KHCOdVeiUuwSnoS7hmYAGVHA==} dependencies: js-sha3: 0.8.0 dev: true - /ethereum-common/0.0.18: + /ethereum-common@0.0.18: resolution: {integrity: sha512-EoltVQTRNg2Uy4o84qpa2aXymXDJhxm7eos/ACOg0DG4baAbMjhbdAEsx9GeE8sC3XCxnYvrrzZDH8D8MtA2iQ==} dev: true - /ethereum-common/0.2.0: + /ethereum-common@0.2.0: resolution: {integrity: sha512-XOnAR/3rntJgbCdGhqdaLIxDLWKLmsZOGhHdBKadEr6gEnJLH52k93Ou+TUdFaPN3hJc3isBZBal3U/XZ15abA==} dev: true - /ethereum-cryptography/0.1.3: + /ethereum-cryptography@0.1.3: resolution: {integrity: sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==} dependencies: '@types/pbkdf2': 3.1.0 @@ -9605,7 +9917,7 @@ packages: secp256k1: 4.0.3 setimmediate: 1.0.5 - /ethereum-cryptography/1.2.0: + /ethereum-cryptography@1.2.0: resolution: {integrity: sha512-6yFQC9b5ug6/17CQpCyE3k9eKBMdhyVjzUy1WkiuY/E4vj/SXDBbCw8QEIaXqf0Mf2SnY6RmpDcwlUmBSS0EJw==} dependencies: '@noble/hashes': 1.2.0 @@ -9614,13 +9926,13 @@ packages: '@scure/bip39': 1.1.1 dev: true - /ethereum-waffle/3.4.4_typescript@4.9.5: + /ethereum-waffle@3.4.4(typescript@4.9.5): resolution: {integrity: sha512-PA9+jCjw4WC3Oc5ocSMBj5sXvueWQeAbvCA+hUlb6oFgwwKyq5ka3bWQ7QZcjzIX+TdFkxP4IbFmoY2D8Dkj9Q==} engines: {node: '>=10.0'} hasBin: true dependencies: '@ethereum-waffle/chai': 3.4.4 - '@ethereum-waffle/compiler': 3.4.4_typescript@4.9.5 + '@ethereum-waffle/compiler': 3.4.4(typescript@4.9.5) '@ethereum-waffle/mock-contract': 3.4.4 '@ethereum-waffle/provider': 3.4.4 ethers: 5.7.2 @@ -9632,21 +9944,21 @@ packages: - utf-8-validate dev: true - /ethereumjs-abi/0.6.5: + /ethereumjs-abi@0.6.5: resolution: {integrity: sha512-rCjJZ/AE96c/AAZc6O3kaog4FhOsAViaysBxqJNy2+LHP0ttH0zkZ7nXdVHOAyt6lFwLO0nlCwWszysG/ao1+g==} dependencies: bn.js: 4.12.0 ethereumjs-util: 4.5.1 dev: true - /ethereumjs-abi/0.6.8: + /ethereumjs-abi@0.6.8: resolution: {integrity: sha512-Tx0r/iXI6r+lRsdvkFDlut0N08jWMnKRZ6Gkq+Nmw75lZe4e6o3EkSnkaBP5NF6+m5PTGAr9JP43N3LyeoglsA==} dependencies: bn.js: 4.12.0 ethereumjs-util: 6.2.1 dev: true - /ethereumjs-account/2.0.5: + /ethereumjs-account@2.0.5: resolution: {integrity: sha512-bgDojnXGjhMwo6eXQC0bY6UK2liSFUSMwwylOmQvZbSl/D7NXQ3+vrGO46ZeOgjGfxXmgIeVNDIiHw7fNZM4VA==} dependencies: ethereumjs-util: 5.2.1 @@ -9654,7 +9966,7 @@ packages: safe-buffer: 5.2.1 dev: true - /ethereumjs-account/3.0.0: + /ethereumjs-account@3.0.0: resolution: {integrity: sha512-WP6BdscjiiPkQfF9PVfMcwx/rDvfZTjFKY0Uwc09zSQr9JfIVH87dYIJu0gNhBhpmovV4yq295fdllS925fnBA==} deprecated: Please use Util.Account class found on package ethereumjs-util@^7.0.6 https://github.com/ethereumjs/ethereumjs-util/releases/tag/v7.0.6 dependencies: @@ -9663,7 +9975,7 @@ packages: safe-buffer: 5.2.1 dev: true - /ethereumjs-block/1.7.1: + /ethereumjs-block@1.7.1: resolution: {integrity: sha512-B+sSdtqm78fmKkBq78/QLKJbu/4Ts4P2KFISdgcuZUPDm9x+N7qgBPIIFUGbaakQh8bzuquiRVbdmvPKqbILRg==} deprecated: 'New package name format for new versions: @ethereumjs/block. Please update.' dependencies: @@ -9674,7 +9986,7 @@ packages: merkle-patricia-tree: 2.3.2 dev: true - /ethereumjs-block/2.2.2: + /ethereumjs-block@2.2.2: resolution: {integrity: sha512-2p49ifhek3h2zeg/+da6XpdFR3GlqY3BIEiqxGF8j9aSRIgkb7M1Ky+yULBKJOu8PAZxfhsYA+HxUk2aCQp3vg==} deprecated: 'New package name format for new versions: @ethereumjs/block. Please update.' dependencies: @@ -9685,7 +9997,7 @@ packages: merkle-patricia-tree: 2.3.2 dev: true - /ethereumjs-blockchain/4.0.4: + /ethereumjs-blockchain@4.0.4: resolution: {integrity: sha512-zCxaRMUOzzjvX78DTGiKjA+4h2/sF0OYL1QuPux0DHpyq8XiNoF5GYHtb++GUxVlMsMfZV7AVyzbtgcRdIcEPQ==} deprecated: 'New package name format for new versions: @ethereumjs/blockchain. Please update.' dependencies: @@ -9701,12 +10013,12 @@ packages: semaphore: 1.1.0 dev: true - /ethereumjs-common/1.5.0: + /ethereumjs-common@1.5.0: resolution: {integrity: sha512-SZOjgK1356hIY7MRj3/ma5qtfr/4B5BL+G4rP/XSMYr2z1H5el4RX5GReYCKmQmYI/nSBmRnwrZ17IfHuG0viQ==} deprecated: 'New package name format for new versions: @ethereumjs/common. Please update.' dev: true - /ethereumjs-tx/1.3.7: + /ethereumjs-tx@1.3.7: resolution: {integrity: sha512-wvLMxzt1RPhAQ9Yi3/HKZTn0FZYpnsmQdbKYfUUpi4j1SEIcbkd9tndVjcPrufY3V7j2IebOpC00Zp2P/Ay2kA==} deprecated: 'New package name format for new versions: @ethereumjs/tx. Please update.' dependencies: @@ -9714,7 +10026,7 @@ packages: ethereumjs-util: 5.2.1 dev: true - /ethereumjs-tx/2.1.2: + /ethereumjs-tx@2.1.2: resolution: {integrity: sha512-zZEK1onCeiORb0wyCXUvg94Ve5It/K6GD1K+26KfFKodiBiS6d9lfCXlUKGBBdQ+bv7Day+JK0tj1K+BeNFRAw==} deprecated: 'New package name format for new versions: @ethereumjs/tx. Please update.' dependencies: @@ -9722,7 +10034,7 @@ packages: ethereumjs-util: 6.2.1 dev: true - /ethereumjs-util/4.5.1: + /ethereumjs-util@4.5.1: resolution: {integrity: sha512-WrckOZ7uBnei4+AKimpuF1B3Fv25OmoRgmYCpGsP7u8PFxXAmAgiJSYT2kRWnt6fVIlKaQlZvuwXp7PIrmn3/w==} dependencies: bn.js: 4.12.0 @@ -9732,7 +10044,7 @@ packages: rlp: 2.2.7 dev: true - /ethereumjs-util/5.2.1: + /ethereumjs-util@5.2.1: resolution: {integrity: sha512-v3kT+7zdyCm1HIqWlLNrHGqHGLpGYIhjeHxQjnDXjLT2FyGJDsd3LWMYUo7pAFRrk86CR3nUJfhC81CCoJNNGQ==} dependencies: bn.js: 4.12.0 @@ -9743,7 +10055,7 @@ packages: rlp: 2.2.7 safe-buffer: 5.2.1 - /ethereumjs-util/6.2.1: + /ethereumjs-util@6.2.1: resolution: {integrity: sha512-W2Ktez4L01Vexijrm5EB6w7dg4n/TgpoYU4avuT5T3Vmnw/eCRtiBrJfQYS/DCSvDIOLn2k57GcHdeBcgVxAqw==} dependencies: '@types/bn.js': 4.11.6 @@ -9754,7 +10066,7 @@ packages: ethjs-util: 0.1.6 rlp: 2.2.7 - /ethereumjs-util/7.1.5: + /ethereumjs-util@7.1.5: resolution: {integrity: sha512-SDl5kKrQAudFBUe5OJM9Ac6WmMyYmXX/6sTmLZ3ffG2eY6ZIGBes3pEDxNN6V72WyOw4CPD5RomKdsa8DAAwLg==} engines: {node: '>=10.0.0'} dependencies: @@ -9765,7 +10077,7 @@ packages: rlp: 2.2.7 dev: true - /ethereumjs-vm/2.6.0: + /ethereumjs-vm@2.6.0: resolution: {integrity: sha512-r/XIUik/ynGbxS3y+mvGnbOKnuLo40V5Mj1J25+HEO63aWYREIqvWeRO/hnROlMBE5WoniQmPmhiaN0ctiHaXw==} deprecated: 'New package name format for new versions: @ethereumjs/vm. Please update.' dependencies: @@ -9782,7 +10094,7 @@ packages: safe-buffer: 5.2.1 dev: true - /ethereumjs-vm/4.2.0: + /ethereumjs-vm@4.2.0: resolution: {integrity: sha512-X6qqZbsY33p5FTuZqCnQ4+lo957iUJMM6Mpa6bL4UW0dxM6WmDSHuI4j/zOp1E2TDKImBGCJA9QPfc08PaNubA==} deprecated: 'New package name format for new versions: @ethereumjs/vm. Please update.' dependencies: @@ -9803,7 +10115,7 @@ packages: util.promisify: 1.1.1 dev: true - /ethereumjs-wallet/0.6.5: + /ethereumjs-wallet@0.6.5: resolution: {integrity: sha512-MDwjwB9VQVnpp/Dc1XzA6J1a3wgHQ4hSvA1uWNatdpOrtCbPVuQSKSyRnjLvS0a+KKMw2pvQ9Ybqpb3+eW8oNA==} requiresBuild: true dependencies: @@ -9819,7 +10131,7 @@ packages: dev: true optional: true - /ethers/4.0.49: + /ethers@4.0.49: resolution: {integrity: sha512-kPltTvWiyu+OktYy1IStSO16i2e7cS9D9OxZ81q2UUaiNPVrm/RTcbxamCXF9VUSKzJIdJV68EAIhTEVBalRWg==} dependencies: aes-js: 3.0.0 @@ -9833,7 +10145,7 @@ packages: xmlhttprequest: 1.8.0 dev: true - /ethers/5.7.2: + /ethers@5.7.2: resolution: {integrity: sha512-wswUsmWo1aOK8rR7DIKiWSw9DbLWe6x98Jrn8wcTflTVvaXhAMaB5zGAXy0GYQEQp9iO1iSHWVyARQm11zUtyg==} dependencies: '@ethersproject/abi': 5.7.0 @@ -9870,7 +10182,7 @@ packages: - bufferutil - utf-8-validate - /ethjs-unit/0.1.6: + /ethjs-unit@0.1.6: resolution: {integrity: sha512-/Sn9Y0oKl0uqQuvgFk/zQgR7aw1g36qX/jzSQ5lSwlO0GigPymk4eGQfeNTD03w1dPOqfz8V77Cy43jH56pagw==} engines: {node: '>=6.5.0', npm: '>=3'} dependencies: @@ -9878,45 +10190,45 @@ packages: number-to-bn: 1.7.0 dev: true - /ethjs-util/0.1.6: + /ethjs-util@0.1.6: resolution: {integrity: sha512-CUnVOQq7gSpDHZVVrQW8ExxUETWrnrvXYvYz55wOU8Uj4VCgw56XC2B/fVqQN+f7gmrnRHSLVnFAwsCuNwji8w==} engines: {node: '>=6.5.0', npm: '>=3'} dependencies: is-hex-prefixed: 1.0.0 strip-hex-prefix: 1.0.0 - /event-emitter/0.3.5: + /event-emitter@0.3.5: resolution: {integrity: sha512-D9rRn9y7kLPnJ+hMq7S/nhvoKwwvVJahBi2BPmx3bvbsEdK3W9ii8cBSGjP+72/LnM4n6fo3+dkCX5FeTQruXA==} dependencies: d: 1.0.1 es5-ext: 0.10.62 dev: false - /event-target-shim/5.0.1: + /event-target-shim@5.0.1: resolution: {integrity: sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==} engines: {node: '>=6'} dev: true - /eventemitter3/4.0.4: + /eventemitter3@4.0.4: resolution: {integrity: sha512-rlaVLnVxtxvoyLsQQFBx53YmXHDxRIzzTLbdfxqi4yocpSjAxXwkU0cScM5JgSKMqEhrZpnvQ2D9gjylR0AimQ==} dev: true optional: true - /eventemitter3/4.0.7: + /eventemitter3@4.0.7: resolution: {integrity: sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==} dev: false - /events/3.3.0: + /events@3.3.0: resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} engines: {node: '>=0.8.x'} - /evp_bytestokey/1.0.3: + /evp_bytestokey@1.0.3: resolution: {integrity: sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==} dependencies: md5.js: 1.3.5 safe-buffer: 5.2.1 - /execa/0.8.0: + /execa@0.8.0: resolution: {integrity: sha512-zDWS+Rb1E8BlqqhALSt9kUhss8Qq4nN3iof3gsOdyINksElaPyNBtKUMTR62qhvgVWR0CqCX7sdnKe4MnUbFEA==} engines: {node: '>=4'} dependencies: @@ -9929,7 +10241,7 @@ packages: strip-eof: 1.0.0 dev: false - /execa/5.1.1: + /execa@5.1.1: resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} engines: {node: '>=10'} dependencies: @@ -9944,12 +10256,12 @@ packages: strip-final-newline: 2.0.0 dev: true - /exit/0.1.2: + /exit@0.1.2: resolution: {integrity: sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==} engines: {node: '>= 0.8.0'} dev: true - /expand-brackets/2.1.4: + /expand-brackets@2.1.4: resolution: {integrity: sha512-w/ozOKR9Obk3qoWeY/WDi6MFta9AoMR+zud60mdnbniMcBxRuFJyDt2LdX/14A1UABeqk+Uk+LDfUpvoGKppZA==} engines: {node: '>=0.10.0'} dependencies: @@ -9964,12 +10276,12 @@ packages: - supports-color dev: true - /expand-template/2.0.3: + /expand-template@2.0.3: resolution: {integrity: sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==} engines: {node: '>=6'} dev: false - /expect/27.5.1: + /expect@27.5.1: resolution: {integrity: sha512-E1q5hSUG2AmYQwQJ041nvgpkODHQvB+RKlB4IYdru6uJsyFTRyZAP463M+1lINorwbqAmUggi6+WwkD8lCS/Dw==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: @@ -9979,7 +10291,7 @@ packages: jest-message-util: 27.5.1 dev: true - /express/4.18.2: + /express@4.18.2: resolution: {integrity: sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==} engines: {node: '>= 0.10.0'} dependencies: @@ -10019,18 +10331,18 @@ packages: dev: true optional: true - /ext/1.7.0: + /ext@1.7.0: resolution: {integrity: sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw==} dependencies: type: 2.7.2 - /extend-shallow/2.0.1: + /extend-shallow@2.0.1: resolution: {integrity: sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==} engines: {node: '>=0.10.0'} dependencies: is-extendable: 0.1.1 - /extend-shallow/3.0.2: + /extend-shallow@3.0.2: resolution: {integrity: sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==} engines: {node: '>=0.10.0'} dependencies: @@ -10038,10 +10350,10 @@ packages: is-extendable: 1.0.1 dev: true - /extend/3.0.2: + /extend@3.0.2: resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} - /extglob/2.0.4: + /extglob@2.0.4: resolution: {integrity: sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==} engines: {node: '>=0.10.0'} dependencies: @@ -10057,31 +10369,31 @@ packages: - supports-color dev: true - /extsprintf/1.3.0: + /extsprintf@1.3.0: resolution: {integrity: sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==} engines: {'0': node >=0.6.0} dev: true - /eyes/0.1.8: + /eyes@0.1.8: resolution: {integrity: sha512-GipyPsXO1anza0AOZdy69Im7hGFCNB7Y/NGjDlZGJ3GJJLtwNSb2vrzYrTYJRrRloVx7pl+bhUaTB8yiccPvFQ==} engines: {node: '> 0.1.90'} dev: false - /fake-merkle-patricia-tree/1.0.1: + /fake-merkle-patricia-tree@1.0.1: resolution: {integrity: sha512-Tgq37lkc9pUIgIKw5uitNUKcgcYL3R6JvXtKQbOf/ZSavXbidsksgp/pAY6p//uhw0I4yoMsvTSovvVIsk/qxA==} dependencies: checkpoint-store: 1.1.0 dev: true - /fast-deep-equal/3.1.3: + /fast-deep-equal@3.1.3: resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} dev: true - /fast-diff/1.2.0: + /fast-diff@1.2.0: resolution: {integrity: sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==} dev: true - /fast-glob/3.2.12: + /fast-glob@3.2.12: resolution: {integrity: sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==} engines: {node: '>=8.6.0'} dependencies: @@ -10092,52 +10404,52 @@ packages: micromatch: 4.0.5 dev: true - /fast-json-stable-stringify/2.1.0: + /fast-json-stable-stringify@2.1.0: resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} dev: true - /fast-levenshtein/2.0.6: + /fast-levenshtein@2.0.6: resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} dev: true - /fast-safe-stringify/2.1.1: + /fast-safe-stringify@2.1.1: resolution: {integrity: sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==} dev: false - /fast-stable-stringify/1.0.0: + /fast-stable-stringify@1.0.0: resolution: {integrity: sha512-wpYMUmFu5f00Sm0cj2pfivpmawLZ0NKdviQ4w9zJeR8JVtOpOxHmLaJuj0vxvGqMJQWyP/COUkF75/57OKyRag==} dev: false - /fastq/1.15.0: + /fastq@1.15.0: resolution: {integrity: sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==} dependencies: reusify: 1.0.4 dev: true - /fb-watchman/2.0.2: + /fb-watchman@2.0.2: resolution: {integrity: sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==} dependencies: bser: 2.1.1 dev: true - /fetch-ponyfill/4.1.0: + /fetch-ponyfill@4.1.0: resolution: {integrity: sha512-knK9sGskIg2T7OnYLdZ2hZXn0CtDrAIBxYQLpmEf0BqfdWnwmM1weccUl5+4EdA44tzNSFAuxITPbXtPehUB3g==} dependencies: node-fetch: 1.7.3 dev: true - /file-entry-cache/6.0.1: + /file-entry-cache@6.0.1: resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} engines: {node: ^10.12.0 || >=12.0.0} dependencies: flat-cache: 3.0.4 dev: true - /file-uri-to-path/1.0.0: + /file-uri-to-path@1.0.0: resolution: {integrity: sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==} dev: false - /fill-range/4.0.0: + /fill-range@4.0.0: resolution: {integrity: sha512-VcpLTWqWDiTerugjj8e3+esbg+skS3M9e54UuR3iCeIDMXCLTsAH8hTSzDQU/X6/6t3eYkOKoZSef2PlU6U1XQ==} engines: {node: '>=0.10.0'} dependencies: @@ -10147,14 +10459,14 @@ packages: to-regex-range: 2.1.1 dev: true - /fill-range/7.0.1: + /fill-range@7.0.1: resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} engines: {node: '>=8'} dependencies: to-regex-range: 5.0.1 dev: true - /finalhandler/1.2.0: + /finalhandler@1.2.0: resolution: {integrity: sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==} engines: {node: '>= 0.8'} dependencies: @@ -10170,7 +10482,7 @@ packages: dev: true optional: true - /find-replace/1.0.3: + /find-replace@1.0.3: resolution: {integrity: sha512-KrUnjzDCD9426YnCP56zGYy/eieTnhtK6Vn++j+JJzmlsWWwEkDnsyVF575spT6HJ6Ow9tlbT3TQTDsa+O4UWA==} engines: {node: '>=4.0.0'} dependencies: @@ -10178,7 +10490,7 @@ packages: test-value: 2.1.0 dev: true - /find-up/1.1.2: + /find-up@1.1.2: resolution: {integrity: sha512-jvElSjyuo4EMQGoTwo1uJU5pQMwTW5lS1x05zzfJuTIyLR3zwO27LYrxNg+dlvKpGOuGy/MzBdXh80g0ve5+HA==} engines: {node: '>=0.10.0'} dependencies: @@ -10186,20 +10498,20 @@ packages: pinkie-promise: 2.0.1 dev: true - /find-up/2.1.0: + /find-up@2.1.0: resolution: {integrity: sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ==} engines: {node: '>=4'} dependencies: locate-path: 2.0.0 dev: true - /find-up/3.0.0: + /find-up@3.0.0: resolution: {integrity: sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==} engines: {node: '>=6'} dependencies: locate-path: 3.0.0 - /find-up/4.1.0: + /find-up@4.1.0: resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} engines: {node: '>=8'} dependencies: @@ -10207,7 +10519,7 @@ packages: path-exists: 4.0.0 dev: true - /find-up/5.0.0: + /find-up@5.0.0: resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} engines: {node: '>=10'} dependencies: @@ -10215,7 +10527,7 @@ packages: path-exists: 4.0.0 dev: true - /find-yarn-workspace-root/1.2.1: + /find-yarn-workspace-root@1.2.1: resolution: {integrity: sha512-dVtfb0WuQG+8Ag2uWkbG79hOUzEsRrhBzgfn86g2sJPkzmcpGdghbNTfUKGTxymFrY/tLIodDzLoW9nOJ4FY8Q==} dependencies: fs-extra: 4.0.3 @@ -10224,13 +10536,13 @@ packages: - supports-color dev: true - /find-yarn-workspace-root/2.0.0: + /find-yarn-workspace-root@2.0.0: resolution: {integrity: sha512-1IMnbjt4KzsQfnhnzNd8wUEgXZ44IzZaZmnLYx7D5FZlaHt2gW20Cri8Q+E/t5tIj4+epTBub+2Zxu/vNILzqQ==} dependencies: micromatch: 4.0.5 dev: true - /flat-cache/3.0.4: + /flat-cache@3.0.4: resolution: {integrity: sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==} engines: {node: ^10.12.0 || >=12.0.0} dependencies: @@ -10238,35 +10550,35 @@ packages: rimraf: 3.0.2 dev: true - /flat/4.1.1: + /flat@4.1.1: resolution: {integrity: sha512-FmTtBsHskrU6FJ2VxCnsDb84wu9zhmO3cUX2kGFb5tuwhfXxGciiT0oRY+cck35QmG+NmGh5eLz6lLCpWTqwpA==} hasBin: true dependencies: is-buffer: 2.0.5 dev: true - /flat/5.0.2: + /flat@5.0.2: resolution: {integrity: sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==} hasBin: true dev: true - /flatted/3.2.7: + /flatted@3.2.7: resolution: {integrity: sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==} dev: true - /flexsearch/0.7.31: + /flexsearch@0.7.31: resolution: {integrity: sha512-XGozTsMPYkm+6b5QL3Z9wQcJjNYxp0CYn3U1gO7dwD6PAqU1SVWZxI9CCg3z+ml3YfqdPnrBehaBrnH2AGKbNA==} dev: false - /flow-stoplight/1.0.0: + /flow-stoplight@1.0.0: resolution: {integrity: sha512-rDjbZUKpN8OYhB0IE/vY/I8UWO/602IIJEU/76Tv4LvYnwHCk0BCsvz4eRr9n+FQcri7L5cyaXOo0+/Kh4HisA==} dev: true - /focus-visible/5.2.0: + /focus-visible@5.2.0: resolution: {integrity: sha512-Rwix9pBtC1Nuy5wysTmKy+UjbDJpIfg8eHjw0rjZ1mX4GNLz1Bmd16uDpI3Gk1i70Fgcs8Csg2lPm8HULFg9DQ==} dev: false - /follow-redirects/1.15.2: + /follow-redirects@1.15.2(debug@4.3.4): resolution: {integrity: sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==} engines: {node: '>=4.0'} peerDependencies: @@ -10274,26 +10586,28 @@ packages: peerDependenciesMeta: debug: optional: true + dependencies: + debug: 4.3.4(supports-color@8.1.1) - /for-each/0.3.3: + /for-each@0.3.3: resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} dependencies: is-callable: 1.2.7 - /for-in/1.0.2: + /for-in@1.0.2: resolution: {integrity: sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ==} engines: {node: '>=0.10.0'} dev: true - /foreach/2.0.6: + /foreach@2.0.6: resolution: {integrity: sha512-k6GAGDyqLe9JaebCsFCoudPPWfihKu8pylYXRlqP1J7ms39iPoTtk2fviNglIeQEwdh0bQeKJ01ZPyuyQvKzwg==} dev: true - /forever-agent/0.6.1: + /forever-agent@0.6.1: resolution: {integrity: sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==} dev: true - /form-data/2.3.3: + /form-data@2.3.3: resolution: {integrity: sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==} engines: {node: '>= 0.12'} dependencies: @@ -10302,7 +10616,7 @@ packages: mime-types: 2.1.35 dev: true - /form-data/2.5.1: + /form-data@2.5.1: resolution: {integrity: sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA==} engines: {node: '>= 0.12'} dependencies: @@ -10311,7 +10625,7 @@ packages: mime-types: 2.1.35 dev: true - /form-data/3.0.1: + /form-data@3.0.1: resolution: {integrity: sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==} engines: {node: '>= 6'} dependencies: @@ -10320,7 +10634,7 @@ packages: mime-types: 2.1.35 dev: true - /form-data/4.0.0: + /form-data@4.0.0: resolution: {integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==} engines: {node: '>= 6'} dependencies: @@ -10329,38 +10643,38 @@ packages: mime-types: 2.1.35 dev: false - /forwarded/0.2.0: + /forwarded@0.2.0: resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} engines: {node: '>= 0.6'} dev: true optional: true - /fp-ts/1.19.3: + /fp-ts@1.19.3: resolution: {integrity: sha512-H5KQDspykdHuztLTg+ajGN0Z2qUjcEf3Ybxc6hLt0k7/zPkn29XnKnxlBPyW2XIddWrGaJBzBl4VLYOtk39yZg==} dev: true - /fraction.js/4.2.0: + /fraction.js@4.2.0: resolution: {integrity: sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA==} dev: true - /fragment-cache/0.2.1: + /fragment-cache@0.2.1: resolution: {integrity: sha512-GMBAbW9antB8iZRHLoGw0b3HANt57diZYFO/HL1JGIC1MjKrdmhxvrJbupnVvpys0zsz7yBApXdQyfepKly2kA==} engines: {node: '>=0.10.0'} dependencies: map-cache: 0.2.2 dev: true - /fresh/0.5.2: + /fresh@0.5.2: resolution: {integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==} engines: {node: '>= 0.6'} dev: true optional: true - /fs-constants/1.0.0: + /fs-constants@1.0.0: resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==} dev: false - /fs-extra/0.30.0: + /fs-extra@0.30.0: resolution: {integrity: sha512-UvSPKyhMn6LEd/WpUaV9C9t3zATuqoqfWc3QdPhPLb58prN9tqYPlPWi8Krxi44loBoUzlobqZ3+8tGpxxSzwA==} dependencies: graceful-fs: 4.2.10 @@ -10370,7 +10684,7 @@ packages: rimraf: 2.7.1 dev: true - /fs-extra/10.1.0: + /fs-extra@10.1.0: resolution: {integrity: sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==} engines: {node: '>=12'} dependencies: @@ -10379,7 +10693,7 @@ packages: universalify: 2.0.0 dev: true - /fs-extra/4.0.3: + /fs-extra@4.0.3: resolution: {integrity: sha512-q6rbdDd1o2mAnQreO7YADIxf/Whx4AHBiRf6d+/cVT8h44ss+lHgxf1FemcqDnQt9X3ct4McHr+JMGlYSsK7Cg==} dependencies: graceful-fs: 4.2.10 @@ -10387,7 +10701,7 @@ packages: universalify: 0.1.2 dev: true - /fs-extra/7.0.1: + /fs-extra@7.0.1: resolution: {integrity: sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==} engines: {node: '>=6 <7 || >=8'} dependencies: @@ -10396,7 +10710,7 @@ packages: universalify: 0.1.2 dev: true - /fs-extra/8.1.0: + /fs-extra@8.1.0: resolution: {integrity: sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==} engines: {node: '>=6 <7 || >=8'} dependencies: @@ -10405,7 +10719,7 @@ packages: universalify: 0.1.2 dev: true - /fs-extra/9.1.0: + /fs-extra@9.1.0: resolution: {integrity: sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==} engines: {node: '>=10'} dependencies: @@ -10415,29 +10729,29 @@ packages: universalify: 2.0.0 dev: true - /fs-minipass/1.2.7: + /fs-minipass@1.2.7: resolution: {integrity: sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA==} dependencies: minipass: 2.9.0 dev: true optional: true - /fs-minipass/2.1.0: + /fs-minipass@2.1.0: resolution: {integrity: sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==} engines: {node: '>= 8'} dependencies: minipass: 3.3.4 dev: true - /fs-readdir-recursive/1.1.0: + /fs-readdir-recursive@1.1.0: resolution: {integrity: sha512-GNanXlVr2pf02+sPN40XN8HG+ePaNcvM0q5mZBd668Obwb0yD5GiUbZOFgwn8kGMY6I3mdyDJzieUy3PTYyTRA==} dev: true - /fs.realpath/1.0.0: + /fs.realpath@1.0.0: resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} dev: true - /fsevents/2.1.3: + /fsevents@2.1.3: resolution: {integrity: sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==} engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} os: [darwin] @@ -10446,7 +10760,7 @@ packages: dev: true optional: true - /fsevents/2.3.2: + /fsevents@2.3.2: resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} os: [darwin] @@ -10454,10 +10768,10 @@ packages: dev: true optional: true - /function-bind/1.1.1: + /function-bind@1.1.1: resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==} - /function.prototype.name/1.1.5: + /function.prototype.name@1.1.5: resolution: {integrity: sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==} engines: {node: '>= 0.4'} dependencies: @@ -10467,21 +10781,21 @@ packages: functions-have-names: 1.2.3 dev: true - /functional-red-black-tree/1.0.1: + /functional-red-black-tree@1.0.1: resolution: {integrity: sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==} dev: true - /functions-have-names/1.2.3: + /functions-have-names@1.2.3: resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} dev: true - /fwd-stream/1.0.4: + /fwd-stream@1.0.4: resolution: {integrity: sha512-q2qaK2B38W07wfPSQDKMiKOD5Nzv2XyuvQlrmh1q0pxyHNanKHq8lwQ6n9zHucAwA5EbzRJKEgds2orn88rYTg==} dependencies: readable-stream: 1.0.34 dev: true - /ganache-core/2.13.2: + /ganache-core@2.13.2: resolution: {integrity: sha512-tIF5cR+ANQz0+3pHWxHjIwHqFXcVo0Mb+kcsNhglNFALcYo49aQpnS9dqHartqPfMFjiHh/qFoD3mYK0d/qGgw==} engines: {node: '>=8.9.0'} deprecated: ganache-core is now ganache; visit https://trfl.io/g7 for details @@ -10491,7 +10805,7 @@ packages: bip39: 2.5.0 cachedown: 1.0.0 clone: 2.1.2 - debug: 3.2.6 + debug: 3.2.6(supports-color@6.0.0) encoding-down: 5.0.4 eth-sig-util: 3.0.0 ethereumjs-abi: 0.6.8 @@ -10525,7 +10839,7 @@ packages: bundledDependencies: - keccak - /gauge/3.0.2: + /gauge@3.0.2: resolution: {integrity: sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==} engines: {node: '>=10'} dependencies: @@ -10540,7 +10854,7 @@ packages: wide-align: 1.1.5 dev: true - /gauge/4.0.4: + /gauge@4.0.4: resolution: {integrity: sha512-f9m+BEN5jkg6a0fZjleidjN51VE1X+mPFQ2DJ0uv1V39oCLCbsGe6yjbBnp7eK7z/+GAon99a3nHuqbuuthyPg==} engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} dependencies: @@ -10554,63 +10868,62 @@ packages: wide-align: 1.1.5 dev: true - /gaze/1.1.3: + /gaze@1.1.3: resolution: {integrity: sha512-BRdNm8hbWzFzWHERTrejLqwHDfS4GibPoq5wjTPIoJHoBtKGPg3xAFfxmM+9ztbXelxcf2hwQcaz1PtmFeue8g==} engines: {node: '>= 4.0.0'} dependencies: globule: 1.3.4 dev: true - /gensync/1.0.0-beta.2: + /gensync@1.0.0-beta.2: resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} engines: {node: '>=6.9.0'} - dev: true - /get-caller-file/1.0.3: + /get-caller-file@1.0.3: resolution: {integrity: sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==} dev: true - /get-caller-file/2.0.5: + /get-caller-file@2.0.5: resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} engines: {node: 6.* || 8.* || >= 10.*} - /get-func-name/2.0.0: + /get-func-name@2.0.0: resolution: {integrity: sha512-Hm0ixYtaSZ/V7C8FJrtZIuBBI+iSgL+1Aq82zSu8VQNB4S3Gk8e7Qs3VwBDJAhmRZcFqkl3tQu36g/Foh5I5ig==} dev: true - /get-intrinsic/1.2.0: + /get-intrinsic@1.2.0: resolution: {integrity: sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q==} dependencies: function-bind: 1.1.1 has: 1.0.3 has-symbols: 1.0.3 - /get-package-type/0.1.0: + /get-package-type@0.1.0: resolution: {integrity: sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==} engines: {node: '>=8.0.0'} dev: true - /get-port/3.2.0: + /get-port@3.2.0: resolution: {integrity: sha512-x5UJKlgeUiNT8nyo/AcnwLnZuZNcSjSw0kogRB+Whd1fjjFq4B1hySFxSFWWSn4mIBzg3sRNUDFYc4g5gjPoLg==} engines: {node: '>=4'} dev: true - /get-stdin/4.0.1: + /get-stdin@4.0.1: resolution: {integrity: sha512-F5aQMywwJ2n85s4hJPTT9RPxGmubonuB10MNYo17/xph174n2MIR33HRguhzVag10O/npM7SPk73LMZNP+FaWw==} engines: {node: '>=0.10.0'} dev: true - /get-stdin/8.0.0: + /get-stdin@8.0.0: resolution: {integrity: sha512-sY22aA6xchAzprjyqmSEQv4UbAAzRN0L2dQB0NlN5acTTK9Don6nhoc3eAbUnpZiCANAMfd/+40kVdKfFygohg==} engines: {node: '>=10'} dev: true - /get-stream/3.0.0: + /get-stream@3.0.0: resolution: {integrity: sha512-GlhdIUuVakc8SJ6kK0zAFbiGzRFzNnY4jUuEbV9UROo4Y+0Ny4fjvcZFVTeDA4odpFyOQzaw6hXukJSq/f28sQ==} engines: {node: '>=4'} dev: false - /get-stream/4.1.0: + /get-stream@4.1.0: resolution: {integrity: sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==} engines: {node: '>=6'} dependencies: @@ -10618,7 +10931,7 @@ packages: dev: true optional: true - /get-stream/5.2.0: + /get-stream@5.2.0: resolution: {integrity: sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==} engines: {node: '>=8'} dependencies: @@ -10626,12 +10939,12 @@ packages: dev: true optional: true - /get-stream/6.0.1: + /get-stream@6.0.1: resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} engines: {node: '>=10'} dev: true - /get-symbol-description/1.0.0: + /get-symbol-description@1.0.0: resolution: {integrity: sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==} engines: {node: '>= 0.4'} dependencies: @@ -10639,18 +10952,18 @@ packages: get-intrinsic: 1.2.0 dev: true - /get-value/2.0.6: + /get-value@2.0.6: resolution: {integrity: sha512-Ln0UQDlxH1BapMu3GPtf7CuYNwRZf2gwCuPqbyG6pB8WfmFpzqcy4xtAaAMUhnNqjMKTiCPZG2oMT3YSx8U2NA==} engines: {node: '>=0.10.0'} dev: true - /getpass/0.1.7: + /getpass@0.1.7: resolution: {integrity: sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==} dependencies: assert-plus: 1.0.0 dev: true - /ghost-testrpc/0.0.2: + /ghost-testrpc@0.0.2: resolution: {integrity: sha512-i08dAEgJ2g8z5buJIrCTduwPIhih3DP+hOCTyyryikfV8T0bNvHnGXO67i0DD1H4GBDETTclPy9njZbfluQYrQ==} hasBin: true dependencies: @@ -10658,46 +10971,46 @@ packages: node-emoji: 1.11.0 dev: true - /git-up/7.0.0: + /git-up@7.0.0: resolution: {integrity: sha512-ONdIrbBCFusq1Oy0sC71F5azx8bVkvtZtMJAsv+a6lz5YAmbNnLD6HAB4gptHZVLPR8S2/kVN6Gab7lryq5+lQ==} dependencies: is-ssh: 1.4.0 parse-url: 8.1.0 dev: false - /git-url-parse/13.1.0: + /git-url-parse@13.1.0: resolution: {integrity: sha512-5FvPJP/70WkIprlUZ33bm4UAaFdjcLkJLpWft1BeZKqwR0uhhNGoKwlUaPtVb4LxCSQ++erHapRak9kWGj+FCA==} dependencies: git-up: 7.0.0 dev: false - /github-from-package/0.0.0: + /github-from-package@0.0.0: resolution: {integrity: sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==} dev: false - /github-slugger/2.0.0: + /github-slugger@2.0.0: resolution: {integrity: sha512-IaOQ9puYtjrkq7Y0Ygl9KDZnrf/aiUJYUpVf89y8kyaxbRG7Y1SrX/jaumrv81vc61+kiMempujsM3Yw7w5qcw==} dev: false - /glob-parent/5.1.2: + /glob-parent@5.1.2: resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} engines: {node: '>= 6'} dependencies: is-glob: 4.0.3 dev: true - /glob-parent/6.0.2: + /glob-parent@6.0.2: resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} engines: {node: '>=10.13.0'} dependencies: is-glob: 4.0.3 dev: true - /glob-to-regexp/0.4.1: + /glob-to-regexp@0.4.1: resolution: {integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==} dev: true - /glob/5.0.15: + /glob@5.0.15: resolution: {integrity: sha512-c9IPMazfRITpmAAKi22dK1VKxGDX9ehhqfABDriL/lzO92xcUKEJPQHrVA/2YHSNFB4iFlykVmWvwo48nr3OxA==} dependencies: inflight: 1.0.6 @@ -10707,7 +11020,7 @@ packages: path-is-absolute: 1.0.1 dev: true - /glob/7.1.3: + /glob@7.1.3: resolution: {integrity: sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==} dependencies: fs.realpath: 1.0.0 @@ -10718,7 +11031,7 @@ packages: path-is-absolute: 1.0.1 dev: true - /glob/7.2.0: + /glob@7.2.0: resolution: {integrity: sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==} dependencies: fs.realpath: 1.0.0 @@ -10729,7 +11042,7 @@ packages: path-is-absolute: 1.0.1 dev: true - /glob/7.2.3: + /glob@7.2.3: resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} dependencies: fs.realpath: 1.0.0 @@ -10740,7 +11053,7 @@ packages: path-is-absolute: 1.0.1 dev: true - /glob/8.1.0: + /glob@8.1.0: resolution: {integrity: sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==} engines: {node: '>=12'} dependencies: @@ -10751,14 +11064,14 @@ packages: once: 1.4.0 dev: true - /global-modules/2.0.0: + /global-modules@2.0.0: resolution: {integrity: sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==} engines: {node: '>=6'} dependencies: global-prefix: 3.0.0 dev: true - /global-prefix/3.0.0: + /global-prefix@3.0.0: resolution: {integrity: sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==} engines: {node: '>=6'} dependencies: @@ -10767,42 +11080,41 @@ packages: which: 1.3.1 dev: true - /global/4.4.0: + /global@4.4.0: resolution: {integrity: sha512-wv/LAoHdRE3BeTGz53FAamhGlPLhlssK45usmGFThIi4XqnBmjKQ16u+RNbP7WvigRZDxUsM0J3gcQ5yicaL0w==} dependencies: min-document: 2.19.0 process: 0.11.10 dev: true - /globals/11.12.0: + /globals@11.12.0: resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} engines: {node: '>=4'} - dev: true - /globals/13.20.0: + /globals@13.20.0: resolution: {integrity: sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==} engines: {node: '>=8'} dependencies: type-fest: 0.20.2 dev: true - /globals/9.18.0: + /globals@9.18.0: resolution: {integrity: sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==} engines: {node: '>=0.10.0'} dev: true - /globalthis/1.0.3: + /globalthis@1.0.3: resolution: {integrity: sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==} engines: {node: '>= 0.4'} dependencies: define-properties: 1.2.0 dev: true - /globalyzer/0.1.0: + /globalyzer@0.1.0: resolution: {integrity: sha512-40oNTM9UfG6aBmuKxk/giHn5nQ8RVz/SS4Ir6zgzOv9/qC3kKZ9v4etGTcJbEl/NyVQH7FGU7d+X1egr57Md2Q==} dev: false - /globby/10.0.2: + /globby@10.0.2: resolution: {integrity: sha512-7dUi7RvCoT/xast/o/dLN53oqND4yk0nsHkhRgn9w65C4PofCLOoJ39iSOg+qVDdWQPIEj+eszMHQ+aLVwwQSg==} engines: {node: '>=8'} dependencies: @@ -10816,7 +11128,7 @@ packages: slash: 3.0.0 dev: true - /globby/11.1.0: + /globby@11.1.0: resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} engines: {node: '>=10'} dependencies: @@ -10828,11 +11140,11 @@ packages: slash: 3.0.0 dev: true - /globrex/0.1.2: + /globrex@0.1.2: resolution: {integrity: sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==} dev: false - /globule/1.3.4: + /globule@1.3.4: resolution: {integrity: sha512-OPTIfhMBh7JbBYDpa5b+Q5ptmMWKwcNcFSR/0c6t8V4f3ZAVBEsKNY37QdVqmLRYSMhOUGYrY0QhSoEpzGr/Eg==} engines: {node: '>= 0.10'} dependencies: @@ -10841,12 +11153,12 @@ packages: minimatch: 3.0.4 dev: true - /gopd/1.0.1: + /gopd@1.0.1: resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} dependencies: get-intrinsic: 1.2.0 - /got/11.8.6: + /got@11.8.6: resolution: {integrity: sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g==} engines: {node: '>=10.19.0'} dependencies: @@ -10864,7 +11176,7 @@ packages: dev: true optional: true - /got/9.6.0: + /got@9.6.0: resolution: {integrity: sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==} engines: {node: '>=8.6'} dependencies: @@ -10884,10 +11196,14 @@ packages: dev: true optional: true - /graceful-fs/4.2.10: + /graceful-fs@4.2.10: resolution: {integrity: sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==} - /gray-matter/4.0.3: + /grapheme-splitter@1.0.4: + resolution: {integrity: sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==} + dev: true + + /gray-matter@4.0.3: resolution: {integrity: sha512-5v6yZd4JK3eMI3FqqCouswVqwugaA9r4dNZB1wwcmrD02QkV5H0y7XBQW8QwQqEaZY1pM9aqORSORhJRdNK44Q==} engines: {node: '>=6.0'} dependencies: @@ -10897,12 +11213,12 @@ packages: strip-bom-string: 1.0.0 dev: false - /growl/1.10.5: + /growl@1.10.5: resolution: {integrity: sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==} engines: {node: '>=4.x'} dev: true - /handlebars/4.7.7: + /handlebars@4.7.7: resolution: {integrity: sha512-aAcXm5OAfE/8IXkcZvCepKU3VzW1/39Fb5ZuqMtgI/hT8X2YgoMvBY5dLhq/cpOvw7Lk1nK/UF71aLG/ZnVYRA==} engines: {node: '>=0.4.7'} hasBin: true @@ -10915,12 +11231,12 @@ packages: uglify-js: 3.17.4 dev: true - /har-schema/2.0.0: + /har-schema@2.0.0: resolution: {integrity: sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q==} engines: {node: '>=4'} dev: true - /har-validator/5.1.5: + /har-validator@5.1.5: resolution: {integrity: sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==} engines: {node: '>=6'} deprecated: this library is no longer supported @@ -10929,12 +11245,12 @@ packages: har-schema: 2.0.0 dev: true - /hard-rejection/2.1.0: + /hard-rejection@2.1.0: resolution: {integrity: sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==} engines: {node: '>=6'} dev: true - /hardhat-abi-exporter/2.10.1_hardhat@2.13.0: + /hardhat-abi-exporter@2.10.1(hardhat@2.13.0): resolution: {integrity: sha512-X8GRxUTtebMAd2k4fcPyVnCdPa6dYK4lBsrwzKP5yiSq4i+WadWPIumaLfce53TUf/o2TnLpLOduyO1ylE2NHQ==} engines: {node: '>=14.14.0'} peerDependencies: @@ -10942,32 +11258,32 @@ packages: dependencies: '@ethersproject/abi': 5.7.0 delete-empty: 3.0.0 - hardhat: 2.13.0_6qtx7vkbdhwvdm4crzlegk4mvi + hardhat: 2.13.0(ts-node@10.9.1)(typescript@4.9.5) dev: true - /hardhat-contract-sizer/2.8.0_hardhat@2.13.0: + /hardhat-contract-sizer@2.8.0(hardhat@2.13.0): resolution: {integrity: sha512-jXt2Si3uIDx5z99J+gvKa0yvIw156pE4dpH9X/PvTQv652BUd+qGj7WT93PXnHXGh5qhQLkjDYeZMYNOThfjFg==} peerDependencies: hardhat: ^2.0.0 dependencies: chalk: 4.1.2 cli-table3: 0.6.3 - hardhat: 2.13.0_6qtx7vkbdhwvdm4crzlegk4mvi + hardhat: 2.13.0(ts-node@10.9.1)(typescript@4.9.5) strip-ansi: 6.0.1 dev: true - /hardhat-docgen/1.3.0_hardhat@2.13.0: + /hardhat-docgen@1.3.0(hardhat@2.13.0)(lodash@4.17.21): resolution: {integrity: sha512-paaiOHjJFLCLz2/qM1TQ7ZEG+Vy+LBvJL+SW4A64ZhBnVnyoZ/zv9DvEuawaWhqP5P7AOM6r22reVz4ecWgW7A==} engines: {node: '>=14.14.0'} peerDependencies: hardhat: ^2.0.0 dependencies: - css-loader: 6.7.3_webpack@5.75.0 - hardhat: 2.13.0_6qtx7vkbdhwvdm4crzlegk4mvi - html-webpack-plugin: 5.5.0_webpack@5.75.0 + css-loader: 6.7.3(webpack@5.75.0) + hardhat: 2.13.0(ts-node@10.9.1)(typescript@4.9.5) + html-webpack-plugin: 5.5.0(webpack@5.75.0) vue: 2.7.14 - vue-loader: 15.10.1_y5o36p7qrshhm4v7l6yk7rwfsu - vue-router: 3.6.5_vue@2.7.14 + vue-loader: 15.10.1(css-loader@6.7.3)(lodash@4.17.21)(vue-template-compiler@2.7.14)(webpack@5.75.0) + vue-router: 3.6.5(vue@2.7.14) vue-template-compiler: 2.7.14 webpack: 5.75.0 transitivePeerDependencies: @@ -11032,20 +11348,20 @@ packages: - whiskers dev: true - /hardhat-gas-reporter/1.0.9_hardhat@2.13.0: + /hardhat-gas-reporter@1.0.9(hardhat@2.13.0): resolution: {integrity: sha512-INN26G3EW43adGKBNzYWOlI3+rlLnasXTwW79YNnUhXPDa+yHESgt639dJEs37gCjhkbNKcRRJnomXEuMFBXJg==} peerDependencies: hardhat: ^2.0.2 dependencies: array-uniq: 1.0.3 eth-gas-reporter: 0.2.25 - hardhat: 2.13.0_6qtx7vkbdhwvdm4crzlegk4mvi + hardhat: 2.13.0(ts-node@10.9.1)(typescript@4.9.5) sha1: 1.1.1 transitivePeerDependencies: - '@codechecks/client' dev: true - /hardhat/2.13.0_6qtx7vkbdhwvdm4crzlegk4mvi: + /hardhat@2.13.0(ts-node@10.9.1)(typescript@4.9.5): resolution: {integrity: sha512-ZlzBOLML1QGlm6JWyVAG8lVTEAoOaVm1in/RU2zoGAnYEoD1Rp4T+ZMvrLNhHaaeS9hfjJ1gJUBfiDr4cx+htQ==} engines: {node: '>=14.0.0'} hasBin: true @@ -11081,7 +11397,7 @@ packages: chalk: 2.4.2 chokidar: 3.5.3 ci-info: 2.0.0 - debug: 4.3.4 + debug: 4.3.4(supports-color@8.1.1) enquirer: 2.3.6 env-paths: 2.2.1 ethereum-cryptography: 1.2.0 @@ -11101,10 +11417,10 @@ packages: raw-body: 2.5.2 resolve: 1.17.0 semver: 6.3.0 - solc: 0.7.3_debug@4.3.4 + solc: 0.7.3(debug@4.3.4) source-map-support: 0.5.21 stacktrace-parser: 0.1.10 - ts-node: 10.9.1_prfxyxghnskheluimpb6dvby4q + ts-node: 10.9.1(@types/node@12.20.55)(typescript@4.9.5) tsort: 0.0.1 typescript: 4.9.5 undici: 5.20.0 @@ -11116,63 +11432,61 @@ packages: - utf-8-validate dev: true - /has-ansi/2.0.0: + /has-ansi@2.0.0: resolution: {integrity: sha512-C8vBJ8DwUCx19vhm7urhTuUsr4/IyP6l4VzNQDv+ryHQObW3TTTp9yB68WpYgRe2bbaGuZ/se74IqFeVnMnLZg==} engines: {node: '>=0.10.0'} dependencies: ansi-regex: 2.1.1 dev: true - /has-bigints/1.0.2: + /has-bigints@1.0.2: resolution: {integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==} dev: true - /has-flag/1.0.0: + /has-flag@1.0.0: resolution: {integrity: sha512-DyYHfIYwAJmjAjSSPKANxI8bFY9YtFrgkAfinBojQ8YJTOuOuav64tMUJv584SES4xl74PmuaevIyaLESHdTAA==} engines: {node: '>=0.10.0'} dev: true - /has-flag/2.0.0: + /has-flag@2.0.0: resolution: {integrity: sha512-P+1n3MnwjR/Epg9BBo1KT8qbye2g2Ou4sFumihwt6I4tsUX7jnLcX4BTOSKg/B1ZrIYMN9FcEnG4x5a7NB8Eng==} engines: {node: '>=0.10.0'} dev: false - /has-flag/3.0.0: + /has-flag@3.0.0: resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} engines: {node: '>=4'} - dev: true - /has-flag/4.0.0: + /has-flag@4.0.0: resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} engines: {node: '>=8'} - dev: true - /has-property-descriptors/1.0.0: + /has-property-descriptors@1.0.0: resolution: {integrity: sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==} dependencies: get-intrinsic: 1.2.0 dev: true - /has-proto/1.0.1: + /has-proto@1.0.1: resolution: {integrity: sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==} engines: {node: '>= 0.4'} dev: true - /has-symbols/1.0.3: + /has-symbols@1.0.3: resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} engines: {node: '>= 0.4'} - /has-tostringtag/1.0.0: + /has-tostringtag@1.0.0: resolution: {integrity: sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==} engines: {node: '>= 0.4'} dependencies: has-symbols: 1.0.3 - /has-unicode/2.0.1: + /has-unicode@2.0.1: resolution: {integrity: sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==} dev: true - /has-value/0.3.1: + /has-value@0.3.1: resolution: {integrity: sha512-gpG936j8/MzaeID5Yif+577c17TxaDmhuyVgSwtnL/q8UUTySg8Mecb+8Cf1otgLoD7DDH75axp86ER7LFsf3Q==} engines: {node: '>=0.10.0'} dependencies: @@ -11181,7 +11495,7 @@ packages: isobject: 2.1.0 dev: true - /has-value/1.0.0: + /has-value@1.0.0: resolution: {integrity: sha512-IBXk4GTsLYdQ7Rvt+GRBrFSVEkmuOUy4re0Xjd9kJSUQpnTrWR4/y9RpfexN9vkAPMFuQoeWKwqzPozRTlasGw==} engines: {node: '>=0.10.0'} dependencies: @@ -11190,12 +11504,12 @@ packages: isobject: 3.0.1 dev: true - /has-values/0.1.4: + /has-values@0.1.4: resolution: {integrity: sha512-J8S0cEdWuQbqD9//tlZxiMuMNmxB8PlEwvYwuxsTmR1G5RXUePEX/SJn7aD0GMLieuZYSwNH0cQuJGwnYunXRQ==} engines: {node: '>=0.10.0'} dev: true - /has-values/1.0.0: + /has-values@1.0.0: resolution: {integrity: sha512-ODYZC64uqzmtfGMEAX/FvZiRyWLpAC3vYnNunURUnkGVTS+mI0smVsWaPydRBsE3g+ok7h960jChO8mFcWlHaQ==} engines: {node: '>=0.10.0'} dependencies: @@ -11203,13 +11517,13 @@ packages: kind-of: 4.0.0 dev: true - /has/1.0.3: + /has@1.0.3: resolution: {integrity: sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==} engines: {node: '>= 0.4.0'} dependencies: function-bind: 1.1.1 - /hash-base/3.1.0: + /hash-base@3.1.0: resolution: {integrity: sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==} engines: {node: '>=4'} dependencies: @@ -11217,7 +11531,7 @@ packages: readable-stream: 3.6.2 safe-buffer: 5.2.1 - /hash-obj/4.0.0: + /hash-obj@4.0.0: resolution: {integrity: sha512-FwO1BUVWkyHasWDW4S8o0ssQXjvyghLV2rfVhnN36b2bbcj45eGiuzdn9XOvOpjV3TKQD7Gm2BWNXdE9V4KKYg==} engines: {node: '>=12'} dependencies: @@ -11226,24 +11540,24 @@ packages: type-fest: 1.4.0 dev: false - /hash-sum/1.0.2: + /hash-sum@1.0.2: resolution: {integrity: sha512-fUs4B4L+mlt8/XAtSOGMUO1TXmAelItBPtJG7CyHJfYTdDjwisntGO2JQz7oUsatOY9o68+57eziUVNw/mRHmA==} dev: true - /hash.js/1.1.3: + /hash.js@1.1.3: resolution: {integrity: sha512-/UETyP0W22QILqS+6HowevwhEFJ3MBJnwTf75Qob9Wz9t0DPuisL8kW8YZMK62dHAKE1c1p+gY1TtOLY+USEHA==} dependencies: inherits: 2.0.4 minimalistic-assert: 1.0.1 dev: true - /hash.js/1.1.7: + /hash.js@1.1.7: resolution: {integrity: sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==} dependencies: inherits: 2.0.4 minimalistic-assert: 1.0.1 - /hast-util-from-parse5/7.1.2: + /hast-util-from-parse5@7.1.2: resolution: {integrity: sha512-Nz7FfPBuljzsN3tCQ4kCBKqdNhQE2l0Tn+X1ubgKBPRoiDIu1mL08Cfw4k7q71+Duyaw7DXDN+VTAp4Vh3oCOw==} dependencies: '@types/hast': 2.3.4 @@ -11255,20 +11569,20 @@ packages: web-namespaces: 2.0.1 dev: false - /hast-util-is-element/2.1.3: + /hast-util-is-element@2.1.3: resolution: {integrity: sha512-O1bKah6mhgEq2WtVMk+Ta5K7pPMqsBBlmzysLdcwKVrqzZQ0CHqUPiIVspNhAG1rvxpvJjtGee17XfauZYKqVA==} dependencies: '@types/hast': 2.3.4 '@types/unist': 2.0.6 dev: false - /hast-util-parse-selector/3.1.1: + /hast-util-parse-selector@3.1.1: resolution: {integrity: sha512-jdlwBjEexy1oGz0aJ2f4GKMaVKkA9jwjr4MjAAI22E5fM/TXVZHuS5OpONtdeIkRKqAaryQ2E9xNQxijoThSZA==} dependencies: '@types/hast': 2.3.4 dev: false - /hast-util-to-estree/2.3.2: + /hast-util-to-estree@2.3.2: resolution: {integrity: sha512-YYDwATNdnvZi3Qi84iatPIl1lWpXba1MeNrNbDfJfVzEBZL8uUmtR7mt7bxKBC8kuAuvb0bkojXYZzsNHyHCLg==} dependencies: '@types/estree': 1.0.0 @@ -11290,7 +11604,7 @@ packages: - supports-color dev: false - /hast-util-to-text/3.1.2: + /hast-util-to-text@3.1.2: resolution: {integrity: sha512-tcllLfp23dJJ+ju5wCCZHVpzsQQ43+moJbqVX3jNWPB7z/KFC4FyZD6R7y94cHL6MQ33YtMZL8Z0aIXXI4XFTw==} dependencies: '@types/hast': 2.3.4 @@ -11299,11 +11613,11 @@ packages: unist-util-find-after: 4.0.1 dev: false - /hast-util-whitespace/2.0.1: + /hast-util-whitespace@2.0.1: resolution: {integrity: sha512-nAxA0v8+vXSBDt3AnRUNjyRIQ0rD+ntpbAp4LnPkumc5M9yUbSMa4XDU9Q6etY4f1Wp4bNgvc1yjiZtsTTrSng==} dev: false - /hastscript/7.2.0: + /hastscript@7.2.0: resolution: {integrity: sha512-TtYPq24IldU8iKoJQqvZOuhi5CyCQRAbvDOX0x1eW6rsHSxa/1i2CCiptNTotGHJ3VoHRGmqiv6/D3q113ikkw==} dependencies: '@types/hast': 2.3.4 @@ -11313,27 +11627,27 @@ packages: space-separated-tokens: 2.0.2 dev: false - /he/1.2.0: + /he@1.2.0: resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} hasBin: true dev: true - /heap/0.2.6: + /heap@0.2.6: resolution: {integrity: sha512-MzzWcnfB1e4EG2vHi3dXHoBupmuXNZzx6pY6HldVS55JKKBoq3xOyzfSaZRkJp37HIhEYC78knabHff3zc4dQQ==} dev: true - /heap/0.2.7: + /heap@0.2.7: resolution: {integrity: sha512-2bsegYkkHO+h/9MGbn6KWcE45cHZgPANo5LXF7EvWdT0yT2EguSVO1nDgU5c8+ZOPwp2vMNa7YFsJhVcDR9Sdg==} dev: true - /hmac-drbg/1.0.1: + /hmac-drbg@1.0.1: resolution: {integrity: sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==} dependencies: hash.js: 1.1.7 minimalistic-assert: 1.0.1 minimalistic-crypto-utils: 1.0.1 - /home-or-tmp/2.0.0: + /home-or-tmp@2.0.0: resolution: {integrity: sha512-ycURW7oUxE2sNiPVw1HVEFsW+ecOpJ5zaj7eC0RlwhibhRBod20muUN8qu/gzx956YrLolVvs1MTXwKgC2rVEg==} engines: {node: '>=0.10.0'} dependencies: @@ -11341,29 +11655,29 @@ packages: os-tmpdir: 1.0.2 dev: true - /hosted-git-info/2.8.9: + /hosted-git-info@2.8.9: resolution: {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==} dev: true - /hosted-git-info/4.1.0: + /hosted-git-info@4.1.0: resolution: {integrity: sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==} engines: {node: '>=10'} dependencies: lru-cache: 6.0.0 dev: true - /html-encoding-sniffer/2.0.1: + /html-encoding-sniffer@2.0.1: resolution: {integrity: sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ==} engines: {node: '>=10'} dependencies: whatwg-encoding: 1.0.5 dev: true - /html-escaper/2.0.2: + /html-escaper@2.0.2: resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} dev: true - /html-minifier-terser/6.1.0: + /html-minifier-terser@6.1.0: resolution: {integrity: sha512-YXxSlJBZTP7RS3tWnQw74ooKa6L9b9i9QYXY21eUEvhZ3u9XLfv6OnFsQq6RxkhHygsaUMvYsZRV5rU/OVNZxw==} engines: {node: '>=12'} hasBin: true @@ -11377,7 +11691,7 @@ packages: terser: 5.16.5 dev: true - /html-webpack-plugin/5.5.0_webpack@5.75.0: + /html-webpack-plugin@5.5.0(webpack@5.75.0): resolution: {integrity: sha512-sy88PC2cRTVxvETRgUHFrL4No3UxvcH8G1NepGhqaTT+GXN2kTamqasot0inS5hXeg1cMbFDt27zzo9p35lZVw==} engines: {node: '>=10.13.0'} peerDependencies: @@ -11391,7 +11705,7 @@ packages: webpack: 5.75.0 dev: true - /htmlparser2/6.1.0: + /htmlparser2@6.1.0: resolution: {integrity: sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==} dependencies: domelementtype: 2.3.0 @@ -11400,7 +11714,7 @@ packages: entities: 2.2.0 dev: true - /http-basic/8.1.3: + /http-basic@8.1.3: resolution: {integrity: sha512-/EcDMwJZh3mABI2NhGfHOGOeOZITqfkEO4p/xK+l3NpyncIHUQBoMvCSF/b5GqvKtySC2srL/GGG3+EtlqlmCw==} engines: {node: '>=6.0.0'} dependencies: @@ -11410,16 +11724,16 @@ packages: parse-cache-control: 1.0.1 dev: true - /http-cache-semantics/4.1.0: + /http-cache-semantics@4.1.0: resolution: {integrity: sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==} dev: true - /http-cache-semantics/4.1.1: + /http-cache-semantics@4.1.1: resolution: {integrity: sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==} dev: true optional: true - /http-errors/2.0.0: + /http-errors@2.0.0: resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==} engines: {node: '>= 0.8'} dependencies: @@ -11430,29 +11744,29 @@ packages: toidentifier: 1.0.1 dev: true - /http-https/1.0.0: + /http-https@1.0.0: resolution: {integrity: sha512-o0PWwVCSp3O0wS6FvNr6xfBCHgt0m1tvPLFOCc2iFDKTRAXhB7m8klDf7ErowFH8POa6dVdGatKU5I1YYwzUyg==} dev: true optional: true - /http-proxy-agent/4.0.1: + /http-proxy-agent@4.0.1: resolution: {integrity: sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==} engines: {node: '>= 6'} dependencies: '@tootallnate/once': 1.1.2 agent-base: 6.0.2 - debug: 4.3.4 + debug: 4.3.4(supports-color@8.1.1) transitivePeerDependencies: - supports-color dev: true - /http-response-object/3.0.2: + /http-response-object@3.0.2: resolution: {integrity: sha512-bqX0XTF6fnXSQcEJ2Iuyr75yVakyjIDCqroJQ/aHfSdlM743Cwqoi2nDYMzLGWUcuTWGWy8AAvOKXTfiv6q9RA==} dependencies: '@types/node': 10.17.60 dev: true - /http-signature/1.2.0: + /http-signature@1.2.0: resolution: {integrity: sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ==} engines: {node: '>=0.8', npm: '>=1.3.7'} dependencies: @@ -11461,7 +11775,7 @@ packages: sshpk: 1.17.0 dev: true - /http2-wrapper/1.0.3: + /http2-wrapper@1.0.3: resolution: {integrity: sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==} engines: {node: '>=10.19.0'} dependencies: @@ -11470,47 +11784,47 @@ packages: dev: true optional: true - /https-proxy-agent/5.0.1: + /https-proxy-agent@5.0.1: resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==} engines: {node: '>= 6'} dependencies: agent-base: 6.0.2 - debug: 4.3.4 + debug: 4.3.4(supports-color@8.1.1) transitivePeerDependencies: - supports-color dev: true - /human-signals/2.1.0: + /human-signals@2.1.0: resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} engines: {node: '>=10.17.0'} dev: true - /humanize-ms/1.2.1: + /humanize-ms@1.2.1: resolution: {integrity: sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==} dependencies: ms: 2.1.3 - /husky/8.0.3: + /husky@8.0.3: resolution: {integrity: sha512-+dQSyqPh4x1hlO1swXBiNb2HzTDN1I2IGLQx1GrBuiqFJfoMrnZWwVmatvSiO+Iz8fBUnf+lekwNo4c2LlXItg==} engines: {node: '>=14'} hasBin: true dev: true - /iconv-lite/0.4.24: + /iconv-lite@0.4.24: resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} engines: {node: '>=0.10.0'} dependencies: safer-buffer: 2.1.2 dev: true - /iconv-lite/0.6.3: + /iconv-lite@0.6.3: resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} engines: {node: '>=0.10.0'} dependencies: safer-buffer: 2.1.2 dev: true - /icss-utils/5.1.0_postcss@8.4.21: + /icss-utils@5.1.0(postcss@8.4.21): resolution: {integrity: sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==} engines: {node: ^10 || ^12 || >= 14} peerDependencies: @@ -11519,59 +11833,59 @@ packages: postcss: 8.4.21 dev: true - /idb-wrapper/1.7.2: + /idb-wrapper@1.7.2: resolution: {integrity: sha512-zfNREywMuf0NzDo9mVsL0yegjsirJxHpKHvWcyRozIqQy89g0a3U+oBPOCN4cc0oCiOuYgZHimzaW/R46G1Mpg==} dev: true - /identicon.js/2.3.3: + /identicon.js@2.3.3: resolution: {integrity: sha512-/qgOkXKZ7YbeCYbawJ9uQQ3XJ3uBg9VDpvHjabCAPp6aRMhjLaFAxG90+1TxzrhKaj6AYpVGrx6UXQfQA41UEA==} dev: false - /idna-uts46-hx/2.3.1: + /idna-uts46-hx@2.3.1: resolution: {integrity: sha512-PWoF9Keq6laYdIRwwCdhTPl60xRqAloYNMQLiyUnG42VjT53oW07BXIRM+NK7eQjzXjAk2gUvX9caRxlnF9TAA==} engines: {node: '>=4.0.0'} dependencies: punycode: 2.1.0 dev: true - /ieee754/1.2.1: + /ieee754@1.2.1: resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} - /ignore/4.0.6: + /ignore@4.0.6: resolution: {integrity: sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==} engines: {node: '>= 4'} dev: true - /ignore/5.2.0: + /ignore@5.2.0: resolution: {integrity: sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==} engines: {node: '>= 4'} dev: true - /ignore/5.2.4: + /ignore@5.2.4: resolution: {integrity: sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==} engines: {node: '>= 4'} dev: true - /immediate/3.2.3: + /immediate@3.2.3: resolution: {integrity: sha512-RrGCXRm/fRVqMIhqXrGEX9rRADavPiDFSoMb/k64i9XMk8uH4r/Omi5Ctierj6XzNecwDbO4WuFbDD1zmpl3Tg==} dev: true - /immediate/3.3.0: + /immediate@3.3.0: resolution: {integrity: sha512-HR7EVodfFUdQCTIeySw+WDRFJlPcLOJbXfwwZ7Oom6tjsvZ3bOkCDJHehQC3nxJrv7+f9XecwazynjU8e4Vw3Q==} dev: true - /immutable/4.2.4: + /immutable@4.2.4: resolution: {integrity: sha512-WDxL3Hheb1JkRN3sQkyujNlL/xRjAo3rJtaU5xeufUauG66JdMr32bLj4gF+vWl84DIA3Zxw7tiAjneYzRRw+w==} dev: true - /import-cwd/2.1.0: + /import-cwd@2.1.0: resolution: {integrity: sha512-Ew5AZzJQFqrOV5BTW3EIoHAnoie1LojZLXKcCQ/yTRyVZosBhK1x1ViYjHGf5pAFOq8ZyChZp6m/fSN7pJyZtg==} engines: {node: '>=4'} dependencies: import-from: 2.1.0 dev: true - /import-fresh/2.0.0: + /import-fresh@2.0.0: resolution: {integrity: sha512-eZ5H8rcgYazHbKC3PG4ClHNykCSxtAhxSSEM+2mb+7evD2CKF5V7c0dNum7AdpDh0ZdICwZY9sRSn8f+KH96sg==} engines: {node: '>=4'} dependencies: @@ -11579,7 +11893,7 @@ packages: resolve-from: 3.0.0 dev: true - /import-fresh/3.3.0: + /import-fresh@3.3.0: resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} engines: {node: '>=6'} dependencies: @@ -11587,14 +11901,14 @@ packages: resolve-from: 4.0.0 dev: true - /import-from/2.1.0: + /import-from@2.1.0: resolution: {integrity: sha512-0vdnLL2wSGnhlRmzHJAg5JHjt1l2vYhzJ7tNLGbeVg0fse56tpGaH0uzH+r9Slej+BSXXEHvBKDEnVSLLE9/+w==} engines: {node: '>=4'} dependencies: resolve-from: 3.0.0 dev: true - /import-local/3.1.0: + /import-local@3.1.0: resolution: {integrity: sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==} engines: {node: '>=8'} hasBin: true @@ -11603,42 +11917,42 @@ packages: resolve-cwd: 3.0.0 dev: true - /imurmurhash/0.1.4: + /imurmurhash@0.1.4: resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} engines: {node: '>=0.8.19'} dev: true - /indent-string/4.0.0: + /indent-string@4.0.0: resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==} engines: {node: '>=8'} dev: true - /indexof/0.0.1: + /indexof@0.0.1: resolution: {integrity: sha512-i0G7hLJ1z0DE8dsqJa2rycj9dBmNKgXBvotXtZYXakU9oivfB9Uj2ZBC27qqef2U58/ZLwalxa1X/RDCdkHtVg==} dev: true - /infer-owner/1.0.4: + /infer-owner@1.0.4: resolution: {integrity: sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==} dev: true - /inflight/1.0.6: + /inflight@1.0.6: resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} dependencies: once: 1.4.0 wrappy: 1.0.2 dev: true - /inherits/2.0.4: + /inherits@2.0.4: resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} - /ini/1.3.8: + /ini@1.3.8: resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} - /inline-style-parser/0.1.1: + /inline-style-parser@0.1.1: resolution: {integrity: sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q==} dev: false - /internal-slot/1.0.5: + /internal-slot@1.0.5: resolution: {integrity: sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==} engines: {node: '>= 0.4'} dependencies: @@ -11647,16 +11961,16 @@ packages: side-channel: 1.0.4 dev: true - /interpret/1.4.0: + /interpret@1.4.0: resolution: {integrity: sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==} engines: {node: '>= 0.10'} dev: true - /intersection-observer/0.12.2: + /intersection-observer@0.12.2: resolution: {integrity: sha512-7m1vEcPCxXYI8HqnL8CKI6siDyD+eIWSwgB3DZA+ZTogxk9I4CDnj4wilt9x/+/QbHI4YG5YZNmC6458/e9Ktg==} dev: false - /intl-messageformat/9.13.0: + /intl-messageformat@9.13.0: resolution: {integrity: sha512-7sGC7QnSQGa5LZP7bXLDhVDtQOeKGeBFGHF2Y8LVBwYZoQZCgWeKoPGTa5GMG8g/TzDgeXuYJQis7Ggiw2xTOw==} dependencies: '@formatjs/ecma402-abstract': 1.11.4 @@ -11665,66 +11979,66 @@ packages: tslib: 2.5.0 dev: false - /invariant/2.2.4: + /invariant@2.2.4: resolution: {integrity: sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==} dependencies: loose-envify: 1.4.0 dev: true - /invert-kv/1.0.0: + /invert-kv@1.0.0: resolution: {integrity: sha512-xgs2NH9AE66ucSq4cNG1nhSFghr5l6tdL15Pk+jl46bmmBapgoaY/AacXyaDznAqmGL99TiLSQgO/XazFSKYeQ==} engines: {node: '>=0.10.0'} dev: true - /io-ts/1.10.4: + /io-ts@1.10.4: resolution: {integrity: sha512-b23PteSnYXSONJ6JQXRAlvJhuw8KOtkqa87W4wDtvMrud/DTJd5X+NpOOI+O/zZwVq6v0VLAaJ+1EDViKEuN9g==} dependencies: fp-ts: 1.19.3 dev: true - /ip/2.0.0: + /ip@2.0.0: resolution: {integrity: sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ==} dev: true - /ipaddr.js/1.9.1: + /ipaddr.js@1.9.1: resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} engines: {node: '>= 0.10'} dev: true optional: true - /is-accessor-descriptor/0.1.6: + /is-accessor-descriptor@0.1.6: resolution: {integrity: sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A==} engines: {node: '>=0.10.0'} dependencies: kind-of: 3.2.2 dev: true - /is-accessor-descriptor/1.0.0: + /is-accessor-descriptor@1.0.0: resolution: {integrity: sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==} engines: {node: '>=0.10.0'} dependencies: kind-of: 6.0.3 dev: true - /is-alphabetical/2.0.1: + /is-alphabetical@2.0.1: resolution: {integrity: sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==} dev: false - /is-alphanumerical/2.0.1: + /is-alphanumerical@2.0.1: resolution: {integrity: sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==} dependencies: is-alphabetical: 2.0.1 is-decimal: 2.0.1 dev: false - /is-arguments/1.1.1: + /is-arguments@1.1.1: resolution: {integrity: sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==} engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.2 has-tostringtag: 1.0.0 - /is-array-buffer/3.0.2: + /is-array-buffer@3.0.2: resolution: {integrity: sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==} dependencies: call-bind: 1.0.2 @@ -11732,28 +12046,28 @@ packages: is-typed-array: 1.1.10 dev: true - /is-arrayish/0.2.1: + /is-arrayish@0.2.1: resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} dev: true - /is-arrayish/0.3.2: + /is-arrayish@0.3.2: resolution: {integrity: sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==} dev: false - /is-bigint/1.0.4: + /is-bigint@1.0.4: resolution: {integrity: sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==} dependencies: has-bigints: 1.0.2 dev: true - /is-binary-path/2.1.0: + /is-binary-path@2.1.0: resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} engines: {node: '>=8'} dependencies: binary-extensions: 2.2.0 dev: true - /is-boolean-object/1.1.2: + /is-boolean-object@1.1.2: resolution: {integrity: sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==} engines: {node: '>= 0.4'} dependencies: @@ -11761,56 +12075,56 @@ packages: has-tostringtag: 1.0.0 dev: true - /is-buffer/1.1.6: + /is-buffer@1.1.6: resolution: {integrity: sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==} dev: true - /is-buffer/2.0.5: + /is-buffer@2.0.5: resolution: {integrity: sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==} engines: {node: '>=4'} - /is-callable/1.2.7: + /is-callable@1.2.7: resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} engines: {node: '>= 0.4'} - /is-ci/2.0.0: + /is-ci@2.0.0: resolution: {integrity: sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==} hasBin: true dependencies: ci-info: 2.0.0 dev: true - /is-core-module/2.11.0: + /is-core-module@2.11.0: resolution: {integrity: sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==} dependencies: has: 1.0.3 - /is-data-descriptor/0.1.4: + /is-data-descriptor@0.1.4: resolution: {integrity: sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg==} engines: {node: '>=0.10.0'} dependencies: kind-of: 3.2.2 dev: true - /is-data-descriptor/1.0.0: + /is-data-descriptor@1.0.0: resolution: {integrity: sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==} engines: {node: '>=0.10.0'} dependencies: kind-of: 6.0.3 dev: true - /is-date-object/1.0.5: + /is-date-object@1.0.5: resolution: {integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==} engines: {node: '>= 0.4'} dependencies: has-tostringtag: 1.0.0 dev: true - /is-decimal/2.0.1: + /is-decimal@2.0.1: resolution: {integrity: sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==} dev: false - /is-descriptor/0.1.6: + /is-descriptor@0.1.6: resolution: {integrity: sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==} engines: {node: '>=0.10.0'} dependencies: @@ -11819,7 +12133,7 @@ packages: kind-of: 5.1.0 dev: true - /is-descriptor/1.0.2: + /is-descriptor@1.0.2: resolution: {integrity: sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==} engines: {node: '>=0.10.0'} dependencies: @@ -11828,173 +12142,178 @@ packages: kind-of: 6.0.3 dev: true - /is-directory/0.3.1: + /is-directory@0.3.1: resolution: {integrity: sha512-yVChGzahRFvbkscn2MlwGismPO12i9+znNruC5gVEntG3qu0xQMzsGg/JFbrsqDOHtHFPci+V5aP5T9I+yeKqw==} engines: {node: '>=0.10.0'} dev: true - /is-docker/2.2.1: + /is-docker@2.2.1: resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==} engines: {node: '>=8'} hasBin: true dev: true - /is-extendable/0.1.1: + /is-extendable@0.1.1: resolution: {integrity: sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==} engines: {node: '>=0.10.0'} - /is-extendable/1.0.1: + /is-extendable@1.0.1: resolution: {integrity: sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==} engines: {node: '>=0.10.0'} dependencies: is-plain-object: 2.0.4 dev: true - /is-extglob/2.1.1: + /is-extglob@2.1.1: resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} engines: {node: '>=0.10.0'} dev: true - /is-finite/1.1.0: + /is-finite@1.1.0: resolution: {integrity: sha512-cdyMtqX/BOqqNBBiKlIVkytNHm49MtMlYyn1zxzvJKWmFMlGzm+ry5BBfYyeY9YmNKbRSo/o7OX9w9ale0wg3w==} engines: {node: '>=0.10.0'} dev: true - /is-fn/1.0.0: + /is-fn@1.0.0: resolution: {integrity: sha512-XoFPJQmsAShb3jEQRfzf2rqXavq7fIqF/jOekp308JlThqrODnMpweVSGilKTCXELfLhltGP2AGgbQGVP8F1dg==} engines: {node: '>=0.10.0'} dev: true - /is-fullwidth-code-point/1.0.0: + /is-fullwidth-code-point@1.0.0: resolution: {integrity: sha512-1pqUqRjkhPJ9miNq9SwMfdvi6lBJcd6eFxvfaivQhaH3SgisfiuudvFntdKOmxuee/77l+FPjKrQjWvmPjWrRw==} engines: {node: '>=0.10.0'} dependencies: number-is-nan: 1.0.1 dev: true - /is-fullwidth-code-point/2.0.0: + /is-fullwidth-code-point@2.0.0: resolution: {integrity: sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==} engines: {node: '>=4'} - /is-fullwidth-code-point/3.0.0: + /is-fullwidth-code-point@3.0.0: resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} engines: {node: '>=8'} - /is-fullwidth-code-point/4.0.0: + /is-fullwidth-code-point@4.0.0: resolution: {integrity: sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==} engines: {node: '>=12'} dev: true - /is-function/1.0.2: + /is-function@1.0.2: resolution: {integrity: sha512-lw7DUp0aWXYg+CBCN+JKkcE0Q2RayZnSvnZBlwgxHBQhqt5pZNVy4Ri7H9GmmXkdu7LUthszM+Tor1u/2iBcpQ==} dev: true - /is-generator-fn/2.1.0: + /is-generator-fn@2.1.0: resolution: {integrity: sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==} engines: {node: '>=6'} dev: true - /is-generator-function/1.0.10: + /is-generator-function@1.0.10: resolution: {integrity: sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==} engines: {node: '>= 0.4'} dependencies: has-tostringtag: 1.0.0 dev: false - /is-glob/4.0.3: + /is-glob@4.0.3: resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} engines: {node: '>=0.10.0'} dependencies: is-extglob: 2.1.1 dev: true - /is-hex-prefixed/1.0.0: + /is-hex-prefixed@1.0.0: resolution: {integrity: sha512-WvtOiug1VFrE9v1Cydwm+FnXd3+w9GaeVUss5W4v/SLy3UW00vP+6iNF2SdnfiBoLy4bTqVdkftNGTUeOFVsbA==} engines: {node: '>=6.5.0', npm: '>=3'} - /is-hexadecimal/2.0.1: + /is-hexadecimal@2.0.1: resolution: {integrity: sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==} dev: false - /is-lambda/1.0.1: + /is-lambda@1.0.1: resolution: {integrity: sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ==} dev: true - /is-negative-zero/2.0.2: + /is-negative-zero@2.0.2: resolution: {integrity: sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==} engines: {node: '>= 0.4'} dev: true - /is-number-object/1.0.7: + /is-number-object@1.0.7: resolution: {integrity: sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==} engines: {node: '>= 0.4'} dependencies: has-tostringtag: 1.0.0 dev: true - /is-number/3.0.0: + /is-number@3.0.0: resolution: {integrity: sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg==} engines: {node: '>=0.10.0'} dependencies: kind-of: 3.2.2 dev: true - /is-number/7.0.0: + /is-number@7.0.0: resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} engines: {node: '>=0.12.0'} dev: true - /is-obj/3.0.0: + /is-obj@3.0.0: resolution: {integrity: sha512-IlsXEHOjtKhpN8r/tRFj2nDyTmHvcfNeu/nrRIcXE17ROeatXchkojffa1SpdqW4cr/Fj6QkEf/Gn4zf6KKvEQ==} engines: {node: '>=12'} dev: false - /is-object/0.1.2: + /is-object@0.1.2: resolution: {integrity: sha512-GkfZZlIZtpkFrqyAXPQSRBMsaHAw+CgoKe2HXAkjd/sfoI9+hS8PT4wg2rJxdQyUKr7N2vHJbg7/jQtE5l5vBQ==} dev: true - /is-plain-obj/1.1.0: + /is-path-inside@3.0.3: + resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} + engines: {node: '>=8'} + dev: true + + /is-plain-obj@1.1.0: resolution: {integrity: sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==} engines: {node: '>=0.10.0'} dev: true - /is-plain-obj/2.1.0: + /is-plain-obj@2.1.0: resolution: {integrity: sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==} engines: {node: '>=8'} dev: true - /is-plain-obj/3.0.0: + /is-plain-obj@3.0.0: resolution: {integrity: sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==} engines: {node: '>=10'} dev: false - /is-plain-obj/4.1.0: + /is-plain-obj@4.1.0: resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==} engines: {node: '>=12'} dev: false - /is-plain-object/2.0.4: + /is-plain-object@2.0.4: resolution: {integrity: sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==} engines: {node: '>=0.10.0'} dependencies: isobject: 3.0.1 dev: true - /is-potential-custom-element-name/1.0.1: + /is-potential-custom-element-name@1.0.1: resolution: {integrity: sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==} dev: true - /is-promise/2.2.2: + /is-promise@2.2.2: resolution: {integrity: sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==} dev: false - /is-reference/3.0.1: + /is-reference@3.0.1: resolution: {integrity: sha512-baJJdQLiYaJdvFbJqXrcGv3WU3QCzBlUcI5QhbesIm6/xPsvmO+2CDoi/GMOFBQEQm+PXkwOPrp9KK5ozZsp2w==} dependencies: '@types/estree': 1.0.0 dev: false - /is-regex/1.1.4: + /is-regex@1.1.4: resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==} engines: {node: '>= 0.4'} dependencies: @@ -12002,42 +12321,42 @@ packages: has-tostringtag: 1.0.0 dev: true - /is-shared-array-buffer/1.0.2: + /is-shared-array-buffer@1.0.2: resolution: {integrity: sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==} dependencies: call-bind: 1.0.2 dev: true - /is-ssh/1.4.0: + /is-ssh@1.4.0: resolution: {integrity: sha512-x7+VxdxOdlV3CYpjvRLBv5Lo9OJerlYanjwFrPR9fuGPjCiNiCzFgAWpiLAohSbsnH4ZAys3SBh+hq5rJosxUQ==} dependencies: protocols: 2.0.1 dev: false - /is-stream/1.1.0: + /is-stream@1.1.0: resolution: {integrity: sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==} engines: {node: '>=0.10.0'} - /is-stream/2.0.1: + /is-stream@2.0.1: resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} engines: {node: '>=8'} dev: true - /is-string/1.0.7: + /is-string@1.0.7: resolution: {integrity: sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==} engines: {node: '>= 0.4'} dependencies: has-tostringtag: 1.0.0 dev: true - /is-symbol/1.0.4: + /is-symbol@1.0.4: resolution: {integrity: sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==} engines: {node: '>= 0.4'} dependencies: has-symbols: 1.0.3 dev: true - /is-typed-array/1.1.10: + /is-typed-array@1.1.10: resolution: {integrity: sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A==} engines: {node: '>= 0.4'} dependencies: @@ -12047,76 +12366,76 @@ packages: gopd: 1.0.1 has-tostringtag: 1.0.0 - /is-typedarray/1.0.0: + /is-typedarray@1.0.0: resolution: {integrity: sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==} - /is-unicode-supported/0.1.0: + /is-unicode-supported@0.1.0: resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==} engines: {node: '>=10'} dev: true - /is-url/1.2.4: + /is-url@1.2.4: resolution: {integrity: sha512-ITvGim8FhRiYe4IQ5uHSkj7pVaPDrCTkNd3yq3cV7iZAcJdHTUMPMEHcqSOy9xZ9qFenQCvi+2wjH9a1nXqHww==} dev: true - /is-utf8/0.2.1: + /is-utf8@0.2.1: resolution: {integrity: sha512-rMYPYvCzsXywIsldgLaSoPlw5PfoB/ssr7hY4pLfcodrA5M/eArza1a9VmTiNIBNMjOGr1Ow9mTyU2o69U6U9Q==} dev: true - /is-weakref/1.0.2: + /is-weakref@1.0.2: resolution: {integrity: sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==} dependencies: call-bind: 1.0.2 dev: true - /is-windows/1.0.2: + /is-windows@1.0.2: resolution: {integrity: sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==} engines: {node: '>=0.10.0'} dev: true - /is-wsl/2.2.0: + /is-wsl@2.2.0: resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==} engines: {node: '>=8'} dependencies: is-docker: 2.2.1 dev: true - /is/0.2.7: + /is@0.2.7: resolution: {integrity: sha512-ajQCouIvkcSnl2iRdK70Jug9mohIHVX9uKpoWnl115ov0R5mzBvRrXxrnHbsA+8AdwCwc/sfw7HXmd4I5EJBdQ==} dev: true - /isarray/0.0.1: + /isarray@0.0.1: resolution: {integrity: sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==} dev: true - /isarray/1.0.0: + /isarray@1.0.0: resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} dev: true - /isarray/2.0.5: + /isarray@2.0.5: resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} dev: false - /isbuffer/0.0.0: + /isbuffer@0.0.0: resolution: {integrity: sha512-xU+NoHp+YtKQkaM2HsQchYn0sltxMxew0HavMfHbjnucBoTSGbw745tL+Z7QBANleWM1eEQMenEpi174mIeS4g==} dev: true - /isexe/2.0.0: + /isexe@2.0.0: resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} - /isobject/2.1.0: + /isobject@2.1.0: resolution: {integrity: sha512-+OUdGJlgjOBZDfxnDjYYG6zp487z0JGNQq3cYQYg5f5hKR+syHMsaztzGeml/4kGG55CSpKSpWTY+jYGgsHLgA==} engines: {node: '>=0.10.0'} dependencies: isarray: 1.0.0 dev: true - /isobject/3.0.1: + /isobject@3.0.1: resolution: {integrity: sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==} engines: {node: '>=0.10.0'} dev: true - /isomorphic-ws/4.0.1_ws@7.5.9: + /isomorphic-ws@4.0.1(ws@7.5.9): resolution: {integrity: sha512-BhBvN2MBpWTaSHdWRb/bwdZJ1WaehQ2L1KngkCkfLUGF0mAWAT1sQUQacEmQ0jXkFw/czDXPNQSL5u2/Krsz1w==} peerDependencies: ws: '*' @@ -12124,16 +12443,16 @@ packages: ws: 7.5.9 dev: false - /isstream/0.1.2: + /isstream@0.1.2: resolution: {integrity: sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==} dev: true - /istanbul-lib-coverage/3.2.0: + /istanbul-lib-coverage@3.2.0: resolution: {integrity: sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==} engines: {node: '>=8'} dev: true - /istanbul-lib-instrument/5.2.1: + /istanbul-lib-instrument@5.2.1: resolution: {integrity: sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==} engines: {node: '>=8'} dependencies: @@ -12146,7 +12465,7 @@ packages: - supports-color dev: true - /istanbul-lib-report/3.0.0: + /istanbul-lib-report@3.0.0: resolution: {integrity: sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==} engines: {node: '>=8'} dependencies: @@ -12155,18 +12474,18 @@ packages: supports-color: 7.2.0 dev: true - /istanbul-lib-source-maps/4.0.1: + /istanbul-lib-source-maps@4.0.1: resolution: {integrity: sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==} engines: {node: '>=10'} dependencies: - debug: 4.3.4 + debug: 4.3.4(supports-color@8.1.1) istanbul-lib-coverage: 3.2.0 source-map: 0.6.1 transitivePeerDependencies: - supports-color dev: true - /istanbul-reports/3.1.5: + /istanbul-reports@3.1.5: resolution: {integrity: sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w==} engines: {node: '>=8'} dependencies: @@ -12174,7 +12493,7 @@ packages: istanbul-lib-report: 3.0.0 dev: true - /jayson/3.7.0: + /jayson@3.7.0: resolution: {integrity: sha512-tfy39KJMrrXJ+mFcMpxwBvFDetS8LAID93+rycFglIQM4kl3uNR3W4lBLE/FFhsoUCEox5Dt2adVpDm/XtebbQ==} engines: {node: '>=8'} hasBin: true @@ -12187,7 +12506,7 @@ packages: delay: 5.0.0 es6-promisify: 5.0.0 eyes: 0.1.8 - isomorphic-ws: 4.0.1_ws@7.5.9 + isomorphic-ws: 4.0.1(ws@7.5.9) json-stringify-safe: 5.0.1 lodash: 4.17.21 uuid: 8.3.2 @@ -12197,7 +12516,7 @@ packages: - utf-8-validate dev: false - /jest-changed-files/27.5.1: + /jest-changed-files@27.5.1: resolution: {integrity: sha512-buBLMiByfWGCoMsLLzGUUSpAmIAGnbR2KJoMN10ziLhOLvP4e0SlypHnAel8iqQXTrcbmfEY9sSqae5sgUsTvw==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: @@ -12206,14 +12525,14 @@ packages: throat: 6.0.1 dev: true - /jest-circus/27.5.1: + /jest-circus@27.5.1: resolution: {integrity: sha512-D95R7x5UtlMA5iBYsOHFFbMD/GVA4R/Kdq15f7xYWUfWHBto9NYRsOvnSauTgdF+ogCpJ4tyKOXhUifxS65gdw==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: '@jest/environment': 27.5.1 '@jest/test-result': 27.5.1 '@jest/types': 27.5.1 - '@types/node': 18.14.2 + '@types/node': 18.15.1 chalk: 4.1.2 co: 4.6.0 dedent: 0.7.0 @@ -12233,7 +12552,7 @@ packages: - supports-color dev: true - /jest-cli/27.5.1: + /jest-cli@27.5.1: resolution: {integrity: sha512-Hc6HOOwYq4/74/c62dEE3r5elx8wjYqxY0r0G/nFrLDPMFRu6RA/u8qINOIkvhxG7mMQ5EJsOGfRpI8L6eFUVw==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} hasBin: true @@ -12263,7 +12582,7 @@ packages: - utf-8-validate dev: true - /jest-config/27.5.1: + /jest-config@27.5.1: resolution: {integrity: sha512-5sAsjm6tGdsVbW9ahcChPAFCk4IlkQUknH5AvKjuLTSlcO/wCZKyFdn7Rg0EkC+OGgWODEy2hDpWB1PgzH0JNA==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} peerDependencies: @@ -12275,7 +12594,7 @@ packages: '@babel/core': 7.20.2 '@jest/test-sequencer': 27.5.1 '@jest/types': 27.5.1 - babel-jest: 27.5.1_@babel+core@7.20.2 + babel-jest: 27.5.1(@babel/core@7.20.2) chalk: 4.1.2 ci-info: 3.6.2 deepmerge: 4.2.2 @@ -12303,7 +12622,7 @@ packages: - utf-8-validate dev: true - /jest-diff/27.5.1: + /jest-diff@27.5.1: resolution: {integrity: sha512-m0NvkX55LDt9T4mctTEgnZk3fmEg3NRYutvMPWM/0iPnkFj2wIeF45O1718cMSOFO1vINkqmxqD8vE37uTEbqw==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: @@ -12313,14 +12632,14 @@ packages: pretty-format: 27.5.1 dev: true - /jest-docblock/27.5.1: + /jest-docblock@27.5.1: resolution: {integrity: sha512-rl7hlABeTsRYxKiUfpHrQrG4e2obOiTQWfMEH3PxPjOtdsfLQO4ReWSZaQ7DETm4xu07rl4q/h4zcKXyU0/OzQ==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: detect-newline: 3.1.0 dev: true - /jest-each/27.5.1: + /jest-each@27.5.1: resolution: {integrity: sha512-1Ff6p+FbhT/bXQnEouYy00bkNSY7OUpfIcmdl8vZ31A1UUaurOLPA8a8BbJOF2RDUElwJhmeaV7LnagI+5UwNQ==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: @@ -12331,14 +12650,14 @@ packages: pretty-format: 27.5.1 dev: true - /jest-environment-jsdom/27.5.1: + /jest-environment-jsdom@27.5.1: resolution: {integrity: sha512-TFBvkTC1Hnnnrka/fUb56atfDtJ9VMZ94JkjTbggl1PEpwrYtUBKMezB3inLmWqQsXYLcMwNoDQwoBTAvFfsfw==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: '@jest/environment': 27.5.1 '@jest/fake-timers': 27.5.1 '@jest/types': 27.5.1 - '@types/node': 18.14.2 + '@types/node': 18.15.1 jest-mock: 27.5.1 jest-util: 27.5.1 jsdom: 16.7.0 @@ -12349,24 +12668,24 @@ packages: - utf-8-validate dev: true - /jest-environment-node/27.5.1: + /jest-environment-node@27.5.1: resolution: {integrity: sha512-Jt4ZUnxdOsTGwSRAfKEnE6BcwsSPNOijjwifq5sDFSA2kesnXTvNqKHYgM0hDq3549Uf/KzdXNYn4wMZJPlFLw==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: '@jest/environment': 27.5.1 '@jest/fake-timers': 27.5.1 '@jest/types': 27.5.1 - '@types/node': 18.14.2 + '@types/node': 18.15.1 jest-mock: 27.5.1 jest-util: 27.5.1 dev: true - /jest-get-type/27.5.1: + /jest-get-type@27.5.1: resolution: {integrity: sha512-2KY95ksYSaK7DMBWQn6dQz3kqAf3BB64y2udeG+hv4KfSOb9qwcYQstTJc1KCbsix+wLZWZYN8t7nwX3GOBLRw==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dev: true - /jest-haste-map/27.5.1: + /jest-haste-map@27.5.1: resolution: {integrity: sha512-7GgkZ4Fw4NFbMSDSpZwXeBiIbx+t/46nJ2QitkOjvwPYyZmqttu2TDSimMHP1EkPOi4xUZAN1doE5Vd25H4Jng==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: @@ -12386,7 +12705,7 @@ packages: fsevents: 2.3.2 dev: true - /jest-jasmine2/27.5.1: + /jest-jasmine2@27.5.1: resolution: {integrity: sha512-jtq7VVyG8SqAorDpApwiJJImd0V2wv1xzdheGHRGyuT7gZm6gG47QEskOlzsN1PG/6WNaCo5pmwMHDf3AkG2pQ==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: @@ -12394,7 +12713,7 @@ packages: '@jest/source-map': 27.5.1 '@jest/test-result': 27.5.1 '@jest/types': 27.5.1 - '@types/node': 18.14.2 + '@types/node': 18.15.1 chalk: 4.1.2 co: 4.6.0 expect: 27.5.1 @@ -12411,7 +12730,7 @@ packages: - supports-color dev: true - /jest-leak-detector/27.5.1: + /jest-leak-detector@27.5.1: resolution: {integrity: sha512-POXfWAMvfU6WMUXftV4HolnJfnPOGEu10fscNCA76KBpRRhcMN2c8d3iT2pxQS3HLbA+5X4sOUPzYO2NUyIlHQ==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: @@ -12419,7 +12738,7 @@ packages: pretty-format: 27.5.1 dev: true - /jest-matcher-utils/27.5.1: + /jest-matcher-utils@27.5.1: resolution: {integrity: sha512-z2uTx/T6LBaCoNWNFWwChLBKYxTMcGBRjAt+2SbP929/Fflb9aa5LGma654Rz8z9HLxsrUaYzxE9T/EFIL/PAw==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: @@ -12429,7 +12748,7 @@ packages: pretty-format: 27.5.1 dev: true - /jest-message-util/27.5.1: + /jest-message-util@27.5.1: resolution: {integrity: sha512-rMyFe1+jnyAAf+NHwTclDz0eAaLkVDdKVHHBFWsBWHnnh5YeJMNWWsv7AbFYXfK3oTqvL7VTWkhNLu1jX24D+g==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: @@ -12444,15 +12763,15 @@ packages: stack-utils: 2.0.6 dev: true - /jest-mock/27.5.1: + /jest-mock@27.5.1: resolution: {integrity: sha512-K4jKbY1d4ENhbrG2zuPWaQBvDly+iZ2yAW+T1fATN78hc0sInwn7wZB8XtlNnvHug5RMwV897Xm4LqmPM4e2Og==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: '@jest/types': 27.5.1 - '@types/node': 18.14.2 + '@types/node': 18.15.1 dev: true - /jest-pnp-resolver/1.2.3_jest-resolve@27.5.1: + /jest-pnp-resolver@1.2.3(jest-resolve@27.5.1): resolution: {integrity: sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==} engines: {node: '>=6'} peerDependencies: @@ -12464,12 +12783,12 @@ packages: jest-resolve: 27.5.1 dev: true - /jest-regex-util/27.5.1: + /jest-regex-util@27.5.1: resolution: {integrity: sha512-4bfKq2zie+x16okqDXjXn9ql2B0dScQu+vcwe4TvFVhkVyuWLqpZrZtXxLLWoXYgn0E87I6r6GRYHF7wFZBUvg==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dev: true - /jest-resolve-dependencies/27.5.1: + /jest-resolve-dependencies@27.5.1: resolution: {integrity: sha512-QQOOdY4PE39iawDn5rzbIePNigfe5B9Z91GDD1ae/xNDlu9kaat8QQ5EKnNmVWPV54hUdxCVwwj6YMgR2O7IOg==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: @@ -12480,7 +12799,7 @@ packages: - supports-color dev: true - /jest-resolve/27.5.1: + /jest-resolve@27.5.1: resolution: {integrity: sha512-FFDy8/9E6CV83IMbDpcjOhumAQPDyETnU2KZ1O98DwTnz8AOBsW/Xv3GySr1mOZdItLR+zDZ7I/UdTFbgSOVCw==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: @@ -12488,7 +12807,7 @@ packages: chalk: 4.1.2 graceful-fs: 4.2.10 jest-haste-map: 27.5.1 - jest-pnp-resolver: 1.2.3_jest-resolve@27.5.1 + jest-pnp-resolver: 1.2.3(jest-resolve@27.5.1) jest-util: 27.5.1 jest-validate: 27.5.1 resolve: 1.22.1 @@ -12496,7 +12815,7 @@ packages: slash: 3.0.0 dev: true - /jest-runner/27.5.1: + /jest-runner@27.5.1: resolution: {integrity: sha512-g4NPsM4mFCOwFKXO4p/H/kWGdJp9V8kURY2lX8Me2drgXqG7rrZAx5kv+5H7wtt/cdFIjhqYx1HrlqWHaOvDaQ==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: @@ -12528,7 +12847,7 @@ packages: - utf-8-validate dev: true - /jest-runtime/27.5.1: + /jest-runtime@27.5.1: resolution: {integrity: sha512-o7gxw3Gf+H2IGt8fv0RiyE1+r83FJBRruoA+FXrlHw6xEyBsU8ugA6IPfTdVyA0w8HClpbK+DGJxH59UrNMx8A==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: @@ -12558,28 +12877,28 @@ packages: - supports-color dev: true - /jest-serializer/27.5.1: + /jest-serializer@27.5.1: resolution: {integrity: sha512-jZCyo6iIxO1aqUxpuBlwTDMkzOAJS4a3eYz3YzgxxVQFwLeSA7Jfq5cbqCY+JLvTDrWirgusI/0KwxKMgrdf7w==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: - '@types/node': 18.14.2 + '@types/node': 18.15.1 graceful-fs: 4.2.10 dev: true - /jest-snapshot/27.5.1: + /jest-snapshot@27.5.1: resolution: {integrity: sha512-yYykXI5a0I31xX67mgeLw1DZ0bJB+gpq5IpSuCAoyDi0+BhgU/RIrL+RTzDmkNTchvDFWKP8lp+w/42Z3us5sA==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: '@babel/core': 7.20.2 '@babel/generator': 7.20.4 - '@babel/plugin-syntax-typescript': 7.20.0_@babel+core@7.20.2 + '@babel/plugin-syntax-typescript': 7.20.0(@babel/core@7.20.2) '@babel/traverse': 7.20.1 '@babel/types': 7.20.2 '@jest/transform': 27.5.1 '@jest/types': 27.5.1 '@types/babel__traverse': 7.18.2 '@types/prettier': 2.7.1 - babel-preset-current-node-syntax: 1.0.1_@babel+core@7.20.2 + babel-preset-current-node-syntax: 1.0.1(@babel/core@7.20.2) chalk: 4.1.2 expect: 27.5.1 graceful-fs: 4.2.10 @@ -12596,7 +12915,7 @@ packages: - supports-color dev: true - /jest-util/27.5.1: + /jest-util@27.5.1: resolution: {integrity: sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: @@ -12608,7 +12927,7 @@ packages: picomatch: 2.3.1 dev: true - /jest-validate/27.5.1: + /jest-validate@27.5.1: resolution: {integrity: sha512-thkNli0LYTmOI1tDB3FI1S1RTp/Bqyd9pTarJwL87OIBFuqEb5Apv5EaApEudYg4g86e3CT6kM0RowkhtEnCBQ==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: @@ -12620,7 +12939,7 @@ packages: pretty-format: 27.5.1 dev: true - /jest-watcher/27.5.1: + /jest-watcher@27.5.1: resolution: {integrity: sha512-z676SuD6Z8o8qbmEGhoEUFOM1+jfEiL3DXHK/xgEiG2EyNYfFG60jluWcupY6dATjfEsKQuibReS1djInQnoVw==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: @@ -12633,16 +12952,16 @@ packages: string-length: 4.0.2 dev: true - /jest-worker/27.5.1: + /jest-worker@27.5.1: resolution: {integrity: sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==} engines: {node: '>= 10.13.0'} dependencies: - '@types/node': 12.20.55 + '@types/node': 18.15.1 merge-stream: 2.0.0 supports-color: 8.1.1 dev: true - /jest/27.5.1: + /jest@27.5.1: resolution: {integrity: sha512-Yn0mADZB89zTtjkPJEXwrac3LHudkQMR+Paqa8uxJHCBr9agxztUifWCyiYrjhMPBoUVBjyny0I7XH6ozDr7QQ==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} hasBin: true @@ -12663,25 +12982,29 @@ packages: - utf-8-validate dev: true - /js-base64/2.6.4: + /js-base64@2.6.4: resolution: {integrity: sha512-pZe//GGmwJndub7ZghVHz7vjb2LgC1m8B07Au3eYqeqv9emhESByMXxaEgkUkEqJe87oBbSniGYoQNIBklc7IQ==} dev: true - /js-sha3/0.5.7: + /js-sdsl@4.4.0: + resolution: {integrity: sha512-FfVSdx6pJ41Oa+CF7RDaFmTnCaFhua+SNYQX74riGOpl96x+2jQCqEfQ2bnXu/5DPCqlRuiqyvTJM0Qjz26IVg==} + dev: true + + /js-sha3@0.5.7: resolution: {integrity: sha512-GII20kjaPX0zJ8wzkTbNDYMY7msuZcTWk8S5UOh6806Jq/wz1J8/bnr8uGU0DAUmYDjj2Mr4X1cW8v/GLYnR+g==} dev: true - /js-sha3/0.8.0: + /js-sha3@0.8.0: resolution: {integrity: sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q==} - /js-tokens/3.0.2: + /js-tokens@3.0.2: resolution: {integrity: sha512-RjTcuD4xjtthQkaWH7dFlH85L+QaVtSoOyGdZ3g6HFhS9dFNDfLyqgm2NFe2X6cQpeFmt0452FJjFG5UameExg==} dev: true - /js-tokens/4.0.0: + /js-tokens@4.0.0: resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} - /js-yaml/3.13.1: + /js-yaml@3.13.1: resolution: {integrity: sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==} hasBin: true dependencies: @@ -12689,24 +13012,24 @@ packages: esprima: 4.0.1 dev: true - /js-yaml/3.14.1: + /js-yaml@3.14.1: resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} hasBin: true dependencies: argparse: 1.0.10 esprima: 4.0.1 - /js-yaml/4.1.0: + /js-yaml@4.1.0: resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} hasBin: true dependencies: argparse: 2.0.1 - /jsbn/0.1.1: + /jsbn@0.1.1: resolution: {integrity: sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==} dev: true - /jsdom/16.7.0: + /jsdom@16.7.0: resolution: {integrity: sha512-u9Smc2G1USStM+s/x1ru5Sxrl6mPYCbByG1U/hUmqaVsm4tbNyS7CicOSRyuGQYZhTu0h84qkZZQ/I+dzizSVw==} engines: {node: '>=10'} peerDependencies: @@ -12748,41 +13071,40 @@ packages: - utf-8-validate dev: true - /jsesc/0.5.0: + /jsesc@0.5.0: resolution: {integrity: sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==} hasBin: true dev: true - /jsesc/1.3.0: + /jsesc@1.3.0: resolution: {integrity: sha512-Mke0DA0QjUWuJlhsE0ZPPhYiJkRap642SmI/4ztCFaUs6V2AiH1sfecc+57NgaryfAA2VR3v6O+CSjC1jZJKOA==} hasBin: true dev: true - /jsesc/2.5.2: + /jsesc@2.5.2: resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==} engines: {node: '>=4'} hasBin: true - dev: true - /json-buffer/3.0.0: + /json-buffer@3.0.0: resolution: {integrity: sha512-CuUqjv0FUZIdXkHPI8MezCnFCdaTAacej1TZYulLoAg1h/PhwkdXFN4V/gzY4g+fMBCOV2xF+rp7t2XD2ns/NQ==} dev: true optional: true - /json-buffer/3.0.1: + /json-buffer@3.0.1: resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} dev: true optional: true - /json-parse-better-errors/1.0.2: + /json-parse-better-errors@1.0.2: resolution: {integrity: sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==} dev: true - /json-parse-even-better-errors/2.3.1: + /json-parse-even-better-errors@2.3.1: resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} dev: true - /json-rpc-engine/3.8.0: + /json-rpc-engine@3.8.0: resolution: {integrity: sha512-6QNcvm2gFuuK4TKU1uwfH0Qd/cOSb9c1lls0gbnIhciktIUQJwz6NQNAW4B1KiGPenv7IKu97V222Yo1bNhGuA==} dependencies: async: 2.6.4 @@ -12795,14 +13117,14 @@ packages: - supports-color dev: true - /json-rpc-engine/5.4.0: + /json-rpc-engine@5.4.0: resolution: {integrity: sha512-rAffKbPoNDjuRnXkecTjnsE3xLLrb00rEkdgalINhaYVYIxDwWtvYBr9UFbhTvPB1B2qUOLoFd/cV6f4Q7mh7g==} dependencies: eth-rpc-errors: 3.0.0 safe-event-emitter: 1.0.1 dev: false - /json-rpc-engine/6.1.0: + /json-rpc-engine@6.1.0: resolution: {integrity: sha512-NEdLrtrq1jUZyfjkr9OCz9EzCNhnRyWtt1PAnvnhwy6e8XETS0Dtc+ZNCO2gvuAoKsIn2+vCSowXTYE4CkgnAQ==} engines: {node: '>=10.0.0'} dependencies: @@ -12810,74 +13132,73 @@ packages: eth-rpc-errors: 4.0.2 dev: false - /json-rpc-error/2.0.0: + /json-rpc-error@2.0.0: resolution: {integrity: sha512-EwUeWP+KgAZ/xqFpaP6YDAXMtCJi+o/QQpCQFIYyxr01AdADi2y413eM8hSqJcoQym9WMePAJWoaODEJufC4Ug==} dependencies: inherits: 2.0.4 dev: true - /json-rpc-random-id/1.0.1: + /json-rpc-random-id@1.0.1: resolution: {integrity: sha512-RJ9YYNCkhVDBuP4zN5BBtYAzEl03yq/jIIsyif0JY9qyJuQQZNeDK7anAPKKlyEtLSj2s8h6hNh2F8zO5q7ScA==} - /json-schema-traverse/0.4.1: + /json-schema-traverse@0.4.1: resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} dev: true - /json-schema-traverse/1.0.0: + /json-schema-traverse@1.0.0: resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} dev: true - /json-schema/0.4.0: + /json-schema@0.4.0: resolution: {integrity: sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==} dev: true - /json-stable-stringify-without-jsonify/1.0.1: + /json-stable-stringify-without-jsonify@1.0.1: resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} dev: true - /json-stable-stringify/1.0.2: + /json-stable-stringify@1.0.2: resolution: {integrity: sha512-eunSSaEnxV12z+Z73y/j5N37/In40GK4GmsSy+tEHJMxknvqnA7/djeYtAgW0GsWHUfg+847WJjKaEylk2y09g==} dependencies: jsonify: 0.0.1 - /json-stringify-safe/5.0.1: + /json-stringify-safe@5.0.1: resolution: {integrity: sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==} - /json5/0.5.1: + /json5@0.5.1: resolution: {integrity: sha512-4xrs1aW+6N5DalkqSVA8fxh458CXvR99WU8WLKmq4v8eWAL86Xo3BVqyd3SkA9wEVjCMqyvvRRkshAdOnBp5rw==} hasBin: true dev: true - /json5/1.0.2: + /json5@1.0.2: resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==} hasBin: true dependencies: minimist: 1.2.8 dev: true - /json5/2.2.1: + /json5@2.2.1: resolution: {integrity: sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==} engines: {node: '>=6'} hasBin: true - dev: true - /jsonc-parser/3.2.0: + /jsonc-parser@3.2.0: resolution: {integrity: sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==} dev: false - /jsonfile/2.4.0: + /jsonfile@2.4.0: resolution: {integrity: sha512-PKllAqbgLgxHaj8TElYymKCAgrASebJrWpTnEkOaTowt23VKXXN0sUeriJ+eh7y6ufb/CC5ap11pz71/cM0hUw==} optionalDependencies: graceful-fs: 4.2.10 dev: true - /jsonfile/4.0.0: + /jsonfile@4.0.0: resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==} optionalDependencies: graceful-fs: 4.2.10 dev: true - /jsonfile/6.1.0: + /jsonfile@6.1.0: resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} dependencies: universalify: 2.0.0 @@ -12885,19 +13206,19 @@ packages: graceful-fs: 4.2.10 dev: true - /jsonify/0.0.1: + /jsonify@0.0.1: resolution: {integrity: sha512-2/Ki0GcmuqSrgFyelQq9M05y7PS0mEwuIzrf3f1fPqkVDVRvZrPZtVSMHxdgo8Aq0sxAOb/cr2aqqA3LeWHVPg==} - /jsonparse/1.3.1: + /jsonparse@1.3.1: resolution: {integrity: sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==} engines: {'0': node >= 0.2.0} dev: false - /jsonschema/1.4.1: + /jsonschema@1.4.1: resolution: {integrity: sha512-S6cATIPVv1z0IlxdN+zUk5EPjkGCdnhN4wVSBlvoUO1tOLJootbo9CquNJmbIh4yikWHiUedhRYrNPn1arpEmQ==} dev: true - /jsprim/1.4.2: + /jsprim@1.4.2: resolution: {integrity: sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==} engines: {node: '>=0.6.0'} dependencies: @@ -12907,28 +13228,28 @@ packages: verror: 1.10.0 dev: true - /katex/0.13.24: + /katex@0.13.24: resolution: {integrity: sha512-jZxYuKCma3VS5UuxOx/rFV1QyGSl3Uy/i0kTJF3HgQ5xMinCQVF8Zd4bMY/9aI9b9A2pjIBOsjSSm68ykTAr8w==} hasBin: true dependencies: commander: 8.3.0 dev: false - /katex/0.15.6: + /katex@0.15.6: resolution: {integrity: sha512-UpzJy4yrnqnhXvRPhjEuLA4lcPn6eRngixW7Q3TJErjg3Aw2PuLFBzTkdUb89UtumxjhHTqL3a5GDGETMSwgJA==} hasBin: true dependencies: commander: 8.3.0 dev: false - /katex/0.16.4: + /katex@0.16.4: resolution: {integrity: sha512-WudRKUj8yyBeVDI4aYMNxhx5Vhh2PjpzQw1GRu/LVGqL4m1AxwD1GcUp0IMbdJaf5zsjtj8ghP0DOQRYhroNkw==} hasBin: true dependencies: commander: 8.3.0 dev: false - /keccak/3.0.2: + /keccak@3.0.2: resolution: {integrity: sha512-PyKKjkH53wDMLGrvmRGSNWgmSxZOUqbnXwKL9tmgbFYA1iAYqW21kfR7mZXV0MlESiefxQQE9X9fTa3X+2MPDQ==} engines: {node: '>=10.0.0'} requiresBuild: true @@ -12938,7 +13259,7 @@ packages: readable-stream: 3.6.2 dev: false - /keccak/3.0.3: + /keccak@3.0.3: resolution: {integrity: sha512-JZrLIAJWuZxKbCilMpNz5Vj7Vtb4scDG3dMXLOsbzBmQGyjwE61BbW7bJkfKKCShXiQZt3T6sBgALRtmd+nZaQ==} engines: {node: '>=10.0.0'} requiresBuild: true @@ -12947,81 +13268,81 @@ packages: node-gyp-build: 4.6.0 readable-stream: 3.6.2 - /keyv/3.1.0: + /keyv@3.1.0: resolution: {integrity: sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==} dependencies: json-buffer: 3.0.0 dev: true optional: true - /keyv/4.5.2: + /keyv@4.5.2: resolution: {integrity: sha512-5MHbFaKn8cNSmVW7BYnijeAVlE4cYA/SVkifVgrh7yotnfhKmjuXpDKjrABLnT0SfHWV21P8ow07OGfRrNDg8g==} dependencies: json-buffer: 3.0.1 dev: true optional: true - /keyvaluestorage-interface/1.0.0: + /keyvaluestorage-interface@1.0.0: resolution: {integrity: sha512-8t6Q3TclQ4uZynJY9IGr2+SsIGwK9JHcO6ootkHCGA0CrQCRy+VkouYNO2xicET6b9al7QKzpebNow+gkpCL8g==} dev: false - /kind-of/3.2.2: + /kind-of@3.2.2: resolution: {integrity: sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==} engines: {node: '>=0.10.0'} dependencies: is-buffer: 1.1.6 dev: true - /kind-of/4.0.0: + /kind-of@4.0.0: resolution: {integrity: sha512-24XsCxmEbRwEDbz/qz3stgin8TTzZ1ESR56OMCN0ujYg+vRutNSiOj9bHH9u85DKgXguraugV5sFuvbD4FW/hw==} engines: {node: '>=0.10.0'} dependencies: is-buffer: 1.1.6 dev: true - /kind-of/5.1.0: + /kind-of@5.1.0: resolution: {integrity: sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==} engines: {node: '>=0.10.0'} dev: true - /kind-of/6.0.3: + /kind-of@6.0.3: resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} engines: {node: '>=0.10.0'} - /klaw-sync/6.0.0: + /klaw-sync@6.0.0: resolution: {integrity: sha512-nIeuVSzdCCs6TDPTqI8w1Yre34sSq7AkZ4B3sfOBbI2CgVSB4Du4aLQijFU2+lhAFCwt9+42Hel6lQNIv6AntQ==} dependencies: graceful-fs: 4.2.10 dev: true - /klaw/1.3.1: + /klaw@1.3.1: resolution: {integrity: sha512-TED5xi9gGQjGpNnvRWknrwAB1eL5GciPfVFOt3Vk1OJCVDQbzuSfrF3hkUQKlsgKrG1F+0t5W0m+Fje1jIt8rw==} optionalDependencies: graceful-fs: 4.2.10 dev: true - /kleur/3.0.3: + /kleur@3.0.3: resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==} engines: {node: '>=6'} dev: true - /kleur/4.1.5: + /kleur@4.1.5: resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==} engines: {node: '>=6'} - /klona/2.0.5: + /klona@2.0.5: resolution: {integrity: sha512-pJiBpiXMbt7dkzXe8Ghj/u4FfXOOa98fPW+bihOJ4SjnoijweJrNThJfd3ifXpXhREjpoF2mZVH1GfS9LV3kHQ==} engines: {node: '>= 8'} dev: true - /lcid/1.0.0: + /lcid@1.0.0: resolution: {integrity: sha512-YiGkH6EnGrDGqLMITnGjXtGmNtjoXw9SVUzcaos8RBi7Ps0VBylkq+vOcY9QE5poLasPCR849ucFUkl0UzUyOw==} engines: {node: '>=0.10.0'} dependencies: invert-kv: 1.0.0 dev: true - /level-blobs/0.1.7: + /level-blobs@0.1.7: resolution: {integrity: sha512-n0iYYCGozLd36m/Pzm206+brIgXP8mxPZazZ6ZvgKr+8YwOZ8/PPpYC5zMUu2qFygRN8RO6WC/HH3XWMW7RMVg==} dependencies: level-peek: 1.0.6 @@ -13029,36 +13350,36 @@ packages: readable-stream: 1.0.34 dev: true - /level-codec/7.0.1: + /level-codec@7.0.1: resolution: {integrity: sha512-Ua/R9B9r3RasXdRmOtd+t9TCOEIIlts+TN/7XTT2unhDaL6sJn83S3rUyljbr6lVtw49N3/yA0HHjpV6Kzb2aQ==} dev: true - /level-codec/9.0.2: + /level-codec@9.0.2: resolution: {integrity: sha512-UyIwNb1lJBChJnGfjmO0OR+ezh2iVu1Kas3nvBS/BzGnx79dv6g7unpKIDNPMhfdTEGoc7mC8uAu51XEtX+FHQ==} engines: {node: '>=6'} dependencies: buffer: 5.7.1 dev: true - /level-concat-iterator/2.0.1: + /level-concat-iterator@2.0.1: resolution: {integrity: sha512-OTKKOqeav2QWcERMJR7IS9CUo1sHnke2C0gkSmcR7QuEtFNLLzHQAvnMw8ykvEcv0Qtkg0p7FOwP1v9e5Smdcw==} engines: {node: '>=6'} dev: true - /level-errors/1.0.5: + /level-errors@1.0.5: resolution: {integrity: sha512-/cLUpQduF6bNrWuAC4pwtUKA5t669pCsCi2XbmojG2tFeOr9j6ShtdDCtFFQO1DRt+EVZhx9gPzP9G2bUaG4ig==} dependencies: errno: 0.1.8 dev: true - /level-errors/2.0.1: + /level-errors@2.0.1: resolution: {integrity: sha512-UVprBJXite4gPS+3VznfgDSU8PTRuVX0NXwoWW50KLxd2yw4Y1t2JUR5In1itQnudZqRMT9DlAM3Q//9NCjCFw==} engines: {node: '>=6'} dependencies: errno: 0.1.8 dev: true - /level-filesystem/1.2.0: + /level-filesystem@1.2.0: resolution: {integrity: sha512-PhXDuCNYpngpxp3jwMT9AYBMgOvB6zxj3DeuIywNKmZqFj2djj9XfT2XDVslfqmo0Ip79cAd3SBy3FsfOZPJ1g==} dependencies: concat-stream: 1.6.2 @@ -13072,23 +13393,23 @@ packages: xtend: 2.2.0 dev: true - /level-fix-range/1.0.2: + /level-fix-range@1.0.2: resolution: {integrity: sha512-9llaVn6uqBiSlBP+wKiIEoBa01FwEISFgHSZiyec2S0KpyLUkGR4afW/FCZ/X8y+QJvzS0u4PGOlZDdh1/1avQ==} dev: true - /level-fix-range/2.0.0: + /level-fix-range@2.0.0: resolution: {integrity: sha512-WrLfGWgwWbYPrHsYzJau+5+te89dUbENBg3/lsxOs4p2tYOhCHjbgXxBAj4DFqp3k/XBwitcRXoCh8RoCogASA==} dependencies: clone: 0.1.19 dev: true - /level-hooks/4.5.0: + /level-hooks@4.5.0: resolution: {integrity: sha512-fxLNny/vL/G4PnkLhWsbHnEaRi+A/k8r5EH/M77npZwYL62RHi2fV0S824z3QdpAk6VTgisJwIRywzBHLK4ZVA==} dependencies: string-range: 1.2.2 dev: true - /level-iterator-stream/1.3.1: + /level-iterator-stream@1.3.1: resolution: {integrity: sha512-1qua0RHNtr4nrZBgYlpV0qHHeHpcRRWTxEZJ8xsemoHAXNL5tbooh4tPEEqIqsbWCAJBmUmkwYK/sW5OrFjWWw==} dependencies: inherits: 2.0.4 @@ -13097,7 +13418,7 @@ packages: xtend: 4.0.2 dev: true - /level-iterator-stream/2.0.3: + /level-iterator-stream@2.0.3: resolution: {integrity: sha512-I6Heg70nfF+e5Y3/qfthJFexhRw/Gi3bIymCoXAlijZdAcLaPuWSJs3KXyTYf23ID6g0o2QF62Yh+grOXY3Rig==} engines: {node: '>=4'} dependencies: @@ -13106,7 +13427,7 @@ packages: xtend: 4.0.2 dev: true - /level-iterator-stream/3.0.1: + /level-iterator-stream@3.0.1: resolution: {integrity: sha512-nEIQvxEED9yRThxvOrq8Aqziy4EGzrxSZK+QzEFAVuJvQ8glfyZ96GB6BoI4sBbLfjMXm2w4vu3Tkcm9obcY0g==} engines: {node: '>=6'} dependencies: @@ -13115,7 +13436,7 @@ packages: xtend: 4.0.2 dev: true - /level-iterator-stream/4.0.2: + /level-iterator-stream@4.0.2: resolution: {integrity: sha512-ZSthfEqzGSOMWoUGhTXdX9jv26d32XJuHz/5YnuHZzH6wldfWMOVwI9TBtKcya4BKTyTt3XVA0A3cF3q5CY30Q==} engines: {node: '>=6'} dependencies: @@ -13124,7 +13445,7 @@ packages: xtend: 4.0.2 dev: true - /level-js/2.2.4: + /level-js@2.2.4: resolution: {integrity: sha512-lZtjt4ZwHE00UMC1vAb271p9qzg8vKlnDeXfIesH3zL0KxhHRDjClQLGLWhyR0nK4XARnd4wc/9eD1ffd4PshQ==} dependencies: abstract-leveldown: 0.12.4 @@ -13135,7 +13456,7 @@ packages: xtend: 2.1.2 dev: true - /level-mem/3.0.1: + /level-mem@3.0.1: resolution: {integrity: sha512-LbtfK9+3Ug1UmvvhR2DqLqXiPW1OJ5jEh0a3m9ZgAipiwpSxGj/qaVVy54RG5vAQN1nCuXqjvprCuKSCxcJHBg==} engines: {node: '>=6'} dependencies: @@ -13143,7 +13464,7 @@ packages: memdown: 3.0.0 dev: true - /level-mem/5.0.1: + /level-mem@5.0.1: resolution: {integrity: sha512-qd+qUJHXsGSFoHTziptAKXoLX87QjR7v2KMbqncDXPxQuCdsQlzmyX+gwrEHhlzn08vkf8TyipYyMmiC6Gobzg==} engines: {node: '>=6'} dependencies: @@ -13151,7 +13472,7 @@ packages: memdown: 5.1.0 dev: true - /level-packager/4.0.1: + /level-packager@4.0.1: resolution: {integrity: sha512-svCRKfYLn9/4CoFfi+d8krOtrp6RoX8+xm0Na5cgXMqSyRru0AnDYdLl+YI8u1FyS6gGZ94ILLZDE5dh2but3Q==} engines: {node: '>=6'} dependencies: @@ -13159,7 +13480,7 @@ packages: levelup: 3.1.1 dev: true - /level-packager/5.1.1: + /level-packager@5.1.1: resolution: {integrity: sha512-HMwMaQPlTC1IlcwT3+swhqf/NUO+ZhXVz6TY1zZIIZlIR0YSn8GtAAWmIvKjNY16ZkEg/JcpAuQskxsXqC0yOQ==} engines: {node: '>=6'} dependencies: @@ -13167,19 +13488,19 @@ packages: levelup: 4.4.0 dev: true - /level-peek/1.0.6: + /level-peek@1.0.6: resolution: {integrity: sha512-TKEzH5TxROTjQxWMczt9sizVgnmJ4F3hotBI48xCTYvOKd/4gA/uY0XjKkhJFo6BMic8Tqjf6jFMLWeg3MAbqQ==} dependencies: level-fix-range: 1.0.2 dev: true - /level-post/1.0.7: + /level-post@1.0.7: resolution: {integrity: sha512-PWYqG4Q00asOrLhX7BejSajByB4EmG2GaKHfj3h5UmmZ2duciXLPGYWIjBzLECFWUGOZWlm5B20h/n3Gs3HKew==} dependencies: ltgt: 2.1.3 dev: true - /level-sublevel/5.2.3: + /level-sublevel@5.2.3: resolution: {integrity: sha512-tO8jrFp+QZYrxx/Gnmjawuh1UBiifpvKNAcm4KCogesWr1Nm2+ckARitf+Oo7xg4OHqMW76eAqQ204BoIlscjA==} dependencies: level-fix-range: 2.0.0 @@ -13188,7 +13509,7 @@ packages: xtend: 2.0.6 dev: true - /level-sublevel/6.6.4: + /level-sublevel@6.6.4: resolution: {integrity: sha512-pcCrTUOiO48+Kp6F1+UAzF/OtWqLcQVTVF39HLdZ3RO8XBoXt+XVPKZO1vVr1aUoxHZA9OtD2e1v7G+3S5KFDA==} dependencies: bytewise: 1.1.0 @@ -13203,19 +13524,19 @@ packages: xtend: 4.0.2 dev: true - /level-supports/1.0.1: + /level-supports@1.0.1: resolution: {integrity: sha512-rXM7GYnW8gsl1vedTJIbzOrRv85c/2uCMpiiCzO2fndd06U/kUXEEU9evYn4zFggBOg36IsBW8LzqIpETwwQzg==} engines: {node: '>=6'} dependencies: xtend: 4.0.2 dev: true - /level-supports/4.0.1: + /level-supports@4.0.1: resolution: {integrity: sha512-PbXpve8rKeNcZ9C1mUicC9auIYFyGpkV9/i6g76tLgANwWhtG2v7I4xNBUlkn3lE2/dZF3Pi0ygYGtLc4RXXdA==} engines: {node: '>=12'} dev: true - /level-transcoder/1.0.1: + /level-transcoder@1.0.1: resolution: {integrity: sha512-t7bFwFtsQeD8cl8NIoQ2iwxA0CL/9IFw7/9gAjOonH0PWTTiRfY7Hq+Ejbsxh86tXobDQ6IOiddjNYIfOBs06w==} engines: {node: '>=12'} dependencies: @@ -13223,14 +13544,14 @@ packages: module-error: 1.0.2 dev: true - /level-ws/0.0.0: + /level-ws@0.0.0: resolution: {integrity: sha512-XUTaO/+Db51Uiyp/t7fCMGVFOTdtLS/NIACxE/GHsij15mKzxksZifKVjlXDF41JMUP/oM1Oc4YNGdKnc3dVLw==} dependencies: readable-stream: 1.0.34 xtend: 2.1.2 dev: true - /level-ws/1.0.0: + /level-ws@1.0.0: resolution: {integrity: sha512-RXEfCmkd6WWFlArh3X8ONvQPm8jNpfA0s/36M4QzLqrLEIt1iJE9WBHLZ5vZJK6haMjJPJGJCQWfjMNnRcq/9Q==} engines: {node: '>=6'} dependencies: @@ -13239,7 +13560,7 @@ packages: xtend: 4.0.2 dev: true - /level-ws/2.0.0: + /level-ws@2.0.0: resolution: {integrity: sha512-1iv7VXx0G9ec1isqQZ7y5LmoZo/ewAsyDHNA8EFDW5hqH2Kqovm33nSFkSdnLLAK+I5FlT+lo5Cw9itGe+CpQA==} engines: {node: '>=6'} dependencies: @@ -13248,7 +13569,7 @@ packages: xtend: 4.0.2 dev: true - /level/8.0.0: + /level@8.0.0: resolution: {integrity: sha512-ypf0jjAk2BWI33yzEaaotpq7fkOPALKAgDBxggO6Q9HGX2MRXn0wbP1Jn/tJv1gtL867+YOjOB49WaUF3UoJNQ==} engines: {node: '>=12'} dependencies: @@ -13256,7 +13577,7 @@ packages: classic-level: 1.2.0 dev: true - /levelup/0.18.6: + /levelup@0.18.6: resolution: {integrity: sha512-uB0auyRqIVXx+hrpIUtol4VAPhLRcnxcOsd2i2m6rbFIDarO5dnrupLOStYYpEcu8ZT087Z9HEuYw1wjr6RL6Q==} dependencies: bl: 0.8.2 @@ -13268,7 +13589,7 @@ packages: xtend: 3.0.0 dev: true - /levelup/1.3.9: + /levelup@1.3.9: resolution: {integrity: sha512-VVGHfKIlmw8w1XqpGOAGwq6sZm2WwWLmlDcULkKWQXEA5EopA8OBNJ2Ck2v6bdk8HeEZSbCSEgzXadyQFm76sQ==} dependencies: deferred-leveldown: 1.2.2 @@ -13280,7 +13601,7 @@ packages: xtend: 4.0.2 dev: true - /levelup/3.1.1: + /levelup@3.1.1: resolution: {integrity: sha512-9N10xRkUU4dShSRRFTBdNaBxofz+PGaIZO962ckboJZiNmLuhVT6FZ6ZKAsICKfUBO76ySaYU6fJWX/jnj3Lcg==} engines: {node: '>=6'} dependencies: @@ -13290,7 +13611,7 @@ packages: xtend: 4.0.2 dev: true - /levelup/4.4.0: + /levelup@4.4.0: resolution: {integrity: sha512-94++VFO3qN95cM/d6eBXvd894oJE0w3cInq9USsyQzzoJxmiYzPAocNcuGCPGGjoXqDVJcr3C1jzt1TSjyaiLQ==} engines: {node: '>=6'} dependencies: @@ -13301,12 +13622,12 @@ packages: xtend: 4.0.2 dev: true - /leven/3.1.0: + /leven@3.1.0: resolution: {integrity: sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==} engines: {node: '>=6'} dev: true - /levn/0.3.0: + /levn@0.3.0: resolution: {integrity: sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==} engines: {node: '>= 0.8.0'} dependencies: @@ -13314,7 +13635,7 @@ packages: type-check: 0.3.2 dev: true - /levn/0.4.1: + /levn@0.4.1: resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} engines: {node: '>= 0.8.0'} dependencies: @@ -13322,26 +13643,26 @@ packages: type-check: 0.4.0 dev: true - /lilconfig/2.0.5: + /lilconfig@2.0.5: resolution: {integrity: sha512-xaYmXZtTHPAw5m+xLN8ab9C+3a8YmV3asNSPOATITbtwrfbwaLJj8h66H1WMIpALCkqsIzK3h7oQ+PdX+LQ9Eg==} engines: {node: '>=10'} dev: true - /lilconfig/2.0.6: + /lilconfig@2.0.6: resolution: {integrity: sha512-9JROoBW7pobfsx+Sq2JsASvCo6Pfo6WWoUW79HuB1BCoBXD4PLWJPqDF6fNj67pqBYTbAHkE57M1kS/+L1neOg==} engines: {node: '>=10'} dev: true - /lilconfig/2.1.0: + /lilconfig@2.1.0: resolution: {integrity: sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==} engines: {node: '>=10'} dev: true - /lines-and-columns/1.2.4: + /lines-and-columns@1.2.4: resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} dev: true - /lint-staged/12.5.0: + /lint-staged@12.5.0: resolution: {integrity: sha512-BKLUjWDsKquV/JuIcoQW4MSAI3ggwEImF1+sB4zaKvyVx1wBk3FsG7UK9bpnmBTN1pm7EH2BBcMwINJzCRv12g==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} hasBin: true @@ -13349,7 +13670,7 @@ packages: cli-truncate: 3.1.0 colorette: 2.0.19 commander: 9.5.0 - debug: 4.3.4_supports-color@9.3.1 + debug: 4.3.4(supports-color@9.3.1) execa: 5.1.1 lilconfig: 2.0.5 listr2: 4.0.5 @@ -13364,7 +13685,7 @@ packages: - enquirer dev: true - /listr2/4.0.5: + /listr2@4.0.5: resolution: {integrity: sha512-juGHV1doQdpNT3GSTs9IUN43QJb7KHdF9uqg7Vufs/tG9VTzpFphqF4pm/ICdAABGQxsyNn9CiYA3StkI6jpwA==} engines: {node: '>=12'} peerDependencies: @@ -13383,7 +13704,7 @@ packages: wrap-ansi: 7.0.0 dev: true - /load-json-file/1.1.0: + /load-json-file@1.1.0: resolution: {integrity: sha512-cy7ZdNRXdablkXYNI049pthVeXFurRyb9+hA/dZzerZ0pGTx42z+y+ssxBaVV2l70t1muq5IdKhn4UtcoGUY9A==} engines: {node: '>=0.10.0'} dependencies: @@ -13394,12 +13715,12 @@ packages: strip-bom: 2.0.0 dev: true - /loader-runner/4.3.0: + /loader-runner@4.3.0: resolution: {integrity: sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==} engines: {node: '>=6.11.5'} dev: true - /loader-utils/1.4.2: + /loader-utils@1.4.2: resolution: {integrity: sha512-I5d00Pd/jwMD2QCduo657+YM/6L3KZu++pmX9VFncxaxvHcru9jx1lBaFft+r4Mt2jK0Yhp41XlRAihzPxHNCg==} engines: {node: '>=4.0.0'} dependencies: @@ -13408,7 +13729,7 @@ packages: json5: 1.0.2 dev: true - /loader-utils/2.0.4: + /loader-utils@2.0.4: resolution: {integrity: sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==} engines: {node: '>=8.9.0'} dependencies: @@ -13417,7 +13738,7 @@ packages: json5: 2.2.1 dev: true - /locate-path/2.0.0: + /locate-path@2.0.0: resolution: {integrity: sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA==} engines: {node: '>=4'} dependencies: @@ -13425,80 +13746,80 @@ packages: path-exists: 3.0.0 dev: true - /locate-path/3.0.0: + /locate-path@3.0.0: resolution: {integrity: sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==} engines: {node: '>=6'} dependencies: p-locate: 3.0.0 path-exists: 3.0.0 - /locate-path/5.0.0: + /locate-path@5.0.0: resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} engines: {node: '>=8'} dependencies: p-locate: 4.1.0 dev: true - /locate-path/6.0.0: + /locate-path@6.0.0: resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} engines: {node: '>=10'} dependencies: p-locate: 5.0.0 dev: true - /lodash.assign/4.2.0: + /lodash.assign@4.2.0: resolution: {integrity: sha512-hFuH8TY+Yji7Eja3mGiuAxBqLagejScbG8GbG0j6o9vzn0YL14My+ktnqtZgFTosKymC9/44wP6s7xyuLfnClw==} dev: true - /lodash.debounce/4.0.8: + /lodash.debounce@4.0.8: resolution: {integrity: sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==} - /lodash.get/4.4.2: + /lodash.get@4.4.2: resolution: {integrity: sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==} dev: false - /lodash.isequal/4.5.0: + /lodash.isequal@4.5.0: resolution: {integrity: sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==} dev: true - /lodash.isequalwith/4.4.0: + /lodash.isequalwith@4.4.0: resolution: {integrity: sha512-dcZON0IalGBpRmJBmMkaoV7d3I80R2O+FrzsZyHdNSFrANq/cgDqKQNmAHE8UEj4+QYWwwhkQOVdLHiAopzlsQ==} dev: true - /lodash.memoize/4.1.2: + /lodash.memoize@4.1.2: resolution: {integrity: sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==} dev: true - /lodash.merge/4.6.2: + /lodash.merge@4.6.2: resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} dev: true - /lodash.truncate/4.4.2: + /lodash.truncate@4.4.2: resolution: {integrity: sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==} dev: true - /lodash/4.17.20: + /lodash@4.17.20: resolution: {integrity: sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==} dev: true - /lodash/4.17.21: + /lodash@4.17.21: resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} - /log-symbols/2.2.0: + /log-symbols@2.2.0: resolution: {integrity: sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==} engines: {node: '>=4'} dependencies: chalk: 2.4.2 dev: true - /log-symbols/3.0.0: + /log-symbols@3.0.0: resolution: {integrity: sha512-dSkNGuI7iG3mfvDzUuYZyvk5dD9ocYCYzNU6CYDE6+Xqd+gwme6Z00NS3dUh8mq/73HaEtT7m6W+yUPtU6BZnQ==} engines: {node: '>=8'} dependencies: chalk: 2.4.2 dev: true - /log-symbols/4.1.0: + /log-symbols@4.1.0: resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==} engines: {node: '>=10'} dependencies: @@ -13506,7 +13827,7 @@ packages: is-unicode-supported: 0.1.0 dev: true - /log-update/4.0.0: + /log-update@4.0.0: resolution: {integrity: sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg==} engines: {node: '>=10'} dependencies: @@ -13516,119 +13837,119 @@ packages: wrap-ansi: 6.2.0 dev: true - /longest-streak/3.1.0: + /longest-streak@3.1.0: resolution: {integrity: sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==} dev: false - /looper/2.0.0: + /looper@2.0.0: resolution: {integrity: sha512-6DzMHJcjbQX/UPHc1rRCBfKlLwDkvuGZ715cIR36wSdYqWXFT35uLXq5P/2orl3tz+t+VOVPxw4yPinQlUDGDQ==} dev: true - /looper/3.0.0: + /looper@3.0.0: resolution: {integrity: sha512-LJ9wplN/uSn72oJRsXTx+snxPet5c8XiZmOKCm906NVYu+ag6SB6vUcnJcWxgnl2NfbIyeobAn7Bwv6xRj2XJg==} dev: true - /loose-envify/1.4.0: + /loose-envify@1.4.0: resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} hasBin: true dependencies: js-tokens: 4.0.0 - /lottie-web/5.10.0: + /lottie-web@5.10.0: resolution: {integrity: sha512-q2hfqKrGXNkwjSSZjKxf3fWMi0e3ZBc03qBkVWoGbwUJ7BcG+9YXjMPtmmhitzk8Nc6VQ5PRnh9yInPdfq0PZg==} dev: false - /loupe/2.3.6: + /loupe@2.3.6: resolution: {integrity: sha512-RaPMZKiMy8/JruncMU5Bt6na1eftNoo++R4Y+N2FrxkDVTrGvcyzFTsaGif4QTeKESheMGegbhw6iUAq+5A8zA==} dependencies: get-func-name: 2.0.0 dev: true - /lower-case/2.0.2: + /lower-case@2.0.2: resolution: {integrity: sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==} dependencies: tslib: 2.5.0 dev: true - /lowercase-keys/1.0.1: + /lowercase-keys@1.0.1: resolution: {integrity: sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==} engines: {node: '>=0.10.0'} dev: true optional: true - /lowercase-keys/2.0.0: + /lowercase-keys@2.0.0: resolution: {integrity: sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==} engines: {node: '>=8'} dev: true optional: true - /lru-cache/3.2.0: + /lru-cache@3.2.0: resolution: {integrity: sha512-91gyOKTc2k66UG6kHiH4h3S2eltcPwE1STVfMYC/NG+nZwf8IIuiamfmpGZjpbbxzSyEJaLC0tNSmhjlQUTJow==} dependencies: pseudomap: 1.0.2 dev: true - /lru-cache/4.1.5: + /lru-cache@4.1.5: resolution: {integrity: sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==} dependencies: pseudomap: 1.0.2 yallist: 2.1.2 - /lru-cache/5.1.1: + /lru-cache@5.1.1: resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} dependencies: yallist: 3.1.1 dev: true - /lru-cache/6.0.0: + /lru-cache@6.0.0: resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} engines: {node: '>=10'} dependencies: yallist: 4.0.0 - /lru-queue/0.1.0: + /lru-queue@0.1.0: resolution: {integrity: sha512-BpdYkt9EvGl8OfWHDQPISVpcl5xZthb+XPsbELj5AQXxIC8IriDZIQYjBJPEm5rS420sjZ0TLEzRcq5KdBhYrQ==} dependencies: es5-ext: 0.10.62 dev: false - /lru_map/0.3.3: + /lru_map@0.3.3: resolution: {integrity: sha512-Pn9cox5CsMYngeDbmChANltQl+5pi6XmTrraMSzhPmMBbmgcxmqWry0U3PGapCU1yB4/LqCcom7qhHZiF/jGfQ==} dev: true - /ltgt/2.1.3: + /ltgt@2.1.3: resolution: {integrity: sha512-5VjHC5GsENtIi5rbJd+feEpDKhfr7j0odoUR2Uh978g+2p93nd5o34cTjQWohXsPsCZeqoDnIqEf88mPCe0Pfw==} dev: true - /ltgt/2.2.1: + /ltgt@2.2.1: resolution: {integrity: sha512-AI2r85+4MquTw9ZYqabu4nMwy9Oftlfa/e/52t9IjtfG+mGBbTNdAoZ3RQKLHR6r0wQnwZnPIEh/Ya6XTWAKNA==} dev: true - /magic-string/0.25.9: + /magic-string@0.25.9: resolution: {integrity: sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==} dependencies: sourcemap-codec: 1.4.8 dev: true - /magic-string/0.26.7: + /magic-string@0.26.7: resolution: {integrity: sha512-hX9XH3ziStPoPhJxLq1syWuZMxbDvGNbVchfrdCtanC7D13888bMFow61x8axrx+GfHLtVeAx2kxL7tTGRl+Ow==} engines: {node: '>=12'} dependencies: sourcemap-codec: 1.4.8 dev: true - /make-dir/3.1.0: + /make-dir@3.1.0: resolution: {integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==} engines: {node: '>=8'} dependencies: semver: 6.3.0 dev: true - /make-error/1.3.6: + /make-error@1.3.6: resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} dev: true - /make-fetch-happen/9.1.0: + /make-fetch-happen@9.1.0: resolution: {integrity: sha512-+zopwDy7DNknmwPQplem5lAZX/eCOzSvSNNcSKm5eVwTkOBzoktEfXsa9L23J/GIRhxRsaxzkPEhrJEpE2F4Gg==} engines: {node: '>= 10'} dependencies: @@ -13653,67 +13974,67 @@ packages: - supports-color dev: true - /makeerror/1.0.12: + /makeerror@1.0.12: resolution: {integrity: sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==} dependencies: tmpl: 1.0.5 dev: true - /map-cache/0.2.2: + /map-cache@0.2.2: resolution: {integrity: sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg==} engines: {node: '>=0.10.0'} dev: true - /map-obj/1.0.1: + /map-obj@1.0.1: resolution: {integrity: sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==} engines: {node: '>=0.10.0'} dev: true - /map-obj/4.3.0: + /map-obj@4.3.0: resolution: {integrity: sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==} engines: {node: '>=8'} dev: true - /map-visit/1.0.0: + /map-visit@1.0.0: resolution: {integrity: sha512-4y7uGv8bd2WdM9vpQsiQNo41Ln1NvhvDRuVt0k2JZQ+ezN2uaQes7lZeZ+QQUHOLQAtDaBJ+7wCbi+ab/KFs+w==} engines: {node: '>=0.10.0'} dependencies: object-visit: 1.0.1 dev: true - /markdown-extensions/1.1.1: + /markdown-extensions@1.1.1: resolution: {integrity: sha512-WWC0ZuMzCyDHYCasEGs4IPvLyTGftYwh6wIEOULOF0HXcqZlhwRzrK0w2VUlxWA98xnvb/jszw4ZSkJ6ADpM6Q==} engines: {node: '>=0.10.0'} dev: false - /markdown-table/1.1.3: + /markdown-table@1.1.3: resolution: {integrity: sha512-1RUZVgQlpJSPWYbFSpmudq5nHY1doEIv89gBtF0s4gW1GF2XorxcA/70M5vq7rLv0a6mhOUccRsqkwhwLCIQ2Q==} dev: true - /markdown-table/3.0.3: + /markdown-table@3.0.3: resolution: {integrity: sha512-Z1NL3Tb1M9wH4XESsCDEksWoKTdlUafKc4pt0GRwjUyXaCFZ+dc3g2erqB6zm3szA2IUSi7VnPI+o/9jnxh9hw==} dev: false - /match-sorter/6.3.1: + /match-sorter@6.3.1: resolution: {integrity: sha512-mxybbo3pPNuA+ZuCUhm5bwNkXrJTbsk5VWbR5wiwz/GC6LIiegBGn2w3O08UG/jdbYLinw51fSQ5xNU1U3MgBw==} dependencies: '@babel/runtime': 7.21.0 remove-accents: 0.4.2 dev: false - /mcl-wasm/0.7.9: + /mcl-wasm@0.7.9: resolution: {integrity: sha512-iJIUcQWA88IJB/5L15GnJVnSQJmf/YaxxV6zRavv83HILHaJQb6y0iFyDMdDO0gN8X37tdxmAOrH/P8B6RB8sQ==} engines: {node: '>=8.9.0'} dev: true - /md5.js/1.3.5: + /md5.js@1.3.5: resolution: {integrity: sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==} dependencies: hash-base: 3.1.0 inherits: 2.0.4 safe-buffer: 5.2.1 - /mdast-util-definitions/5.1.2: + /mdast-util-definitions@5.1.2: resolution: {integrity: sha512-8SVPMuHqlPME/z3gqVwWY4zVXn8lqKv/pAhC57FuJ40ImXyBpmO5ukh98zB2v7Blql2FiHjHv9LVztSIqjY+MA==} dependencies: '@types/mdast': 3.0.10 @@ -13721,7 +14042,7 @@ packages: unist-util-visit: 4.1.2 dev: false - /mdast-util-find-and-replace/2.2.2: + /mdast-util-find-and-replace@2.2.2: resolution: {integrity: sha512-MTtdFRz/eMDHXzeK6W3dO7mXUlF82Gom4y0oOgvHhh/HXZAGvIQDUvQ0SuUx+j2tv44b8xTHOm8K/9OoRFnXKw==} dependencies: '@types/mdast': 3.0.10 @@ -13730,7 +14051,7 @@ packages: unist-util-visit-parents: 5.1.3 dev: false - /mdast-util-from-markdown/1.3.0: + /mdast-util-from-markdown@1.3.0: resolution: {integrity: sha512-HN3W1gRIuN/ZW295c7zi7g9lVBllMgZE40RxCX37wrTPWXCWtpvOZdfnuK+1WNpvZje6XuJeI3Wnb4TJEUem+g==} dependencies: '@types/mdast': 3.0.10 @@ -13749,7 +14070,7 @@ packages: - supports-color dev: false - /mdast-util-gfm-autolink-literal/1.0.3: + /mdast-util-gfm-autolink-literal@1.0.3: resolution: {integrity: sha512-My8KJ57FYEy2W2LyNom4n3E7hKTuQk/0SES0u16tjA9Z3oFkF4RrC/hPAPgjlSpezsOvI8ObcXcElo92wn5IGA==} dependencies: '@types/mdast': 3.0.10 @@ -13758,7 +14079,7 @@ packages: micromark-util-character: 1.1.0 dev: false - /mdast-util-gfm-footnote/1.0.2: + /mdast-util-gfm-footnote@1.0.2: resolution: {integrity: sha512-56D19KOGbE00uKVj3sgIykpwKL179QsVFwx/DCW0u/0+URsryacI4MAdNJl0dh+u2PSsD9FtxPFbHCzJ78qJFQ==} dependencies: '@types/mdast': 3.0.10 @@ -13766,14 +14087,14 @@ packages: micromark-util-normalize-identifier: 1.0.0 dev: false - /mdast-util-gfm-strikethrough/1.0.3: + /mdast-util-gfm-strikethrough@1.0.3: resolution: {integrity: sha512-DAPhYzTYrRcXdMjUtUjKvW9z/FNAMTdU0ORyMcbmkwYNbKocDpdk+PX1L1dQgOID/+vVs1uBQ7ElrBQfZ0cuiQ==} dependencies: '@types/mdast': 3.0.10 mdast-util-to-markdown: 1.5.0 dev: false - /mdast-util-gfm-table/1.0.7: + /mdast-util-gfm-table@1.0.7: resolution: {integrity: sha512-jjcpmNnQvrmN5Vx7y7lEc2iIOEytYv7rTvu+MeyAsSHTASGCCRA79Igg2uKssgOs1i1po8s3plW0sTu1wkkLGg==} dependencies: '@types/mdast': 3.0.10 @@ -13784,14 +14105,14 @@ packages: - supports-color dev: false - /mdast-util-gfm-task-list-item/1.0.2: + /mdast-util-gfm-task-list-item@1.0.2: resolution: {integrity: sha512-PFTA1gzfp1B1UaiJVyhJZA1rm0+Tzn690frc/L8vNX1Jop4STZgOE6bxUhnzdVSB+vm2GU1tIsuQcA9bxTQpMQ==} dependencies: '@types/mdast': 3.0.10 mdast-util-to-markdown: 1.5.0 dev: false - /mdast-util-gfm/2.0.2: + /mdast-util-gfm@2.0.2: resolution: {integrity: sha512-qvZ608nBppZ4icQlhQQIAdc6S3Ffj9RGmzwUKUWuEICFnd1LVkN3EktF7ZHAgfcEdvZB5owU9tQgt99e2TlLjg==} dependencies: mdast-util-from-markdown: 1.3.0 @@ -13805,7 +14126,7 @@ packages: - supports-color dev: false - /mdast-util-math/2.0.2: + /mdast-util-math@2.0.2: resolution: {integrity: sha512-8gmkKVp9v6+Tgjtq6SYx9kGPpTf6FVYRa53/DLh479aldR9AyP48qeVOgNZ5X7QUK7nOy4yw7vg6mbiGcs9jWQ==} dependencies: '@types/mdast': 3.0.10 @@ -13813,7 +14134,7 @@ packages: mdast-util-to-markdown: 1.5.0 dev: false - /mdast-util-mdx-expression/1.3.2: + /mdast-util-mdx-expression@1.3.2: resolution: {integrity: sha512-xIPmR5ReJDu/DHH1OoIT1HkuybIfRGYRywC+gJtI7qHjCJp/M9jrmBEJW22O8lskDWm562BX2W8TiAwRTb0rKA==} dependencies: '@types/estree-jsx': 1.0.0 @@ -13825,7 +14146,7 @@ packages: - supports-color dev: false - /mdast-util-mdx-jsx/2.1.2: + /mdast-util-mdx-jsx@2.1.2: resolution: {integrity: sha512-o9vBCYQK5ZLGEj3tCGISJGjvafyHRVJlZmfJzSE7xjiogSzIeph/Z4zMY65q4WGRMezQBeAwPlrdymDYYYx0tA==} dependencies: '@types/estree-jsx': 1.0.0 @@ -13844,7 +14165,7 @@ packages: - supports-color dev: false - /mdast-util-mdx/2.0.1: + /mdast-util-mdx@2.0.1: resolution: {integrity: sha512-38w5y+r8nyKlGvNjSEqWrhG0w5PmnRA+wnBvm+ulYCct7nsGYhFVb0lljS9bQav4psDAS1eGkP2LMVcZBi/aqw==} dependencies: mdast-util-from-markdown: 1.3.0 @@ -13856,7 +14177,7 @@ packages: - supports-color dev: false - /mdast-util-mdxjs-esm/1.3.1: + /mdast-util-mdxjs-esm@1.3.1: resolution: {integrity: sha512-SXqglS0HrEvSdUEfoXFtcg7DRl7S2cwOXc7jkuusG472Mmjag34DUDeOJUZtl+BVnyeO1frIgVpHlNRWc2gk/w==} dependencies: '@types/estree-jsx': 1.0.0 @@ -13868,14 +14189,14 @@ packages: - supports-color dev: false - /mdast-util-phrasing/3.0.1: + /mdast-util-phrasing@3.0.1: resolution: {integrity: sha512-WmI1gTXUBJo4/ZmSk79Wcb2HcjPJBzM1nlI/OUWA8yk2X9ik3ffNbBGsU+09BFmXaL1IBb9fiuvq6/KMiNycSg==} dependencies: '@types/mdast': 3.0.10 unist-util-is: 5.2.1 dev: false - /mdast-util-to-hast/12.3.0: + /mdast-util-to-hast@12.3.0: resolution: {integrity: sha512-pits93r8PhnIoU4Vy9bjW39M2jJ6/tdHyja9rrot9uujkN7UTU9SDnE6WNJz/IGyQk3XHX6yNNtrBH6cQzm8Hw==} dependencies: '@types/hast': 2.3.4 @@ -13888,7 +14209,7 @@ packages: unist-util-visit: 4.1.2 dev: false - /mdast-util-to-markdown/1.5.0: + /mdast-util-to-markdown@1.5.0: resolution: {integrity: sha512-bbv7TPv/WC49thZPg3jXuqzuvI45IL2EVAr/KxF0BSdHsU0ceFHOmwQn6evxAh1GaoK/6GQ1wp4R4oW2+LFL/A==} dependencies: '@types/mdast': 3.0.10 @@ -13901,19 +14222,19 @@ packages: zwitch: 2.0.4 dev: false - /mdast-util-to-string/3.1.1: + /mdast-util-to-string@3.1.1: resolution: {integrity: sha512-tGvhT94e+cVnQt8JWE9/b3cUQZWS732TJxXHktvP+BYo62PpYD53Ls/6cC60rW21dW+txxiM4zMdc6abASvZKA==} dependencies: '@types/mdast': 3.0.10 dev: false - /media-typer/0.3.0: + /media-typer@0.3.0: resolution: {integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==} engines: {node: '>= 0.6'} dev: true optional: true - /memdown/1.4.1: + /memdown@1.4.1: resolution: {integrity: sha512-iVrGHZB8i4OQfM155xx8akvG9FIj+ht14DX5CQkCTG4EHzZ3d3sgckIf/Lm9ivZalEsFuEVnWv2B2WZvbrro2w==} dependencies: abstract-leveldown: 2.7.2 @@ -13924,7 +14245,7 @@ packages: safe-buffer: 5.1.2 dev: true - /memdown/3.0.0: + /memdown@3.0.0: resolution: {integrity: sha512-tbV02LfZMWLcHcq4tw++NuqMO+FZX8tNJEiD2aNRm48ZZusVg5N8NART+dmBkepJVye986oixErf7jfXboMGMA==} engines: {node: '>=6'} dependencies: @@ -13936,7 +14257,7 @@ packages: safe-buffer: 5.1.2 dev: true - /memdown/5.1.0: + /memdown@5.1.0: resolution: {integrity: sha512-B3J+UizMRAlEArDjWHTMmadet+UKwHd3UjMgGBkZcKAxAYVPS9o0Yeiha4qvz7iGiL2Sb3igUft6p7nbFWctpw==} engines: {node: '>=6'} dependencies: @@ -13948,7 +14269,7 @@ packages: safe-buffer: 5.2.1 dev: true - /memoizee/0.4.15: + /memoizee@0.4.15: resolution: {integrity: sha512-UBWmJpLZd5STPm7PMUlOw/TSy972M+z8gcyQ5veOnSDRREz/0bmpyTfKt3/51DhEBqCZQn1udM/5flcSPYhkdQ==} dependencies: d: 1.0.1 @@ -13961,7 +14282,7 @@ packages: timers-ext: 0.1.7 dev: false - /memory-level/1.0.0: + /memory-level@1.0.0: resolution: {integrity: sha512-UXzwewuWeHBz5krr7EvehKcmLFNoXxGcvuYhC41tRnkrTbJohtS7kVn9akmgirtRygg+f7Yjsfi8Uu5SGSQ4Og==} engines: {node: '>=12'} dependencies: @@ -13970,11 +14291,11 @@ packages: module-error: 1.0.2 dev: true - /memorystream/0.3.1: + /memorystream@0.3.1: resolution: {integrity: sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw==} engines: {node: '>= 0.10.0'} - /meow/9.0.0: + /meow@9.0.0: resolution: {integrity: sha512-+obSblOQmRhcyBt62furQqRAQpNyWXo8BuQ5bN7dG8wmwQ+vwHKp/rCFD4CrTP8CsDQD1sjoZ94K417XEUk8IQ==} engines: {node: '>=10'} dependencies: @@ -13992,27 +14313,27 @@ packages: yargs-parser: 20.2.4 dev: true - /merge-descriptors/1.0.1: + /merge-descriptors@1.0.1: resolution: {integrity: sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==} dev: true optional: true - /merge-source-map/1.1.0: + /merge-source-map@1.1.0: resolution: {integrity: sha512-Qkcp7P2ygktpMPh2mCQZaf3jhN6D3Z/qVZHSdWvQ+2Ef5HgRAPBO57A77+ENm0CPx2+1Ce/MYKi3ymqdfuqibw==} dependencies: source-map: 0.6.1 dev: true - /merge-stream/2.0.0: + /merge-stream@2.0.0: resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} dev: true - /merge2/1.4.1: + /merge2@1.4.1: resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} engines: {node: '>= 8'} dev: true - /merkle-patricia-tree/2.3.2: + /merkle-patricia-tree@2.3.2: resolution: {integrity: sha512-81PW5m8oz/pz3GvsAwbauj7Y00rqm81Tzad77tHBwU7pIAtN+TJnMSOJhxBKflSVYhptMMb9RskhqHqrSm1V+g==} dependencies: async: 1.5.2 @@ -14025,7 +14346,7 @@ packages: semaphore: 1.1.0 dev: true - /merkle-patricia-tree/3.0.0: + /merkle-patricia-tree@3.0.0: resolution: {integrity: sha512-soRaMuNf/ILmw3KWbybaCjhx86EYeBbD8ph0edQCTed0JN/rxDt1EBN52Ajre3VyGo+91f8+/rfPIRQnnGMqmQ==} dependencies: async: 2.6.4 @@ -14037,7 +14358,7 @@ packages: semaphore: 1.1.0 dev: true - /merkle-patricia-tree/4.2.4: + /merkle-patricia-tree@4.2.4: resolution: {integrity: sha512-eHbf/BG6eGNsqqfbLED9rIqbsF4+sykEaBn6OLNs71tjclbMcMOk1tEPmJKcNcNCLkvbpY/lwyOlizWsqPNo8w==} dependencies: '@types/levelup': 4.3.3 @@ -14048,13 +14369,13 @@ packages: semaphore-async-await: 1.5.1 dev: true - /methods/1.1.2: + /methods@1.1.2: resolution: {integrity: sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==} engines: {node: '>= 0.6'} dev: true optional: true - /micromark-core-commonmark/1.0.6: + /micromark-core-commonmark@1.0.6: resolution: {integrity: sha512-K+PkJTxqjFfSNkfAhp4GB+cZPfQd6dxtTXnf+RjZOV7T4EEXnvgzOcnp+eSTmpGk9d1S9sL6/lqrgSNn/s0HZA==} dependencies: decode-named-character-reference: 1.0.2 @@ -14075,7 +14396,7 @@ packages: uvu: 0.5.6 dev: false - /micromark-extension-gfm-autolink-literal/1.0.3: + /micromark-extension-gfm-autolink-literal@1.0.3: resolution: {integrity: sha512-i3dmvU0htawfWED8aHMMAzAVp/F0Z+0bPh3YrbTPPL1v4YAlCZpy5rBO5p0LPYiZo0zFVkoYh7vDU7yQSiCMjg==} dependencies: micromark-util-character: 1.1.0 @@ -14085,7 +14406,7 @@ packages: uvu: 0.5.6 dev: false - /micromark-extension-gfm-footnote/1.0.4: + /micromark-extension-gfm-footnote@1.0.4: resolution: {integrity: sha512-E/fmPmDqLiMUP8mLJ8NbJWJ4bTw6tS+FEQS8CcuDtZpILuOb2kjLqPEeAePF1djXROHXChM/wPJw0iS4kHCcIg==} dependencies: micromark-core-commonmark: 1.0.6 @@ -14098,7 +14419,7 @@ packages: uvu: 0.5.6 dev: false - /micromark-extension-gfm-strikethrough/1.0.4: + /micromark-extension-gfm-strikethrough@1.0.4: resolution: {integrity: sha512-/vjHU/lalmjZCT5xt7CcHVJGq8sYRm80z24qAKXzaHzem/xsDYb2yLL+NNVbYvmpLx3O7SYPuGL5pzusL9CLIQ==} dependencies: micromark-util-chunked: 1.0.0 @@ -14109,7 +14430,7 @@ packages: uvu: 0.5.6 dev: false - /micromark-extension-gfm-table/1.0.5: + /micromark-extension-gfm-table@1.0.5: resolution: {integrity: sha512-xAZ8J1X9W9K3JTJTUL7G6wSKhp2ZYHrFk5qJgY/4B33scJzE2kpfRL6oiw/veJTbt7jiM/1rngLlOKPWr1G+vg==} dependencies: micromark-factory-space: 1.0.0 @@ -14119,13 +14440,13 @@ packages: uvu: 0.5.6 dev: false - /micromark-extension-gfm-tagfilter/1.0.1: + /micromark-extension-gfm-tagfilter@1.0.1: resolution: {integrity: sha512-Ty6psLAcAjboRa/UKUbbUcwjVAv5plxmpUTy2XC/3nJFL37eHej8jrHrRzkqcpipJliuBH30DTs7+3wqNcQUVA==} dependencies: micromark-util-types: 1.0.2 dev: false - /micromark-extension-gfm-task-list-item/1.0.3: + /micromark-extension-gfm-task-list-item@1.0.3: resolution: {integrity: sha512-PpysK2S1Q/5VXi72IIapbi/jliaiOFzv7THH4amwXeYXLq3l1uo8/2Be0Ac1rEwK20MQEsGH2ltAZLNY2KI/0Q==} dependencies: micromark-factory-space: 1.0.0 @@ -14135,7 +14456,7 @@ packages: uvu: 0.5.6 dev: false - /micromark-extension-gfm/2.0.1: + /micromark-extension-gfm@2.0.1: resolution: {integrity: sha512-p2sGjajLa0iYiGQdT0oelahRYtMWvLjy8J9LOCxzIQsllMCGLbsLW+Nc+N4vi02jcRJvedVJ68cjelKIO6bpDA==} dependencies: micromark-extension-gfm-autolink-literal: 1.0.3 @@ -14148,7 +14469,7 @@ packages: micromark-util-types: 1.0.2 dev: false - /micromark-extension-math/2.0.2: + /micromark-extension-math@2.0.2: resolution: {integrity: sha512-cFv2B/E4pFPBBFuGgLHkkNiFAIQv08iDgPH2HCuR2z3AUgMLecES5Cq7AVtwOtZeRrbA80QgMUk8VVW0Z+D2FA==} dependencies: '@types/katex': 0.11.1 @@ -14160,7 +14481,7 @@ packages: uvu: 0.5.6 dev: false - /micromark-extension-mdx-expression/1.0.4: + /micromark-extension-mdx-expression@1.0.4: resolution: {integrity: sha512-TCgLxqW6ReQ3AJgtj1P0P+8ZThBTloLbeb7jNaqr6mCOLDpxUiBFE/9STgooMZttEwOQu5iEcCCa3ZSDhY9FGw==} dependencies: micromark-factory-mdx-expression: 1.0.7 @@ -14172,7 +14493,7 @@ packages: uvu: 0.5.6 dev: false - /micromark-extension-mdx-jsx/1.0.3: + /micromark-extension-mdx-jsx@1.0.3: resolution: {integrity: sha512-VfA369RdqUISF0qGgv2FfV7gGjHDfn9+Qfiv5hEwpyr1xscRj/CiVRkU7rywGFCO7JwJ5L0e7CJz60lY52+qOA==} dependencies: '@types/acorn': 4.0.6 @@ -14186,13 +14507,13 @@ packages: vfile-message: 3.1.4 dev: false - /micromark-extension-mdx-md/1.0.0: + /micromark-extension-mdx-md@1.0.0: resolution: {integrity: sha512-xaRAMoSkKdqZXDAoSgp20Azm0aRQKGOl0RrS81yGu8Hr/JhMsBmfs4wR7m9kgVUIO36cMUQjNyiyDKPrsv8gOw==} dependencies: micromark-util-types: 1.0.2 dev: false - /micromark-extension-mdxjs-esm/1.0.3: + /micromark-extension-mdxjs-esm@1.0.3: resolution: {integrity: sha512-2N13ol4KMoxb85rdDwTAC6uzs8lMX0zeqpcyx7FhS7PxXomOnLactu8WI8iBNXW8AVyea3KIJd/1CKnUmwrK9A==} dependencies: micromark-core-commonmark: 1.0.6 @@ -14205,11 +14526,11 @@ packages: vfile-message: 3.1.4 dev: false - /micromark-extension-mdxjs/1.0.0: + /micromark-extension-mdxjs@1.0.0: resolution: {integrity: sha512-TZZRZgeHvtgm+IhtgC2+uDMR7h8eTKF0QUX9YsgoL9+bADBpBY6SiLvWqnBlLbCEevITmTqmEuY3FoxMKVs1rQ==} dependencies: acorn: 8.8.2 - acorn-jsx: 5.3.2_acorn@8.8.2 + acorn-jsx: 5.3.2(acorn@8.8.2) micromark-extension-mdx-expression: 1.0.4 micromark-extension-mdx-jsx: 1.0.3 micromark-extension-mdx-md: 1.0.0 @@ -14218,7 +14539,7 @@ packages: micromark-util-types: 1.0.2 dev: false - /micromark-factory-destination/1.0.0: + /micromark-factory-destination@1.0.0: resolution: {integrity: sha512-eUBA7Rs1/xtTVun9TmV3gjfPz2wEwgK5R5xcbIM5ZYAtvGF6JkyaDsj0agx8urXnO31tEO6Ug83iVH3tdedLnw==} dependencies: micromark-util-character: 1.1.0 @@ -14226,7 +14547,7 @@ packages: micromark-util-types: 1.0.2 dev: false - /micromark-factory-label/1.0.2: + /micromark-factory-label@1.0.2: resolution: {integrity: sha512-CTIwxlOnU7dEshXDQ+dsr2n+yxpP0+fn271pu0bwDIS8uqfFcumXpj5mLn3hSC8iw2MUr6Gx8EcKng1dD7i6hg==} dependencies: micromark-util-character: 1.1.0 @@ -14235,7 +14556,7 @@ packages: uvu: 0.5.6 dev: false - /micromark-factory-mdx-expression/1.0.7: + /micromark-factory-mdx-expression@1.0.7: resolution: {integrity: sha512-QAdFbkQagTZ/eKb8zDGqmjvgevgJH3+aQpvvKrXWxNJp3o8/l2cAbbrBd0E04r0Gx6nssPpqWIjnbHFvZu5qsQ==} dependencies: micromark-factory-space: 1.0.0 @@ -14248,14 +14569,14 @@ packages: vfile-message: 3.1.4 dev: false - /micromark-factory-space/1.0.0: + /micromark-factory-space@1.0.0: resolution: {integrity: sha512-qUmqs4kj9a5yBnk3JMLyjtWYN6Mzfcx8uJfi5XAveBniDevmZasdGBba5b4QsvRcAkmvGo5ACmSUmyGiKTLZew==} dependencies: micromark-util-character: 1.1.0 micromark-util-types: 1.0.2 dev: false - /micromark-factory-title/1.0.2: + /micromark-factory-title@1.0.2: resolution: {integrity: sha512-zily+Nr4yFqgMGRKLpTVsNl5L4PMu485fGFDOQJQBl2NFpjGte1e86zC0da93wf97jrc4+2G2GQudFMHn3IX+A==} dependencies: micromark-factory-space: 1.0.0 @@ -14265,7 +14586,7 @@ packages: uvu: 0.5.6 dev: false - /micromark-factory-whitespace/1.0.0: + /micromark-factory-whitespace@1.0.0: resolution: {integrity: sha512-Qx7uEyahU1lt1RnsECBiuEbfr9INjQTGa6Err+gF3g0Tx4YEviPbqqGKNv/NrBaE7dVHdn1bVZKM/n5I/Bak7A==} dependencies: micromark-factory-space: 1.0.0 @@ -14274,20 +14595,20 @@ packages: micromark-util-types: 1.0.2 dev: false - /micromark-util-character/1.1.0: + /micromark-util-character@1.1.0: resolution: {integrity: sha512-agJ5B3unGNJ9rJvADMJ5ZiYjBRyDpzKAOk01Kpi1TKhlT1APx3XZk6eN7RtSz1erbWHC2L8T3xLZ81wdtGRZzg==} dependencies: micromark-util-symbol: 1.0.1 micromark-util-types: 1.0.2 dev: false - /micromark-util-chunked/1.0.0: + /micromark-util-chunked@1.0.0: resolution: {integrity: sha512-5e8xTis5tEZKgesfbQMKRCyzvffRRUX+lK/y+DvsMFdabAicPkkZV6gO+FEWi9RfuKKoxxPwNL+dFF0SMImc1g==} dependencies: micromark-util-symbol: 1.0.1 dev: false - /micromark-util-classify-character/1.0.0: + /micromark-util-classify-character@1.0.0: resolution: {integrity: sha512-F8oW2KKrQRb3vS5ud5HIqBVkCqQi224Nm55o5wYLzY/9PwHGXC01tr3d7+TqHHz6zrKQ72Okwtvm/xQm6OVNZA==} dependencies: micromark-util-character: 1.1.0 @@ -14295,20 +14616,20 @@ packages: micromark-util-types: 1.0.2 dev: false - /micromark-util-combine-extensions/1.0.0: + /micromark-util-combine-extensions@1.0.0: resolution: {integrity: sha512-J8H058vFBdo/6+AsjHp2NF7AJ02SZtWaVUjsayNFeAiydTxUwViQPxN0Hf8dp4FmCQi0UUFovFsEyRSUmFH3MA==} dependencies: micromark-util-chunked: 1.0.0 micromark-util-types: 1.0.2 dev: false - /micromark-util-decode-numeric-character-reference/1.0.0: + /micromark-util-decode-numeric-character-reference@1.0.0: resolution: {integrity: sha512-OzO9AI5VUtrTD7KSdagf4MWgHMtET17Ua1fIpXTpuhclCqD8egFWo85GxSGvxgkGS74bEahvtM0WP0HjvV0e4w==} dependencies: micromark-util-symbol: 1.0.1 dev: false - /micromark-util-decode-string/1.0.2: + /micromark-util-decode-string@1.0.2: resolution: {integrity: sha512-DLT5Ho02qr6QWVNYbRZ3RYOSSWWFuH3tJexd3dgN1odEuPNxCngTCXJum7+ViRAd9BbdxCvMToPOD/IvVhzG6Q==} dependencies: decode-named-character-reference: 1.0.2 @@ -14317,11 +14638,11 @@ packages: micromark-util-symbol: 1.0.1 dev: false - /micromark-util-encode/1.0.1: + /micromark-util-encode@1.0.1: resolution: {integrity: sha512-U2s5YdnAYexjKDel31SVMPbfi+eF8y1U4pfiRW/Y8EFVCy/vgxk/2wWTxzcqE71LHtCuCzlBDRU2a5CQ5j+mQA==} dev: false - /micromark-util-events-to-acorn/1.2.1: + /micromark-util-events-to-acorn@1.2.1: resolution: {integrity: sha512-mkg3BaWlw6ZTkQORrKVBW4o9ICXPxLtGz51vml5mQpKFdo9vqIX68CAx5JhTOdjQyAHH7JFmm4rh8toSPQZUmg==} dependencies: '@types/acorn': 4.0.6 @@ -14333,23 +14654,23 @@ packages: vfile-message: 3.1.4 dev: false - /micromark-util-html-tag-name/1.1.0: + /micromark-util-html-tag-name@1.1.0: resolution: {integrity: sha512-BKlClMmYROy9UiV03SwNmckkjn8QHVaWkqoAqzivabvdGcwNGMMMH/5szAnywmsTBUzDsU57/mFi0sp4BQO6dA==} dev: false - /micromark-util-normalize-identifier/1.0.0: + /micromark-util-normalize-identifier@1.0.0: resolution: {integrity: sha512-yg+zrL14bBTFrQ7n35CmByWUTFsgst5JhA4gJYoty4Dqzj4Z4Fr/DHekSS5aLfH9bdlfnSvKAWsAgJhIbogyBg==} dependencies: micromark-util-symbol: 1.0.1 dev: false - /micromark-util-resolve-all/1.0.0: + /micromark-util-resolve-all@1.0.0: resolution: {integrity: sha512-CB/AGk98u50k42kvgaMM94wzBqozSzDDaonKU7P7jwQIuH2RU0TeBqGYJz2WY1UdihhjweivStrJ2JdkdEmcfw==} dependencies: micromark-util-types: 1.0.2 dev: false - /micromark-util-sanitize-uri/1.1.0: + /micromark-util-sanitize-uri@1.1.0: resolution: {integrity: sha512-RoxtuSCX6sUNtxhbmsEFQfWzs8VN7cTctmBPvYivo98xb/kDEoTCtJQX5wyzIYEmk/lvNFTat4hL8oW0KndFpg==} dependencies: micromark-util-character: 1.1.0 @@ -14357,7 +14678,7 @@ packages: micromark-util-symbol: 1.0.1 dev: false - /micromark-util-subtokenize/1.0.2: + /micromark-util-subtokenize@1.0.2: resolution: {integrity: sha512-d90uqCnXp/cy4G881Ub4psE57Sf8YD0pim9QdjCRNjfas2M1u6Lbt+XZK9gnHL2XFhnozZiEdCa9CNfXSfQ6xA==} dependencies: micromark-util-chunked: 1.0.0 @@ -14366,19 +14687,19 @@ packages: uvu: 0.5.6 dev: false - /micromark-util-symbol/1.0.1: + /micromark-util-symbol@1.0.1: resolution: {integrity: sha512-oKDEMK2u5qqAptasDAwWDXq0tG9AssVwAx3E9bBF3t/shRIGsWIRG+cGafs2p/SnDSOecnt6hZPCE2o6lHfFmQ==} dev: false - /micromark-util-types/1.0.2: + /micromark-util-types@1.0.2: resolution: {integrity: sha512-DCfg/T8fcrhrRKTPjRrw/5LLvdGV7BHySf/1LOZx7TzWZdYRjogNtyNq885z3nNallwr3QUKARjqvHqX1/7t+w==} dev: false - /micromark/3.1.0: + /micromark@3.1.0: resolution: {integrity: sha512-6Mj0yHLdUZjHnOPgr5xfWIMqMWS12zDN6iws9SLuSz76W8jTtAv24MN4/CL7gJrl5vtxGInkkqDv/JIoRsQOvA==} dependencies: '@types/debug': 4.1.7 - debug: 4.3.4 + debug: 4.3.4(supports-color@8.1.1) decode-named-character-reference: 1.0.2 micromark-core-commonmark: 1.0.6 micromark-factory-space: 1.0.0 @@ -14398,7 +14719,7 @@ packages: - supports-color dev: false - /micromatch/3.1.10: + /micromatch@3.1.10: resolution: {integrity: sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==} engines: {node: '>=0.10.0'} dependencies: @@ -14419,7 +14740,7 @@ packages: - supports-color dev: true - /micromatch/4.0.5: + /micromatch@4.0.5: resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} engines: {node: '>=8.6'} dependencies: @@ -14427,7 +14748,7 @@ packages: picomatch: 2.3.1 dev: true - /miller-rabin/4.0.1: + /miller-rabin@4.0.1: resolution: {integrity: sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==} hasBin: true dependencies: @@ -14435,82 +14756,82 @@ packages: brorand: 1.1.0 dev: true - /mime-db/1.52.0: + /mime-db@1.52.0: resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} engines: {node: '>= 0.6'} - /mime-types/2.1.35: + /mime-types@2.1.35: resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} engines: {node: '>= 0.6'} dependencies: mime-db: 1.52.0 - /mime/1.6.0: + /mime@1.6.0: resolution: {integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==} engines: {node: '>=4'} hasBin: true dev: true optional: true - /mimic-fn/2.1.0: + /mimic-fn@2.1.0: resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} engines: {node: '>=6'} dev: true - /mimic-response/1.0.1: + /mimic-response@1.0.1: resolution: {integrity: sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==} engines: {node: '>=4'} dev: true optional: true - /mimic-response/3.1.0: + /mimic-response@3.1.0: resolution: {integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==} engines: {node: '>=10'} - /min-document/2.19.0: + /min-document@2.19.0: resolution: {integrity: sha512-9Wy1B3m3f66bPPmU5hdA4DR4PB2OfDU/+GS3yAB7IQozE3tqXaVv2zOjgla7MEGSRv95+ILmOuvhLkOK6wJtCQ==} dependencies: dom-walk: 0.1.2 dev: true - /min-indent/1.0.1: + /min-indent@1.0.1: resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} engines: {node: '>=4'} dev: true - /minimalistic-assert/1.0.1: + /minimalistic-assert@1.0.1: resolution: {integrity: sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==} - /minimalistic-crypto-utils/1.0.1: + /minimalistic-crypto-utils@1.0.1: resolution: {integrity: sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==} - /minimatch/3.0.4: + /minimatch@3.0.4: resolution: {integrity: sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==} dependencies: brace-expansion: 1.1.11 dev: true - /minimatch/3.1.2: + /minimatch@3.1.2: resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} dependencies: brace-expansion: 1.1.11 dev: true - /minimatch/5.0.1: + /minimatch@5.0.1: resolution: {integrity: sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g==} engines: {node: '>=10'} dependencies: brace-expansion: 2.0.1 dev: true - /minimatch/5.1.6: + /minimatch@5.1.6: resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==} engines: {node: '>=10'} dependencies: brace-expansion: 2.0.1 dev: true - /minimist-options/4.1.0: + /minimist-options@4.1.0: resolution: {integrity: sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==} engines: {node: '>= 6'} dependencies: @@ -14519,21 +14840,21 @@ packages: kind-of: 6.0.3 dev: true - /minimist/1.2.7: + /minimist@1.2.7: resolution: {integrity: sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g==} dev: true - /minimist/1.2.8: + /minimist@1.2.8: resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} - /minipass-collect/1.0.2: + /minipass-collect@1.0.2: resolution: {integrity: sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==} engines: {node: '>= 8'} dependencies: minipass: 3.3.4 dev: true - /minipass-fetch/1.4.1: + /minipass-fetch@1.4.1: resolution: {integrity: sha512-CGH1eblLq26Y15+Azk7ey4xh0J/XfJfrCox5LDJiKqI2Q2iwOLOKrlmIaODiSQS8d18jalF6y2K2ePUm0CmShw==} engines: {node: '>=8'} dependencies: @@ -14544,28 +14865,28 @@ packages: encoding: 0.1.13 dev: true - /minipass-flush/1.0.5: + /minipass-flush@1.0.5: resolution: {integrity: sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==} engines: {node: '>= 8'} dependencies: minipass: 3.3.4 dev: true - /minipass-pipeline/1.2.4: + /minipass-pipeline@1.2.4: resolution: {integrity: sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==} engines: {node: '>=8'} dependencies: minipass: 3.3.4 dev: true - /minipass-sized/1.0.3: + /minipass-sized@1.0.3: resolution: {integrity: sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==} engines: {node: '>=8'} dependencies: minipass: 3.3.4 dev: true - /minipass/2.9.0: + /minipass@2.9.0: resolution: {integrity: sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==} dependencies: safe-buffer: 5.2.1 @@ -14573,21 +14894,21 @@ packages: dev: true optional: true - /minipass/3.3.4: + /minipass@3.3.4: resolution: {integrity: sha512-I9WPbWHCGu8W+6k1ZiGpPu0GkoKBeorkfKNuAFBNS1HNFJvke82sxvI5bzcCNpWPorkOO5QQ+zomzzwRxejXiw==} engines: {node: '>=8'} dependencies: yallist: 4.0.0 dev: true - /minizlib/1.3.3: + /minizlib@1.3.3: resolution: {integrity: sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q==} dependencies: minipass: 2.9.0 dev: true optional: true - /minizlib/2.1.2: + /minizlib@2.1.2: resolution: {integrity: sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==} engines: {node: '>= 8'} dependencies: @@ -14595,7 +14916,7 @@ packages: yallist: 4.0.0 dev: true - /mixin-deep/1.3.2: + /mixin-deep@1.3.2: resolution: {integrity: sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==} engines: {node: '>=0.10.0'} dependencies: @@ -14603,11 +14924,11 @@ packages: is-extendable: 1.0.1 dev: true - /mkdirp-classic/0.5.3: + /mkdirp-classic@0.5.3: resolution: {integrity: sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==} dev: false - /mkdirp-promise/5.0.1: + /mkdirp-promise@5.0.1: 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. @@ -14616,40 +14937,40 @@ packages: dev: true optional: true - /mkdirp/0.5.5: + /mkdirp@0.5.5: resolution: {integrity: sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==} hasBin: true dependencies: minimist: 1.2.8 dev: true - /mkdirp/0.5.6: + /mkdirp@0.5.6: resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==} hasBin: true dependencies: minimist: 1.2.8 dev: true - /mkdirp/1.0.4: + /mkdirp@1.0.4: resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==} engines: {node: '>=10'} hasBin: true dev: true - /mkdirp/2.1.5: + /mkdirp@2.1.5: resolution: {integrity: sha512-jbjfql+shJtAPrFoKxHOXip4xS+kul9W3OzfzzrqueWK2QMGon2bFH2opl6W9EagBThjEz+iysyi/swOoVfB/w==} engines: {node: '>=10'} hasBin: true dev: true optional: true - /mnemonist/0.38.5: + /mnemonist@0.38.5: resolution: {integrity: sha512-bZTFT5rrPKtPJxj8KSV0WkPyNxl72vQepqqVUAW2ARUpUSF2qXMB6jZj7hW5/k7C1rtpzqbD/IIbJwLXUjCHeg==} dependencies: obliterator: 2.0.4 dev: true - /mocha/10.2.0: + /mocha@10.2.0: resolution: {integrity: sha512-IDY7fl/BecMwFHzoqF2sg/SHHANeBoMMXFlS9r0OXKDssYE1M5O43wUY/9BVPeIvfH2zmEbBfseqN9gBQZzXkg==} engines: {node: '>= 14.0.0'} hasBin: true @@ -14657,7 +14978,7 @@ packages: ansi-colors: 4.1.1 browser-stdout: 1.3.1 chokidar: 3.5.3 - debug: 4.3.4_supports-color@8.1.1 + debug: 4.3.4(supports-color@8.1.1) diff: 5.0.0 escape-string-regexp: 4.0.0 find-up: 5.0.0 @@ -14677,7 +14998,7 @@ packages: yargs-unparser: 2.0.0 dev: true - /mocha/7.1.2: + /mocha@7.1.2: resolution: {integrity: sha512-o96kdRKMKI3E8U0bjnfqW4QMk12MwZ4mhdBTf+B5a1q9+aq2HRnj+3ZdJu0B/ZhJeK78MgYuv6L8d/rA5AeBJA==} engines: {node: '>= 8.10.0'} hasBin: true @@ -14685,7 +15006,7 @@ packages: ansi-colors: 3.2.3 browser-stdout: 1.3.1 chokidar: 3.3.0 - debug: 3.2.6_supports-color@6.0.0 + debug: 3.2.6(supports-color@6.0.0) diff: 3.5.0 escape-string-regexp: 1.0.5 find-up: 3.0.0 @@ -14708,7 +15029,7 @@ packages: yargs-unparser: 1.6.0 dev: true - /mocha/7.2.0: + /mocha@7.2.0: resolution: {integrity: sha512-O9CIypScywTVpNaRrCAgoUnJgozpIofjKUYmJhiCIJMiuYnLI6otcb1/kpW9/n/tJODHGZ7i8aLQoDVsMtOKQQ==} engines: {node: '>= 8.10.0'} hasBin: true @@ -14716,7 +15037,7 @@ packages: ansi-colors: 3.2.3 browser-stdout: 1.3.1 chokidar: 3.3.0 - debug: 3.2.6_supports-color@6.0.0 + debug: 3.2.6(supports-color@6.0.0) diff: 3.5.0 escape-string-regexp: 1.0.5 find-up: 3.0.0 @@ -14739,35 +15060,35 @@ packages: yargs-unparser: 1.6.0 dev: true - /mock-fs/4.14.0: + /mock-fs@4.14.0: resolution: {integrity: sha512-qYvlv/exQ4+svI3UOvPUpLDF0OMX5euvUH0Ny4N5QyRyhNdgAgUrVH3iUINSzEPLvx0kbo/Bp28GJKIqvE7URw==} dev: true optional: true - /module-error/1.0.2: + /module-error@1.0.2: resolution: {integrity: sha512-0yuvsqSCv8LbaOKhnsQ/T5JhyFlCYLPXK3U2sgV10zoKQwzs/MyfuQUOZQ1V/6OCOJsK/TRgNVrPuPDqtdMFtA==} engines: {node: '>=10'} dev: true - /mri/1.2.0: + /mri@1.2.0: resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==} engines: {node: '>=4'} - /ms/2.0.0: + /ms@2.0.0: resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} dev: true - /ms/2.1.1: + /ms@2.1.1: resolution: {integrity: sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==} dev: true - /ms/2.1.2: + /ms@2.1.2: resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} - /ms/2.1.3: + /ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} - /multibase/0.6.1: + /multibase@0.6.1: resolution: {integrity: sha512-pFfAwyTjbbQgNc3G7D48JkJxWtoJoBMaR4xQUOuB8RnCgRqaYmWNFeJTTvrJ2w51bjLq2zTby6Rqj9TQ9elSUw==} deprecated: This module has been superseded by the multiformats module dependencies: @@ -14776,7 +15097,7 @@ packages: dev: true optional: true - /multibase/0.7.0: + /multibase@0.7.0: resolution: {integrity: sha512-TW8q03O0f6PNFTQDvh3xxH03c8CjGaaYrjkl9UQPG6rz53TQzzxJVCIWVjzcbN/Q5Y53Zd0IBQBMVktVgNx4Fg==} deprecated: This module has been superseded by the multiformats module dependencies: @@ -14785,7 +15106,7 @@ packages: dev: true optional: true - /multicodec/0.5.7: + /multicodec@0.5.7: resolution: {integrity: sha512-PscoRxm3f+88fAtELwUnZxGDkduE2HD9Q6GHUOywQLjOGT/HAdhjLDYNZ1e7VR0s0TP0EwZ16LNUTFpoBGivOA==} deprecated: This module has been superseded by the multiformats module dependencies: @@ -14793,7 +15114,7 @@ packages: dev: true optional: true - /multicodec/1.0.4: + /multicodec@1.0.4: resolution: {integrity: sha512-NDd7FeS3QamVtbgfvu5h7fd1IlbaC4EQ0/pgU4zqE2vdHCmBGsUa0TiM8/TdSeG6BMPC92OOCf8F1ocE/Wkrrg==} deprecated: This module has been superseded by the multiformats module dependencies: @@ -14802,7 +15123,7 @@ packages: dev: true optional: true - /multihashes/0.4.21: + /multihashes@0.4.21: resolution: {integrity: sha512-uVSvmeCWf36pU2nB4/1kzYZjsXD9vofZKpgudqkceYY5g2aZZXJ5r9lxuzoRLl1OAp28XljXsEJ/X/85ZsKmKw==} dependencies: buffer: 5.7.1 @@ -14811,27 +15132,27 @@ packages: dev: true optional: true - /nan/2.17.0: + /nan@2.17.0: resolution: {integrity: sha512-2ZTgtl0nJsO0KQCjEpxcIr5D+Yv90plTitZt9JBfQvVJDS5seMl3FOvsh3+9CoYWXf/1l5OaZzzF6nDm4cagaQ==} dev: true - /nano-json-stream-parser/0.1.2: + /nano-json-stream-parser@0.1.2: resolution: {integrity: sha512-9MqxMH/BSJC7dnLsEMPyfN5Dvoo49IsPFYMcHw3Bcfc2kN0lpHRBSzlMSVx4HGyJ7s9B31CyBTVehWJoQ8Ctew==} dev: true optional: true - /nanoid/3.3.3: + /nanoid@3.3.3: resolution: {integrity: sha512-p1sjXuopFs0xg+fPASzQ28agW1oHD7xDsd9Xkf3T15H3c/cifrFHVwrh74PdoklAPi+i7MdRsE47vm2r6JoB+w==} engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true dev: true - /nanoid/3.3.4: + /nanoid@3.3.4: resolution: {integrity: sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==} engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true - /nanomatch/1.2.13: + /nanomatch@1.2.13: resolution: {integrity: sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==} engines: {node: '>=0.10.0'} dependencies: @@ -14850,32 +15171,32 @@ packages: - supports-color dev: true - /napi-build-utils/1.0.2: + /napi-build-utils@1.0.2: resolution: {integrity: sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==} dev: false - /napi-macros/2.0.0: + /napi-macros@2.0.0: resolution: {integrity: sha512-A0xLykHtARfueITVDernsAWdtIMbOJgKgcluwENp3AlsKN/PloyO10HtmoqnFAQAcxPkgZN7wdfPfEd0zNGxbg==} dev: true - /natural-compare-lite/1.4.0: + /natural-compare-lite@1.4.0: resolution: {integrity: sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==} dev: true - /natural-compare/1.4.0: + /natural-compare@1.4.0: resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} dev: true - /negotiator/0.6.3: + /negotiator@0.6.3: resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==} engines: {node: '>= 0.6'} dev: true - /neo-async/2.6.2: + /neo-async@2.6.2: resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} dev: true - /next-mdx-remote/4.4.1_biqbaboplfbrettd7655fr4n2y: + /next-mdx-remote@4.4.1(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-1BvyXaIou6xy3XoNF4yaMZUCb6vD2GTAa5ciOa6WoO+gAUTYsb1K4rI/HSC2ogAWLrb/7VSV52skz07vOzmqIQ==} engines: {node: '>=14', npm: '>=7'} peerDependencies: @@ -14883,43 +15204,43 @@ packages: react-dom: '>=16.x <=18.x' dependencies: '@mdx-js/mdx': 2.3.0 - '@mdx-js/react': 2.3.0_react@18.2.0 + '@mdx-js/react': 2.3.0(react@18.2.0) react: 18.2.0 - react-dom: 18.2.0_react@18.2.0 + react-dom: 18.2.0(react@18.2.0) vfile: 5.3.7 vfile-matter: 3.0.1 transitivePeerDependencies: - supports-color dev: false - /next-seo/5.15.0_ld2jel3hspngo3u5lti2kgl2sq: + /next-seo@5.15.0(next@13.2.4)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-LGbcY91yDKGMb7YI+28n3g+RuChUkt6pXNpa8FkfKkEmNiJkeRDEXTnnjVtwT9FmMhG6NH8qwHTelGrlYm9rgg==} peerDependencies: next: ^8.1.1-canary.54 || >=9.0.0 react: '>=16.0.0' react-dom: '>=16.0.0' dependencies: - next: 13.2.4_biqbaboplfbrettd7655fr4n2y + next: 13.2.4(react-dom@18.2.0)(react@18.2.0) react: 18.2.0 - react-dom: 18.2.0_react@18.2.0 + react-dom: 18.2.0(react@18.2.0) dev: false - /next-themes/0.2.1_ld2jel3hspngo3u5lti2kgl2sq: + /next-themes@0.2.1(next@13.2.4)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-B+AKNfYNIzh0vqQQKqQItTS8evEouKD7H5Hj3kmuPERwddR2TxvDSFZuTj6T7Jfn1oyeUyJMydPl1Bkxkh0W7A==} peerDependencies: next: '*' react: '*' react-dom: '*' dependencies: - next: 13.2.4_biqbaboplfbrettd7655fr4n2y + next: 13.2.4(react-dom@18.2.0)(react@18.2.0) react: 18.2.0 - react-dom: 18.2.0_react@18.2.0 + react-dom: 18.2.0(react@18.2.0) dev: false - /next-tick/1.1.0: + /next-tick@1.1.0: resolution: {integrity: sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==} - /next/13.2.4_biqbaboplfbrettd7655fr4n2y: + /next@13.2.4(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-g1I30317cThkEpvzfXujf0O4wtaQHtDCLhlivwlTJ885Ld+eOgcz7r3TGQzeU+cSRoNHtD8tsJgzxVdYojFssw==} engines: {node: '>=14.6.0'} hasBin: true @@ -14945,8 +15266,8 @@ packages: caniuse-lite: 1.0.30001465 postcss: 8.4.14 react: 18.2.0 - react-dom: 18.2.0_react@18.2.0 - styled-jsx: 5.1.1_react@18.2.0 + react-dom: 18.2.0(react@18.2.0) + styled-jsx: 5.1.1(react@18.2.0) optionalDependencies: '@next/swc-android-arm-eabi': 13.2.4 '@next/swc-android-arm64': 13.2.4 @@ -14966,7 +15287,7 @@ packages: - babel-plugin-macros dev: false - /nextra-theme-docs/2.2.19_i765vautotixoofbdi6dinfkwe: + /nextra-theme-docs@2.2.19(next@13.2.4)(nextra@2.2.19)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-+5PcNgHwxwSAmQZlbV2cbjbvxj7CPYnN44OtWNxHQ8L3dzlw6fUyIJtyCUcGbDHpFC3sHmwYgB3OCWH8m4P35Q==} peerDependencies: next: '>=9.5.3' @@ -14974,7 +15295,7 @@ packages: react: '>=16.13.1' react-dom: '>=16.13.1' dependencies: - '@headlessui/react': 1.7.13_biqbaboplfbrettd7655fr4n2y + '@headlessui/react': 1.7.13(react-dom@18.2.0)(react@18.2.0) '@popperjs/core': 2.11.6 clsx: 1.2.1 flexsearch: 0.7.31 @@ -14982,17 +15303,17 @@ packages: git-url-parse: 13.1.0 intersection-observer: 0.12.2 match-sorter: 6.3.1 - next: 13.2.4_biqbaboplfbrettd7655fr4n2y - next-seo: 5.15.0_ld2jel3hspngo3u5lti2kgl2sq - next-themes: 0.2.1_ld2jel3hspngo3u5lti2kgl2sq - nextra: 2.2.19_ld2jel3hspngo3u5lti2kgl2sq + next: 13.2.4(react-dom@18.2.0)(react@18.2.0) + next-seo: 5.15.0(next@13.2.4)(react-dom@18.2.0)(react@18.2.0) + next-themes: 0.2.1(next@13.2.4)(react-dom@18.2.0)(react@18.2.0) + nextra: 2.2.19(next@13.2.4)(react-dom@18.2.0)(react@18.2.0) react: 18.2.0 - react-dom: 18.2.0_react@18.2.0 + react-dom: 18.2.0(react@18.2.0) scroll-into-view-if-needed: 3.0.6 zod: 3.21.4 dev: false - /nextra/2.2.19_ld2jel3hspngo3u5lti2kgl2sq: + /nextra@2.2.19(next@13.2.4)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-QmgbJvT1lfmFCM8n5gfGTA5p8efw20N/oZP9ojBhWhmatq/PwAp7VoSeTan6TT9Yspv6PmnrgpqKhYGzPSkFVw==} peerDependencies: next: '>=9.5.3' @@ -15000,20 +15321,20 @@ packages: react-dom: '>=16.13.1' dependencies: '@mdx-js/mdx': 2.3.0 - '@mdx-js/react': 2.3.0_react@18.2.0 + '@mdx-js/react': 2.3.0(react@18.2.0) '@napi-rs/simple-git': 0.1.8 github-slugger: 2.0.0 graceful-fs: 4.2.10 gray-matter: 4.0.3 katex: 0.16.4 lodash.get: 4.4.2 - next: 13.2.4_biqbaboplfbrettd7655fr4n2y - next-mdx-remote: 4.4.1_biqbaboplfbrettd7655fr4n2y + next: 13.2.4(react-dom@18.2.0)(react@18.2.0) + next-mdx-remote: 4.4.1(react-dom@18.2.0)(react@18.2.0) p-limit: 3.1.0 react: 18.2.0 - react-dom: 18.2.0_react@18.2.0 + react-dom: 18.2.0(react@18.2.0) rehype-katex: 6.0.2 - rehype-pretty-code: 0.9.3_shiki@0.14.1 + rehype-pretty-code: 0.9.3(shiki@0.14.1) remark-gfm: 3.0.1 remark-math: 5.1.1 remark-reading-time: 2.0.1 @@ -15026,52 +15347,52 @@ packages: - supports-color dev: false - /nice-try/1.0.5: + /nice-try@1.0.5: resolution: {integrity: sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==} dev: true - /no-case/3.0.4: + /no-case@3.0.4: resolution: {integrity: sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==} dependencies: lower-case: 2.0.2 tslib: 2.5.0 dev: true - /node-abi/3.33.0: + /node-abi@3.33.0: resolution: {integrity: sha512-7GGVawqyHF4pfd0YFybhv/eM9JwTtPqx0mAanQ146O3FlSh3pA24zf9IRQTOsfTSqXTNzPSP5iagAJ94jjuVog==} engines: {node: '>=10'} dependencies: semver: 7.3.8 dev: false - /node-addon-api/2.0.2: + /node-addon-api@2.0.2: resolution: {integrity: sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA==} - /node-addon-api/5.1.0: + /node-addon-api@5.1.0: resolution: {integrity: sha512-eh0GgfEkpnoWDq+VY8OyvYhFEzBk6jIYbRKdIlyTiAXIVJ8PyBaKb0rp7oDtoddbdoHWhq8wwr+XZ81F1rpNdA==} dev: false - /node-emoji/1.11.0: + /node-emoji@1.11.0: resolution: {integrity: sha512-wo2DpQkQp7Sjm2A0cq+sN7EHKO6Sl0ctXeBdFZrL9T9+UywORbufTcTZxom8YqpLQt/FqNMUkOpkZrJVYSKD3A==} dependencies: lodash: 4.17.21 dev: true - /node-environment-flags/1.0.6: + /node-environment-flags@1.0.6: resolution: {integrity: sha512-5Evy2epuL+6TM0lCQGpFIj6KwiEsGh1SrHUhTbNX+sLbBtjidPZFAnVK9y5yU1+h//RitLbRHTIMyxQPtxMdHw==} dependencies: object.getownpropertydescriptors: 2.1.5 semver: 5.7.1 dev: true - /node-fetch/1.7.3: + /node-fetch@1.7.3: resolution: {integrity: sha512-NhZ4CsKx7cYm2vSrBAr2PvFOe6sWDf0UYLRqA6svUYg7+/TSfVAu49jYC4BvQ4Sms9SZgdqGBgroqfDhJdTyKQ==} dependencies: encoding: 0.1.13 is-stream: 1.1.0 dev: true - /node-fetch/2.6.7: + /node-fetch@2.6.7: resolution: {integrity: sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==} engines: {node: 4.x || >=6.0.0} peerDependencies: @@ -15083,7 +15404,7 @@ packages: whatwg-url: 5.0.0 dev: false - /node-fetch/2.6.9: + /node-fetch@2.6.9: resolution: {integrity: sha512-DJm/CJkZkRjKKj4Zi4BsKVZh3ValV5IR5s7LVZnW+6YMh0W1BfNA8XSs6DLMGYlId5F3KnA70uu2qepcR08Qqg==} engines: {node: 4.x || >=6.0.0} peerDependencies: @@ -15095,16 +15416,16 @@ packages: whatwg-url: 5.0.0 dev: true - /node-gyp-build/4.5.0: + /node-gyp-build@4.5.0: resolution: {integrity: sha512-2iGbaQBV+ITgCz76ZEjmhUKAKVf7xfY1sRl4UiKQspfZMH2h06SyhNsnSVy50cwkFQDGLyif6m/6uFXHkOZ6rg==} hasBin: true dev: false - /node-gyp-build/4.6.0: + /node-gyp-build@4.6.0: resolution: {integrity: sha512-NTZVKn9IylLwUzaKjkas1e4u2DLNcV4rdYagA4PWdPwW87Bi7z+BznyKSRwS/761tV/lzCGXplWsiaMjLqP2zQ==} hasBin: true - /node-gyp/8.4.1: + /node-gyp@8.4.1: resolution: {integrity: sha512-olTJRgUtAb/hOXG0E93wZDs5YiJlgbXxTwQAFHyNlRsXQnYzUaF2aGgujZbw+hR8aF4ZG/rST57bWMWD16jr9w==} engines: {node: '>= 10.12.0'} hasBin: true @@ -15124,17 +15445,17 @@ packages: - supports-color dev: true - /node-int64/0.4.0: + /node-int64@0.4.0: resolution: {integrity: sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==} dev: true - /node-releases/2.0.10: + /node-releases@2.0.10: resolution: {integrity: sha512-5GFldHPXVG/YZmFzJvKK2zDSzPKhEp0+ZR5SVaoSag9fsL5YgHbUHDfnG5494ISANDcK4KwPXAx2xqVEydmd7w==} - /node-releases/2.0.8: + /node-releases@2.0.8: resolution: {integrity: sha512-dFSmB8fFHEH/s81Xi+Y/15DQY6VHW81nXRj86EMSL3lmuTmK1e+aT4wrFCkTbm+gSwkw4KpX+rT/pMM2c1mF+A==} - /node-sass/7.0.3: + /node-sass@7.0.3: resolution: {integrity: sha512-8MIlsY/4dXUkJDYht9pIWBhMil3uHmE8b/AdJPjmFn1nBx9X9BASzfzmsCy0uCCb8eqI3SYYzVPDswWqSx7gjw==} engines: {node: '>=12'} hasBin: true @@ -15160,19 +15481,19 @@ packages: - supports-color dev: true - /nofilter/3.1.0: + /nofilter@3.1.0: resolution: {integrity: sha512-l2NNj07e9afPnhAhvgVrCD/oy2Ai1yfLpuo3EpiO1jFTsB4sFz6oIfAfSZyQzVpkZQ9xS8ZS5g1jCBgq4Hwo0g==} engines: {node: '>=12.19'} dev: true - /nopt/3.0.6: + /nopt@3.0.6: resolution: {integrity: sha512-4GUt3kSEYmk4ITxzB/b9vaIDfUVWN/Ml1Fwl11IlnIG2iaJ9O6WXZ9SrYM9NLI8OCBieN2Y8SWC2oJV0RQ7qYg==} hasBin: true dependencies: abbrev: 1.0.9 dev: true - /nopt/5.0.0: + /nopt@5.0.0: resolution: {integrity: sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==} engines: {node: '>=6'} hasBin: true @@ -15180,7 +15501,7 @@ packages: abbrev: 1.0.9 dev: true - /normalize-package-data/2.5.0: + /normalize-package-data@2.5.0: resolution: {integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==} dependencies: hosted-git-info: 2.8.9 @@ -15189,7 +15510,7 @@ packages: validate-npm-package-license: 3.0.4 dev: true - /normalize-package-data/3.0.3: + /normalize-package-data@3.0.3: resolution: {integrity: sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==} engines: {node: '>=10'} dependencies: @@ -15199,43 +15520,43 @@ packages: validate-npm-package-license: 3.0.4 dev: true - /normalize-path/3.0.0: + /normalize-path@3.0.0: resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} engines: {node: '>=0.10.0'} dev: true - /normalize-range/0.1.2: + /normalize-range@0.1.2: resolution: {integrity: sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==} engines: {node: '>=0.10.0'} dev: true - /normalize-url/4.5.1: + /normalize-url@4.5.1: resolution: {integrity: sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA==} engines: {node: '>=8'} dev: true optional: true - /normalize-url/6.1.0: + /normalize-url@6.1.0: resolution: {integrity: sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==} engines: {node: '>=10'} dev: true optional: true - /npm-run-path/2.0.2: + /npm-run-path@2.0.2: resolution: {integrity: sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw==} engines: {node: '>=4'} dependencies: path-key: 2.0.1 dev: false - /npm-run-path/4.0.1: + /npm-run-path@4.0.1: resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} engines: {node: '>=8'} dependencies: path-key: 3.1.1 dev: true - /npmlog/5.0.1: + /npmlog@5.0.1: resolution: {integrity: sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==} dependencies: are-we-there-yet: 2.0.0 @@ -15244,7 +15565,7 @@ packages: set-blocking: 2.0.0 dev: true - /npmlog/6.0.2: + /npmlog@6.0.2: resolution: {integrity: sha512-/vBvz5Jfr9dT/aFWd0FIRf+T/Q2WBsLENygUaFUqstqsycmZAP/t5BvFJTK0viFmSUxiUKTUplWy5vt+rvKIxg==} engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} dependencies: @@ -15254,18 +15575,18 @@ packages: set-blocking: 2.0.0 dev: true - /nth-check/2.1.1: + /nth-check@2.1.1: resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==} dependencies: boolbase: 1.0.0 dev: true - /number-is-nan/1.0.1: + /number-is-nan@1.0.1: resolution: {integrity: sha512-4jbtZXNAsfZbAHiiqjLPBiCl16dES1zI4Hpzzxw61Tk+loF+sBDBKx1ICKKKwIqQ7M0mFn1TmkN7euSncWgHiQ==} engines: {node: '>=0.10.0'} dev: true - /number-to-bn/1.7.0: + /number-to-bn@1.7.0: resolution: {integrity: sha512-wsJ9gfSz1/s4ZsJN01lyonwuxA1tml6X1yBDnfpMglypcBRFZZkus26EdPSlqS5GJfYddVZa22p3VNb3z5m5Ig==} engines: {node: '>=6.5.0', npm: '>=3'} dependencies: @@ -15273,20 +15594,20 @@ packages: strip-hex-prefix: 1.0.0 dev: true - /nwsapi/2.2.2: + /nwsapi@2.2.2: resolution: {integrity: sha512-90yv+6538zuvUMnN+zCr8LuV6bPFdq50304114vJYJ8RDyK8D5O9Phpbd6SZWgI7PwzmmfN1upeOJlvybDSgCw==} dev: true - /oauth-sign/0.9.0: + /oauth-sign@0.9.0: resolution: {integrity: sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==} dev: true - /object-assign/4.1.1: + /object-assign@4.1.1: resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} engines: {node: '>=0.10.0'} dev: true - /object-copy/0.1.0: + /object-copy@0.1.0: resolution: {integrity: sha512-79LYn6VAb63zgtmAteVOWo9Vdj71ZVBy3Pbse+VqxDpEP83XuujMrGqHIwAXJ5I/aM0zU7dIyIAhifVTPrNItQ==} engines: {node: '>=0.10.0'} dependencies: @@ -15295,15 +15616,15 @@ packages: kind-of: 3.2.2 dev: true - /object-hash/3.0.0: + /object-hash@3.0.0: resolution: {integrity: sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==} engines: {node: '>= 6'} dev: true - /object-inspect/1.12.3: + /object-inspect@1.12.3: resolution: {integrity: sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==} - /object-is/1.1.5: + /object-is@1.1.5: resolution: {integrity: sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==} engines: {node: '>= 0.4'} dependencies: @@ -15311,7 +15632,7 @@ packages: define-properties: 1.2.0 dev: true - /object-keys/0.2.0: + /object-keys@0.2.0: resolution: {integrity: sha512-XODjdR2pBh/1qrjPcbSeSgEtKbYo7LqYNq64/TPuCf7j9SfDD3i21yatKoIy39yIWNvVM59iutfQQpCv1RfFzA==} deprecated: Please update to the latest object-keys dependencies: @@ -15320,23 +15641,23 @@ packages: is: 0.2.7 dev: true - /object-keys/0.4.0: + /object-keys@0.4.0: resolution: {integrity: sha512-ncrLw+X55z7bkl5PnUvHwFK9FcGuFYo9gtjws2XtSzL+aZ8tm830P60WJ0dSmFVaSalWieW5MD7kEdnXda9yJw==} dev: true - /object-keys/1.1.1: + /object-keys@1.1.1: resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} engines: {node: '>= 0.4'} dev: true - /object-visit/1.0.1: + /object-visit@1.0.1: resolution: {integrity: sha512-GBaMwwAVK9qbQN3Scdo0OyvgPW7l3lnaVMj84uTOZlswkX0KpF6fyDBJhtTthf7pymztoN36/KEr1DyhF96zEA==} engines: {node: '>=0.10.0'} dependencies: isobject: 3.0.1 dev: true - /object.assign/4.1.0: + /object.assign@4.1.0: resolution: {integrity: sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==} engines: {node: '>= 0.4'} dependencies: @@ -15346,7 +15667,7 @@ packages: object-keys: 1.1.1 dev: true - /object.assign/4.1.4: + /object.assign@4.1.4: resolution: {integrity: sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==} engines: {node: '>= 0.4'} dependencies: @@ -15356,7 +15677,7 @@ packages: object-keys: 1.1.1 dev: true - /object.getownpropertydescriptors/2.1.5: + /object.getownpropertydescriptors@2.1.5: resolution: {integrity: sha512-yDNzckpM6ntyQiGTik1fKV1DcVDRS+w8bvpWNCBanvH5LfRX9O8WTHqQzG4RZwRAM4I0oU7TV11Lj5v0g20ibw==} engines: {node: '>= 0.8'} dependencies: @@ -15366,14 +15687,14 @@ packages: es-abstract: 1.21.1 dev: true - /object.pick/1.3.0: + /object.pick@1.3.0: resolution: {integrity: sha512-tqa/UMy/CCoYmj+H5qc07qvSL9dqcs/WZENZ1JbtWBlATP+iVOe778gE6MSijnyCnORzDuX6hU+LA4SZ09YjFQ==} engines: {node: '>=0.10.0'} dependencies: isobject: 3.0.1 dev: true - /object.values/1.1.6: + /object.values@1.1.6: resolution: {integrity: sha512-FVVTkD1vENCsAcwNs9k6jea2uHC/X0+JcjG8YA60FN5CMaJmG95wT9jek/xX9nornqGRrBkKtzuAu2wuHpKqvw==} engines: {node: '>= 0.4'} dependencies: @@ -15382,22 +15703,22 @@ packages: es-abstract: 1.21.1 dev: true - /obliterator/2.0.4: + /obliterator@2.0.4: resolution: {integrity: sha512-lgHwxlxV1qIg1Eap7LgIeoBWIMFibOjbrYPIPJZcI1mmGAI2m3lNYpK12Y+GBdPQ0U1hRwSord7GIaawz962qQ==} dev: true - /oboe/2.1.4: + /oboe@2.1.4: resolution: {integrity: sha512-ymBJ4xSC6GBXLT9Y7lirj+xbqBLa+jADGJldGEYG7u8sZbS9GyG+u1Xk9c5cbriKwSpCg41qUhPjvU5xOpvIyQ==} dependencies: http-https: 1.0.0 dev: true optional: true - /octal/1.0.0: + /octal@1.0.0: resolution: {integrity: sha512-nnda7W8d+A3vEIY+UrDQzzboPf1vhs4JYVhff5CDkq9QNoZY7Xrxeo/htox37j9dZf7yNHevZzqtejWgy1vCqQ==} dev: true - /on-finished/2.4.1: + /on-finished@2.4.1: resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} engines: {node: '>= 0.8'} dependencies: @@ -15405,19 +15726,19 @@ packages: dev: true optional: true - /once/1.4.0: + /once@1.4.0: resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} dependencies: wrappy: 1.0.2 - /onetime/5.1.2: + /onetime@5.1.2: resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} engines: {node: '>=6'} dependencies: mimic-fn: 2.1.0 dev: true - /open/7.4.2: + /open@7.4.2: resolution: {integrity: sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==} engines: {node: '>=8'} dependencies: @@ -15425,7 +15746,7 @@ packages: is-wsl: 2.2.0 dev: true - /optionator/0.8.3: + /optionator@0.8.3: resolution: {integrity: sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==} engines: {node: '>= 0.8.0'} dependencies: @@ -15437,7 +15758,7 @@ packages: word-wrap: 1.2.3 dev: true - /optionator/0.9.1: + /optionator@0.9.1: resolution: {integrity: sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==} engines: {node: '>= 0.8.0'} dependencies: @@ -15449,116 +15770,116 @@ packages: word-wrap: 1.2.3 dev: true - /os-homedir/1.0.2: + /os-homedir@1.0.2: resolution: {integrity: sha512-B5JU3cabzk8c67mRRd3ECmROafjYMXbuzlwtqdM8IbS8ktlTix8aFGb2bAGKrSRIlnfKwovGUUr72JUPyOb6kQ==} engines: {node: '>=0.10.0'} dev: true - /os-locale/1.4.0: + /os-locale@1.4.0: resolution: {integrity: sha512-PRT7ZORmwu2MEFt4/fv3Q+mEfN4zetKxufQrkShY2oGvUms9r8otu5HfdyIFHkYXjO7laNsoVGmM2MANfuTA8g==} engines: {node: '>=0.10.0'} dependencies: lcid: 1.0.0 dev: true - /os-tmpdir/1.0.2: + /os-tmpdir@1.0.2: resolution: {integrity: sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==} engines: {node: '>=0.10.0'} - /p-cancelable/1.1.0: + /p-cancelable@1.1.0: resolution: {integrity: sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==} engines: {node: '>=6'} dev: true optional: true - /p-cancelable/2.1.1: + /p-cancelable@2.1.1: resolution: {integrity: sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==} engines: {node: '>=8'} dev: true optional: true - /p-finally/1.0.0: + /p-finally@1.0.0: resolution: {integrity: sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==} engines: {node: '>=4'} dev: false - /p-limit/1.3.0: + /p-limit@1.3.0: resolution: {integrity: sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==} engines: {node: '>=4'} dependencies: p-try: 1.0.0 dev: true - /p-limit/2.3.0: + /p-limit@2.3.0: resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} engines: {node: '>=6'} dependencies: p-try: 2.2.0 - /p-limit/3.1.0: + /p-limit@3.1.0: resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} engines: {node: '>=10'} dependencies: yocto-queue: 0.1.0 - /p-locate/2.0.0: + /p-locate@2.0.0: resolution: {integrity: sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg==} engines: {node: '>=4'} dependencies: p-limit: 1.3.0 dev: true - /p-locate/3.0.0: + /p-locate@3.0.0: resolution: {integrity: sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==} engines: {node: '>=6'} dependencies: p-limit: 2.3.0 - /p-locate/4.1.0: + /p-locate@4.1.0: resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} engines: {node: '>=8'} dependencies: p-limit: 2.3.0 dev: true - /p-locate/5.0.0: + /p-locate@5.0.0: resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} engines: {node: '>=10'} dependencies: p-limit: 3.1.0 dev: true - /p-map/4.0.0: + /p-map@4.0.0: resolution: {integrity: sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==} engines: {node: '>=10'} dependencies: aggregate-error: 3.1.0 dev: true - /p-try/1.0.0: + /p-try@1.0.0: resolution: {integrity: sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww==} engines: {node: '>=4'} dev: true - /p-try/2.2.0: + /p-try@2.2.0: resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} engines: {node: '>=6'} - /param-case/3.0.4: + /param-case@3.0.4: resolution: {integrity: sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==} dependencies: dot-case: 3.0.4 tslib: 2.5.0 dev: true - /parent-module/1.0.1: + /parent-module@1.0.1: resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} engines: {node: '>=6'} dependencies: callsites: 3.1.0 dev: true - /parse-asn1/5.1.6: + /parse-asn1@5.1.6: resolution: {integrity: sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw==} dependencies: asn1.js: 5.4.1 @@ -15568,11 +15889,11 @@ packages: safe-buffer: 5.2.1 dev: true - /parse-cache-control/1.0.1: + /parse-cache-control@1.0.1: resolution: {integrity: sha512-60zvsJReQPX5/QP0Kzfd/VrpjScIQ7SHBW6bFCYfEP+fp0Eppr1SHhIO5nd1PjZtvclzSzES9D/p5nFJurwfWg==} dev: true - /parse-entities/4.0.1: + /parse-entities@4.0.1: resolution: {integrity: sha512-SWzvYcSJh4d/SGLIOQfZ/CoNv6BTlI6YEQ7Nj82oDVnRpwe/Z/F1EMx42x3JAOwGBlCjeCH0BRJQbQ/opHL17w==} dependencies: '@types/unist': 2.0.6 @@ -15585,18 +15906,18 @@ packages: is-hexadecimal: 2.0.1 dev: false - /parse-headers/2.0.5: + /parse-headers@2.0.5: resolution: {integrity: sha512-ft3iAoLOB/MlwbNXgzy43SWGP6sQki2jQvAyBg/zDFAgr9bfNWZIUj42Kw2eJIl8kEi4PbgE6U1Zau/HwI75HA==} dev: true - /parse-json/2.2.0: + /parse-json@2.2.0: resolution: {integrity: sha512-QR/GGaKCkhwk1ePQNYDRKYZ3mwU9ypsKhB0XyFnLQdomyEqk3e8wpW3V5Jp88zbxK4n5ST1nqo+g9juTpownhQ==} engines: {node: '>=0.10.0'} dependencies: error-ex: 1.3.2 dev: true - /parse-json/4.0.0: + /parse-json@4.0.0: resolution: {integrity: sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==} engines: {node: '>=4'} dependencies: @@ -15604,7 +15925,7 @@ packages: json-parse-better-errors: 1.0.2 dev: true - /parse-json/5.2.0: + /parse-json@5.2.0: resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} engines: {node: '>=8'} dependencies: @@ -15614,44 +15935,44 @@ packages: lines-and-columns: 1.2.4 dev: true - /parse-numeric-range/1.3.0: + /parse-numeric-range@1.3.0: resolution: {integrity: sha512-twN+njEipszzlMJd4ONUYgSfZPDxgHhT9Ahed5uTigpQn90FggW4SA/AIPq/6a149fTbE9qBEcSwE3FAEp6wQQ==} dev: false - /parse-path/7.0.0: + /parse-path@7.0.0: resolution: {integrity: sha512-Euf9GG8WT9CdqwuWJGdf3RkUcTBArppHABkO7Lm8IzRQp0e2r/kkFnmhu4TSK30Wcu5rVAZLmfPKSBBi9tWFog==} dependencies: protocols: 2.0.1 dev: false - /parse-url/8.1.0: + /parse-url@8.1.0: resolution: {integrity: sha512-xDvOoLU5XRrcOZvnI6b8zA6n9O9ejNk/GExuz1yBuWUGn9KA97GI6HTs6u02wKara1CeVmZhH+0TZFdWScR89w==} dependencies: parse-path: 7.0.0 dev: false - /parse5/6.0.1: + /parse5@6.0.1: resolution: {integrity: sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==} - /parseurl/1.3.3: + /parseurl@1.3.3: resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} engines: {node: '>= 0.8'} dev: true optional: true - /pascal-case/3.1.2: + /pascal-case@3.1.2: resolution: {integrity: sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==} dependencies: no-case: 3.0.4 tslib: 2.5.0 dev: true - /pascalcase/0.1.1: + /pascalcase@0.1.1: resolution: {integrity: sha512-XHXfu/yOQRy9vYOtUDVMN60OEJjW013GoObG1o+xwQTpB9eYJX/BjXMsdW13ZDPruFhYYn0AG22w0xgQMwl3Nw==} engines: {node: '>=0.10.0'} dev: true - /patch-package/6.2.2: + /patch-package@6.2.2: resolution: {integrity: sha512-YqScVYkVcClUY0v8fF0kWOjDYopzIM8e3bj/RU1DPeEF14+dCGm6UeOYm4jvCyxqIEQ5/eJzmbWfDWnUleFNMg==} engines: {npm: '>5'} hasBin: true @@ -15672,7 +15993,7 @@ packages: - supports-color dev: true - /patch-package/6.5.1: + /patch-package@6.5.1: resolution: {integrity: sha512-I/4Zsalfhc6bphmJTlrLoOcAF87jcxko4q0qsv4bGcurbr8IskEOtdnt9iCmsQVGL1B+iUhSQqweyTLJfCF9rA==} engines: {node: '>=10', npm: '>5'} hasBin: true @@ -15693,54 +16014,54 @@ packages: yaml: 1.10.2 dev: true - /path-browserify/1.0.1: + /path-browserify@1.0.1: resolution: {integrity: sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==} dev: true - /path-exists/2.1.0: + /path-exists@2.1.0: resolution: {integrity: sha512-yTltuKuhtNeFJKa1PiRzfLAU5182q1y4Eb4XCJ3PBqyzEDkAZRzBrKKBct682ls9reBVHf9udYLN5Nd+K1B9BQ==} engines: {node: '>=0.10.0'} dependencies: pinkie-promise: 2.0.1 dev: true - /path-exists/3.0.0: + /path-exists@3.0.0: resolution: {integrity: sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==} engines: {node: '>=4'} - /path-exists/4.0.0: + /path-exists@4.0.0: resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} engines: {node: '>=8'} dev: true - /path-is-absolute/1.0.1: + /path-is-absolute@1.0.1: resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} engines: {node: '>=0.10.0'} dev: true - /path-key/2.0.1: + /path-key@2.0.1: resolution: {integrity: sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==} engines: {node: '>=4'} - /path-key/3.1.1: + /path-key@3.1.1: resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} engines: {node: '>=8'} dev: true - /path-parse/1.0.7: + /path-parse@1.0.7: resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} - /path-starts-with/2.0.0: + /path-starts-with@2.0.0: resolution: {integrity: sha512-3UHTHbJz5+NLkPafFR+2ycJOjoc4WV2e9qCZCnm71zHiWaFrm1XniLVTkZXvaRgxr1xFh9JsTdicpH2yM03nLA==} engines: {node: '>=8'} dev: true - /path-to-regexp/0.1.7: + /path-to-regexp@0.1.7: resolution: {integrity: sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==} dev: true optional: true - /path-type/1.1.0: + /path-type@1.1.0: resolution: {integrity: sha512-S4eENJz1pkiQn9Znv33Q+deTOKmbl+jj1Fl+qiP/vYezj+S8x+J3Uo0ISrx/QoEvIlOaDWJhPaRd1flJ9HXZqg==} engines: {node: '>=0.10.0'} dependencies: @@ -15749,16 +16070,16 @@ packages: pinkie-promise: 2.0.1 dev: true - /path-type/4.0.0: + /path-type@4.0.0: resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} engines: {node: '>=8'} dev: true - /pathval/1.1.1: + /pathval@1.1.1: resolution: {integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==} dev: true - /pbkdf2/3.1.2: + /pbkdf2@3.1.2: resolution: {integrity: sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==} engines: {node: '>=0.12'} dependencies: @@ -15768,11 +16089,11 @@ packages: safe-buffer: 5.2.1 sha.js: 2.4.11 - /performance-now/2.1.0: + /performance-now@2.1.0: resolution: {integrity: sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==} dev: true - /periscopic/3.1.0: + /periscopic@3.1.0: resolution: {integrity: sha512-vKiQ8RRtkl9P+r/+oefh25C3fhybptkHKCZSPlcXiJux2tJF55GnEj3BVn4A5gKfq9NWWXXrxkHBwVPUfH0opw==} dependencies: '@types/estree': 1.0.0 @@ -15780,84 +16101,84 @@ packages: is-reference: 3.0.1 dev: false - /picocolors/0.2.1: + /picocolors@0.2.1: resolution: {integrity: sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==} dev: true - /picocolors/1.0.0: + /picocolors@1.0.0: resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} - /picomatch/2.3.1: + /picomatch@2.3.1: resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} engines: {node: '>=8.6'} dev: true - /pidtree/0.5.0: + /pidtree@0.5.0: resolution: {integrity: sha512-9nxspIM7OpZuhBxPg73Zvyq7j1QMPMPsGKTqRc2XOaFQauDvoNz9fM1Wdkjmeo7l9GXOZiRs97sPkuayl39wjA==} engines: {node: '>=0.10'} hasBin: true dev: true - /pify/2.3.0: + /pify@2.3.0: resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==} engines: {node: '>=0.10.0'} dev: true - /pify/3.0.0: + /pify@3.0.0: resolution: {integrity: sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==} engines: {node: '>=4'} dev: false - /pify/4.0.1: + /pify@4.0.1: resolution: {integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==} engines: {node: '>=6'} dev: true - /pify/5.0.0: + /pify@5.0.0: resolution: {integrity: sha512-eW/gHNMlxdSP6dmG6uJip6FXN0EQBwm2clYYd8Wul42Cwu/DK8HEftzsapcNdYe2MfLiIwZqsDk2RDEsTE79hA==} engines: {node: '>=10'} dev: false - /pinkie-promise/2.0.1: + /pinkie-promise@2.0.1: resolution: {integrity: sha512-0Gni6D4UcLTbv9c57DfxDGdr41XfgUjqWZu492f0cIGr16zDU06BWP/RAEvOuo7CQ0CNjHaLlM59YJJFm3NWlw==} engines: {node: '>=0.10.0'} dependencies: pinkie: 2.0.4 dev: true - /pinkie/2.0.4: + /pinkie@2.0.4: resolution: {integrity: sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg==} engines: {node: '>=0.10.0'} dev: true - /pirates/4.0.5: + /pirates@4.0.5: resolution: {integrity: sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ==} engines: {node: '>= 6'} dev: true - /pkg-dir/4.2.0: + /pkg-dir@4.2.0: resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==} engines: {node: '>=8'} dependencies: find-up: 4.1.0 dev: true - /pluralize/8.0.0: + /pluralize@8.0.0: resolution: {integrity: sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==} engines: {node: '>=4'} dev: true - /pngjs/3.4.0: + /pngjs@3.4.0: resolution: {integrity: sha512-NCrCHhWmnQklfH4MtJMRjZ2a8c80qXeMlQMv2uVp9ISJMTt562SbGd6n2oq0PaPgKm7Z6pL9E2UlLIhC+SHL3w==} engines: {node: '>=4.0.0'} dev: false - /posix-character-classes/0.1.1: + /posix-character-classes@0.1.1: resolution: {integrity: sha512-xTgYBc3fuo7Yt7JbiuFxSYGToMoz8fLoE6TC9Wx1P/u+LfeThMOAqmuyECnlBaaJb+u1m9hHiXUEtwW4OzfUJg==} engines: {node: '>=0.10.0'} dev: true - /postcss-cli/7.1.2: + /postcss-cli@7.1.2: resolution: {integrity: sha512-3mlEmN1v2NVuosMWZM2tP8bgZn7rO5PYxRRrXtdSyL5KipcgBDjJ9ct8/LKxImMCJJi3x5nYhCGFJOkGyEqXBQ==} engines: {node: '>=10'} hasBin: true @@ -15876,7 +16197,7 @@ packages: yargs: 15.4.1 dev: true - /postcss-import/14.1.0_postcss@8.4.19: + /postcss-import@14.1.0(postcss@8.4.19): resolution: {integrity: sha512-flwI+Vgm4SElObFVPpTIT7SU7R3qk2L7PyduMcokiaVKuWv9d/U+Gm/QAd8NDLuykTWTkcrjOeD2Pp1rMeBTGw==} engines: {node: '>=10.0.0'} peerDependencies: @@ -15888,7 +16209,7 @@ packages: resolve: 1.22.1 dev: true - /postcss-import/14.1.0_postcss@8.4.21: + /postcss-import@14.1.0(postcss@8.4.21): resolution: {integrity: sha512-flwI+Vgm4SElObFVPpTIT7SU7R3qk2L7PyduMcokiaVKuWv9d/U+Gm/QAd8NDLuykTWTkcrjOeD2Pp1rMeBTGw==} engines: {node: '>=10.0.0'} peerDependencies: @@ -15900,7 +16221,7 @@ packages: resolve: 1.22.1 dev: true - /postcss-js/4.0.0_postcss@8.4.19: + /postcss-js@4.0.0(postcss@8.4.19): resolution: {integrity: sha512-77QESFBwgX4irogGVPgQ5s07vLvFqWr228qZY+w6lW599cRlK/HmnlivnnVUxkjHnCu4J16PDMHcH+e+2HbvTQ==} engines: {node: ^12 || ^14 || >= 16} peerDependencies: @@ -15910,7 +16231,7 @@ packages: postcss: 8.4.19 dev: true - /postcss-js/4.0.1_postcss@8.4.21: + /postcss-js@4.0.1(postcss@8.4.21): resolution: {integrity: sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==} engines: {node: ^12 || ^14 || >= 16} peerDependencies: @@ -15920,7 +16241,7 @@ packages: postcss: 8.4.21 dev: true - /postcss-load-config/2.1.2: + /postcss-load-config@2.1.2: resolution: {integrity: sha512-/rDeGV6vMUo3mwJZmeHfEDvwnTKKqQ0S7OHUi/kJvvtx3aWtyWG2/0ZWnzCt2keEclwN6Tf0DST2v9kITdOKYw==} engines: {node: '>= 4'} dependencies: @@ -15928,7 +16249,7 @@ packages: import-cwd: 2.1.0 dev: true - /postcss-load-config/3.1.4_postcss@8.4.19: + /postcss-load-config@3.1.4(postcss@8.4.19): resolution: {integrity: sha512-6DiM4E7v4coTE4uzA8U//WhtPwyhiim3eyjEMFCnUpzbrkK9wJHgKDT2mR+HbtSrd/NubVaYTOpSpjUl8NQeRg==} engines: {node: '>= 10'} peerDependencies: @@ -15945,7 +16266,7 @@ packages: yaml: 1.10.2 dev: true - /postcss-load-config/3.1.4_postcss@8.4.21: + /postcss-load-config@3.1.4(postcss@8.4.21): resolution: {integrity: sha512-6DiM4E7v4coTE4uzA8U//WhtPwyhiim3eyjEMFCnUpzbrkK9wJHgKDT2mR+HbtSrd/NubVaYTOpSpjUl8NQeRg==} engines: {node: '>= 10'} peerDependencies: @@ -15962,7 +16283,7 @@ packages: yaml: 1.10.2 dev: true - /postcss-loader/6.2.1_postcss@8.4.19: + /postcss-loader@6.2.1(postcss@8.4.19)(webpack@5.75.0): resolution: {integrity: sha512-WbbYpmAaKcux/P66bZ40bpWsBucjx/TTgVVzRZ9yUO8yQfVBlameJ0ZGVaPfH64hNSBh63a+ICP5nqOpBA0w+Q==} engines: {node: '>= 12.13.0'} peerDependencies: @@ -15973,9 +16294,10 @@ packages: klona: 2.0.5 postcss: 8.4.19 semver: 7.3.8 + webpack: 5.75.0 dev: true - /postcss-loader/6.2.1_postcss@8.4.21: + /postcss-loader@6.2.1(postcss@8.4.21)(webpack@5.75.0): resolution: {integrity: sha512-WbbYpmAaKcux/P66bZ40bpWsBucjx/TTgVVzRZ9yUO8yQfVBlameJ0ZGVaPfH64hNSBh63a+ICP5nqOpBA0w+Q==} engines: {node: '>= 12.13.0'} peerDependencies: @@ -15986,9 +16308,10 @@ packages: klona: 2.0.5 postcss: 8.4.21 semver: 7.3.8 + webpack: 5.75.0 dev: true - /postcss-modules-extract-imports/3.0.0_postcss@8.4.21: + /postcss-modules-extract-imports@3.0.0(postcss@8.4.21): resolution: {integrity: sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==} engines: {node: ^10 || ^12 || >= 14} peerDependencies: @@ -15997,19 +16320,19 @@ packages: postcss: 8.4.21 dev: true - /postcss-modules-local-by-default/4.0.0_postcss@8.4.21: + /postcss-modules-local-by-default@4.0.0(postcss@8.4.21): resolution: {integrity: sha512-sT7ihtmGSF9yhm6ggikHdV0hlziDTX7oFoXtuVWeDd3hHObNkcHRo9V3yg7vCAY7cONyxJC/XXCmmiHHcvX7bQ==} engines: {node: ^10 || ^12 || >= 14} peerDependencies: postcss: ^8.1.0 dependencies: - icss-utils: 5.1.0_postcss@8.4.21 + icss-utils: 5.1.0(postcss@8.4.21) postcss: 8.4.21 postcss-selector-parser: 6.0.11 postcss-value-parser: 4.2.0 dev: true - /postcss-modules-scope/3.0.0_postcss@8.4.21: + /postcss-modules-scope@3.0.0(postcss@8.4.21): resolution: {integrity: sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg==} engines: {node: ^10 || ^12 || >= 14} peerDependencies: @@ -16019,17 +16342,17 @@ packages: postcss-selector-parser: 6.0.11 dev: true - /postcss-modules-values/4.0.0_postcss@8.4.21: + /postcss-modules-values@4.0.0(postcss@8.4.21): resolution: {integrity: sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==} engines: {node: ^10 || ^12 || >= 14} peerDependencies: postcss: ^8.1.0 dependencies: - icss-utils: 5.1.0_postcss@8.4.21 + icss-utils: 5.1.0(postcss@8.4.21) postcss: 8.4.21 dev: true - /postcss-nested/6.0.0_postcss@8.4.19: + /postcss-nested@6.0.0(postcss@8.4.19): resolution: {integrity: sha512-0DkamqrPcmkBDsLn+vQDIrtkSbNkv5AD/M322ySo9kqFkCIYklym2xEmWkwo+Y3/qZo34tzEPNUw4y7yMCdv5w==} engines: {node: '>=12.0'} peerDependencies: @@ -16039,7 +16362,7 @@ packages: postcss-selector-parser: 6.0.11 dev: true - /postcss-nested/6.0.0_postcss@8.4.21: + /postcss-nested@6.0.0(postcss@8.4.21): resolution: {integrity: sha512-0DkamqrPcmkBDsLn+vQDIrtkSbNkv5AD/M322ySo9kqFkCIYklym2xEmWkwo+Y3/qZo34tzEPNUw4y7yMCdv5w==} engines: {node: '>=12.0'} peerDependencies: @@ -16049,7 +16372,7 @@ packages: postcss-selector-parser: 6.0.11 dev: true - /postcss-reporter/6.0.1: + /postcss-reporter@6.0.1: resolution: {integrity: sha512-LpmQjfRWyabc+fRygxZjpRxfhRf9u/fdlKf4VHG4TSPbV2XNsuISzYW1KL+1aQzx53CAppa1bKG4APIB/DOXXw==} engines: {node: '>=6'} dependencies: @@ -16059,7 +16382,7 @@ packages: postcss: 7.0.39 dev: true - /postcss-selector-parser/6.0.11: + /postcss-selector-parser@6.0.11: resolution: {integrity: sha512-zbARubNdogI9j7WY4nQJBiNqQf3sLS3wCP4WfOidu+p28LofJqDH1tcXypGrcmMHhDk2t9wGhCsYe/+szLTy1g==} engines: {node: '>=4'} dependencies: @@ -16067,11 +16390,11 @@ packages: util-deprecate: 1.0.2 dev: true - /postcss-value-parser/4.2.0: + /postcss-value-parser@4.2.0: resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} dev: true - /postcss/7.0.39: + /postcss@7.0.39: resolution: {integrity: sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==} engines: {node: '>=6.0.0'} dependencies: @@ -16079,7 +16402,7 @@ packages: source-map: 0.6.1 dev: true - /postcss/8.4.14: + /postcss@8.4.14: resolution: {integrity: sha512-E398TUmfAYFPBSdzgeieK2Y1+1cpdxJx8yXbK/m57nRhKSmk1GB2tO4lbLBtlkfPQTDKfe4Xqv1ASWPpayPEig==} engines: {node: ^10 || ^12 || >=14} dependencies: @@ -16088,7 +16411,7 @@ packages: source-map-js: 1.0.2 dev: false - /postcss/8.4.19: + /postcss@8.4.19: resolution: {integrity: sha512-h+pbPsyhlYj6N2ozBmHhHrs9DzGmbaarbLvWipMRO7RLS+v4onj26MPFXA5OBYFxyqYhUJK456SwDcY9H2/zsA==} engines: {node: ^10 || ^12 || >=14} dependencies: @@ -16097,7 +16420,7 @@ packages: source-map-js: 1.0.2 dev: true - /postcss/8.4.21: + /postcss@8.4.21: resolution: {integrity: sha512-tP7u/Sn/dVxK2NnruI4H9BG+x+Wxz6oeZ1cJ8P6G/PZY0IKk4k/63TDsQf2kQq3+qoJeLm2kIBUNlZe3zgb4Zg==} engines: {node: ^10 || ^12 || >=14} dependencies: @@ -16106,20 +16429,20 @@ packages: source-map-js: 1.0.2 dev: true - /postinstall-postinstall/2.1.0: + /postinstall-postinstall@2.1.0: resolution: {integrity: sha512-7hQX6ZlZXIoRiWNrbMQaLzUUfH+sSx39u8EJ9HYuDc1kLo9IXKWjM5RSquZN1ad5GnH8CGFM78fsAAQi3OKEEQ==} requiresBuild: true dev: true - /preact/10.11.3: + /preact@10.11.3: resolution: {integrity: sha512-eY93IVpod/zG3uMF22Unl8h9KkrcKIRs2EGar8hwLZZDU1lkjph303V9HZBwufh2s736U6VXuhD109LYqPoffg==} dev: false - /preact/10.4.1: + /preact@10.4.1: resolution: {integrity: sha512-WKrRpCSwL2t3tpOOGhf2WfTpcmbpxaWtDbdJdKdjd0aEiTkvOmS4NBkG6kzlaAHI9AkQ3iVqbFWM3Ei7mZ4o1Q==} dev: false - /prebuild-install/7.1.1: + /prebuild-install@7.1.1: resolution: {integrity: sha512-jAXscXWMcCK8GgCoHOfIr0ODh5ai8mj63L2nWrjuAgXE6tDyYGnx4/8o/rCgU+B4JSyZBKbeZqzhtwtC3ovxjw==} engines: {node: '>=10'} hasBin: true @@ -16138,35 +16461,35 @@ packages: tunnel-agent: 0.6.0 dev: false - /precond/0.2.3: + /precond@0.2.3: resolution: {integrity: sha512-QCYG84SgGyGzqJ/vlMsxeXd/pgL/I94ixdNFyh1PusWmTCyVfPJjZ1K1jvHtsbfnXQs2TSkEP2fR7QiMZAnKFQ==} engines: {node: '>= 0.6'} dev: true - /prelude-ls/1.1.2: + /prelude-ls@1.1.2: resolution: {integrity: sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==} engines: {node: '>= 0.8.0'} dev: true - /prelude-ls/1.2.1: + /prelude-ls@1.2.1: resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} engines: {node: '>= 0.8.0'} dev: true - /prepend-http/2.0.0: + /prepend-http@2.0.0: resolution: {integrity: sha512-ravE6m9Atw9Z/jjttRUZ+clIXogdghyZAuWJ3qEzjT+jI/dL1ifAqhZeC5VHzQp1MSt1+jxKkFNemj/iO7tVUA==} engines: {node: '>=4'} dev: true optional: true - /prettier-linter-helpers/1.0.0: + /prettier-linter-helpers@1.0.0: resolution: {integrity: sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==} engines: {node: '>=6.0.0'} dependencies: fast-diff: 1.2.0 dev: true - /prettier-plugin-solidity/1.1.3_prettier@2.8.4: + /prettier-plugin-solidity@1.1.3(prettier@2.8.4): resolution: {integrity: sha512-fQ9yucPi2sBbA2U2Xjh6m4isUTJ7S7QLc/XDDsktqqxYfTwdYKJ0EnnywXHwCGAaYbQNK+HIYPL1OemxuMsgeg==} engines: {node: '>=12'} peerDependencies: @@ -16178,7 +16501,7 @@ packages: solidity-comments-extractor: 0.0.7 dev: true - /prettier-plugin-svelte/2.9.0_nryolsexf6k3znhuh4uzpugsem: + /prettier-plugin-svelte@2.9.0(prettier@2.7.1)(svelte@3.53.1): resolution: {integrity: sha512-3doBi5NO4IVgaNPtwewvrgPpqAcvNv0NwJNflr76PIGgi9nf1oguQV1Hpdm9TI2ALIQVn/9iIwLpBO5UcD2Jiw==} peerDependencies: prettier: ^1.16.4 || ^2.0.0 @@ -16188,26 +16511,26 @@ packages: svelte: 3.53.1 dev: true - /prettier/2.7.1: + /prettier@2.7.1: resolution: {integrity: sha512-ujppO+MkdPqoVINuDFDRLClm7D78qbDt0/NR+wp5FqEZOoTNAjPHWj17QRhu7geIHJfcNhRk1XVQmF8Bp3ye+g==} engines: {node: '>=10.13.0'} hasBin: true dev: true - /prettier/2.8.4: + /prettier@2.8.4: resolution: {integrity: sha512-vIS4Rlc2FNh0BySk3Wkd6xmwxB0FpOndW5fisM5H8hsZSxU2VWVB5CWIkIjWvrHjIhxk2g3bfMKM87zNTrZddw==} engines: {node: '>=10.13.0'} hasBin: true dev: true - /pretty-error/4.0.0: + /pretty-error@4.0.0: resolution: {integrity: sha512-AoJ5YMAcXKYxKhuJGdcvse+Voc6v1RgnsR3nWcYU7q4t6z0Q6T86sv5Zq8VIRbOWWFpvdGE83LtdSMNd+6Y0xw==} dependencies: lodash: 4.17.21 renderkid: 3.0.0 dev: true - /pretty-format/27.5.1: + /pretty-format@27.5.1: resolution: {integrity: sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: @@ -16216,35 +16539,35 @@ packages: react-is: 17.0.2 dev: true - /pretty-hrtime/1.0.3: + /pretty-hrtime@1.0.3: resolution: {integrity: sha512-66hKPCr+72mlfiSjlEB1+45IjXSqvVAIy6mocupoww4tBFE9R9IhwwUGoI4G++Tc9Aq+2rxOt0RFU6gPcrte0A==} engines: {node: '>= 0.8'} dev: true - /private/0.1.8: + /private@0.1.8: resolution: {integrity: sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==} engines: {node: '>= 0.6'} dev: true - /process-es6/0.11.6: + /process-es6@0.11.6: resolution: {integrity: sha512-GYBRQtL4v3wgigq10Pv58jmTbFXlIiTbSfgnNqZLY0ldUPqy1rRxDI5fCjoCpnM6TqmHQI8ydzTBXW86OYc0gA==} dev: true - /process-nextick-args/2.0.1: + /process-nextick-args@2.0.1: resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} dev: true - /process/0.11.10: + /process@0.11.10: resolution: {integrity: sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==} engines: {node: '>= 0.6.0'} dev: true - /progress/2.0.3: + /progress@2.0.3: resolution: {integrity: sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==} engines: {node: '>=0.4.0'} dev: true - /promise-inflight/1.0.1: + /promise-inflight@1.0.1: resolution: {integrity: sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==} peerDependencies: bluebird: '*' @@ -16253,7 +16576,7 @@ packages: optional: true dev: true - /promise-retry/2.0.1: + /promise-retry@2.0.1: resolution: {integrity: sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==} engines: {node: '>=10'} dependencies: @@ -16261,7 +16584,7 @@ packages: retry: 0.12.0 dev: true - /promise-to-callback/1.0.0: + /promise-to-callback@1.0.0: resolution: {integrity: sha512-uhMIZmKM5ZteDMfLgJnoSq9GCwsNKrYau73Awf1jIy6/eUcuuZ3P+CD9zUv0kJsIUbU+x6uLNIhXhLHDs1pNPA==} engines: {node: '>=0.10.0'} dependencies: @@ -16269,13 +16592,13 @@ packages: set-immediate-shim: 1.0.1 dev: true - /promise/8.3.0: + /promise@8.3.0: resolution: {integrity: sha512-rZPNPKTOYVNEEKFaq1HqTgOwZD+4/YHS5ukLzQCypkj+OkYx7iv0mA91lJlpPPZ8vMau3IIGj5Qlwrx+8iiSmg==} dependencies: asap: 2.0.6 dev: true - /prompts/2.4.2: + /prompts@2.4.2: resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==} engines: {node: '>= 6'} dependencies: @@ -16283,7 +16606,7 @@ packages: sisteransi: 1.0.5 dev: true - /proper-lockfile/4.1.2: + /proper-lockfile@4.1.2: resolution: {integrity: sha512-TjNPblN4BwAWMXU8s9AEz4JmQxnD1NNL7bNOY/AKUzyamc379FWASUhc/K1pL2noVb+XmZKLL68cjzLsiOAMaA==} dependencies: graceful-fs: 4.2.10 @@ -16291,15 +16614,15 @@ packages: signal-exit: 3.0.7 dev: true - /property-information/6.2.0: + /property-information@6.2.0: resolution: {integrity: sha512-kma4U7AFCTwpqq5twzC1YVIDXSqg6qQK6JN0smOw8fgRy1OkMi0CYSzFmsy6dnqSenamAtj0CyXMUJ1Mf6oROg==} dev: false - /protocols/2.0.1: + /protocols@2.0.1: resolution: {integrity: sha512-/XJ368cyBJ7fzLMwLKv1e4vLxOju2MNAIokcr7meSaNcVbWz/CPcW22cP04mwxOErdA5mwjA8Q6w/cdAQxVn7Q==} dev: false - /proxy-addr/2.0.7: + /proxy-addr@2.0.7: resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} engines: {node: '>= 0.10'} dependencies: @@ -16308,26 +16631,26 @@ packages: dev: true optional: true - /proxy-from-env/1.1.0: + /proxy-from-env@1.1.0: resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} dev: false - /prr/0.0.0: + /prr@0.0.0: resolution: {integrity: sha512-LmUECmrW7RVj6mDWKjTXfKug7TFGdiz9P18HMcO4RHL+RW7MCOGNvpj5j47Rnp6ne6r4fZ2VzyUWEpKbg+tsjQ==} dev: true - /prr/1.0.1: + /prr@1.0.1: resolution: {integrity: sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==} dev: true - /pseudomap/1.0.2: + /pseudomap@1.0.2: resolution: {integrity: sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==} - /psl/1.9.0: + /psl@1.9.0: resolution: {integrity: sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==} dev: true - /public-encrypt/4.0.3: + /public-encrypt@4.0.3: resolution: {integrity: sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==} dependencies: bn.js: 4.12.0 @@ -16338,15 +16661,15 @@ packages: safe-buffer: 5.2.1 dev: true - /pull-cat/1.1.11: + /pull-cat@1.1.11: resolution: {integrity: sha512-i3w+xZ3DCtTVz8S62hBOuNLRHqVDsHMNZmgrZsjPnsxXUgbWtXEee84lo1XswE7W2a3WHyqsNuDJTjVLAQR8xg==} dev: true - /pull-defer/0.2.3: + /pull-defer@0.2.3: resolution: {integrity: sha512-/An3KE7mVjZCqNhZsr22k1Tx8MACnUnHZZNPSJ0S62td8JtYr/AiRG42Vz7Syu31SoTLUzVIe61jtT/pNdjVYA==} dev: true - /pull-level/2.0.4: + /pull-level@2.0.4: resolution: {integrity: sha512-fW6pljDeUThpq5KXwKbRG3X7Ogk3vc75d5OQU/TvXXui65ykm+Bn+fiktg+MOx2jJ85cd+sheufPL+rw9QSVZg==} dependencies: level-post: 1.0.7 @@ -16358,53 +16681,53 @@ packages: stream-to-pull-stream: 1.7.3 dev: true - /pull-live/1.0.1: + /pull-live@1.0.1: resolution: {integrity: sha512-tkNz1QT5gId8aPhV5+dmwoIiA1nmfDOzJDlOOUpU5DNusj6neNd3EePybJ5+sITr2FwyCs/FVpx74YMCfc8YeA==} dependencies: pull-cat: 1.1.11 pull-stream: 3.7.0 dev: true - /pull-pushable/2.2.0: + /pull-pushable@2.2.0: resolution: {integrity: sha512-M7dp95enQ2kaHvfCt2+DJfyzgCSpWVR2h2kWYnVsW6ZpxQBx5wOu0QWOvQPVoPnBLUZYitYP2y7HyHkLQNeGXg==} dev: true - /pull-stream/3.7.0: + /pull-stream@3.7.0: resolution: {integrity: sha512-Eco+/R004UaCK2qEDE8vGklcTG2OeZSVm1kTUQNrykEjDwcFXDZhygFDsW49DbXyJMEhHeRL3z5cRVqPAhXlIw==} dev: true - /pull-window/2.1.4: + /pull-window@2.1.4: resolution: {integrity: sha512-cbDzN76BMlcGG46OImrgpkMf/VkCnupj8JhsrpBw3aWBM9ye345aYnqitmZCgauBkc0HbbRRn9hCnsa3k2FNUg==} dependencies: looper: 2.0.0 dev: true - /pump/3.0.0: + /pump@3.0.0: resolution: {integrity: sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==} dependencies: end-of-stream: 1.4.4 once: 1.4.0 - /punycode/1.3.2: + /punycode@1.3.2: resolution: {integrity: sha512-RofWgt/7fL5wP1Y7fxE7/EmTLzQVnB0ycyibJ0OOHIlJqTNzglYFxVwETOcIoJqJmpDXJ9xImDv+Fq34F/d4Dw==} dev: true - /punycode/2.1.0: + /punycode@2.1.0: resolution: {integrity: sha512-Yxz2kRwT90aPiWEMHVYnEf4+rhwF1tBmmZ4KepCP+Wkium9JxtWnUm1nqGwpiAHr/tnTSeHqr3wb++jgSkXjhA==} engines: {node: '>=6'} dev: true - /punycode/2.1.1: + /punycode@2.1.1: resolution: {integrity: sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==} engines: {node: '>=6'} dev: true - /punycode/2.3.0: + /punycode@2.3.0: resolution: {integrity: sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==} engines: {node: '>=6'} dev: true - /qrcode/1.4.4: + /qrcode@1.4.4: resolution: {integrity: sha512-oLzEC5+NKFou9P0bMj5+v6Z40evexeE29Z9cummZXZ9QXyMr3lphkURzxjXgPJC5azpxcshoDWV1xE46z+/c3Q==} engines: {node: '>=4'} hasBin: true @@ -16418,18 +16741,18 @@ packages: yargs: 13.3.2 dev: false - /qs/6.11.0: + /qs@6.11.0: resolution: {integrity: sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==} engines: {node: '>=0.6'} dependencies: side-channel: 1.0.4 - /qs/6.5.3: + /qs@6.5.3: resolution: {integrity: sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==} engines: {node: '>=0.6'} dev: true - /query-string/5.1.1: + /query-string@5.1.1: resolution: {integrity: sha512-gjWOsm2SoGlgLEdAGt7a6slVOk9mGiXmPFMqrEhLQ68rhQuBnpfs3+EmlvqKyxnCo9/PPlF+9MtY02S1aFg+Jw==} engines: {node: '>=0.10.0'} dependencies: @@ -16439,7 +16762,7 @@ packages: dev: true optional: true - /query-string/6.13.5: + /query-string@6.13.5: resolution: {integrity: sha512-svk3xg9qHR39P3JlHuD7g3nRnyay5mHbrPctEBDUxUkHRifPHXJDhBUycdCC0NBjXoDf44Gb+IsOZL1Uwn8M/Q==} engines: {node: '>=6'} dependencies: @@ -16448,49 +16771,49 @@ packages: strict-uri-encode: 2.0.0 dev: false - /querystring/0.2.0: + /querystring@0.2.0: resolution: {integrity: sha512-X/xY82scca2tau62i9mDyU9K+I+djTMUsvwf7xnUX5GLvVzgJybOJf4Y6o9Zx3oJK/LSXg5tTZBjwzqVPaPO2g==} engines: {node: '>=0.4.x'} deprecated: The querystring API is considered Legacy. new code should use the URLSearchParams API instead. dev: true - /querystringify/2.2.0: + /querystringify@2.2.0: resolution: {integrity: sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==} dev: true - /queue-microtask/1.2.3: + /queue-microtask@1.2.3: resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} dev: true - /quick-lru/4.0.1: + /quick-lru@4.0.1: resolution: {integrity: sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==} engines: {node: '>=8'} dev: true - /quick-lru/5.1.1: + /quick-lru@5.1.1: resolution: {integrity: sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==} engines: {node: '>=10'} dev: true - /randombytes/2.1.0: + /randombytes@2.1.0: resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} dependencies: safe-buffer: 5.2.1 - /randomfill/1.0.4: + /randomfill@1.0.4: resolution: {integrity: sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==} dependencies: randombytes: 2.1.0 safe-buffer: 5.2.1 dev: true - /range-parser/1.2.1: + /range-parser@1.2.1: resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==} engines: {node: '>= 0.6'} dev: true optional: true - /raw-body/2.5.1: + /raw-body@2.5.1: resolution: {integrity: sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==} engines: {node: '>= 0.8'} dependencies: @@ -16501,7 +16824,7 @@ packages: dev: true optional: true - /raw-body/2.5.2: + /raw-body@2.5.2: resolution: {integrity: sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==} engines: {node: '>= 0.8'} dependencies: @@ -16511,7 +16834,7 @@ packages: unpipe: 1.0.0 dev: true - /rc/1.2.8: + /rc@1.2.8: resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==} hasBin: true dependencies: @@ -16521,7 +16844,7 @@ packages: strip-json-comments: 2.0.1 dev: false - /react-dom/18.2.0_react@18.2.0: + /react-dom@18.2.0(react@18.2.0): resolution: {integrity: sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==} peerDependencies: react: ^18.2.0 @@ -16531,23 +16854,23 @@ packages: scheduler: 0.23.0 dev: false - /react-is/17.0.2: + /react-is@17.0.2: resolution: {integrity: sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==} dev: true - /react/18.2.0: + /react@18.2.0: resolution: {integrity: sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==} engines: {node: '>=0.10.0'} dependencies: loose-envify: 1.4.0 - /read-cache/1.0.0: + /read-cache@1.0.0: resolution: {integrity: sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==} dependencies: pify: 2.3.0 dev: true - /read-pkg-up/1.0.1: + /read-pkg-up@1.0.1: resolution: {integrity: sha512-WD9MTlNtI55IwYUS27iHh9tK3YoIVhxis8yKhLpTqWtml739uXc9NWTpxoHkfZf3+DkCCsXox94/VWZniuZm6A==} engines: {node: '>=0.10.0'} dependencies: @@ -16555,7 +16878,7 @@ packages: read-pkg: 1.1.0 dev: true - /read-pkg-up/7.0.1: + /read-pkg-up@7.0.1: resolution: {integrity: sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==} engines: {node: '>=8'} dependencies: @@ -16564,7 +16887,7 @@ packages: type-fest: 0.8.1 dev: true - /read-pkg/1.1.0: + /read-pkg@1.1.0: resolution: {integrity: sha512-7BGwRHqt4s/uVbuyoeejRn4YmFnYZiFl4AuaeXHlgZf3sONF0SOGlxs2Pw8g6hCKupo08RafIO5YXFNOKTfwsQ==} engines: {node: '>=0.10.0'} dependencies: @@ -16573,7 +16896,7 @@ packages: path-type: 1.1.0 dev: true - /read-pkg/5.2.0: + /read-pkg@5.2.0: resolution: {integrity: sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==} engines: {node: '>=8'} dependencies: @@ -16583,7 +16906,7 @@ packages: type-fest: 0.6.0 dev: true - /readable-stream/1.0.34: + /readable-stream@1.0.34: resolution: {integrity: sha512-ok1qVCJuRkNmvebYikljxJA/UEsKwLl2nI1OmaqAu4/UE+h0wKCHok4XkL/gvi39OacXvw59RJUOFUkDib2rHg==} dependencies: core-util-is: 1.0.3 @@ -16592,7 +16915,7 @@ packages: string_decoder: 0.10.31 dev: true - /readable-stream/2.3.7: + /readable-stream@2.3.7: resolution: {integrity: sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==} dependencies: core-util-is: 1.0.3 @@ -16604,7 +16927,7 @@ packages: util-deprecate: 1.0.2 dev: true - /readable-stream/2.3.8: + /readable-stream@2.3.8: resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} dependencies: core-util-is: 1.0.3 @@ -16616,7 +16939,7 @@ packages: util-deprecate: 1.0.2 dev: true - /readable-stream/3.6.2: + /readable-stream@3.6.2: resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} engines: {node: '>= 6'} dependencies: @@ -16624,39 +16947,39 @@ packages: string_decoder: 1.3.0 util-deprecate: 1.0.2 - /readdirp/3.2.0: + /readdirp@3.2.0: resolution: {integrity: sha512-crk4Qu3pmXwgxdSgGhgA/eXiJAPQiX4GMOZZMXnqKxHX7TaoL+3gQVo/WeuAiogr07DpnfjIMpXXa+PAIvwPGQ==} engines: {node: '>= 8'} dependencies: picomatch: 2.3.1 dev: true - /readdirp/3.6.0: + /readdirp@3.6.0: resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} engines: {node: '>=8.10.0'} dependencies: picomatch: 2.3.1 dev: true - /reading-time/1.5.0: + /reading-time@1.5.0: resolution: {integrity: sha512-onYyVhBNr4CmAxFsKS7bz+uTLRakypIe4R+5A824vBSkQy/hB3fZepoVEf8OVAxzLvK+H/jm9TzpI3ETSm64Kg==} dev: false - /rechoir/0.6.2: + /rechoir@0.6.2: resolution: {integrity: sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==} engines: {node: '>= 0.10'} dependencies: resolve: 1.22.1 dev: true - /recursive-readdir/2.2.3: + /recursive-readdir@2.2.3: resolution: {integrity: sha512-8HrF5ZsXk5FAH9dgsx3BlUer73nIhuj+9OrQwEbLTPOBzGkL1lsFCR01am+v+0m2Cmbs1nP12hLDl5FA7EszKA==} engines: {node: '>=6.0.0'} dependencies: minimatch: 3.1.2 dev: true - /redent/3.0.0: + /redent@3.0.0: resolution: {integrity: sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==} engines: {node: '>=8'} dependencies: @@ -16664,25 +16987,25 @@ packages: strip-indent: 3.0.0 dev: true - /regenerate-unicode-properties/10.1.0: + /regenerate-unicode-properties@10.1.0: resolution: {integrity: sha512-d1VudCLoIGitcU/hEg2QqvyGZQmdC0Lf8BqdOMXGFSvJP4bNV1+XqbPQeHHLD51Jh4QJJ225dlIFvY4Ly6MXmQ==} engines: {node: '>=4'} dependencies: regenerate: 1.4.2 dev: true - /regenerate/1.4.2: + /regenerate@1.4.2: resolution: {integrity: sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==} dev: true - /regenerator-runtime/0.11.1: + /regenerator-runtime@0.11.1: resolution: {integrity: sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==} dev: true - /regenerator-runtime/0.13.11: + /regenerator-runtime@0.13.11: resolution: {integrity: sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==} - /regenerator-transform/0.10.1: + /regenerator-transform@0.10.1: resolution: {integrity: sha512-PJepbvDbuK1xgIgnau7Y90cwaAmO/LCLMI2mPvaXq2heGMR3aWW5/BQvYrhJ8jgmQjXewXvBjzfqKcVOmhjZ6Q==} dependencies: babel-runtime: 6.26.0 @@ -16690,13 +17013,13 @@ packages: private: 0.1.8 dev: true - /regenerator-transform/0.15.1: + /regenerator-transform@0.15.1: resolution: {integrity: sha512-knzmNAcuyxV+gQCufkYcvOqX/qIIfHLv0u5x79kRxuGojfYVky1f15TzZEu2Avte8QGepvUNTnLskf8E6X6Vyg==} dependencies: '@babel/runtime': 7.20.13 dev: true - /regex-not/1.0.2: + /regex-not@1.0.2: resolution: {integrity: sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==} engines: {node: '>=0.10.0'} dependencies: @@ -16704,7 +17027,7 @@ packages: safe-regex: 1.1.0 dev: true - /regexp.prototype.flags/1.4.3: + /regexp.prototype.flags@1.4.3: resolution: {integrity: sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA==} engines: {node: '>= 0.4'} dependencies: @@ -16713,17 +17036,17 @@ packages: functions-have-names: 1.2.3 dev: true - /regexparam/2.0.1: + /regexparam@2.0.1: resolution: {integrity: sha512-zRgSaYemnNYxUv+/5SeoHI0eJIgTL/A2pUtXUPLHQxUldagouJ9p+K6IbIZ/JiQuCEv2E2B1O11SjVQy3aMCkw==} engines: {node: '>=8'} dev: false - /regexpp/3.2.0: + /regexpp@3.2.0: resolution: {integrity: sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==} engines: {node: '>=8'} dev: true - /regexpu-core/2.0.0: + /regexpu-core@2.0.0: resolution: {integrity: sha512-tJ9+S4oKjxY8IZ9jmjnp/mtytu1u3iyIQAfmI51IKWH6bFf7XR1ybtaO6j7INhZKXOTYADk7V5qxaqLkmNxiZQ==} dependencies: regenerate: 1.4.2 @@ -16731,7 +17054,7 @@ packages: regjsparser: 0.1.5 dev: true - /regexpu-core/5.2.2: + /regexpu-core@5.2.2: resolution: {integrity: sha512-T0+1Zp2wjF/juXMrMxHxidqGYn8U4R+zleSJhX9tQ1PUsS8a9UtYfbsF9LdiVgNX3kiX8RNaKM42nfSgvFJjmw==} engines: {node: '>=4'} dependencies: @@ -16743,29 +17066,29 @@ packages: unicode-match-property-value-ecmascript: 2.1.0 dev: true - /regjsgen/0.2.0: + /regjsgen@0.2.0: resolution: {integrity: sha512-x+Y3yA24uF68m5GA+tBjbGYo64xXVJpbToBaWCoSNSc1hdk6dfctaRWrNFTVJZIIhL5GxW8zwjoixbnifnK59g==} dev: true - /regjsgen/0.7.1: + /regjsgen@0.7.1: resolution: {integrity: sha512-RAt+8H2ZEzHeYWxZ3H2z6tF18zyyOnlcdaafLrm21Bguj7uZy6ULibiAFdXEtKQY4Sy7wDTwDiOazasMLc4KPA==} dev: true - /regjsparser/0.1.5: + /regjsparser@0.1.5: resolution: {integrity: sha512-jlQ9gYLfk2p3V5Ag5fYhA7fv7OHzd1KUH0PRP46xc3TgwjwgROIW572AfYg/X9kaNq/LJnu6oJcFRXlIrGoTRw==} hasBin: true dependencies: jsesc: 0.5.0 dev: true - /regjsparser/0.9.1: + /regjsparser@0.9.1: resolution: {integrity: sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==} hasBin: true dependencies: jsesc: 0.5.0 dev: true - /rehype-katex/6.0.2: + /rehype-katex@6.0.2: resolution: {integrity: sha512-C4gDAlS1+l0hJqctyiU64f9CvT00S03qV1T6HiMzbSuLBgWUtcqydWHY9OpKrm0SpkK16FNd62CDKyWLwV2ppg==} dependencies: '@types/hast': 2.3.4 @@ -16778,7 +17101,7 @@ packages: unist-util-visit: 4.1.2 dev: false - /rehype-parse/8.0.4: + /rehype-parse@8.0.4: resolution: {integrity: sha512-MJJKONunHjoTh4kc3dsM1v3C9kGrrxvA3U8PxZlP2SjH8RNUSrb+lF7Y0KVaUDnGH2QZ5vAn7ulkiajM9ifuqg==} dependencies: '@types/hast': 2.3.4 @@ -16787,7 +17110,7 @@ packages: unified: 10.1.2 dev: false - /rehype-pretty-code/0.9.3_shiki@0.14.1: + /rehype-pretty-code@0.9.3(shiki@0.14.1): resolution: {integrity: sha512-57i+ifrttqpeQxub0NZ2pRw0aiUPYeBpr234NLWfZ4BfbEaP+29+iCXB1rUMkzoPi6IBC4w4I93mUPgw36IajQ==} engines: {node: ^12.16.0 || >=13.2.0} peerDependencies: @@ -16798,12 +17121,12 @@ packages: shiki: 0.14.1 dev: false - /relateurl/0.2.7: + /relateurl@0.2.7: resolution: {integrity: sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==} engines: {node: '>= 0.10'} dev: true - /remark-gfm/3.0.1: + /remark-gfm@3.0.1: resolution: {integrity: sha512-lEFDoi2PICJyNrACFOfDD3JlLkuSbOa5Wd8EPt06HUdptv8Gn0bxYTdbU/XXQ3swAPkEaGxxPN9cbnMHvVu1Ig==} dependencies: '@types/mdast': 3.0.10 @@ -16814,7 +17137,7 @@ packages: - supports-color dev: false - /remark-math/5.1.1: + /remark-math@5.1.1: resolution: {integrity: sha512-cE5T2R/xLVtfFI4cCePtiRn+e6jKMtFDR3P8V3qpv8wpKjwvHoBA4eJzvX+nVrnlNy0911bdGmuspCSwetfYHw==} dependencies: '@types/mdast': 3.0.10 @@ -16823,7 +17146,7 @@ packages: unified: 10.1.2 dev: false - /remark-mdx/2.3.0: + /remark-mdx@2.3.0: resolution: {integrity: sha512-g53hMkpM0I98MU266IzDFMrTD980gNF3BJnkyFcmN+dD873mQeD5rdMO3Y2X+x8umQfbSE0PcoEDl7ledSA+2g==} dependencies: mdast-util-mdx: 2.0.1 @@ -16832,7 +17155,7 @@ packages: - supports-color dev: false - /remark-parse/10.0.1: + /remark-parse@10.0.1: resolution: {integrity: sha512-1fUyHr2jLsVOkhbvPRBJ5zTKZZyD6yZzYaWCS6BPBdQ8vEMBCH+9zNCDA6tET/zHCi/jLqjCWtlJZUPk+DbnFw==} dependencies: '@types/mdast': 3.0.10 @@ -16842,7 +17165,7 @@ packages: - supports-color dev: false - /remark-reading-time/2.0.1: + /remark-reading-time@2.0.1: resolution: {integrity: sha512-fy4BKy9SRhtYbEHvp6AItbRTnrhiDGbqLQTSYVbQPGuRCncU1ubSsh9p/W5QZSxtYcUXv8KGL0xBgPLyNJA1xw==} dependencies: estree-util-is-identifier-name: 2.1.0 @@ -16851,7 +17174,7 @@ packages: unist-util-visit: 3.1.0 dev: false - /remark-rehype/10.1.0: + /remark-rehype@10.1.0: resolution: {integrity: sha512-EFmR5zppdBp0WQeDVZ/b66CWJipB2q2VLNFMabzDSGR66Z2fQii83G5gTBbgGEnEEA0QRussvrFHxk1HWGJskw==} dependencies: '@types/hast': 2.3.4 @@ -16860,11 +17183,11 @@ packages: unified: 10.1.2 dev: false - /remove-accents/0.4.2: + /remove-accents@0.4.2: resolution: {integrity: sha512-7pXIJqJOq5tFgG1A2Zxti3Ht8jJF337m4sowbuHsW30ZnkQFnDzy9qBNhgzX8ZLW4+UBcXiiR7SwR6pokHsxiA==} dev: false - /renderkid/3.0.0: + /renderkid@3.0.0: resolution: {integrity: sha512-q/7VIQA8lmM1hF+jn+sFSPWGlMkSAeNYcPLmDQx2zzuiDfaLrOmumR8iaUKlenFgh0XRPIUeSPlH3A+AW3Z5pg==} dependencies: css-select: 4.3.0 @@ -16874,38 +17197,38 @@ packages: strip-ansi: 6.0.1 dev: true - /repeat-element/1.1.4: + /repeat-element@1.1.4: resolution: {integrity: sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ==} engines: {node: '>=0.10.0'} dev: true - /repeat-string/1.6.1: + /repeat-string@1.6.1: resolution: {integrity: sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==} engines: {node: '>=0.10'} dev: true - /repeating/2.0.1: + /repeating@2.0.1: resolution: {integrity: sha512-ZqtSMuVybkISo2OWvqvm7iHSWngvdaW3IpsT9/uP8v4gMi591LY6h35wdOfvQdWCKFWZWm2Y1Opp4kV7vQKT6A==} engines: {node: '>=0.10.0'} dependencies: is-finite: 1.1.0 dev: true - /req-cwd/2.0.0: + /req-cwd@2.0.0: resolution: {integrity: sha512-ueoIoLo1OfB6b05COxAA9UpeoscNpYyM+BqYlA7H6LVF4hKGPXQQSSaD2YmvDVJMkk4UDpAHIeU1zG53IqjvlQ==} engines: {node: '>=4'} dependencies: req-from: 2.0.0 dev: true - /req-from/2.0.0: + /req-from@2.0.0: resolution: {integrity: sha512-LzTfEVDVQHBRfjOUMgNBA+V6DWsSnoeKzf42J7l0xa/B4jyPOuuF5MlNSmomLNGemWTnV2TIdjSSLnEn95fOQA==} engines: {node: '>=4'} dependencies: resolve-from: 3.0.0 dev: true - /request-promise-core/1.1.4_request@2.88.2: + /request-promise-core@1.1.4(request@2.88.2): resolution: {integrity: sha512-TTbAfBBRdWD7aNNOoVOBH4pN/KigV6LyapYNNlAPA8JwbovRti1E88m3sYAwsLi5ryhPKsE9APwnjFTgdUjTpw==} engines: {node: '>=0.10.0'} peerDependencies: @@ -16915,7 +17238,7 @@ packages: request: 2.88.2 dev: true - /request-promise-native/1.0.9_request@2.88.2: + /request-promise-native@1.0.9(request@2.88.2): resolution: {integrity: sha512-wcW+sIUiWnKgNY0dqCpOZkUbF/I+YPi+f09JZIDa39Ec+q82CpSYniDp+ISgTTbKmnpJWASeJBPZmoxH84wt3g==} engines: {node: '>=0.12.0'} deprecated: request-promise-native has been deprecated because it extends the now deprecated request package, see https://github.com/request/request/issues/3142 @@ -16923,12 +17246,12 @@ packages: request: ^2.34 dependencies: request: 2.88.2 - request-promise-core: 1.1.4_request@2.88.2 + request-promise-core: 1.1.4(request@2.88.2) stealthy-require: 1.1.1 tough-cookie: 2.5.0 dev: true - /request/2.88.2: + /request@2.88.2: resolution: {integrity: sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==} engines: {node: '>= 6'} deprecated: request has been deprecated, see https://github.com/request/request/issues/3142 @@ -16955,79 +17278,79 @@ packages: uuid: 3.4.0 dev: true - /require-directory/2.1.1: + /require-directory@2.1.1: resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} engines: {node: '>=0.10.0'} - /require-from-string/1.2.1: + /require-from-string@1.2.1: resolution: {integrity: sha512-H7AkJWMobeskkttHyhTVtS0fxpFLjxhbfMa6Bk3wimP7sdPRGL3EyCg3sAQenFfAe+xQ+oAc85Nmtvq0ROM83Q==} engines: {node: '>=0.10.0'} dev: true - /require-from-string/2.0.2: + /require-from-string@2.0.2: resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} engines: {node: '>=0.10.0'} dev: true - /require-main-filename/1.0.1: + /require-main-filename@1.0.1: resolution: {integrity: sha512-IqSUtOVP4ksd1C/ej5zeEh/BIP2ajqpn8c5x+q99gvcIG/Qf0cud5raVnE/Dwd0ua9TXYDoDc0RE5hBSdz22Ug==} dev: true - /require-main-filename/2.0.0: + /require-main-filename@2.0.0: resolution: {integrity: sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==} - /requires-port/1.0.0: + /requires-port@1.0.0: resolution: {integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==} dev: true - /resolve-alpn/1.2.1: + /resolve-alpn@1.2.1: resolution: {integrity: sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==} dev: true optional: true - /resolve-cwd/3.0.0: + /resolve-cwd@3.0.0: resolution: {integrity: sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==} engines: {node: '>=8'} dependencies: resolve-from: 5.0.0 dev: true - /resolve-from/3.0.0: + /resolve-from@3.0.0: resolution: {integrity: sha512-GnlH6vxLymXJNMBo7XP1fJIzBFbdYt49CuTwmB/6N53t+kMPRMFKz783LlQ4tv28XoQfMWinAJX6WCGf2IlaIw==} engines: {node: '>=4'} dev: true - /resolve-from/4.0.0: + /resolve-from@4.0.0: resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} engines: {node: '>=4'} dev: true - /resolve-from/5.0.0: + /resolve-from@5.0.0: resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} engines: {node: '>=8'} dev: true - /resolve-url/0.2.1: + /resolve-url@0.2.1: resolution: {integrity: sha512-ZuF55hVUQaaczgOIwqWzkEcEidmlD/xl44x1UZnhOXcYuFN2S6+rcxpG+C1N3So0wvNI3DmJICUFfu2SxhBmvg==} deprecated: https://github.com/lydell/resolve-url#deprecated dev: true - /resolve.exports/1.1.0: + /resolve.exports@1.1.0: resolution: {integrity: sha512-J1l+Zxxp4XK3LUDZ9m60LRJF/mAe4z6a4xyabPHk7pvK5t35dACV32iIjJDFeWZFfZlO29w6SZ67knR0tHzJtQ==} engines: {node: '>=10'} dev: true - /resolve/1.1.7: + /resolve@1.1.7: resolution: {integrity: sha512-9znBF0vBcaSN3W2j7wKvdERPwqTxSpCq+if5C0WoTCyV9n24rua28jeuQ2pL/HOf+yUe/Mef+H/5p60K0Id3bg==} dev: true - /resolve/1.17.0: + /resolve@1.17.0: resolution: {integrity: sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==} dependencies: path-parse: 1.0.7 dev: true - /resolve/1.22.1: + /resolve@1.22.1: resolution: {integrity: sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==} hasBin: true dependencies: @@ -17035,21 +17358,21 @@ packages: path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 - /responselike/1.0.2: + /responselike@1.0.2: resolution: {integrity: sha512-/Fpe5guzJk1gPqdJLJR5u7eG/gNY4nImjbRDaVWVMRhne55TCmj2i9Q+54PBRfatRC8v/rIiv9BN0pMd9OV5EQ==} dependencies: lowercase-keys: 1.0.1 dev: true optional: true - /responselike/2.0.1: + /responselike@2.0.1: resolution: {integrity: sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==} dependencies: lowercase-keys: 2.0.0 dev: true optional: true - /restore-cursor/3.1.0: + /restore-cursor@3.1.0: resolution: {integrity: sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==} engines: {node: '>=8'} dependencies: @@ -17057,63 +17380,63 @@ packages: signal-exit: 3.0.7 dev: true - /resumer/0.0.0: + /resumer@0.0.0: resolution: {integrity: sha512-Fn9X8rX8yYF4m81rZCK/5VmrmsSbqS/i3rDLl6ZZHAXgC2nTAx3dhwG8q8odP/RmdLa2YrybDJaAMg+X1ajY3w==} dependencies: through: 2.3.8 dev: true - /ret/0.1.15: + /ret@0.1.15: resolution: {integrity: sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==} engines: {node: '>=0.12'} dev: true - /retry/0.12.0: + /retry@0.12.0: resolution: {integrity: sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==} engines: {node: '>= 4'} dev: true - /reusify/1.0.4: + /reusify@1.0.4: resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} engines: {iojs: '>=1.0.0', node: '>=0.10.0'} dev: true - /rfdc/1.3.0: + /rfdc@1.3.0: resolution: {integrity: sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==} dev: true - /rimraf/2.7.1: + /rimraf@2.7.1: resolution: {integrity: sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==} hasBin: true dependencies: glob: 7.2.3 dev: true - /rimraf/3.0.2: + /rimraf@3.0.2: resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} hasBin: true dependencies: glob: 7.2.3 dev: true - /ripemd160/2.0.2: + /ripemd160@2.0.2: resolution: {integrity: sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==} dependencies: hash-base: 3.1.0 inherits: 2.0.4 - /rlp/2.2.7: + /rlp@2.2.7: resolution: {integrity: sha512-d5gdPmgQ0Z+AklL2NVXr/IoSjNZFfTVvQWzL/AM2AOcSzYP2xjlb0AC8YyCLc41MSNf6P6QVtjgPdmVtzb+4lQ==} hasBin: true dependencies: bn.js: 5.2.1 - /rlp/3.0.0: + /rlp@3.0.0: resolution: {integrity: sha512-PD6U2PGk6Vq2spfgiWZdomLvRGDreBLxi5jv5M8EpRo3pU6VEm31KO+HFxE18Q3vgqfDrQ9pZA3FP95rkijNKw==} hasBin: true dev: true - /rollup-plugin-node-builtins/2.1.2: + /rollup-plugin-node-builtins@2.1.2: resolution: {integrity: sha512-bxdnJw8jIivr2yEyt8IZSGqZkygIJOGAWypXvHXnwKAbUcN4Q/dGTx7K0oAJryC/m6aq6tKutltSeXtuogU6sw==} dependencies: browserify-fs: 1.0.0 @@ -17122,15 +17445,16 @@ packages: process-es6: 0.11.6 dev: true - /rollup-plugin-polyfill-node/0.10.2: + /rollup-plugin-polyfill-node@0.10.2(rollup@2.79.1): resolution: {integrity: sha512-5GMywXiLiuQP6ZzED/LO/Q0HyDi2W6b8VN+Zd3oB0opIjyRs494Me2ZMaqKWDNbGiW4jvvzl6L2n4zRgxS9cSQ==} peerDependencies: rollup: ^1.20.0 || ^2.0.0 dependencies: - '@rollup/plugin-inject': 4.0.4 + '@rollup/plugin-inject': 4.0.4(rollup@2.79.1) + rollup: 2.79.1 dev: true - /rollup/2.79.1: + /rollup@2.79.1: resolution: {integrity: sha512-uKxbd0IhMZOhjAiD5oAFp7BqvkA4Dv47qpOCtaNvng4HBwdbWtdOh8f5nZNuk2rp51PMGk3bzfWu5oayNEuYnw==} engines: {node: '>=10.0.0'} hasBin: true @@ -17138,71 +17462,71 @@ packages: fsevents: 2.3.2 dev: true - /rpc-websockets/7.5.0: + /rpc-websockets@7.5.0: resolution: {integrity: sha512-9tIRi1uZGy7YmDjErf1Ax3wtqdSSLIlnmL5OtOzgd5eqPKbsPpwDP5whUDO2LQay3Xp0CcHlcNSGzacNRluBaQ==} dependencies: '@babel/runtime': 7.20.13 eventemitter3: 4.0.7 uuid: 8.3.2 - ws: 8.11.0_3cxu5zja4e2r5wmvge7mdcljwq + ws: 8.11.0(bufferutil@4.0.7)(utf-8-validate@5.0.10) optionalDependencies: bufferutil: 4.0.7 utf-8-validate: 5.0.10 dev: false - /run-parallel-limit/1.1.0: + /run-parallel-limit@1.1.0: resolution: {integrity: sha512-jJA7irRNM91jaKc3Hcl1npHsFLOXOoTkPCUL1JEa1R82O2miplXXRaGdjW/KM/98YQWDhJLiSs793CnXfblJUw==} dependencies: queue-microtask: 1.2.3 dev: true - /run-parallel/1.2.0: + /run-parallel@1.2.0: resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} dependencies: queue-microtask: 1.2.3 dev: true - /rustbn.js/0.2.0: + /rustbn.js@0.2.0: resolution: {integrity: sha512-4VlvkRUuCJvr2J6Y0ImW7NvTCriMi7ErOAqWk1y69vAdoNIzCF3yPmgeNzx+RQTLEDFq5sHfscn1MwHxP9hNfA==} dev: true - /rxjs/6.6.7: + /rxjs@6.6.7: resolution: {integrity: sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==} engines: {npm: '>=2.0.0'} dependencies: tslib: 1.14.1 dev: false - /rxjs/7.8.0: + /rxjs@7.8.0: resolution: {integrity: sha512-F2+gxDshqmIub1KdvZkaEfGDwLNpPvk9Fs6LD/MyQxNgMds/WH9OdDDXOmxUZpME+iSK3rQCctkL0DYyytUqMg==} dependencies: tslib: 2.5.0 dev: true - /sade/1.8.1: + /sade@1.8.1: resolution: {integrity: sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==} engines: {node: '>=6'} dependencies: mri: 1.2.0 - /safe-buffer/5.1.2: + /safe-buffer@5.1.2: resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} dev: true - /safe-buffer/5.2.1: + /safe-buffer@5.2.1: resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} - /safe-event-emitter/1.0.1: + /safe-event-emitter@1.0.1: resolution: {integrity: sha512-e1wFe99A91XYYxoQbcq2ZJUWurxEyP8vfz7A7vuUe1s95q8r5ebraVaA1BukYJcpM6V16ugWoD9vngi8Ccu5fg==} deprecated: Renamed to @metamask/safe-event-emitter dependencies: events: 3.3.0 - /safe-json-utils/1.1.1: + /safe-json-utils@1.1.1: resolution: {integrity: sha512-SAJWGKDs50tAbiDXLf89PDwt9XYkWyANFWVzn4dTXl5QyI8t2o/bW5/OJl3lvc2WVU4MEpTo9Yz5NVFNsp+OJQ==} dev: false - /safe-regex-test/1.0.0: + /safe-regex-test@1.0.0: resolution: {integrity: sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==} dependencies: call-bind: 1.0.2 @@ -17210,17 +17534,17 @@ packages: is-regex: 1.1.4 dev: true - /safe-regex/1.1.0: + /safe-regex@1.1.0: resolution: {integrity: sha512-aJXcif4xnaNUzvUuC5gcb46oTS7zvg4jpMTnuqtrEPlR3vFr4pxtdTwaF1Qs3Enjn9HK+ZlwQui+a7z0SywIzg==} dependencies: ret: 0.1.15 dev: true - /safer-buffer/2.1.2: + /safer-buffer@2.1.2: resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} dev: true - /sander/0.5.1: + /sander@0.5.1: resolution: {integrity: sha512-3lVqBir7WuKDHGrKRDn/1Ye3kwpXaDOMsiRP1wd6wpZW56gJhsbp5RqQpA6JG/P+pkXizygnr1dKR8vzWaVsfA==} dependencies: es6-promise: 3.3.1 @@ -17229,7 +17553,7 @@ packages: rimraf: 2.7.1 dev: true - /sass-graph/4.0.1: + /sass-graph@4.0.1: resolution: {integrity: sha512-5YCfmGBmxoIRYHnKK2AKzrAkCoQ8ozO+iumT8K4tXJXRVCPf+7s1/9KxTSW3Rbvf+7Y7b4FR3mWyLnQr3PHocA==} engines: {node: '>=12'} hasBin: true @@ -17240,14 +17564,14 @@ packages: yargs: 17.6.2 dev: true - /saxes/5.0.1: + /saxes@5.0.1: resolution: {integrity: sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==} engines: {node: '>=10'} dependencies: xmlchars: 2.2.0 dev: true - /sc-istanbul/0.4.6: + /sc-istanbul@0.4.6: resolution: {integrity: sha512-qJFF/8tW/zJsbyfh/iT/ZM5QNHE3CXxtLJbZsL+CzdJLBsPD7SedJZoUA4d8iAcN2IoMp/Dx80shOOd2x96X/g==} hasBin: true dependencies: @@ -17267,49 +17591,49 @@ packages: wordwrap: 1.0.0 dev: true - /scheduler/0.23.0: + /scheduler@0.23.0: resolution: {integrity: sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==} dependencies: loose-envify: 1.4.0 dev: false - /schema-utils/3.1.1: + /schema-utils@3.1.1: resolution: {integrity: sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==} engines: {node: '>= 10.13.0'} dependencies: '@types/json-schema': 7.0.11 ajv: 6.12.6 - ajv-keywords: 3.5.2_ajv@6.12.6 + ajv-keywords: 3.5.2(ajv@6.12.6) dev: true - /scroll-into-view-if-needed/3.0.6: + /scroll-into-view-if-needed@3.0.6: resolution: {integrity: sha512-x+CW0kOzlFNOnseF0DBr0AJ5m+TgGmSOdEZwyiZW0gV87XBvxQKw5A8DvFFgabznA68XqLgVX+PwPX8OzsFvRA==} dependencies: compute-scroll-into-view: 3.0.0 dev: false - /scrypt-js/2.0.4: + /scrypt-js@2.0.4: resolution: {integrity: sha512-4KsaGcPnuhtCZQCxFxN3GVYIhKFPTdLd8PLC552XwbMndtD0cjRFAhDuuydXQ0h08ZfPgzqe6EKHozpuH74iDw==} dev: true - /scrypt-js/3.0.1: + /scrypt-js@3.0.1: resolution: {integrity: sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA==} - /scryptsy/1.2.1: + /scryptsy@1.2.1: resolution: {integrity: sha512-aldIRgMozSJ/Gl6K6qmJZysRP82lz83Wb42vl4PWN8SaLFHIaOzLPc9nUUW2jQN88CuGm5q5HefJ9jZ3nWSmTw==} dependencies: pbkdf2: 3.1.2 dev: true optional: true - /scss-tokenizer/0.4.3: + /scss-tokenizer@0.4.3: resolution: {integrity: sha512-raKLgf1LI5QMQnG+RxHz6oK0sL3x3I4FN2UDLqgLOGO8hodECNnNh5BXn7fAyBxrA8zVzdQizQ6XjNJQ+uBwMw==} dependencies: js-base64: 2.6.4 source-map: 0.7.4 dev: true - /secp256k1/4.0.3: + /secp256k1@4.0.3: resolution: {integrity: sha512-NLZVf+ROMxwtEj3Xa562qgv2BK5e2WNmXPiOdVIPLgs6lyTzMvBq0aWTYMI5XCP9jZMVKOcqZLw/Wc4vDkuxhA==} engines: {node: '>=10.0.0'} requiresBuild: true @@ -17318,7 +17642,7 @@ packages: node-addon-api: 2.0.2 node-gyp-build: 4.6.0 - /section-matter/1.0.0: + /section-matter@1.0.0: resolution: {integrity: sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA==} engines: {node: '>=4'} dependencies: @@ -17326,46 +17650,46 @@ packages: kind-of: 6.0.3 dev: false - /seedrandom/3.0.1: + /seedrandom@3.0.1: resolution: {integrity: sha512-1/02Y/rUeU1CJBAGLebiC5Lbo5FnB22gQbIFFYTLkwvp1xdABZJH1sn4ZT1MzXmPpzv+Rf/Lu2NcsLJiK4rcDg==} dev: true - /semaphore-async-await/1.5.1: + /semaphore-async-await@1.5.1: resolution: {integrity: sha512-b/ptP11hETwYWpeilHXXQiV5UJNJl7ZWWooKRE5eBIYWoom6dZ0SluCIdCtKycsMtZgKWE01/qAw6jblw1YVhg==} engines: {node: '>=4.1'} dev: true - /semaphore/1.1.0: + /semaphore@1.1.0: resolution: {integrity: sha512-O4OZEaNtkMd/K0i6js9SL+gqy0ZCBMgUvlSqHKi4IBdjhe7wB8pwztUk1BbZ1fmrvpwFrPbHzqd2w5pTcJH6LA==} engines: {node: '>=0.8.0'} dev: true - /semver/2.3.2: + /semver@2.3.2: resolution: {integrity: sha512-abLdIKCosKfpnmhS52NCTjO4RiLspDfsn37prjzGrp9im5DPJOgh82Os92vtwGh6XdQryKI/7SREZnV+aqiXrA==} hasBin: true dev: true - /semver/5.4.1: + /semver@5.4.1: resolution: {integrity: sha512-WfG/X9+oATh81XtllIo/I8gOiY9EXRdv1cQdyykeXK17YcUW3EXUAi2To4pcH6nZtJPr7ZOpM5OMyWJZm+8Rsg==} hasBin: true dev: true - /semver/5.7.1: + /semver@5.7.1: resolution: {integrity: sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==} hasBin: true - /semver/6.3.0: + /semver@6.3.0: resolution: {integrity: sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==} hasBin: true - /semver/7.3.8: + /semver@7.3.8: resolution: {integrity: sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==} engines: {node: '>=10'} hasBin: true dependencies: lru-cache: 6.0.0 - /send/0.18.0: + /send@0.18.0: resolution: {integrity: sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==} engines: {node: '>= 0.8.0'} dependencies: @@ -17387,19 +17711,19 @@ packages: dev: true optional: true - /serialize-javascript/6.0.0: + /serialize-javascript@6.0.0: resolution: {integrity: sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==} dependencies: randombytes: 2.1.0 dev: true - /serialize-javascript/6.0.1: + /serialize-javascript@6.0.1: resolution: {integrity: sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w==} dependencies: randombytes: 2.1.0 dev: true - /serve-static/1.15.0: + /serve-static@1.15.0: resolution: {integrity: sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==} engines: {node: '>= 0.8.0'} dependencies: @@ -17412,7 +17736,7 @@ packages: dev: true optional: true - /servify/0.1.12: + /servify@0.1.12: resolution: {integrity: sha512-/xE6GvsKKqyo1BAY+KxOWXcLpPsUUyji7Qg3bVD7hh1eRze5bR1uYiuDA/k3Gof1s9BTzQZEJK8sNcNGFIzeWw==} engines: {node: '>=6'} dependencies: @@ -17426,15 +17750,15 @@ packages: dev: true optional: true - /set-blocking/2.0.0: + /set-blocking@2.0.0: resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==} - /set-immediate-shim/1.0.1: + /set-immediate-shim@1.0.1: resolution: {integrity: sha512-Li5AOqrZWCVA2n5kryzEmqai6bKSIvpz5oUJHPVj6+dsbD3X1ixtsY5tEnsaNpH3pFAHmG8eIHUrtEtohrg+UQ==} engines: {node: '>=0.10.0'} dev: true - /set-value/2.0.1: + /set-value@2.0.1: resolution: {integrity: sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==} engines: {node: '>=0.10.0'} dependencies: @@ -17444,32 +17768,32 @@ packages: split-string: 3.1.0 dev: true - /setimmediate/1.0.4: + /setimmediate@1.0.4: resolution: {integrity: sha512-/TjEmXQVEzdod/FFskf3o7oOAsGhHf2j1dZqRFbDzq4F3mvvxflIIi4Hd3bLQE9y/CpwqfSQam5JakI/mi3Pog==} dev: true - /setimmediate/1.0.5: + /setimmediate@1.0.5: resolution: {integrity: sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==} - /setprototypeof/1.2.0: + /setprototypeof@1.2.0: resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} dev: true - /sha.js/2.4.11: + /sha.js@2.4.11: resolution: {integrity: sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==} hasBin: true dependencies: inherits: 2.0.4 safe-buffer: 5.2.1 - /sha1/1.1.1: + /sha1@1.1.1: resolution: {integrity: sha512-dZBS6OrMjtgVkopB1Gmo4RQCDKiZsqcpAQpkV/aaj+FCrCg8r4I4qMkDPQjBgLIxlmu9k4nUbWq6ohXahOneYA==} dependencies: charenc: 0.0.2 crypt: 0.0.2 dev: true - /sharp/0.31.3: + /sharp@0.31.3: resolution: {integrity: sha512-XcR4+FCLBFKw1bdB+GEhnUNXNXvnt0tDo4WsBsraKymuo/IAuPuCBVAL2wIkUw2r/dwFW5Q5+g66Kwl2dgDFVg==} engines: {node: '>=14.15.0'} requiresBuild: true @@ -17484,29 +17808,29 @@ packages: tunnel-agent: 0.6.0 dev: false - /shebang-command/1.2.0: + /shebang-command@1.2.0: resolution: {integrity: sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==} engines: {node: '>=0.10.0'} dependencies: shebang-regex: 1.0.0 - /shebang-command/2.0.0: + /shebang-command@2.0.0: resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} engines: {node: '>=8'} dependencies: shebang-regex: 3.0.0 dev: true - /shebang-regex/1.0.0: + /shebang-regex@1.0.0: resolution: {integrity: sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==} engines: {node: '>=0.10.0'} - /shebang-regex/3.0.0: + /shebang-regex@3.0.0: resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} engines: {node: '>=8'} dev: true - /shelljs/0.8.5: + /shelljs@0.8.5: resolution: {integrity: sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==} engines: {node: '>=4'} hasBin: true @@ -17516,7 +17840,7 @@ packages: rechoir: 0.6.2 dev: true - /shiki/0.14.1: + /shiki@0.14.1: resolution: {integrity: sha512-+Jz4nBkCBe0mEDqo1eKRcCdjRtrCjozmcbTUjbPTX7OOJfEbTZzlUWlZtGe3Gb5oV1/jnojhG//YZc3rs9zSEw==} dependencies: ansi-sequence-parser: 1.1.0 @@ -17525,20 +17849,20 @@ packages: vscode-textmate: 8.0.0 dev: false - /side-channel/1.0.4: + /side-channel@1.0.4: resolution: {integrity: sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==} dependencies: call-bind: 1.0.2 get-intrinsic: 1.2.0 object-inspect: 1.12.3 - /signal-exit/3.0.7: + /signal-exit@3.0.7: resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} - /simple-concat/1.0.1: + /simple-concat@1.0.1: resolution: {integrity: sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==} - /simple-get/2.8.2: + /simple-get@2.8.2: resolution: {integrity: sha512-Ijd/rV5o+mSBBs4F/x9oDPtTx9Zb6X9brmnXvMW4J7IR15ngi9q5xxqWBKU744jTZiaXtxaPL7uHG6vtN8kUkw==} dependencies: decompress-response: 3.3.0 @@ -17547,7 +17871,7 @@ packages: dev: true optional: true - /simple-get/4.0.1: + /simple-get@4.0.1: resolution: {integrity: sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==} dependencies: decompress-response: 6.0.0 @@ -17555,31 +17879,31 @@ packages: simple-concat: 1.0.1 dev: false - /simple-swizzle/0.2.2: + /simple-swizzle@0.2.2: resolution: {integrity: sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==} dependencies: is-arrayish: 0.3.2 dev: false - /sisteransi/1.0.5: + /sisteransi@1.0.5: resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} dev: true - /slash/1.0.0: + /slash@1.0.0: resolution: {integrity: sha512-3TYDR7xWt4dIqV2JauJr+EJeW356RXijHeUlO+8djJ+uBXPn8/2dpzBc8yQhh583sVvc9CvFAeQVgijsH+PNNg==} engines: {node: '>=0.10.0'} dev: true - /slash/2.0.0: + /slash@2.0.0: resolution: {integrity: sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==} engines: {node: '>=6'} dev: true - /slash/3.0.0: + /slash@3.0.0: resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} engines: {node: '>=8'} - /slice-ansi/3.0.0: + /slice-ansi@3.0.0: resolution: {integrity: sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==} engines: {node: '>=8'} dependencies: @@ -17588,7 +17912,7 @@ packages: is-fullwidth-code-point: 3.0.0 dev: true - /slice-ansi/4.0.0: + /slice-ansi@4.0.0: resolution: {integrity: sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==} engines: {node: '>=10'} dependencies: @@ -17597,7 +17921,7 @@ packages: is-fullwidth-code-point: 3.0.0 dev: true - /slice-ansi/5.0.0: + /slice-ansi@5.0.0: resolution: {integrity: sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==} engines: {node: '>=12'} dependencies: @@ -17605,12 +17929,12 @@ packages: is-fullwidth-code-point: 4.0.0 dev: true - /smart-buffer/4.2.0: + /smart-buffer@4.2.0: resolution: {integrity: sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==} engines: {node: '>= 6.0.0', npm: '>= 3.0.0'} dev: true - /snapdragon-node/2.1.1: + /snapdragon-node@2.1.1: resolution: {integrity: sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==} engines: {node: '>=0.10.0'} dependencies: @@ -17619,14 +17943,14 @@ packages: snapdragon-util: 3.0.1 dev: true - /snapdragon-util/3.0.1: + /snapdragon-util@3.0.1: resolution: {integrity: sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==} engines: {node: '>=0.10.0'} dependencies: kind-of: 3.2.2 dev: true - /snapdragon/0.8.2: + /snapdragon@0.8.2: resolution: {integrity: sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==} engines: {node: '>=0.10.0'} dependencies: @@ -17642,18 +17966,18 @@ packages: - supports-color dev: true - /socks-proxy-agent/6.2.1: + /socks-proxy-agent@6.2.1: resolution: {integrity: sha512-a6KW9G+6B3nWZ1yB8G7pJwL3ggLy1uTzKAgCb7ttblwqdz9fMGJUuTy3uFzEP48FAs9FLILlmzDlE2JJhVQaXQ==} engines: {node: '>= 10'} dependencies: agent-base: 6.0.2 - debug: 4.3.4 + debug: 4.3.4(supports-color@8.1.1) socks: 2.7.1 transitivePeerDependencies: - supports-color dev: true - /socks/2.7.1: + /socks@2.7.1: resolution: {integrity: sha512-7maUZy1N7uo6+WVEX6psASxtNlKaNVMlGQKkG/63nEDdLOWNbiUMoLK7X4uYoLhQstau72mLgfEWcXcwsaHbYQ==} engines: {node: '>= 10.13.0', npm: '>= 3.0.0'} dependencies: @@ -17661,7 +17985,7 @@ packages: smart-buffer: 4.2.0 dev: true - /solc/0.4.26: + /solc@0.4.26: resolution: {integrity: sha512-o+c6FpkiHd+HPjmjEVpQgH7fqZ14tJpXhho+/bQXlXbliLIS/xjXb42Vxh+qQY1WCSTMQ0+a5vR9vi0MfhU6mA==} hasBin: true dependencies: @@ -17672,7 +17996,7 @@ packages: yargs: 4.8.1 dev: true - /solc/0.6.12: + /solc@0.6.12: resolution: {integrity: sha512-Lm0Ql2G9Qc7yPP2Ba+WNmzw2jwsrd3u4PobHYlSOxaut3TtUbj9+5ZrT6f4DUpNPEoBaFUOEg9Op9C0mk7ge9g==} engines: {node: '>=8.0.0'} hasBin: true @@ -17687,14 +18011,14 @@ packages: tmp: 0.0.33 dev: true - /solc/0.7.3_debug@4.3.4: + /solc@0.7.3(debug@4.3.4): resolution: {integrity: sha512-GAsWNAjGzIDg7VxzP6mPjdurby3IkGCjQcM8GFYZT6RyaoUZKmMU6Y7YwG+tFGhv7dwZ8rmR4iwFDrrD99JwqA==} engines: {node: '>=8.0.0'} hasBin: true dependencies: command-exists: 1.2.9 commander: 3.0.2 - follow-redirects: 1.15.2 + follow-redirects: 1.15.2(debug@4.3.4) fs-extra: 0.30.0 js-sha3: 0.8.0 memorystream: 0.3.1 @@ -17705,14 +18029,14 @@ packages: - debug dev: true - /solc/0.8.19: + /solc@0.8.19: resolution: {integrity: sha512-yqurS3wzC4LdEvmMobODXqprV4MYJcVtinuxgrp61ac8K2zz40vXA0eSAskSHPgv8dQo7Nux39i3QBsHx4pqyA==} engines: {node: '>=10.0.0'} hasBin: true dependencies: command-exists: 1.2.9 commander: 8.3.0 - follow-redirects: 1.15.2 + follow-redirects: 1.15.2(debug@4.3.4) js-sha3: 0.8.0 memorystream: 0.3.1 semver: 5.7.1 @@ -17721,7 +18045,7 @@ packages: - debug dev: false - /solhint/3.4.0: + /solhint@3.4.0: resolution: {integrity: sha512-FYEs/LoTxMsWFP/OGsEqR1CBDn3Bn7hrTWsgtjai17MzxITgearIdlo374KKZjjIycu8E2xBcJ+RSWeoBvQmkw==} hasBin: true dependencies: @@ -17746,25 +18070,25 @@ packages: prettier: 2.8.4 dev: true - /solidity-ast/0.4.46: + /solidity-ast@0.4.46: resolution: {integrity: sha512-MlPZQfPhjWXqh7YxWcBGDXaPZIfMYCOHYoLEhGDWulNwEPIQQZuB7mA9eP17CU0jY/bGR4avCEUVVpvHtT2gbA==} dev: true - /solidity-comments-extractor/0.0.7: + /solidity-comments-extractor@0.0.7: resolution: {integrity: sha512-wciNMLg/Irp8OKGrh3S2tfvZiZ0NEyILfcRCXCD4mp7SgK/i9gzLfhY2hY7VMCQJ3kH9UB9BzNdibIVMchzyYw==} dev: true - /solidity-docgen/0.6.0-beta.35_hardhat@2.13.0: + /solidity-docgen@0.6.0-beta.35(hardhat@2.13.0): resolution: {integrity: sha512-9QdwK1THk/MWIdq1PEW/6dvtND0pUqpFTsbKwwU9YQIMYuRhH1lek9SsgnsGGYtdJ0VTrXXcVT30q20a8Y610A==} peerDependencies: hardhat: ^2.8.0 dependencies: handlebars: 4.7.7 - hardhat: 2.13.0_6qtx7vkbdhwvdm4crzlegk4mvi + hardhat: 2.13.0(ts-node@10.9.1)(typescript@4.9.5) solidity-ast: 0.4.46 dev: true - /sorcery/0.10.0: + /sorcery@0.10.0: resolution: {integrity: sha512-R5ocFmKZQFfSTstfOtHjJuAwbpGyf9qjQa1egyhvXSbM7emjrtLXtGdZsDJDABC85YBfVvrOiGWKSYXPKdvP1g==} hasBin: true dependencies: @@ -17774,18 +18098,18 @@ packages: sourcemap-codec: 1.4.8 dev: true - /sort-keys/5.0.0: + /sort-keys@5.0.0: resolution: {integrity: sha512-Pdz01AvCAottHTPQGzndktFNdbRA75BgOfeT1hH+AMnJFv8lynkPi42rfeEhpx1saTEI3YNMWxfqu0sFD1G8pw==} engines: {node: '>=12'} dependencies: is-plain-obj: 4.1.0 dev: false - /source-map-js/1.0.2: + /source-map-js@1.0.2: resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==} engines: {node: '>=0.10.0'} - /source-map-resolve/0.5.3: + /source-map-resolve@0.5.3: resolution: {integrity: sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==} deprecated: See https://github.com/lydell/source-map-resolve#deprecated dependencies: @@ -17796,32 +18120,32 @@ packages: urix: 0.1.0 dev: true - /source-map-support/0.4.18: + /source-map-support@0.4.18: resolution: {integrity: sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA==} dependencies: source-map: 0.5.7 dev: true - /source-map-support/0.5.12: + /source-map-support@0.5.12: resolution: {integrity: sha512-4h2Pbvyy15EE02G+JOZpUCmqWJuqrs+sEkzewTm++BPi7Hvn/HwcqLAcNxYAyI0x13CpPPn+kMjl+hplXMHITQ==} dependencies: buffer-from: 1.1.2 source-map: 0.6.1 dev: true - /source-map-support/0.5.21: + /source-map-support@0.5.21: resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} dependencies: buffer-from: 1.1.2 source-map: 0.6.1 dev: true - /source-map-url/0.4.1: + /source-map-url@0.4.1: resolution: {integrity: sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw==} deprecated: See https://github.com/lydell/source-map-url#deprecated dev: true - /source-map/0.2.0: + /source-map@0.2.0: resolution: {integrity: sha512-CBdZ2oa/BHhS4xj5DlhjWNHcan57/5YuvfdLf17iVmIpd9KRm+DFLmC6nBNj+6Ua7Kt3TmOjDpQT1aTYOQtoUA==} engines: {node: '>=0.8.0'} requiresBuild: true @@ -17830,67 +18154,67 @@ packages: dev: true optional: true - /source-map/0.5.7: + /source-map@0.5.7: resolution: {integrity: sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==} engines: {node: '>=0.10.0'} dev: true - /source-map/0.6.1: + /source-map@0.6.1: resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} engines: {node: '>=0.10.0'} dev: true - /source-map/0.7.4: + /source-map@0.7.4: resolution: {integrity: sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==} engines: {node: '>= 8'} - /sourcemap-codec/1.4.8: + /sourcemap-codec@1.4.8: resolution: {integrity: sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==} deprecated: Please use @jridgewell/sourcemap-codec instead dev: true - /space-separated-tokens/2.0.2: + /space-separated-tokens@2.0.2: resolution: {integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==} dev: false - /spdx-correct/3.1.1: + /spdx-correct@3.1.1: resolution: {integrity: sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==} dependencies: spdx-expression-parse: 3.0.1 spdx-license-ids: 3.0.12 dev: true - /spdx-exceptions/2.3.0: + /spdx-exceptions@2.3.0: resolution: {integrity: sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==} dev: true - /spdx-expression-parse/3.0.1: + /spdx-expression-parse@3.0.1: resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==} dependencies: spdx-exceptions: 2.3.0 spdx-license-ids: 3.0.12 dev: true - /spdx-license-ids/3.0.12: + /spdx-license-ids@3.0.12: resolution: {integrity: sha512-rr+VVSXtRhO4OHbXUiAF7xW3Bo9DuuF6C5jH+q/x15j2jniycgKbxU09Hr0WqlSLUs4i4ltHGXqTe7VHclYWyA==} dev: true - /split-on-first/1.1.0: + /split-on-first@1.1.0: resolution: {integrity: sha512-43ZssAJaMusuKWL8sKUBQXHWOpq8d6CfN/u1p4gUzfJkM05C8rxTmYrkIPTXapZpORA6LkkzcUulJ8FqA7Uudw==} engines: {node: '>=6'} dev: false - /split-string/3.1.0: + /split-string@3.1.0: resolution: {integrity: sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==} engines: {node: '>=0.10.0'} dependencies: extend-shallow: 3.0.2 dev: true - /sprintf-js/1.0.3: + /sprintf-js@1.0.3: resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} - /sshpk/1.17.0: + /sshpk@1.17.0: resolution: {integrity: sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ==} engines: {node: '>=0.10.0'} hasBin: true @@ -17906,28 +18230,28 @@ packages: tweetnacl: 0.14.5 dev: true - /ssri/8.0.1: + /ssri@8.0.1: resolution: {integrity: sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ==} engines: {node: '>= 8'} dependencies: minipass: 3.3.4 dev: true - /stack-utils/2.0.6: + /stack-utils@2.0.6: resolution: {integrity: sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==} engines: {node: '>=10'} dependencies: escape-string-regexp: 2.0.0 dev: true - /stacktrace-parser/0.1.10: + /stacktrace-parser@0.1.10: resolution: {integrity: sha512-KJP1OCML99+8fhOHxwwzyWrlUuVX5GQ0ZpJTd1DFXhdkrvg1szxfHhawXUZ3g9TkXORQd4/WG68jMlQZ2p8wlg==} engines: {node: '>=6'} dependencies: type-fest: 0.7.1 dev: true - /static-extend/0.1.2: + /static-extend@0.1.2: resolution: {integrity: sha512-72E9+uLc27Mt718pMHt9VMNiAL4LMsmDbBva8mxWUCkT07fSzEGMYUCk0XWY6lp0j6RBAG4cJ3mWuZv2OE3s0g==} engines: {node: '>=0.10.0'} dependencies: @@ -17935,58 +18259,58 @@ packages: object-copy: 0.1.0 dev: true - /statuses/2.0.1: + /statuses@2.0.1: resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} engines: {node: '>= 0.8'} dev: true - /stdout-stream/1.4.1: + /stdout-stream@1.4.1: resolution: {integrity: sha512-j4emi03KXqJWcIeF8eIXkjMFN1Cmb8gUlDYGeBALLPo5qdyTfA9bOtl8m33lRoC+vFMkP3gl0WsDr6+gzxbbTA==} dependencies: readable-stream: 2.3.7 dev: true - /stealthy-require/1.1.1: + /stealthy-require@1.1.1: resolution: {integrity: sha512-ZnWpYnYugiOVEY5GkcuJK1io5V8QmNYChG62gSit9pQVGErXtrKuPC55ITaVSukmMta5qpMU7vqLt2Lnni4f/g==} engines: {node: '>=0.10.0'} dev: true - /stream-browserify/3.0.0: + /stream-browserify@3.0.0: resolution: {integrity: sha512-H73RAHsVBapbim0tU2JwwOiXUj+fikfiaoYAKHF3VJfA0pe2BCzkhAHBlLG6REzE+2WNZcxOXjK7lkso+9euLA==} dependencies: inherits: 2.0.4 readable-stream: 3.6.2 dev: false - /stream-to-pull-stream/1.7.3: + /stream-to-pull-stream@1.7.3: resolution: {integrity: sha512-6sNyqJpr5dIOQdgNy/xcDWwDuzAsAwVzhzrWlAPAQ7Lkjx/rv0wgvxEyKwTq6FmNd5rjTrELt/CLmaSw7crMGg==} dependencies: looper: 3.0.0 pull-stream: 3.7.0 dev: true - /streamsearch/1.1.0: + /streamsearch@1.1.0: resolution: {integrity: sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==} engines: {node: '>=10.0.0'} dev: true - /strict-uri-encode/1.1.0: + /strict-uri-encode@1.1.0: resolution: {integrity: sha512-R3f198pcvnB+5IpnBlRkphuE9n46WyVl8I39W/ZUTZLz4nqSP/oLYUrcnJrw462Ds8he4YKMov2efsTIw1BDGQ==} engines: {node: '>=0.10.0'} dev: true optional: true - /strict-uri-encode/2.0.0: + /strict-uri-encode@2.0.0: resolution: {integrity: sha512-QwiXZgpRcKkhTj2Scnn++4PKtWsH0kpzZ62L2R6c/LUVYv7hVnZqcg2+sMuT6R7Jusu1vviK/MFsu6kNJfWlEQ==} engines: {node: '>=4'} dev: false - /string-argv/0.3.1: + /string-argv@0.3.1: resolution: {integrity: sha512-a1uQGz7IyVy9YwhqjZIZu1c8JO8dNIe20xBmSS6qu9kv++k3JGzCVmprbNN5Kn+BgzD5E7YYwg1CcjuJMRNsvg==} engines: {node: '>=0.6.19'} dev: true - /string-length/4.0.2: + /string-length@4.0.2: resolution: {integrity: sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==} engines: {node: '>=10'} dependencies: @@ -17994,11 +18318,11 @@ packages: strip-ansi: 6.0.1 dev: true - /string-range/1.2.2: + /string-range@1.2.2: resolution: {integrity: sha512-tYft6IFi8SjplJpxCUxyqisD3b+R2CSkomrtJYCkvuf1KuCAWgz7YXt4O0jip7efpfCemwHEzTEAO8EuOYgh3w==} dev: true - /string-width/1.0.2: + /string-width@1.0.2: resolution: {integrity: sha512-0XsVpQLnVCXHJfyEs8tC0zpTVIr5PKKsQtkT29IwupnPTjtPmQ3xT/4yCREF9hYkV/3M3kzcUTSAZT6a6h81tw==} engines: {node: '>=0.10.0'} dependencies: @@ -18007,7 +18331,7 @@ packages: strip-ansi: 3.0.1 dev: true - /string-width/2.1.1: + /string-width@2.1.1: resolution: {integrity: sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==} engines: {node: '>=4'} dependencies: @@ -18015,7 +18339,7 @@ packages: strip-ansi: 4.0.0 dev: true - /string-width/3.1.0: + /string-width@3.1.0: resolution: {integrity: sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==} engines: {node: '>=6'} dependencies: @@ -18023,7 +18347,7 @@ packages: is-fullwidth-code-point: 2.0.0 strip-ansi: 5.2.0 - /string-width/4.2.3: + /string-width@4.2.3: resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} engines: {node: '>=8'} dependencies: @@ -18031,7 +18355,7 @@ packages: is-fullwidth-code-point: 3.0.0 strip-ansi: 6.0.1 - /string-width/5.1.2: + /string-width@5.1.2: resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} engines: {node: '>=12'} dependencies: @@ -18040,7 +18364,7 @@ packages: strip-ansi: 7.0.1 dev: true - /string.prototype.trim/1.2.7: + /string.prototype.trim@1.2.7: resolution: {integrity: sha512-p6TmeT1T3411M8Cgg9wBTMRtY2q9+PNy9EV1i2lIXUN/btt763oIfxwN3RR8VU6wHX8j/1CFy0L+YuThm6bgOg==} engines: {node: '>= 0.4'} dependencies: @@ -18049,7 +18373,7 @@ packages: es-abstract: 1.21.1 dev: true - /string.prototype.trimend/1.0.6: + /string.prototype.trimend@1.0.6: resolution: {integrity: sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==} dependencies: call-bind: 1.0.2 @@ -18057,7 +18381,7 @@ packages: es-abstract: 1.21.1 dev: true - /string.prototype.trimstart/1.0.6: + /string.prototype.trimstart@1.0.6: resolution: {integrity: sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==} dependencies: call-bind: 1.0.2 @@ -18065,122 +18389,122 @@ packages: es-abstract: 1.21.1 dev: true - /string_decoder/0.10.31: + /string_decoder@0.10.31: resolution: {integrity: sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==} dev: true - /string_decoder/1.1.1: + /string_decoder@1.1.1: resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} dependencies: safe-buffer: 5.1.2 dev: true - /string_decoder/1.3.0: + /string_decoder@1.3.0: resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} dependencies: safe-buffer: 5.2.1 - /stringify-entities/4.0.3: + /stringify-entities@4.0.3: resolution: {integrity: sha512-BP9nNHMhhfcMbiuQKCqMjhDP5yBCAxsPu4pHFFzJ6Alo9dZgY4VLDPutXqIjpRiMoKdp7Av85Gr73Q5uH9k7+g==} dependencies: character-entities-html4: 2.1.0 character-entities-legacy: 3.0.0 dev: false - /strip-ansi/3.0.1: + /strip-ansi@3.0.1: resolution: {integrity: sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==} engines: {node: '>=0.10.0'} dependencies: ansi-regex: 2.1.1 dev: true - /strip-ansi/4.0.0: + /strip-ansi@4.0.0: resolution: {integrity: sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow==} engines: {node: '>=4'} dependencies: ansi-regex: 3.0.1 dev: true - /strip-ansi/5.2.0: + /strip-ansi@5.2.0: resolution: {integrity: sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==} engines: {node: '>=6'} dependencies: ansi-regex: 4.1.1 - /strip-ansi/6.0.1: + /strip-ansi@6.0.1: resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} engines: {node: '>=8'} dependencies: ansi-regex: 5.0.1 - /strip-ansi/7.0.1: + /strip-ansi@7.0.1: resolution: {integrity: sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==} engines: {node: '>=12'} dependencies: ansi-regex: 6.0.1 dev: true - /strip-bom-string/1.0.0: + /strip-bom-string@1.0.0: resolution: {integrity: sha512-uCC2VHvQRYu+lMh4My/sFNmF2klFymLX1wHJeXnbEJERpV/ZsVuonzerjfrGpIGF7LBVa1O7i9kjiWvJiFck8g==} engines: {node: '>=0.10.0'} dev: false - /strip-bom/2.0.0: + /strip-bom@2.0.0: resolution: {integrity: sha512-kwrX1y7czp1E69n2ajbG65mIo9dqvJ+8aBQXOGVxqwvNbsXdFM6Lq37dLAY3mknUwru8CfcCbfOLL/gMo+fi3g==} engines: {node: '>=0.10.0'} dependencies: is-utf8: 0.2.1 dev: true - /strip-bom/3.0.0: + /strip-bom@3.0.0: resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} engines: {node: '>=4'} dev: true - /strip-bom/4.0.0: + /strip-bom@4.0.0: resolution: {integrity: sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==} engines: {node: '>=8'} dev: true - /strip-eof/1.0.0: + /strip-eof@1.0.0: resolution: {integrity: sha512-7FCwGGmx8mD5xQd3RPUvnSpUXHM3BWuzjtpD4TXsfcZ9EL4azvVVUscFYwD9nx8Kh+uCBC00XBtAykoMHwTh8Q==} engines: {node: '>=0.10.0'} dev: false - /strip-final-newline/2.0.0: + /strip-final-newline@2.0.0: resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} engines: {node: '>=6'} dev: true - /strip-hex-prefix/1.0.0: + /strip-hex-prefix@1.0.0: resolution: {integrity: sha512-q8d4ue7JGEiVcypji1bALTos+0pWtyGlivAWyPuTkHzuTCJqrK9sWxYQZUq6Nq3cuyv3bm734IhHvHtGGURU6A==} engines: {node: '>=6.5.0', npm: '>=3'} dependencies: is-hex-prefixed: 1.0.0 - /strip-indent/3.0.0: + /strip-indent@3.0.0: resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==} engines: {node: '>=8'} dependencies: min-indent: 1.0.1 dev: true - /strip-json-comments/2.0.1: + /strip-json-comments@2.0.1: resolution: {integrity: sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==} engines: {node: '>=0.10.0'} - /strip-json-comments/3.1.1: + /strip-json-comments@3.1.1: resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} engines: {node: '>=8'} dev: true - /style-to-object/0.4.1: + /style-to-object@0.4.1: resolution: {integrity: sha512-HFpbb5gr2ypci7Qw+IOhnP2zOU7e77b+rzM+wTzXzfi1PrtBCX0E7Pk4wL4iTLnhzZ+JgEGAhX81ebTg/aYjQw==} dependencies: inline-style-parser: 0.1.1 dev: false - /styled-jsx/5.1.1_react@18.2.0: + /styled-jsx@5.1.1(react@18.2.0): resolution: {integrity: sha512-pW7uC1l4mBZ8ugbiZrcIsiIvVx1UmTfw7UkC3Um2tmfUq9Bhk8IiyEIPl6F8agHgjzku6j0xQEZbfA5uSgSaCw==} engines: {node: '>= 12.0.0'} peerDependencies: @@ -18197,63 +18521,61 @@ packages: react: 18.2.0 dev: false - /superstruct/0.14.2: + /superstruct@0.14.2: resolution: {integrity: sha512-nPewA6m9mR3d6k7WkZ8N8zpTWfenFH3q9pA2PkuiZxINr9DKB2+40wEQf0ixn8VaGuJ78AB6iWOtStI+/4FKZQ==} dev: false - /supports-color/2.0.0: + /supports-color@2.0.0: resolution: {integrity: sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==} engines: {node: '>=0.8.0'} dev: true - /supports-color/3.2.3: + /supports-color@3.2.3: resolution: {integrity: sha512-Jds2VIYDrlp5ui7t8abHN2bjAu4LV/q4N2KivFPpGH0lrka0BMq/33AmECUXlKPcHigkNaqfXRENFju+rlcy+A==} engines: {node: '>=0.8.0'} dependencies: has-flag: 1.0.0 dev: true - /supports-color/4.5.0: + /supports-color@4.5.0: resolution: {integrity: sha512-ycQR/UbvI9xIlEdQT1TQqwoXtEldExbCEAJgRo5YXlmSKjv6ThHnP9/vwGa1gr19Gfw+LkFd7KqYMhzrRC5JYw==} engines: {node: '>=4'} dependencies: has-flag: 2.0.0 dev: false - /supports-color/5.5.0: + /supports-color@5.5.0: resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} engines: {node: '>=4'} dependencies: has-flag: 3.0.0 - dev: true - /supports-color/6.0.0: + /supports-color@6.0.0: resolution: {integrity: sha512-on9Kwidc1IUQo+bQdhi8+Tijpo0e1SS6RoGo2guUwn5vdaxw8RXOF9Vb2ws+ihWOmh4JnCJOvaziZWP1VABaLg==} engines: {node: '>=6'} dependencies: has-flag: 3.0.0 dev: true - /supports-color/7.2.0: + /supports-color@7.2.0: resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} engines: {node: '>=8'} dependencies: has-flag: 4.0.0 dev: true - /supports-color/8.1.1: + /supports-color@8.1.1: resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} engines: {node: '>=10'} dependencies: has-flag: 4.0.0 - dev: true - /supports-color/9.3.1: + /supports-color@9.3.1: resolution: {integrity: sha512-knBY82pjmnIzK3NifMo3RxEIRD9E0kIzV4BKcyTZ9+9kWgLMxd4PrsTSMoFQUabgRBbF8KOLRDCyKgNV+iK44Q==} engines: {node: '>=12'} dev: true - /supports-hyperlinks/2.3.0: + /supports-hyperlinks@2.3.0: resolution: {integrity: sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA==} engines: {node: '>=8'} dependencies: @@ -18261,11 +18583,11 @@ packages: supports-color: 7.2.0 dev: true - /supports-preserve-symlinks-flag/1.0.0: + /supports-preserve-symlinks-flag@1.0.0: resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} engines: {node: '>= 0.4'} - /svelte-check/2.9.2_dfqi3dk7soqznqtir4fhqm6z5i: + /svelte-check@2.9.2(@babel/core@7.20.2)(node-sass@7.0.3)(postcss@8.4.19)(svelte@3.53.1): resolution: {integrity: sha512-DRi8HhnCiqiGR2YF9ervPGvtoYrheE09cXieCTEqeTPOTJzfoa54Py8rovIBv4bH4n5HgZYIyTQ3DDLHQLl2uQ==} hasBin: true peerDependencies: @@ -18278,7 +18600,7 @@ packages: picocolors: 1.0.0 sade: 1.8.1 svelte: 3.53.1 - svelte-preprocess: 4.10.7_d6lifvqr42ebgwtwt2nbwt433a + svelte-preprocess: 4.10.7(@babel/core@7.20.2)(node-sass@7.0.3)(postcss@8.4.19)(svelte@3.53.1)(typescript@4.9.3) typescript: 4.9.3 transitivePeerDependencies: - '@babel/core' @@ -18293,7 +18615,7 @@ packages: - sugarss dev: true - /svelte-check/2.9.2_zerbpdatqmtl23l4lmflabtkhm: + /svelte-check@2.9.2(@babel/core@7.20.2)(node-sass@7.0.3)(postcss@8.4.21)(svelte@3.53.1): resolution: {integrity: sha512-DRi8HhnCiqiGR2YF9ervPGvtoYrheE09cXieCTEqeTPOTJzfoa54Py8rovIBv4bH4n5HgZYIyTQ3DDLHQLl2uQ==} hasBin: true peerDependencies: @@ -18306,7 +18628,7 @@ packages: picocolors: 1.0.0 sade: 1.8.1 svelte: 3.53.1 - svelte-preprocess: 4.10.7_ge4z2gzwvmjf74ug6kcjgue5me + svelte-preprocess: 4.10.7(@babel/core@7.20.2)(node-sass@7.0.3)(postcss@8.4.21)(svelte@3.53.1)(typescript@4.9.3) typescript: 4.9.3 transitivePeerDependencies: - '@babel/core' @@ -18321,15 +18643,15 @@ packages: - sugarss dev: true - /svelte-dev-helper/1.1.9: + /svelte-dev-helper@1.1.9: resolution: {integrity: sha512-oU+Xv7Dl4kRU2kdFjsoPLfJfnt5hUhsFUZtuzI3Ku/f2iAFZqBoEuXOqK3N9ngD4dxQOmN4OKWPHVi3NeAeAfQ==} dev: true - /svelte-heros-v2/0.3.10: + /svelte-heros-v2@0.3.10: resolution: {integrity: sha512-e5ZhYN8blZwfhb2k4KYSfHnbbddonDNsglqMpwXLLwPVPBiJXeGpcPy2zkffq6kvkLS2tYipYOaAPSXimgtuUg==} dev: true - /svelte-hmr/0.14.12_svelte@3.53.1: + /svelte-hmr@0.14.12(svelte@3.53.1): resolution: {integrity: sha512-4QSW/VvXuqVcFZ+RhxiR8/newmwOCTlbYIezvkeN6302YFRE8cXy0naamHcjz8Y9Ce3ITTZtrHrIL0AGfyo61w==} engines: {node: ^12.20 || ^14.13.1 || >= 16} peerDependencies: @@ -18338,7 +18660,7 @@ packages: svelte: 3.53.1 dev: true - /svelte-hmr/0.15.1_svelte@3.53.1: + /svelte-hmr@0.15.1(svelte@3.53.1): resolution: {integrity: sha512-BiKB4RZ8YSwRKCNVdNxK/GfY+r4Kjgp9jCLEy0DuqAKfmQtpL38cQK3afdpjw4sqSs4PLi3jIPJIFp259NkZtA==} engines: {node: ^12.20 || ^14.13.1 || >= 16} peerDependencies: @@ -18347,7 +18669,7 @@ packages: svelte: 3.53.1 dev: true - /svelte-i18n/3.5.2_svelte@3.53.1: + /svelte-i18n@3.5.2(svelte@3.53.1): resolution: {integrity: sha512-7Ub895Fqo2KRUCBAYSGjBQzaCOfDdgg6VwBT/mq6/EJqyP18DNIcNzeE2tiZejJ46R70npBR31Q1p9ywQ8L7BA==} engines: {node: '>= 16'} hasBin: true @@ -18363,7 +18685,7 @@ packages: tiny-glob: 0.2.9 dev: false - /svelte-jester/2.3.2_jest@27.5.1+svelte@3.53.1: + /svelte-jester@2.3.2(jest@27.5.1)(svelte@3.53.1): resolution: {integrity: sha512-JtxSz4FWAaCRBXbPsh4LcDs4Ua7zdXgLC0TZvT1R56hRV0dymmNP+abw67DTPF7sQPyNxWsOKd0Sl7Q8SnP8kg==} engines: {node: '>=14'} peerDependencies: @@ -18374,7 +18696,7 @@ packages: svelte: 3.53.1 dev: true - /svelte-loader/3.1.4_svelte@3.53.1: + /svelte-loader@3.1.4(svelte@3.53.1): resolution: {integrity: sha512-DtgVPb03UWhPW0GGlWx+1w6+LeCSnFijpX+4NCUNlRQjuzy8fcjBWaC+Q5cMCrk8JDB8YBqHt+SijDmAz1A/Ww==} peerDependencies: svelte: '>3.0.0' @@ -18382,10 +18704,10 @@ packages: loader-utils: 2.0.4 svelte: 3.53.1 svelte-dev-helper: 1.1.9 - svelte-hmr: 0.14.12_svelte@3.53.1 + svelte-hmr: 0.14.12(svelte@3.53.1) dev: true - /svelte-preprocess/4.10.7_d6lifvqr42ebgwtwt2nbwt433a: + /svelte-preprocess@4.10.7(@babel/core@7.20.2)(node-sass@7.0.3)(postcss@8.4.19)(svelte@3.53.1)(typescript@4.9.3): resolution: {integrity: sha512-sNPBnqYD6FnmdBrUmBCaqS00RyCsCpj2BG58A1JBswNF7b0OKviwxqVrOL/CKyJrLSClrSeqQv5BXNg2RUbPOw==} engines: {node: '>= 9.11.2'} requiresBuild: true @@ -18426,6 +18748,7 @@ packages: typescript: optional: true dependencies: + '@babel/core': 7.20.2 '@types/pug': 2.0.6 '@types/sass': 1.43.1 detect-indent: 6.1.0 @@ -18438,7 +18761,7 @@ packages: typescript: 4.9.3 dev: true - /svelte-preprocess/4.10.7_ge4z2gzwvmjf74ug6kcjgue5me: + /svelte-preprocess@4.10.7(@babel/core@7.20.2)(node-sass@7.0.3)(postcss@8.4.21)(svelte@3.53.1)(typescript@4.9.3): resolution: {integrity: sha512-sNPBnqYD6FnmdBrUmBCaqS00RyCsCpj2BG58A1JBswNF7b0OKviwxqVrOL/CKyJrLSClrSeqQv5BXNg2RUbPOw==} engines: {node: '>= 9.11.2'} requiresBuild: true @@ -18479,6 +18802,7 @@ packages: typescript: optional: true dependencies: + '@babel/core': 7.20.2 '@types/pug': 2.0.6 '@types/sass': 1.43.1 detect-indent: 6.1.0 @@ -18491,7 +18815,7 @@ packages: typescript: 4.9.3 dev: true - /svelte-preprocess/4.10.7_urj4ueeh3k3dx7qcxhluquyqdy: + /svelte-preprocess@4.10.7(@babel/core@7.20.2)(node-sass@7.0.3)(postcss@8.4.21)(svelte@3.53.1)(typescript@4.9.5): resolution: {integrity: sha512-sNPBnqYD6FnmdBrUmBCaqS00RyCsCpj2BG58A1JBswNF7b0OKviwxqVrOL/CKyJrLSClrSeqQv5BXNg2RUbPOw==} engines: {node: '>= 9.11.2'} requiresBuild: true @@ -18532,6 +18856,7 @@ packages: typescript: optional: true dependencies: + '@babel/core': 7.20.2 '@types/pug': 2.0.6 '@types/sass': 1.43.1 detect-indent: 6.1.0 @@ -18544,17 +18869,17 @@ packages: typescript: 4.9.5 dev: true - /svelte-spa-router/3.3.0: + /svelte-spa-router@3.3.0: resolution: {integrity: sha512-cwRNe7cxD43sCvSfEeaKiNZg3FCizGxeMcf7CPiWRP3jKXjEma3vxyyuDtPOam6nWbVxl9TNM3hlE/i87ZlqcQ==} dependencies: regexparam: 2.0.1 dev: false - /svelte/3.53.1: + /svelte@3.53.1: resolution: {integrity: sha512-Q4/hHkktZogGhN5iqxqSi9sjEVoe/NbIxX4hXEHoasTxj+TxEQVAq66LnDMdAZxjmsodkoI5F3slqsS68U7FNw==} engines: {node: '>= 8'} - /swarm-js/0.1.42: + /swarm-js@0.1.42: resolution: {integrity: sha512-BV7c/dVlA3R6ya1lMlSSNPLYrntt0LUq4YMgy3iwpCIc6rZnS5W2wUoctarZ5pXlpKtxDDf9hNziEkcfrxdhqQ==} dependencies: bluebird: 3.7.2 @@ -18575,11 +18900,11 @@ packages: dev: true optional: true - /symbol-tree/3.2.4: + /symbol-tree@3.2.4: resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==} dev: true - /sync-request/6.1.0: + /sync-request@6.1.0: resolution: {integrity: sha512-8fjNkrNlNCrVc/av+Jn+xxqfCjYaBoHqCsDz6mt030UMxJGr+GSfCV1dQt2gRtlL63+VPidwDVLr7V2OcTSdRw==} engines: {node: '>=8.0.0'} dependencies: @@ -18588,13 +18913,13 @@ packages: then-request: 6.0.2 dev: true - /sync-rpc/1.3.6: + /sync-rpc@1.3.6: resolution: {integrity: sha512-J8jTXuZzRlvU7HemDgHi3pGnh/rkoqR/OZSjhTyyZrEkkYQbk7Z33AXp37mkPfPpfdOuj7Ex3H/TJM1z48uPQw==} dependencies: get-port: 3.2.0 dev: true - /table/6.8.1: + /table@6.8.1: resolution: {integrity: sha512-Y4X9zqrCftUhMeH2EptSSERdVKt/nEdijTOacGD/97EKjhQ/Qs8RTlEGABSJNNN8lac9kheH+af7yAkEWlgneA==} engines: {node: '>=10.0.0'} dependencies: @@ -18605,7 +18930,7 @@ packages: strip-ansi: 6.0.1 dev: true - /tailwindcss/3.2.4_postcss@8.4.19: + /tailwindcss@3.2.4(postcss@8.4.19): resolution: {integrity: sha512-AhwtHCKMtR71JgeYDaswmZXhPcW9iuI9Sp2LvZPo9upDZ7231ZJ7eA9RaURbhpXGVlrjX4cFNlB4ieTetEb7hQ==} engines: {node: '>=12.13.0'} hasBin: true @@ -18627,10 +18952,10 @@ packages: object-hash: 3.0.0 picocolors: 1.0.0 postcss: 8.4.19 - postcss-import: 14.1.0_postcss@8.4.19 - postcss-js: 4.0.0_postcss@8.4.19 - postcss-load-config: 3.1.4_postcss@8.4.19 - postcss-nested: 6.0.0_postcss@8.4.19 + postcss-import: 14.1.0(postcss@8.4.19) + postcss-js: 4.0.0(postcss@8.4.19) + postcss-load-config: 3.1.4(postcss@8.4.19) + postcss-nested: 6.0.0(postcss@8.4.19) postcss-selector-parser: 6.0.11 postcss-value-parser: 4.2.0 quick-lru: 5.1.1 @@ -18639,7 +18964,7 @@ packages: - ts-node dev: true - /tailwindcss/3.2.6_postcss@8.4.21: + /tailwindcss@3.2.6(postcss@8.4.21): resolution: {integrity: sha512-BfgQWZrtqowOQMC2bwaSNe7xcIjdDEgixWGYOd6AL0CbKHJlvhfdbINeAW76l1sO+1ov/MJ93ODJ9yluRituIw==} engines: {node: '>=12.13.0'} hasBin: true @@ -18661,10 +18986,10 @@ packages: object-hash: 3.0.0 picocolors: 1.0.0 postcss: 8.4.21 - postcss-import: 14.1.0_postcss@8.4.21 - postcss-js: 4.0.1_postcss@8.4.21 - postcss-load-config: 3.1.4_postcss@8.4.21 - postcss-nested: 6.0.0_postcss@8.4.21 + postcss-import: 14.1.0(postcss@8.4.21) + postcss-js: 4.0.1(postcss@8.4.21) + postcss-load-config: 3.1.4(postcss@8.4.21) + postcss-nested: 6.0.0(postcss@8.4.21) postcss-selector-parser: 6.0.11 postcss-value-parser: 4.2.0 quick-lru: 5.1.1 @@ -18673,7 +18998,7 @@ packages: - ts-node dev: true - /tailwindcss/3.2.7_postcss@8.4.21: + /tailwindcss@3.2.7(postcss@8.4.21): resolution: {integrity: sha512-B6DLqJzc21x7wntlH/GsZwEXTBttVSl1FtCzC8WP4oBc/NKef7kaax5jeihkkCEWc831/5NDJ9gRNDK6NEioQQ==} engines: {node: '>=12.13.0'} hasBin: true @@ -18695,10 +19020,10 @@ packages: object-hash: 3.0.0 picocolors: 1.0.0 postcss: 8.4.21 - postcss-import: 14.1.0_postcss@8.4.21 - postcss-js: 4.0.1_postcss@8.4.21 - postcss-load-config: 3.1.4_postcss@8.4.21 - postcss-nested: 6.0.0_postcss@8.4.21 + postcss-import: 14.1.0(postcss@8.4.21) + postcss-js: 4.0.1(postcss@8.4.21) + postcss-load-config: 3.1.4(postcss@8.4.21) + postcss-nested: 6.0.0(postcss@8.4.21) postcss-selector-parser: 6.0.11 postcss-value-parser: 4.2.0 quick-lru: 5.1.1 @@ -18707,12 +19032,12 @@ packages: - ts-node dev: true - /tapable/2.2.1: + /tapable@2.2.1: resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==} engines: {node: '>=6'} dev: true - /tape/4.16.2: + /tape@4.16.2: resolution: {integrity: sha512-TUChV+q0GxBBCEbfCYkGLkv8hDJYjMdSWdE0/Lr331sB389dsvFUHNV9ph5iQqKzt8Ss9drzcda/YeexclBFqg==} hasBin: true dependencies: @@ -18733,7 +19058,7 @@ packages: through: 2.3.8 dev: true - /tar-fs/2.1.1: + /tar-fs@2.1.1: resolution: {integrity: sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==} dependencies: chownr: 1.1.4 @@ -18742,7 +19067,7 @@ packages: tar-stream: 2.2.0 dev: false - /tar-stream/2.2.0: + /tar-stream@2.2.0: resolution: {integrity: sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==} engines: {node: '>=6'} dependencies: @@ -18753,7 +19078,7 @@ packages: readable-stream: 3.6.2 dev: false - /tar/4.4.19: + /tar@4.4.19: resolution: {integrity: sha512-a20gEsvHnWe0ygBY8JbxoM4w3SJdhc7ZAuxkLqh+nvNQN2IOt0B5lLgM490X5Hl8FF0dl0tOf2ewFYAlIFgzVA==} engines: {node: '>=4.5'} dependencies: @@ -18767,7 +19092,7 @@ packages: dev: true optional: true - /tar/6.1.12: + /tar@6.1.12: resolution: {integrity: sha512-jU4TdemS31uABHd+Lt5WEYJuzn+TJTCBLljvIAHZOz6M9Os5pJ4dD+vRFLxPa/n3T0iEFzpi+0x1UfuDZYbRMw==} engines: {node: '>=10'} dependencies: @@ -18779,7 +19104,7 @@ packages: yallist: 4.0.0 dev: true - /terminal-link/2.1.1: + /terminal-link@2.1.1: resolution: {integrity: sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==} engines: {node: '>=8'} dependencies: @@ -18787,7 +19112,7 @@ packages: supports-hyperlinks: 2.3.0 dev: true - /terser-webpack-plugin/5.3.6_webpack@5.75.0: + /terser-webpack-plugin@5.3.6(webpack@5.75.0): resolution: {integrity: sha512-kfLFk+PoLUQIbLmB1+PZDMRSZS99Mp+/MHqDNmMA6tOItzRt+Npe3E+fsMs5mfcM0wCtrrdU387UnV+vnSffXQ==} engines: {node: '>= 10.13.0'} peerDependencies: @@ -18811,7 +19136,7 @@ packages: webpack: 5.75.0 dev: true - /terser/5.16.5: + /terser@5.16.5: resolution: {integrity: sha512-qcwfg4+RZa3YvlFh0qjifnzBHjKGNbtDo9yivMqMFDy9Q6FSaQWSB/j1xKhsoUFJIqDOM3TsN6D5xbrMrFcHbg==} engines: {node: '>=10'} hasBin: true @@ -18822,7 +19147,7 @@ packages: source-map-support: 0.5.21 dev: true - /test-exclude/6.0.0: + /test-exclude@6.0.0: resolution: {integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==} engines: {node: '>=8'} dependencies: @@ -18831,7 +19156,7 @@ packages: minimatch: 3.1.2 dev: true - /test-value/2.1.0: + /test-value@2.1.0: resolution: {integrity: sha512-+1epbAxtKeXttkGFMTX9H42oqzOTufR1ceCF+GYA5aOmvaPq9wd4PUS8329fn2RRLGNeUkgRLnVpycjx8DsO2w==} engines: {node: '>=0.10.0'} dependencies: @@ -18839,24 +19164,24 @@ packages: typical: 2.6.1 dev: true - /testrpc/0.0.1: + /testrpc@0.0.1: resolution: {integrity: sha512-afH1hO+SQ/VPlmaLUFj2636QMeDvPCeQMc/9RBMW0IfjNe9gFD9Ra3ShqYkB7py0do1ZcCna/9acHyzTJ+GcNA==} deprecated: testrpc has been renamed to ganache-cli, please use this package from now on. dev: true - /text-encoding-utf-8/1.0.2: + /text-encoding-utf-8@1.0.2: resolution: {integrity: sha512-8bw4MY9WjdsD2aMtO0OzOCY3pXGYNx2d2FfHRVUKkiCPDWjKuOlhLVASS+pD7VkLTVjW268LYJHwsnPFlBpbAg==} dev: false - /text-table/0.2.0: + /text-table@0.2.0: resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} dev: true - /theme-change/2.2.0: + /theme-change@2.2.0: resolution: {integrity: sha512-vvgZEEfmH3yZGq2bWHyzs2AOG1SRfNnCvWbEnPzGpdvvCmAWtOsEdg4H6k/OMapegG+LEQvQ76tQoN9B+FT7rg==} dev: true - /then-request/6.0.2: + /then-request@6.0.2: resolution: {integrity: sha512-3ZBiG7JvP3wbDzA9iNY5zJQcHL4jn/0BWtXIkagfz7QgOL/LqjCEOBQuJNZfu0XYnv5JhKh+cDxCPM4ILrqruA==} engines: {node: '>=6.0.0'} dependencies: @@ -18873,41 +19198,41 @@ packages: qs: 6.11.0 dev: true - /throat/6.0.1: + /throat@6.0.1: resolution: {integrity: sha512-8hmiGIJMDlwjg7dlJ4yKGLK8EsYqKgPWbG3b4wjJddKNwc7N7Dpn08Df4szr/sZdMVeOstrdYSsqzX6BYbcB+w==} dev: true - /through/2.3.8: - resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==} - - /through2/2.0.5: + /through2@2.0.5: resolution: {integrity: sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==} dependencies: readable-stream: 2.3.8 xtend: 4.0.2 dev: true - /timed-out/4.0.1: + /through@2.3.8: + resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==} + + /timed-out@4.0.1: resolution: {integrity: sha512-G7r3AhovYtr5YKOWQkta8RKAPb+J9IsO4uVmzjl8AZwfhs8UcUwTiD6gcJYSgOtzyjvQKrKYn41syHbUWMkafA==} engines: {node: '>=0.10.0'} dev: true optional: true - /timers-ext/0.1.7: + /timers-ext@0.1.7: resolution: {integrity: sha512-b85NUNzTSdodShTIbky6ZF02e8STtVVfD+fu4aXXShEELpozH+bCpJLYMPZbsABN2wDH7fJpqIoXxJpzbf0NqQ==} dependencies: es5-ext: 0.10.62 next-tick: 1.1.0 dev: false - /tiny-glob/0.2.9: + /tiny-glob@0.2.9: resolution: {integrity: sha512-g/55ssRPUjShh+xkfx9UPDXqhckHEsHr4Vd9zX55oSdGZc/MD0m3sferOkwWtp98bv+kcVfEHtRJgBVJzelrzg==} dependencies: globalyzer: 0.1.0 globrex: 0.1.2 dev: false - /title/3.5.3: + /title@3.5.3: resolution: {integrity: sha512-20JyowYglSEeCvZv3EZ0nZ046vLarO37prvV0mbtQV7C8DJPGgN967r8SJkqd3XK3K3lD3/Iyfp3avjfil8Q2Q==} hasBin: true dependencies: @@ -18917,51 +19242,51 @@ packages: titleize: 1.0.0 dev: false - /titleize/1.0.0: + /titleize@1.0.0: resolution: {integrity: sha512-TARUb7z1pGvlLxgPk++7wJ6aycXF3GJ0sNSBTAsTuJrQG5QuZlkUQP+zl+nbjAh4gMX9yDw9ZYklMd7vAfJKEw==} engines: {node: '>=0.10.0'} dev: false - /tmp/0.0.33: + /tmp@0.0.33: resolution: {integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==} engines: {node: '>=0.6.0'} dependencies: os-tmpdir: 1.0.2 - /tmp/0.1.0: + /tmp@0.1.0: resolution: {integrity: sha512-J7Z2K08jbGcdA1kkQpJSqLF6T0tdQqpR2pnSUXsIchbPdTI9v3e85cLW0d6WDhwuAleOV71j2xWs8qMPfK7nKw==} engines: {node: '>=6'} dependencies: rimraf: 2.7.1 dev: true - /tmpl/1.0.5: + /tmpl@1.0.5: resolution: {integrity: sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==} dev: true - /to-fast-properties/1.0.3: + /to-fast-properties@1.0.3: resolution: {integrity: sha512-lxrWP8ejsq+7E3nNjwYmUBMAgjMTZoTI+sdBOpvNyijeDLa29LUn9QaoXAHv4+Z578hbmHHJKZknzxVtvo77og==} engines: {node: '>=0.10.0'} dev: true - /to-fast-properties/2.0.0: + /to-fast-properties@2.0.0: resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} engines: {node: '>=4'} - /to-object-path/0.3.0: + /to-object-path@0.3.0: resolution: {integrity: sha512-9mWHdnGRuh3onocaHzukyvCZhzvr6tiflAy/JRFXcJX0TjgfWA9pk9t8CMbzmBE4Jfw58pXbkngtBtqYxzNEyg==} engines: {node: '>=0.10.0'} dependencies: kind-of: 3.2.2 dev: true - /to-readable-stream/1.0.0: + /to-readable-stream@1.0.0: resolution: {integrity: sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q==} engines: {node: '>=6'} dev: true optional: true - /to-regex-range/2.1.1: + /to-regex-range@2.1.1: resolution: {integrity: sha512-ZZWNfCjUokXXDGXFpZehJIkZqq91BcULFq/Pi7M5i4JnxXdhMKAK682z8bCW3o8Hj1wuuzoKcW3DfVzaP6VuNg==} engines: {node: '>=0.10.0'} dependencies: @@ -18969,14 +19294,14 @@ packages: repeat-string: 1.6.1 dev: true - /to-regex-range/5.0.1: + /to-regex-range@5.0.1: resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} engines: {node: '>=8.0'} dependencies: is-number: 7.0.0 dev: true - /to-regex/3.0.2: + /to-regex@3.0.2: resolution: {integrity: sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==} engines: {node: '>=0.10.0'} dependencies: @@ -18986,16 +19311,16 @@ packages: safe-regex: 1.1.0 dev: true - /toggle-selection/1.0.6: + /toggle-selection@1.0.6: resolution: {integrity: sha512-BiZS+C1OS8g/q2RRbJmy59xpyghNBqrr6k5L/uKBGRsTfxmu3ffiRnd8mlGPUVayg8pvfi5urfnu8TU7DVOkLQ==} dev: false - /toidentifier/1.0.1: + /toidentifier@1.0.1: resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} engines: {node: '>=0.6'} dev: true - /tough-cookie/2.5.0: + /tough-cookie@2.5.0: resolution: {integrity: sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==} engines: {node: '>=0.8'} dependencies: @@ -19003,7 +19328,7 @@ packages: punycode: 2.3.0 dev: true - /tough-cookie/4.1.2: + /tough-cookie@4.1.2: resolution: {integrity: sha512-G9fqXWoYFZgTc2z8Q5zaHy/vJMjm+WV0AkAeHxVCQiEB1b+dGvWzFW6QV07cY5jQ5gRkeid2qIkzkxUnmoQZUQ==} engines: {node: '>=6'} dependencies: @@ -19013,49 +19338,49 @@ packages: url-parse: 1.5.10 dev: true - /tr46/0.0.3: + /tr46@0.0.3: resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} - /tr46/2.1.0: + /tr46@2.1.0: resolution: {integrity: sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw==} engines: {node: '>=8'} dependencies: punycode: 2.1.1 dev: true - /trim-lines/3.0.1: + /trim-lines@3.0.1: resolution: {integrity: sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==} dev: false - /trim-newlines/3.0.1: + /trim-newlines@3.0.1: resolution: {integrity: sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==} engines: {node: '>=8'} dev: true - /trim-right/1.0.1: + /trim-right@1.0.1: resolution: {integrity: sha512-WZGXGstmCWgeevgTL54hrCuw1dyMQIzWy7ZfqRJfSmJZBwklI15egmQytFP6bPidmw3M8d5yEowl1niq4vmqZw==} engines: {node: '>=0.10.0'} dev: true - /trough/2.1.0: + /trough@2.1.0: resolution: {integrity: sha512-AqTiAOLcj85xS7vQ8QkAV41hPDIJ71XJB4RCUrzo/1GM2CQwhkJGaf9Hgr7BOugMRpgGUrqRg/DrBDl4H40+8g==} dev: false - /true-case-path/1.0.3: + /true-case-path@1.0.3: resolution: {integrity: sha512-m6s2OdQe5wgpFMC+pAJ+q9djG82O2jcHPOI6RNg1yy9rCYR+WD6Nbpl32fDpfC56nirdRy+opFa/Vk7HYhqaew==} dependencies: glob: 7.2.3 dev: true - /true-case-path/2.2.1: + /true-case-path@2.2.1: resolution: {integrity: sha512-0z3j8R7MCjy10kc/g+qg7Ln3alJTodw9aDuVWZa3uiWqfuBMKeAeP2ocWcxoyM3D73yz3Jt/Pu4qPr4wHSdB/Q==} dev: true - /ts-essentials/1.0.4: + /ts-essentials@1.0.4: resolution: {integrity: sha512-q3N1xS4vZpRouhYHDPwO0bDW3EZ6SK9CrrDHxi/D6BPReSjpVgWIOpLS2o0gSBZm+7q/wyKp6RVM1AeeW7uyfQ==} dev: true - /ts-essentials/6.0.7_typescript@4.9.5: + /ts-essentials@6.0.7(typescript@4.9.5): resolution: {integrity: sha512-2E4HIIj4tQJlIHuATRHayv0EfMGK3ris/GRk1E3CFnsZzeNV+hUmelbaTZHLtXaZppM5oLhHRtO04gINC4Jusw==} peerDependencies: typescript: '>=3.7.0' @@ -19063,7 +19388,7 @@ packages: typescript: 4.9.5 dev: true - /ts-essentials/7.0.3_typescript@4.9.5: + /ts-essentials@7.0.3(typescript@4.9.5): resolution: {integrity: sha512-8+gr5+lqO3G84KdiTSMRLtuyJ+nTBVRKuCrK4lidMPdVeEp0uqC875uE5NMcaA7YYMN7XsNiFQuMvasF8HT/xQ==} peerDependencies: typescript: '>=3.7.0' @@ -19071,7 +19396,7 @@ packages: typescript: 4.9.5 dev: true - /ts-generator/0.1.1: + /ts-generator@0.1.1: resolution: {integrity: sha512-N+ahhZxTLYu1HNTQetwWcx3so8hcYbkKBHTr4b4/YgObFTIKkOSSsaa+nal12w8mfrJAyzJfETXawbNjSfP2gQ==} hasBin: true dependencies: @@ -19086,19 +19411,19 @@ packages: ts-essentials: 1.0.4 dev: true - /ts-interface-checker/0.1.13: + /ts-interface-checker@0.1.13: resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} dev: true - /ts-jest-mock-import-meta/0.12.0_ts-jest@27.1.5: + /ts-jest-mock-import-meta@0.12.0(ts-jest@27.1.5): resolution: {integrity: sha512-LfuetNsQ6CDEAPekFOtMpCPRBBAgoA322IQ95eCa3x0mR++GwhZddlsmjOUhxRPLF3utbXUZpCEZiW+HP8jkiA==} peerDependencies: ts-jest: '>=20.0.0' dependencies: - ts-jest: 27.1.5_ucbcg4iu5zhznj2s67mybtqili + ts-jest: 27.1.5(@babel/core@7.20.2)(@types/jest@27.5.2)(babel-jest@27.5.1)(jest@27.5.1)(typescript@4.9.3) dev: true - /ts-jest/27.1.5_gy2w2unevcycrhih2qxqkdetla: + /ts-jest@27.1.5(@babel/core@7.20.2)(@types/jest@27.5.2)(babel-jest@27.5.1)(jest@27.5.1)(typescript@4.9.3): resolution: {integrity: sha512-Xv6jBQPoBEvBq/5i2TeSG9tt/nqkbpcurrEG1b+2yfBrcJelOZF9Ml6dmyMh7bcW9JyFbRYpR5rxROSlBLTZHA==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} hasBin: true @@ -19119,8 +19444,9 @@ packages: esbuild: optional: true dependencies: + '@babel/core': 7.20.2 '@types/jest': 27.5.2 - babel-jest: 27.5.1 + babel-jest: 27.5.1(@babel/core@7.20.2) bs-logger: 0.2.6 fast-json-stable-stringify: 2.1.0 jest: 27.5.1 @@ -19129,11 +19455,11 @@ packages: lodash.memoize: 4.1.2 make-error: 1.3.6 semver: 7.3.8 - typescript: 4.9.5 + typescript: 4.9.3 yargs-parser: 20.2.4 dev: true - /ts-jest/27.1.5_ucbcg4iu5zhznj2s67mybtqili: + /ts-jest@27.1.5(@babel/core@7.20.2)(@types/jest@27.5.2)(babel-jest@27.5.1)(jest@27.5.1)(typescript@4.9.5): resolution: {integrity: sha512-Xv6jBQPoBEvBq/5i2TeSG9tt/nqkbpcurrEG1b+2yfBrcJelOZF9Ml6dmyMh7bcW9JyFbRYpR5rxROSlBLTZHA==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} hasBin: true @@ -19154,8 +19480,9 @@ packages: esbuild: optional: true dependencies: + '@babel/core': 7.20.2 '@types/jest': 27.5.2 - babel-jest: 27.5.1 + babel-jest: 27.5.1(@babel/core@7.20.2) bs-logger: 0.2.6 fast-json-stable-stringify: 2.1.0 jest: 27.5.1 @@ -19164,11 +19491,11 @@ packages: lodash.memoize: 4.1.2 make-error: 1.3.6 semver: 7.3.8 - typescript: 4.9.3 + typescript: 4.9.5 yargs-parser: 20.2.4 dev: true - /ts-loader/9.4.1_typescript@4.9.3: + /ts-loader@9.4.1(typescript@4.9.3)(webpack@5.75.0): resolution: {integrity: sha512-384TYAqGs70rn9F0VBnh6BPTfhga7yFNdC5gXbQpDrBj9/KsT4iRkGqKXhziofHOlE2j6YEaiTYVGKKvPhGWvw==} engines: {node: '>=12.0.0'} peerDependencies: @@ -19180,9 +19507,10 @@ packages: micromatch: 4.0.5 semver: 7.3.8 typescript: 4.9.3 + webpack: 5.75.0 dev: true - /ts-loader/9.4.1_typescript@4.9.5: + /ts-loader@9.4.1(typescript@4.9.5)(webpack@5.75.0): resolution: {integrity: sha512-384TYAqGs70rn9F0VBnh6BPTfhga7yFNdC5gXbQpDrBj9/KsT4iRkGqKXhziofHOlE2j6YEaiTYVGKKvPhGWvw==} engines: {node: '>=12.0.0'} peerDependencies: @@ -19194,9 +19522,10 @@ packages: micromatch: 4.0.5 semver: 7.3.8 typescript: 4.9.5 + webpack: 5.75.0 dev: true - /ts-node/10.9.1_prfxyxghnskheluimpb6dvby4q: + /ts-node@10.9.1(@types/node@12.20.55)(typescript@4.9.5): resolution: {integrity: sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==} hasBin: true peerDependencies: @@ -19227,7 +19556,7 @@ packages: yn: 3.1.1 dev: true - /tsconfig-paths/3.14.2: + /tsconfig-paths@3.14.2: resolution: {integrity: sha512-o/9iXgCYc5L/JxCHPe3Hvh8Q/2xm5Z+p18PESBU6Ff33695QnCHBEjcytY2q19ua7Mbl/DavtBOLq+oG0RCL+g==} dependencies: '@types/json5': 0.0.29 @@ -19236,21 +19565,21 @@ packages: strip-bom: 3.0.0 dev: true - /tslib/1.14.1: + /tslib@1.14.1: resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} - /tslib/2.4.1: + /tslib@2.4.1: resolution: {integrity: sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==} dev: true - /tslib/2.5.0: + /tslib@2.5.0: resolution: {integrity: sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==} - /tsort/0.0.1: + /tsort@0.0.1: resolution: {integrity: sha512-Tyrf5mxF8Ofs1tNoxA13lFeZ2Zrbd6cKbuH3V+MQ5sb6DtBj5FjrXVsRWT8YvNAQTqNoz66dz1WsbigI22aEnw==} dev: true - /tsutils/3.21.0_typescript@4.9.3: + /tsutils@3.21.0(typescript@4.9.3): resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==} engines: {node: '>= 6'} peerDependencies: @@ -19260,7 +19589,7 @@ packages: typescript: 4.9.3 dev: true - /tsutils/3.21.0_typescript@4.9.5: + /tsutils@3.21.0(typescript@4.9.5): resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==} engines: {node: '>= 6'} peerDependencies: @@ -19270,77 +19599,77 @@ packages: typescript: 4.9.5 dev: true - /tunnel-agent/0.6.0: + /tunnel-agent@0.6.0: resolution: {integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==} dependencies: safe-buffer: 5.2.1 - /tweetnacl-util/0.15.1: + /tweetnacl-util@0.15.1: resolution: {integrity: sha512-RKJBIj8lySrShN4w6i/BonWp2Z/uxwC3h4y7xsRrpP59ZboCd0GpEVsOnMDYLMmKBpYhb5TgHzZXy7wTfYFBRw==} dev: true - /tweetnacl/0.14.5: + /tweetnacl@0.14.5: resolution: {integrity: sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==} dev: true - /tweetnacl/1.0.3: + /tweetnacl@1.0.3: resolution: {integrity: sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw==} dev: true - /type-check/0.3.2: + /type-check@0.3.2: resolution: {integrity: sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==} engines: {node: '>= 0.8.0'} dependencies: prelude-ls: 1.1.2 dev: true - /type-check/0.4.0: + /type-check@0.4.0: resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} engines: {node: '>= 0.8.0'} dependencies: prelude-ls: 1.2.1 dev: true - /type-detect/4.0.8: + /type-detect@4.0.8: resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} engines: {node: '>=4'} dev: true - /type-fest/0.18.1: + /type-fest@0.18.1: resolution: {integrity: sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==} engines: {node: '>=10'} dev: true - /type-fest/0.20.2: + /type-fest@0.20.2: resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} engines: {node: '>=10'} dev: true - /type-fest/0.21.3: + /type-fest@0.21.3: resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} engines: {node: '>=10'} dev: true - /type-fest/0.6.0: + /type-fest@0.6.0: resolution: {integrity: sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==} engines: {node: '>=8'} dev: true - /type-fest/0.7.1: + /type-fest@0.7.1: resolution: {integrity: sha512-Ne2YiiGN8bmrmJJEuTWTLJR32nh/JdL1+PSicowtNb0WFpn59GK8/lfD61bVtzguz7b3PBt74nxpv/Pw5po5Rg==} engines: {node: '>=8'} dev: true - /type-fest/0.8.1: + /type-fest@0.8.1: resolution: {integrity: sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==} engines: {node: '>=8'} dev: true - /type-fest/1.4.0: + /type-fest@1.4.0: resolution: {integrity: sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==} engines: {node: '>=10'} - /type-is/1.6.18: + /type-is@1.6.18: resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==} engines: {node: '>= 0.6'} dependencies: @@ -19349,29 +19678,29 @@ packages: dev: true optional: true - /type/1.2.0: + /type@1.2.0: resolution: {integrity: sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==} - /type/2.7.2: + /type@2.7.2: resolution: {integrity: sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw==} - /typechain/3.0.0_typescript@4.9.5: + /typechain@3.0.0(typescript@4.9.5): resolution: {integrity: sha512-ft4KVmiN3zH4JUFu2WJBrwfHeDf772Tt2d8bssDTo/YcckKW2D+OwFrHXRC6hJvO3mHjFQTihoMV6fJOi0Hngg==} hasBin: true dependencies: command-line-args: 4.0.7 - debug: 4.3.4 + debug: 4.3.4(supports-color@8.1.1) fs-extra: 7.0.1 js-sha3: 0.8.0 lodash: 4.17.21 - ts-essentials: 6.0.7_typescript@4.9.5 + ts-essentials: 6.0.7(typescript@4.9.5) ts-generator: 0.1.1 transitivePeerDependencies: - supports-color - typescript dev: true - /typechain/5.2.0_typescript@4.9.5: + /typechain@5.2.0(typescript@4.9.5): resolution: {integrity: sha512-0INirvQ+P+MwJOeMct+WLkUE4zov06QxC96D+i3uGFEHoiSkZN70MKDQsaj8zkL86wQwByJReI2e7fOUwECFuw==} hasBin: true peerDependencies: @@ -19379,20 +19708,20 @@ packages: dependencies: '@types/prettier': 2.7.2 command-line-args: 4.0.7 - debug: 4.3.4 + debug: 4.3.4(supports-color@8.1.1) fs-extra: 7.0.1 glob: 7.2.3 js-sha3: 0.8.0 lodash: 4.17.21 mkdirp: 1.0.4 prettier: 2.8.4 - ts-essentials: 7.0.3_typescript@4.9.5 + ts-essentials: 7.0.3(typescript@4.9.5) typescript: 4.9.5 transitivePeerDependencies: - supports-color dev: true - /typed-array-length/1.0.4: + /typed-array-length@1.0.4: resolution: {integrity: sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==} dependencies: call-bind: 1.0.2 @@ -19400,48 +19729,48 @@ packages: is-typed-array: 1.1.10 dev: true - /typedarray-to-buffer/1.0.4: + /typedarray-to-buffer@1.0.4: resolution: {integrity: sha512-vjMKrfSoUDN8/Vnqitw2FmstOfuJ73G6CrSEKnf11A6RmasVxHqfeBcnTb6RsL4pTMuV5Zsv9IiHRphMZyckUw==} dev: true - /typedarray-to-buffer/3.1.5: + /typedarray-to-buffer@3.1.5: resolution: {integrity: sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==} dependencies: is-typedarray: 1.0.0 - /typedarray/0.0.6: + /typedarray@0.0.6: resolution: {integrity: sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==} dev: true - /typescript/4.9.3: + /typescript@4.9.3: resolution: {integrity: sha512-CIfGzTelbKNEnLpLdGFgdyKhG23CKdKgQPOBc+OUNrkJ2vr+KSzsSV5kq5iWhEQbok+quxgGzrAtGWCyU7tHnA==} engines: {node: '>=4.2.0'} hasBin: true - /typescript/4.9.5: + /typescript@4.9.5: resolution: {integrity: sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==} engines: {node: '>=4.2.0'} hasBin: true - /typewise-core/1.2.0: + /typewise-core@1.2.0: resolution: {integrity: sha512-2SCC/WLzj2SbUwzFOzqMCkz5amXLlxtJqDKTICqg30x+2DZxcfZN2MvQZmGfXWKNWaKK9pBPsvkcwv8bF/gxKg==} dev: true - /typewise/1.0.3: + /typewise@1.0.3: resolution: {integrity: sha512-aXofE06xGhaQSPzt8hlTY+/YWQhm9P0jYUp1f2XtmW/3Bk0qzXcyFWAtPoo2uTGQj1ZwbDuSyuxicq+aDo8lCQ==} dependencies: typewise-core: 1.2.0 dev: true - /typewiselite/1.0.0: + /typewiselite@1.0.0: resolution: {integrity: sha512-J9alhjVHupW3Wfz6qFRGgQw0N3gr8hOkw6zm7FZ6UR1Cse/oD9/JVok7DNE9TT9IbciDHX2Ex9+ksE6cRmtymw==} dev: true - /typical/2.6.1: + /typical@2.6.1: resolution: {integrity: sha512-ofhi8kjIje6npGozTip9Fr8iecmYfEbS06i0JnIg+rh51KakryWF4+jX8lLKZVhy6N+ID45WYSFCxPOdTWCzNg==} dev: true - /uglify-js/3.17.4: + /uglify-js@3.17.4: resolution: {integrity: sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g==} engines: {node: '>=0.8.0'} hasBin: true @@ -19449,12 +19778,12 @@ packages: dev: true optional: true - /ultron/1.1.1: + /ultron@1.1.1: resolution: {integrity: sha512-UIEXBNeYmKptWH6z8ZnqTeS8fV74zG0/eRU9VGkpzz+LIJNs8W/zM/L+7ctCkRrgbNnnR0xxw4bKOr0cW0N0Og==} dev: true optional: true - /unbox-primitive/1.0.2: + /unbox-primitive@1.0.2: resolution: {integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==} dependencies: call-bind: 1.0.2 @@ -19463,24 +19792,24 @@ packages: which-boxed-primitive: 1.0.2 dev: true - /underscore/1.9.1: + /underscore@1.9.1: resolution: {integrity: sha512-5/4etnCkd9c8gwgowi5/om/mYO5ajCaOgdzj/oW+0eQV9WxKBDZw5+ycmKmeaTXjInS/W0BzpGLo2xR2aBwZdg==} dev: true optional: true - /undici/5.20.0: + /undici@5.20.0: resolution: {integrity: sha512-J3j60dYzuo6Eevbawwp1sdg16k5Tf768bxYK4TUJRH7cBM4kFCbf3mOnM/0E3vQYXvpxITbbWmBafaDbxLDz3g==} engines: {node: '>=12.18'} dependencies: busboy: 1.6.0 dev: true - /unicode-canonical-property-names-ecmascript/2.0.0: + /unicode-canonical-property-names-ecmascript@2.0.0: resolution: {integrity: sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==} engines: {node: '>=4'} dev: true - /unicode-match-property-ecmascript/2.0.0: + /unicode-match-property-ecmascript@2.0.0: resolution: {integrity: sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==} engines: {node: '>=4'} dependencies: @@ -19488,17 +19817,17 @@ packages: unicode-property-aliases-ecmascript: 2.1.0 dev: true - /unicode-match-property-value-ecmascript/2.1.0: + /unicode-match-property-value-ecmascript@2.1.0: resolution: {integrity: sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA==} engines: {node: '>=4'} dev: true - /unicode-property-aliases-ecmascript/2.1.0: + /unicode-property-aliases-ecmascript@2.1.0: resolution: {integrity: sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==} engines: {node: '>=4'} dev: true - /unified/10.1.2: + /unified@10.1.2: resolution: {integrity: sha512-pUSWAi/RAnVy1Pif2kAoeWNBa3JVrx0MId2LASj8G+7AiHWoKZNTomq6LG326T68U7/e263X6fTdcXIy7XnF7Q==} dependencies: '@types/unist': 2.0.6 @@ -19510,7 +19839,7 @@ packages: vfile: 5.3.7 dev: false - /union-value/1.0.1: + /union-value@1.0.1: resolution: {integrity: sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==} engines: {node: '>=0.10.0'} dependencies: @@ -19520,55 +19849,55 @@ packages: set-value: 2.0.1 dev: true - /unique-filename/1.1.1: + /unique-filename@1.1.1: resolution: {integrity: sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==} dependencies: unique-slug: 2.0.2 dev: true - /unique-slug/2.0.2: + /unique-slug@2.0.2: resolution: {integrity: sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==} dependencies: imurmurhash: 0.1.4 dev: true - /unist-util-find-after/4.0.1: + /unist-util-find-after@4.0.1: resolution: {integrity: sha512-QO/PuPMm2ERxC6vFXEPtmAutOopy5PknD+Oq64gGwxKtk4xwo9Z97t9Av1obPmGU0IyTa6EKYUfTrK2QJS3Ozw==} dependencies: '@types/unist': 2.0.6 unist-util-is: 5.2.1 dev: false - /unist-util-generated/2.0.1: + /unist-util-generated@2.0.1: resolution: {integrity: sha512-qF72kLmPxAw0oN2fwpWIqbXAVyEqUzDHMsbtPvOudIlUzXYFIeQIuxXQCRCFh22B7cixvU0MG7m3MW8FTq/S+A==} dev: false - /unist-util-is/5.2.1: + /unist-util-is@5.2.1: resolution: {integrity: sha512-u9njyyfEh43npf1M+yGKDGVPbY/JWEemg5nH05ncKPfi+kBbKBJoTdsogMu33uhytuLlv9y0O7GH7fEdwLdLQw==} dependencies: '@types/unist': 2.0.6 dev: false - /unist-util-position-from-estree/1.1.2: + /unist-util-position-from-estree@1.1.2: resolution: {integrity: sha512-poZa0eXpS+/XpoQwGwl79UUdea4ol2ZuCYguVaJS4qzIOMDzbqz8a3erUCOmubSZkaOuGamb3tX790iwOIROww==} dependencies: '@types/unist': 2.0.6 dev: false - /unist-util-position/4.0.4: + /unist-util-position@4.0.4: resolution: {integrity: sha512-kUBE91efOWfIVBo8xzh/uZQ7p9ffYRtUbMRZBNFYwf0RK8koUMx6dGUfwylLOKmaT2cs4wSW96QoYUSXAyEtpg==} dependencies: '@types/unist': 2.0.6 dev: false - /unist-util-remove-position/4.0.2: + /unist-util-remove-position@4.0.2: resolution: {integrity: sha512-TkBb0HABNmxzAcfLf4qsIbFbaPDvMO6wa3b3j4VcEzFVaw1LBKwnW4/sRJ/atSLSzoIg41JWEdnE7N6DIhGDGQ==} dependencies: '@types/unist': 2.0.6 unist-util-visit: 4.1.2 dev: false - /unist-util-remove/3.1.1: + /unist-util-remove@3.1.1: resolution: {integrity: sha512-kfCqZK5YVY5yEa89tvpl7KnBBHu2c6CzMkqHUrlOqaRgGOMp0sMvwWOVrbAtj03KhovQB7i96Gda72v/EFE0vw==} dependencies: '@types/unist': 2.0.6 @@ -19576,27 +19905,27 @@ packages: unist-util-visit-parents: 5.1.3 dev: false - /unist-util-stringify-position/3.0.3: + /unist-util-stringify-position@3.0.3: resolution: {integrity: sha512-k5GzIBZ/QatR8N5X2y+drfpWG8IDBzdnVj6OInRNWm1oXrzydiaAT2OQiA8DPRRZyAKb9b6I2a6PxYklZD0gKg==} dependencies: '@types/unist': 2.0.6 dev: false - /unist-util-visit-parents/4.1.1: + /unist-util-visit-parents@4.1.1: resolution: {integrity: sha512-1xAFJXAKpnnJl8G7K5KgU7FY55y3GcLIXqkzUj5QF/QVP7biUm0K0O2oqVkYsdjzJKifYeWn9+o6piAK2hGSHw==} dependencies: '@types/unist': 2.0.6 unist-util-is: 5.2.1 dev: false - /unist-util-visit-parents/5.1.3: + /unist-util-visit-parents@5.1.3: resolution: {integrity: sha512-x6+y8g7wWMyQhL1iZfhIPhDAs7Xwbn9nRosDXl7qoPTSCy0yNxnKc+hWokFifWQIDGi154rdUqKvbCa4+1kLhg==} dependencies: '@types/unist': 2.0.6 unist-util-is: 5.2.1 dev: false - /unist-util-visit/3.1.0: + /unist-util-visit@3.1.0: resolution: {integrity: sha512-Szoh+R/Ll68QWAyQyZZpQzZQm2UPbxibDvaY8Xc9SUtYgPsDzx5AWSk++UUt2hJuow8mvwR+rG+LQLw+KsuAKA==} dependencies: '@types/unist': 2.0.6 @@ -19604,7 +19933,7 @@ packages: unist-util-visit-parents: 4.1.1 dev: false - /unist-util-visit/4.1.2: + /unist-util-visit@4.1.2: resolution: {integrity: sha512-MSd8OUGISqHdVvfY9TPhyK2VdUrPgxkUtWSuMHF6XAAFuL4LokseigBnZtPnJMu+FbynTkFNnFlyjxpVKujMRg==} dependencies: '@types/unist': 2.0.6 @@ -19612,32 +19941,32 @@ packages: unist-util-visit-parents: 5.1.3 dev: false - /universalify/0.1.2: + /universalify@0.1.2: resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} engines: {node: '>= 4.0.0'} dev: true - /universalify/0.2.0: + /universalify@0.2.0: resolution: {integrity: sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==} engines: {node: '>= 4.0.0'} dev: true - /universalify/2.0.0: + /universalify@2.0.0: resolution: {integrity: sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==} engines: {node: '>= 10.0.0'} dev: true - /unorm/1.6.0: + /unorm@1.6.0: resolution: {integrity: sha512-b2/KCUlYZUeA7JFUuRJZPUtr4gZvBh7tavtv4fvk4+KV9pfGiR6CQAQAWl49ZpR3ts2dk4FYkP7EIgDJoiOLDA==} engines: {node: '>= 0.4.0'} dev: true - /unpipe/1.0.0: + /unpipe@1.0.0: resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} engines: {node: '>= 0.8'} dev: true - /unset-value/1.0.0: + /unset-value@1.0.0: resolution: {integrity: sha512-PcA2tsuGSF9cnySLHTLSh2qrQiJ70mn+r+Glzxv2TWZblxsxCC52BDlZoPCsz7STd9pN7EZetkWZBAvk4cgZdQ==} engines: {node: '>=0.10.0'} dependencies: @@ -19645,7 +19974,7 @@ packages: isobject: 3.0.1 dev: true - /update-browserslist-db/1.0.10_browserslist@4.21.4: + /update-browserslist-db@1.0.10(browserslist@4.21.4): resolution: {integrity: sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==} hasBin: true peerDependencies: @@ -19655,7 +19984,7 @@ packages: escalade: 3.1.1 picocolors: 1.0.0 - /update-browserslist-db/1.0.10_browserslist@4.21.5: + /update-browserslist-db@1.0.10(browserslist@4.21.5): resolution: {integrity: sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==} hasBin: true peerDependencies: @@ -19665,18 +19994,18 @@ packages: escalade: 3.1.1 picocolors: 1.0.0 - /uri-js/4.4.1: + /uri-js@4.4.1: resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} dependencies: punycode: 2.3.0 dev: true - /urix/0.1.0: + /urix@0.1.0: resolution: {integrity: sha512-Am1ousAhSLBeB9cG/7k7r2R0zj50uDRlZHPGbazid5s9rlF1F/QKYObEKSIunSjIOkJZqwRRLpvewjEkM7pSqg==} deprecated: Please see https://github.com/lydell/urix#deprecated dev: true - /url-parse-lax/3.0.0: + /url-parse-lax@3.0.0: resolution: {integrity: sha512-NjFKA0DidqPa5ciFcSrXnAltTtzz84ogy+NebPvfEgAck0+TNg4UJ4IN+fB7zRZfbgUf0syOo9MDxFkDSMuFaQ==} engines: {node: '>=4'} dependencies: @@ -19684,51 +20013,53 @@ packages: dev: true optional: true - /url-parse/1.5.10: + /url-parse@1.5.10: resolution: {integrity: sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==} dependencies: querystringify: 2.2.0 requires-port: 1.0.0 dev: true - /url-set-query/1.0.0: + /url-set-query@1.0.0: resolution: {integrity: sha512-3AChu4NiXquPfeckE5R5cGdiHCMWJx1dwCWOmWIL4KHAziJNOFIYJlpGFeKDvwLPHovZRCxK3cYlwzqI9Vp+Gg==} dev: true optional: true - /url/0.11.0: + /url@0.11.0: resolution: {integrity: sha512-kbailJa29QrtXnxgq+DdCEGlbTeYM2eJUxsz6vjZavrCYPMIFHMKQmSKYAIuUK2i7hgPm28a8piX5NTUtM/LKQ==} dependencies: punycode: 1.3.2 querystring: 0.2.0 dev: true - /use-sync-external-store/1.2.0: + /use-sync-external-store@1.2.0(react@18.2.0): resolution: {integrity: sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA==} peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 + dependencies: + react: 18.2.0 dev: false - /use/3.1.1: + /use@3.1.1: resolution: {integrity: sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==} engines: {node: '>=0.10.0'} dev: true - /utf-8-validate/5.0.10: + /utf-8-validate@5.0.10: resolution: {integrity: sha512-Z6czzLq4u8fPOyx7TU6X3dvUZVvoJmxSQ+IcrlmagKhilxlhZgxPK6C5Jqbkw1IDUmFTM+cz9QDnnLTwDz/2gQ==} engines: {node: '>=6.14.2'} requiresBuild: true dependencies: node-gyp-build: 4.6.0 - /utf8/3.0.0: + /utf8@3.0.0: resolution: {integrity: sha512-E8VjFIQ/TyQgp+TZfS6l8yp/xWppSAHzidGiRrqe4bK4XP9pTRyKFgGJpO3SN7zdX4DeomTrwaseCHovfpFcqQ==} dev: true - /util-deprecate/1.0.2: + /util-deprecate@1.0.2: resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} - /util.promisify/1.1.1: + /util.promisify@1.1.1: resolution: {integrity: sha512-/s3UsZUrIfa6xDhr7zZhnE9SLQ5RIXyYfiVnMMyMDzOc8WhWN4Nbh36H842OyurKbCDAesZOJaVyvmSl6fhGQw==} dependencies: call-bind: 1.0.2 @@ -19738,7 +20069,7 @@ packages: object.getownpropertydescriptors: 2.1.5 dev: true - /util/0.12.5: + /util@0.12.5: resolution: {integrity: sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==} dependencies: inherits: 2.0.4 @@ -19748,39 +20079,39 @@ packages: which-typed-array: 1.1.9 dev: false - /utila/0.4.0: + /utila@0.4.0: resolution: {integrity: sha512-Z0DbgELS9/L/75wZbro8xAnT50pBVFQZ+hUEueGDU5FN51YSCYM+jdxsfCiHjwNP/4LCDD0i/graKpeBnOXKRA==} dev: true - /utils-merge/1.0.1: + /utils-merge@1.0.1: resolution: {integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==} engines: {node: '>= 0.4.0'} dev: true optional: true - /uuid/2.0.1: + /uuid@2.0.1: resolution: {integrity: sha512-nWg9+Oa3qD2CQzHIP4qKUqwNfzKn8P0LtFhotaCTFchsV7ZfDhAybeip/HZVeMIpZi9JgY1E3nUlwaCmZT1sEg==} deprecated: Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details. dev: true - /uuid/3.3.2: + /uuid@3.3.2: 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 dev: true optional: true - /uuid/3.4.0: + /uuid@3.4.0: resolution: {integrity: sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==} deprecated: Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details. hasBin: true dev: true - /uuid/8.3.2: + /uuid@8.3.2: resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} hasBin: true - /uvu/0.5.6: + /uvu@0.5.6: resolution: {integrity: sha512-+g8ENReyr8YsOc6fv/NVJs2vFdHBnBNdfE49rshrTzDWOlUx4Gq7KOS2GD8eqhy2j+Ejq29+SbKH8yjkAqXqoA==} engines: {node: '>=8'} hasBin: true @@ -19791,15 +20122,15 @@ packages: sade: 1.8.1 dev: false - /v8-compile-cache-lib/3.0.1: + /v8-compile-cache-lib@3.0.1: resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==} dev: true - /v8-compile-cache/2.3.0: + /v8-compile-cache@2.3.0: resolution: {integrity: sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==} dev: true - /v8-to-istanbul/8.1.1: + /v8-to-istanbul@8.1.1: resolution: {integrity: sha512-FGtKtv3xIpR6BYhvgH8MI/y78oT7d8Au3ww4QIxymrCtZEh5b8gCw2siywE+puhEmuWKDtmfrvF5UlB298ut3w==} engines: {node: '>=10.12.0'} dependencies: @@ -19808,25 +20139,25 @@ packages: source-map: 0.7.4 dev: true - /validate-npm-package-license/3.0.4: + /validate-npm-package-license@3.0.4: resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} dependencies: spdx-correct: 3.1.1 spdx-expression-parse: 3.0.1 dev: true - /varint/5.0.2: + /varint@5.0.2: resolution: {integrity: sha512-lKxKYG6H03yCZUpAGOPOsMcGxd1RHCu1iKvEHYDPmTyq2HueGhD73ssNBqqQWfvYs04G9iUFRvmAVLW20Jw6ow==} dev: true optional: true - /vary/1.1.2: + /vary@1.1.2: resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} engines: {node: '>= 0.8'} dev: true optional: true - /verror/1.10.0: + /verror@1.10.0: resolution: {integrity: sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==} engines: {'0': node >=0.6.0} dependencies: @@ -19835,14 +20166,14 @@ packages: extsprintf: 1.3.0 dev: true - /vfile-location/4.1.0: + /vfile-location@4.1.0: resolution: {integrity: sha512-YF23YMyASIIJXpktBa4vIGLJ5Gs88UB/XePgqPmTa7cDA+JeO3yclbpheQYCHjVHBn/yePzrXuygIL+xbvRYHw==} dependencies: '@types/unist': 2.0.6 vfile: 5.3.7 dev: false - /vfile-matter/3.0.1: + /vfile-matter@3.0.1: resolution: {integrity: sha512-CAAIDwnh6ZdtrqAuxdElUqQRQDQgbbIrYtDYI8gCjXS1qQ+1XdLoK8FIZWxJwn0/I+BkSSZpar3SOgjemQz4fg==} dependencies: '@types/js-yaml': 4.0.5 @@ -19850,14 +20181,14 @@ packages: js-yaml: 4.1.0 dev: false - /vfile-message/3.1.4: + /vfile-message@3.1.4: resolution: {integrity: sha512-fa0Z6P8HUrQN4BZaX05SIVXic+7kE3b05PWAtPuYP9QLHsLKYR7/AlLW3NtOrpXRLeawpDLMsVkmk5DG0NXgWw==} dependencies: '@types/unist': 2.0.6 unist-util-stringify-position: 3.0.3 dev: false - /vfile/5.3.7: + /vfile@5.3.7: resolution: {integrity: sha512-r7qlzkgErKjobAmyNIkkSpizsFPYiUPuJb5pNW1RB4JcYVZhs4lIbVqk8XPk033CV/1z8ss5pkax8SuhGpcG8g==} dependencies: '@types/unist': 2.0.6 @@ -19866,7 +20197,7 @@ packages: vfile-message: 3.1.4 dev: false - /vite-plugin-static-copy/0.12.0_vite@3.2.4: + /vite-plugin-static-copy@0.12.0(vite@3.2.4): resolution: {integrity: sha512-5a8hCjYJdf/rl8s7ct/YWt97gXdGPGNSOoJtkY5IYhbnSq04X1gTt5GpFHKfAxhHoed1Grfw3Ed13t7AjJi7gw==} engines: {node: ^14.18.0 || >=16.0.0} peerDependencies: @@ -19879,7 +20210,7 @@ packages: vite: 3.2.4 dev: true - /vite/3.2.4: + /vite@3.2.4: resolution: {integrity: sha512-Z2X6SRAffOUYTa+sLy3NQ7nlHFU100xwanq1WDwqaiFiCe+25zdxP1TfCS5ojPV2oDDcXudHIoPnI1Z/66B7Yw==} engines: {node: ^14.18.0 || >=16.0.0} hasBin: true @@ -19912,7 +20243,7 @@ packages: fsevents: 2.3.2 dev: true - /vitefu/0.2.2_vite@3.2.4: + /vitefu@0.2.2(vite@3.2.4): resolution: {integrity: sha512-8CKEIWPm4B4DUDN+h+hVJa9pyNi7rzc5MYmbxhs1wcMakueGFNWB5/DL30USm9qU3xUPnL4/rrLEAwwFiD1tag==} peerDependencies: vite: ^3.0.0 @@ -19923,19 +20254,19 @@ packages: vite: 3.2.4 dev: true - /vscode-oniguruma/1.7.0: + /vscode-oniguruma@1.7.0: resolution: {integrity: sha512-L9WMGRfrjOhgHSdOYgCt/yRMsXzLDJSL7BPrOZt73gU0iWO4mpqzqQzOz5srxqTvMBaR0XZTSrVWo4j55Rc6cA==} dev: false - /vscode-textmate/8.0.0: + /vscode-textmate@8.0.0: resolution: {integrity: sha512-AFbieoL7a5LMqcnOF04ji+rpXadgOXnZsxQr//r83kLPr7biP7am3g9zbaZIaBGwBRWeSvoMD4mgPdX3e4NWBg==} dev: false - /vue-hot-reload-api/2.3.4: + /vue-hot-reload-api@2.3.4: resolution: {integrity: sha512-BXq3jwIagosjgNVae6tkHzzIk6a8MHFtzAdwhnV5VlvPTFxDCvIttgSiHWjdGoTJvXtmRu5HacExfdarRcFhog==} dev: true - /vue-loader/15.10.1_y5o36p7qrshhm4v7l6yk7rwfsu: + /vue-loader@15.10.1(css-loader@6.7.3)(lodash@4.17.21)(vue-template-compiler@2.7.14)(webpack@5.75.0): resolution: {integrity: sha512-SaPHK1A01VrNthlix6h1hq4uJu7S/z0kdLUb6klubo738NeQoLbS6V9/d8Pv19tU0XdQKju3D1HSKuI8wJ5wMA==} peerDependencies: '@vue/compiler-sfc': ^3.0.8 @@ -19951,8 +20282,8 @@ packages: vue-template-compiler: optional: true dependencies: - '@vue/component-compiler-utils': 3.3.0 - css-loader: 6.7.3_webpack@5.75.0 + '@vue/component-compiler-utils': 3.3.0(lodash@4.17.21) + css-loader: 6.7.3(webpack@5.75.0) hash-sum: 1.0.2 loader-utils: 1.4.2 vue-hot-reload-api: 2.3.4 @@ -20015,7 +20346,7 @@ packages: - whiskers dev: true - /vue-router/3.6.5_vue@2.7.14: + /vue-router@3.6.5(vue@2.7.14): resolution: {integrity: sha512-VYXZQLtjuvKxxcshuRAwjHnciqZVoXAjTjcqBTz4rKc8qih9g9pI3hbDjmqXaHdgL3v8pV6P8Z335XvHzESxLQ==} peerDependencies: vue: ^2 @@ -20023,52 +20354,52 @@ packages: vue: 2.7.14 dev: true - /vue-style-loader/4.1.3: + /vue-style-loader@4.1.3: resolution: {integrity: sha512-sFuh0xfbtpRlKfm39ss/ikqs9AbKCoXZBpHeVZ8Tx650o0k0q/YCM7FRvigtxpACezfq6af+a7JeqVTWvncqDg==} dependencies: hash-sum: 1.0.2 loader-utils: 1.4.2 dev: true - /vue-template-compiler/2.7.14: + /vue-template-compiler@2.7.14: resolution: {integrity: sha512-zyA5Y3ArvVG0NacJDkkzJuPQDF8RFeRlzV2vLeSnhSpieO6LK2OVbdLPi5MPPs09Ii+gMO8nY4S3iKQxBxDmWQ==} dependencies: de-indent: 1.0.2 he: 1.2.0 dev: true - /vue-template-es2015-compiler/1.9.1: + /vue-template-es2015-compiler@1.9.1: resolution: {integrity: sha512-4gDntzrifFnCEvyoO8PqyJDmguXgVPxKiIxrBKjIowvL9l+N66196+72XVYR8BBf1Uv1Fgt3bGevJ+sEmxfZzw==} dev: true - /vue/2.7.14: + /vue@2.7.14: resolution: {integrity: sha512-b2qkFyOM0kwqWFuQmgd4o+uHGU7T+2z3T+WQp8UBjADfEv2n4FEMffzBmCKNP0IGzOEEfYjvtcC62xaSKeQDrQ==} dependencies: '@vue/compiler-sfc': 2.7.14 csstype: 3.1.1 dev: true - /w3c-hr-time/1.0.2: + /w3c-hr-time@1.0.2: resolution: {integrity: sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==} deprecated: Use your platform's native performance.now() and performance.timeOrigin. dependencies: browser-process-hrtime: 1.0.0 dev: true - /w3c-xmlserializer/2.0.0: + /w3c-xmlserializer@2.0.0: resolution: {integrity: sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA==} engines: {node: '>=10'} dependencies: xml-name-validator: 3.0.0 dev: true - /walker/1.0.8: + /walker@1.0.8: resolution: {integrity: sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==} dependencies: makeerror: 1.0.12 dev: true - /watchpack/2.4.0: + /watchpack@2.4.0: resolution: {integrity: sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==} engines: {node: '>=10.13.0'} dependencies: @@ -20076,11 +20407,11 @@ packages: graceful-fs: 4.2.10 dev: true - /web-namespaces/2.0.1: + /web-namespaces@2.0.1: resolution: {integrity: sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==} dev: false - /web3-bzz/1.2.11: + /web3-bzz@1.2.11: resolution: {integrity: sha512-XGpWUEElGypBjeFyUhTkiPXFbDVD6Nr/S5jznE3t8cWUA0FxRf1n3n/NuIZeb0H9RkN2Ctd/jNma/k8XGa3YKg==} engines: {node: '>=8.0.0'} dependencies: @@ -20095,7 +20426,7 @@ packages: dev: true optional: true - /web3-core-helpers/1.2.11: + /web3-core-helpers@1.2.11: resolution: {integrity: sha512-PEPoAoZd5ME7UfbnCZBdzIerpe74GEvlwT4AjOmHeCVZoIFk7EqvOZDejJHt+feJA6kMVTdd0xzRNN295UhC1A==} engines: {node: '>=8.0.0'} dependencies: @@ -20105,7 +20436,7 @@ packages: dev: true optional: true - /web3-core-method/1.2.11: + /web3-core-method@1.2.11: resolution: {integrity: sha512-ff0q76Cde94HAxLDZ6DbdmKniYCQVtvuaYh+rtOUMB6kssa5FX0q3vPmixi7NPooFnbKmmZCM6NvXg4IreTPIw==} engines: {node: '>=8.0.0'} dependencies: @@ -20118,7 +20449,7 @@ packages: dev: true optional: true - /web3-core-promievent/1.2.11: + /web3-core-promievent@1.2.11: resolution: {integrity: sha512-il4McoDa/Ox9Agh4kyfQ8Ak/9ABYpnF8poBLL33R/EnxLsJOGQG2nZhkJa3I067hocrPSjEdlPt/0bHXsln4qA==} engines: {node: '>=8.0.0'} dependencies: @@ -20126,7 +20457,7 @@ packages: dev: true optional: true - /web3-core-requestmanager/1.2.11: + /web3-core-requestmanager@1.2.11: resolution: {integrity: sha512-oFhBtLfOiIbmfl6T6gYjjj9igOvtyxJ+fjS+byRxiwFJyJ5BQOz4/9/17gWR1Cq74paTlI7vDGxYfuvfE/mKvA==} engines: {node: '>=8.0.0'} dependencies: @@ -20140,7 +20471,7 @@ packages: dev: true optional: true - /web3-core-subscriptions/1.2.11: + /web3-core-subscriptions@1.2.11: resolution: {integrity: sha512-qEF/OVqkCvQ7MPs1JylIZCZkin0aKK9lDxpAtQ1F8niEDGFqn7DT8E/vzbIa0GsOjL2fZjDhWJsaW+BSoAW1gg==} engines: {node: '>=8.0.0'} dependencies: @@ -20150,7 +20481,7 @@ packages: dev: true optional: true - /web3-core/1.2.11: + /web3-core@1.2.11: resolution: {integrity: sha512-CN7MEYOY5ryo5iVleIWRE3a3cZqVaLlIbIzDPsvQRUfzYnvzZQRZBm9Mq+ttDi2STOOzc1MKylspz/o3yq/LjQ==} engines: {node: '>=8.0.0'} dependencies: @@ -20166,7 +20497,7 @@ packages: dev: true optional: true - /web3-eth-abi/1.2.11: + /web3-eth-abi@1.2.11: resolution: {integrity: sha512-PkRYc0+MjuLSgg03QVWqWlQivJqRwKItKtEpRUaxUAeLE7i/uU39gmzm2keHGcQXo3POXAbOnMqkDvOep89Crg==} engines: {node: '>=8.0.0'} dependencies: @@ -20176,7 +20507,7 @@ packages: dev: true optional: true - /web3-eth-accounts/1.2.11: + /web3-eth-accounts@1.2.11: resolution: {integrity: sha512-6FwPqEpCfKIh3nSSGeo3uBm2iFSnFJDfwL3oS9pyegRBXNsGRVpgiW63yhNzL0796StsvjHWwQnQHsZNxWAkGw==} engines: {node: '>=8.0.0'} dependencies: @@ -20196,7 +20527,7 @@ packages: dev: true optional: true - /web3-eth-contract/1.2.11: + /web3-eth-contract@1.2.11: resolution: {integrity: sha512-MzYuI/Rq2o6gn7vCGcnQgco63isPNK5lMAan2E51AJLknjSLnOxwNY3gM8BcKoy4Z+v5Dv00a03Xuk78JowFow==} engines: {node: '>=8.0.0'} dependencies: @@ -20214,7 +20545,7 @@ packages: dev: true optional: true - /web3-eth-ens/1.2.11: + /web3-eth-ens@1.2.11: resolution: {integrity: sha512-dbW7dXP6HqT1EAPvnniZVnmw6TmQEKF6/1KgAxbo8iBBYrVTMDGFQUUnZ+C4VETGrwwaqtX4L9d/FrQhZ6SUiA==} engines: {node: '>=8.0.0'} dependencies: @@ -20232,7 +20563,7 @@ packages: dev: true optional: true - /web3-eth-iban/1.2.11: + /web3-eth-iban@1.2.11: resolution: {integrity: sha512-ozuVlZ5jwFC2hJY4+fH9pIcuH1xP0HEFhtWsR69u9uDIANHLPQQtWYmdj7xQ3p2YT4bQLq/axKhZi7EZVetmxQ==} engines: {node: '>=8.0.0'} dependencies: @@ -20241,7 +20572,7 @@ packages: dev: true optional: true - /web3-eth-personal/1.2.11: + /web3-eth-personal@1.2.11: resolution: {integrity: sha512-42IzUtKq9iHZ8K9VN0vAI50iSU9tOA1V7XU2BhF/tb7We2iKBVdkley2fg26TxlOcKNEHm7o6HRtiiFsVK4Ifw==} engines: {node: '>=8.0.0'} dependencies: @@ -20256,7 +20587,7 @@ packages: dev: true optional: true - /web3-eth/1.2.11: + /web3-eth@1.2.11: resolution: {integrity: sha512-REvxW1wJ58AgHPcXPJOL49d1K/dPmuw4LjPLBPStOVkQjzDTVmJEIsiLwn2YeuNDd4pfakBwT8L3bz1G1/wVsQ==} engines: {node: '>=8.0.0'} dependencies: @@ -20278,7 +20609,7 @@ packages: dev: true optional: true - /web3-net/1.2.11: + /web3-net@1.2.11: resolution: {integrity: sha512-sjrSDj0pTfZouR5BSTItCuZ5K/oZPVdVciPQ6981PPPIwJJkCMeVjD7I4zO3qDPCnBjBSbWvVnLdwqUBPtHxyg==} engines: {node: '>=8.0.0'} dependencies: @@ -20290,7 +20621,7 @@ packages: dev: true optional: true - /web3-provider-engine/14.2.1: + /web3-provider-engine@14.2.1: resolution: {integrity: sha512-iSv31h2qXkr9vrL6UZDm4leZMc32SjWJFGOp/D92JXfcEboCqraZyuExDkpxKw8ziTufXieNM7LSXNHzszYdJw==} dependencies: async: 2.6.4 @@ -20320,7 +20651,7 @@ packages: - utf-8-validate dev: true - /web3-providers-http/1.2.11: + /web3-providers-http@1.2.11: resolution: {integrity: sha512-psh4hYGb1+ijWywfwpB2cvvOIMISlR44F/rJtYkRmQ5jMvG4FOCPlQJPiHQZo+2cc3HbktvvSJzIhkWQJdmvrA==} engines: {node: '>=8.0.0'} dependencies: @@ -20329,7 +20660,7 @@ packages: dev: true optional: true - /web3-providers-ipc/1.2.11: + /web3-providers-ipc@1.2.11: resolution: {integrity: sha512-yhc7Y/k8hBV/KlELxynWjJDzmgDEDjIjBzXK+e0rHBsYEhdCNdIH5Psa456c+l0qTEU2YzycF8VAjYpWfPnBpQ==} engines: {node: '>=8.0.0'} dependencies: @@ -20339,7 +20670,7 @@ packages: dev: true optional: true - /web3-providers-ws/1.2.11: + /web3-providers-ws@1.2.11: resolution: {integrity: sha512-ZxnjIY1Er8Ty+cE4migzr43zA/+72AF1myzsLaU5eVgdsfV7Jqx7Dix1hbevNZDKFlSoEyq/3j/jYalh3So1Zg==} engines: {node: '>=8.0.0'} dependencies: @@ -20352,7 +20683,7 @@ packages: dev: true optional: true - /web3-shh/1.2.11: + /web3-shh@1.2.11: resolution: {integrity: sha512-B3OrO3oG1L+bv3E1sTwCx66injW1A8hhwpknDUbV+sw3fehFazA06z9SGXUefuFI1kVs4q2vRi0n4oCcI4dZDg==} engines: {node: '>=8.0.0'} dependencies: @@ -20365,7 +20696,7 @@ packages: dev: true optional: true - /web3-utils/1.2.11: + /web3-utils@1.2.11: resolution: {integrity: sha512-3Tq09izhD+ThqHEaWYX4VOT7dNPdZiO+c/1QMA0s5X2lDFKK/xHJb7cyTRRVzN2LvlHbR7baS1tmQhSua51TcQ==} engines: {node: '>=8.0.0'} dependencies: @@ -20380,7 +20711,7 @@ packages: dev: true optional: true - /web3-utils/1.8.2: + /web3-utils@1.8.2: resolution: {integrity: sha512-v7j6xhfLQfY7xQDrUP0BKbaNrmZ2/+egbqP9q3KYmOiPpnvAfol+32slgL0WX/5n8VPvKCK5EZ1HGrAVICSToA==} engines: {node: '>=8.0.0'} dependencies: @@ -20393,7 +20724,7 @@ packages: utf8: 3.0.0 dev: true - /web3/1.2.11: + /web3@1.2.11: resolution: {integrity: sha512-mjQ8HeU41G6hgOYm1pmeH0mRAeNKJGnJEUzDMoerkpw7QUQT4exVREgF1MYPvL/z6vAshOXei25LE/t/Bxl8yQ==} engines: {node: '>=8.0.0'} requiresBuild: true @@ -20412,25 +20743,25 @@ packages: dev: true optional: true - /webidl-conversions/3.0.1: + /webidl-conversions@3.0.1: resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} - /webidl-conversions/5.0.0: + /webidl-conversions@5.0.0: resolution: {integrity: sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA==} engines: {node: '>=8'} dev: true - /webidl-conversions/6.1.0: + /webidl-conversions@6.1.0: resolution: {integrity: sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==} engines: {node: '>=10.4'} dev: true - /webpack-sources/3.2.3: + /webpack-sources@3.2.3: resolution: {integrity: sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==} engines: {node: '>=10.13.0'} dev: true - /webpack/5.75.0: + /webpack@5.75.0: resolution: {integrity: sha512-piaIaoVJlqMsPtX/+3KTTO6jfvrSYgauFVdt8cr9LTHKmcq/AMd4mhzsiP7ZF/PGRNPGA8336jldh9l2Kt2ogQ==} engines: {node: '>=10.13.0'} hasBin: true @@ -20446,7 +20777,7 @@ packages: '@webassemblyjs/wasm-edit': 1.11.1 '@webassemblyjs/wasm-parser': 1.11.1 acorn: 8.8.2 - acorn-import-assertions: 1.8.0_acorn@8.8.2 + acorn-import-assertions: 1.8.0(acorn@8.8.2) browserslist: 4.21.5 chrome-trace-event: 1.0.3 enhanced-resolve: 5.12.0 @@ -20461,7 +20792,7 @@ packages: neo-async: 2.6.2 schema-utils: 3.1.1 tapable: 2.2.1 - terser-webpack-plugin: 5.3.6_webpack@5.75.0 + terser-webpack-plugin: 5.3.6(webpack@5.75.0) watchpack: 2.4.0 webpack-sources: 3.2.3 transitivePeerDependencies: @@ -20470,7 +20801,7 @@ packages: - uglify-js dev: true - /websocket/1.0.32: + /websocket@1.0.32: resolution: {integrity: sha512-i4yhcllSP4wrpoPMU2N0TQ/q0O94LRG/eUQjEAamRltjQ1oT1PFFKOG4i877OlJgCG8rw6LrrowJp+TYCEWF7Q==} engines: {node: '>=4.0.0'} dependencies: @@ -20484,27 +20815,27 @@ packages: - supports-color dev: true - /whatwg-encoding/1.0.5: + /whatwg-encoding@1.0.5: resolution: {integrity: sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==} dependencies: iconv-lite: 0.4.24 dev: true - /whatwg-fetch/2.0.4: + /whatwg-fetch@2.0.4: resolution: {integrity: sha512-dcQ1GWpOD/eEQ97k66aiEVpNnapVj90/+R+SXTPYGHpYBBypfKJEQjLrvMZ7YXbKm21gXd4NcuxUTjiv1YtLng==} dev: true - /whatwg-mimetype/2.3.0: + /whatwg-mimetype@2.3.0: resolution: {integrity: sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==} dev: true - /whatwg-url/5.0.0: + /whatwg-url@5.0.0: resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} dependencies: tr46: 0.0.3 webidl-conversions: 3.0.1 - /whatwg-url/8.7.0: + /whatwg-url@8.7.0: resolution: {integrity: sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg==} engines: {node: '>=10'} dependencies: @@ -20513,7 +20844,7 @@ packages: webidl-conversions: 6.1.0 dev: true - /which-boxed-primitive/1.0.2: + /which-boxed-primitive@1.0.2: resolution: {integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==} dependencies: is-bigint: 1.0.4 @@ -20523,14 +20854,14 @@ packages: is-symbol: 1.0.4 dev: true - /which-module/1.0.0: + /which-module@1.0.0: resolution: {integrity: sha512-F6+WgncZi/mJDrammbTuHe1q0R5hOXv/mBaiNA2TCNT/LTHusX0V+CJnj9XT8ki5ln2UZyyddDgHfCzyrOH7MQ==} dev: true - /which-module/2.0.0: + /which-module@2.0.0: resolution: {integrity: sha512-B+enWhmw6cjfVC7kS8Pj9pCrKSc5txArRyaYGe088shv/FGWH+0Rjx/xPgtsWfsUtS27FkP697E4DDhgrgoc0Q==} - /which-typed-array/1.1.9: + /which-typed-array@1.1.9: resolution: {integrity: sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA==} engines: {node: '>= 0.4'} dependencies: @@ -20541,13 +20872,13 @@ packages: has-tostringtag: 1.0.0 is-typed-array: 1.1.10 - /which/1.3.1: + /which@1.3.1: resolution: {integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==} hasBin: true dependencies: isexe: 2.0.0 - /which/2.0.2: + /which@2.0.2: resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} engines: {node: '>= 8'} hasBin: true @@ -20555,38 +20886,38 @@ packages: isexe: 2.0.0 dev: true - /wide-align/1.1.3: + /wide-align@1.1.3: resolution: {integrity: sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==} dependencies: string-width: 2.1.1 dev: true - /wide-align/1.1.5: + /wide-align@1.1.5: resolution: {integrity: sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==} dependencies: string-width: 4.2.3 dev: true - /window-size/0.2.0: + /window-size@0.2.0: resolution: {integrity: sha512-UD7d8HFA2+PZsbKyaOCEy8gMh1oDtHgJh1LfgjQ4zVXmYjAT/kvz3PueITKuqDiIXQe7yzpPnxX3lNc+AhQMyw==} engines: {node: '>= 0.10.0'} hasBin: true dev: true - /word-wrap/1.2.3: + /word-wrap@1.2.3: resolution: {integrity: sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==} engines: {node: '>=0.10.0'} dev: true - /wordwrap/1.0.0: + /wordwrap@1.0.0: resolution: {integrity: sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==} dev: true - /workerpool/6.2.1: + /workerpool@6.2.1: resolution: {integrity: sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw==} dev: true - /wrap-ansi/2.1.0: + /wrap-ansi@2.1.0: resolution: {integrity: sha512-vAaEaDM946gbNpH5pLVNR+vX2ht6n0Bt3GXwVB1AuAqZosOvHNF3P7wDnh8KLkSqgUh0uh77le7Owgoz+Z9XBw==} engines: {node: '>=0.10.0'} dependencies: @@ -20594,7 +20925,7 @@ packages: strip-ansi: 3.0.1 dev: true - /wrap-ansi/5.1.0: + /wrap-ansi@5.1.0: resolution: {integrity: sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==} engines: {node: '>=6'} dependencies: @@ -20602,7 +20933,7 @@ packages: string-width: 3.1.0 strip-ansi: 5.2.0 - /wrap-ansi/6.2.0: + /wrap-ansi@6.2.0: resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==} engines: {node: '>=8'} dependencies: @@ -20611,7 +20942,7 @@ packages: strip-ansi: 6.0.1 dev: true - /wrap-ansi/7.0.0: + /wrap-ansi@7.0.0: resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} engines: {node: '>=10'} dependencies: @@ -20619,10 +20950,10 @@ packages: string-width: 4.2.3 strip-ansi: 6.0.1 - /wrappy/1.0.2: + /wrappy@1.0.2: resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} - /write-file-atomic/3.0.3: + /write-file-atomic@3.0.3: resolution: {integrity: sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==} dependencies: imurmurhash: 0.1.4 @@ -20631,7 +20962,7 @@ packages: typedarray-to-buffer: 3.1.5 dev: true - /ws/3.3.3: + /ws@3.3.3: resolution: {integrity: sha512-nnWLa/NwZSt4KQJu51MYlCcSQ5g7INpOrOMt4XV8j4dqTXdmlUmSHQ8/oLC069ckre0fRsgfvsKwbTdtKLCDkA==} peerDependencies: bufferutil: ^4.0.1 @@ -20648,7 +20979,7 @@ packages: dev: true optional: true - /ws/5.2.3: + /ws@5.2.3: resolution: {integrity: sha512-jZArVERrMsKUatIdnLzqvcfydI85dvd/Fp1u/VOpfdDWQ4c9qWXe+VIeAbQ5FrDwciAkr+lzofXLz3Kuf26AOA==} peerDependencies: bufferutil: ^4.0.1 @@ -20662,7 +20993,7 @@ packages: async-limiter: 1.0.1 dev: true - /ws/7.4.6: + /ws@7.4.6: resolution: {integrity: sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==} engines: {node: '>=8.3.0'} peerDependencies: @@ -20674,7 +21005,7 @@ packages: utf-8-validate: optional: true - /ws/7.5.3: + /ws@7.5.3: resolution: {integrity: sha512-kQ/dHIzuLrS6Je9+uv81ueZomEwH0qVYstcAQ4/Z93K8zeko9gtAbttJWzoC5ukqXY1PpoouV3+VSOqEAFt5wg==} engines: {node: '>=8.3.0'} peerDependencies: @@ -20687,7 +21018,7 @@ packages: optional: true dev: false - /ws/7.5.9: + /ws@7.5.9: resolution: {integrity: sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==} engines: {node: '>=8.3.0'} peerDependencies: @@ -20699,7 +21030,7 @@ packages: utf-8-validate: optional: true - /ws/8.11.0_3cxu5zja4e2r5wmvge7mdcljwq: + /ws@8.11.0(bufferutil@4.0.7)(utf-8-validate@5.0.10): resolution: {integrity: sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg==} engines: {node: '>=10.0.0'} peerDependencies: @@ -20715,14 +21046,14 @@ packages: utf-8-validate: 5.0.10 dev: false - /xhr-request-promise/0.1.3: + /xhr-request-promise@0.1.3: resolution: {integrity: sha512-YUBytBsuwgitWtdRzXDDkWAXzhdGB8bYm0sSzMPZT7Z2MBjMSTHFsyCT1yCRATY+XC69DUrQraRAEgcoCRaIPg==} dependencies: xhr-request: 1.1.0 dev: true optional: true - /xhr-request/1.1.0: + /xhr-request@1.1.0: resolution: {integrity: sha512-Y7qzEaR3FDtL3fP30k9wO/e+FBnBByZeybKOhASsGP30NIkRAAkKD/sCnLvgEfAIEC1rcmK7YG8f4oEnIrrWzA==} dependencies: buffer-to-arraybuffer: 0.0.5 @@ -20735,7 +21066,14 @@ packages: dev: true optional: true - /xhr/2.6.0: + /xhr2-cookies@1.1.0: + resolution: {integrity: sha512-hjXUA6q+jl/bd8ADHcVfFsSPIf+tyLIjuO9TwJC9WI6JP2zKcS7C+p56I9kCLLsaCiNT035iYvEUUzdEFj/8+g==} + dependencies: + cookiejar: 2.1.4 + dev: true + optional: true + + /xhr@2.6.0: resolution: {integrity: sha512-/eCGLb5rxjx5e3mF1A7s+pLlR6CGyqWN91fv1JgER5mVWg1MZmlhBvy9kjcsOdRk8RrIujotWyJamfyrp+WIcA==} dependencies: global: 4.4.0 @@ -20744,27 +21082,20 @@ packages: xtend: 4.0.2 dev: true - /xhr2-cookies/1.1.0: - resolution: {integrity: sha512-hjXUA6q+jl/bd8ADHcVfFsSPIf+tyLIjuO9TwJC9WI6JP2zKcS7C+p56I9kCLLsaCiNT035iYvEUUzdEFj/8+g==} - dependencies: - cookiejar: 2.1.4 - dev: true - optional: true - - /xml-name-validator/3.0.0: + /xml-name-validator@3.0.0: resolution: {integrity: sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==} dev: true - /xmlchars/2.2.0: + /xmlchars@2.2.0: resolution: {integrity: sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==} dev: true - /xmlhttprequest/1.8.0: + /xmlhttprequest@1.8.0: resolution: {integrity: sha512-58Im/U0mlVBLM38NdZjHyhuMtCqa61469k2YP/AaPbvCoV9aQGUpbJBj1QRm2ytRiVQBD/fsw7L2bJGDVQswBA==} engines: {node: '>=0.4.0'} dev: true - /xtend/2.0.6: + /xtend@2.0.6: resolution: {integrity: sha512-fOZg4ECOlrMl+A6Msr7EIFcON1L26mb4NY5rurSkOex/TWhazOrg6eXD/B0XkuiYcYhQDWLXzQxLMVJ7LXwokg==} engines: {node: '>=0.4'} dependencies: @@ -20772,65 +21103,65 @@ packages: object-keys: 0.2.0 dev: true - /xtend/2.1.2: + /xtend@2.1.2: resolution: {integrity: sha512-vMNKzr2rHP9Dp/e1NQFnLQlwlhp9L/LfvnsVdHxN1f+uggyVI3i08uD14GPvCToPkdsRfyPqIyYGmIk58V98ZQ==} engines: {node: '>=0.4'} dependencies: object-keys: 0.4.0 dev: true - /xtend/2.2.0: + /xtend@2.2.0: resolution: {integrity: sha512-SLt5uylT+4aoXxXuwtQp5ZnMMzhDb1Xkg4pEqc00WUJCQifPfV9Ub1VrNhp9kXkrjZD2I2Hl8WnjP37jzZLPZw==} engines: {node: '>=0.4'} dev: true - /xtend/3.0.0: + /xtend@3.0.0: resolution: {integrity: sha512-sp/sT9OALMjRW1fKDlPeuSZlDQpkqReA0pyJukniWbTGoEKefHxhGJynE3PNhUMlcM8qWIjPwecwCw4LArS5Eg==} engines: {node: '>=0.4'} dev: true - /xtend/4.0.2: + /xtend@4.0.2: resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} engines: {node: '>=0.4'} - /y18n/3.2.2: + /y18n@3.2.2: resolution: {integrity: sha512-uGZHXkHnhF0XeeAPgnKfPv1bgKAYyVvmNL1xlKsPYZPaIHxGti2hHqvOCQv71XMsLxu1QjergkqogUnms5D3YQ==} dev: true - /y18n/4.0.3: + /y18n@4.0.3: resolution: {integrity: sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==} - /y18n/5.0.8: + /y18n@5.0.8: resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} engines: {node: '>=10'} - /yaeti/0.0.6: + /yaeti@0.0.6: resolution: {integrity: sha512-MvQa//+KcZCUkBTIC9blM+CU9J2GzuTytsOUwf2lidtvkx/6gnEp1QvJv34t9vdjhFmha/mUiNDbN0D0mJWdug==} engines: {node: '>=0.10.32'} dev: true - /yallist/2.1.2: + /yallist@2.1.2: resolution: {integrity: sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==} - /yallist/3.1.1: + /yallist@3.1.1: resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} dev: true - /yallist/4.0.0: + /yallist@4.0.0: resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} - /yaml/1.10.2: + /yaml@1.10.2: resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==} engines: {node: '>= 6'} dev: true - /yargs-parser/13.1.2: + /yargs-parser@13.1.2: resolution: {integrity: sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==} dependencies: camelcase: 5.3.1 decamelize: 1.2.0 - /yargs-parser/18.1.3: + /yargs-parser@18.1.3: resolution: {integrity: sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==} engines: {node: '>=6'} dependencies: @@ -20838,23 +21169,23 @@ packages: decamelize: 1.2.0 dev: true - /yargs-parser/2.4.1: + /yargs-parser@2.4.1: resolution: {integrity: sha512-9pIKIJhnI5tonzG6OnCFlz/yln8xHYcGl+pn3xR0Vzff0vzN1PbNRaelgfgRUwZ3s4i3jvxT9WhmUGL4whnasA==} dependencies: camelcase: 3.0.0 lodash.assign: 4.2.0 dev: true - /yargs-parser/20.2.4: + /yargs-parser@20.2.4: resolution: {integrity: sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==} engines: {node: '>=10'} dev: true - /yargs-parser/21.1.1: + /yargs-parser@21.1.1: resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} engines: {node: '>=12'} - /yargs-unparser/1.6.0: + /yargs-unparser@1.6.0: resolution: {integrity: sha512-W9tKgmSn0DpSatfri0nx52Joq5hVXgeLiqR/5G0sZNDoLZFOr/xjBUDcShCOGNsBnEMNo1KAMBkTej1Hm62HTw==} engines: {node: '>=6'} dependencies: @@ -20863,7 +21194,7 @@ packages: yargs: 13.3.2 dev: true - /yargs-unparser/2.0.0: + /yargs-unparser@2.0.0: resolution: {integrity: sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==} engines: {node: '>=10'} dependencies: @@ -20873,7 +21204,7 @@ packages: is-plain-obj: 2.1.0 dev: true - /yargs/13.3.2: + /yargs@13.3.2: resolution: {integrity: sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==} dependencies: cliui: 5.0.0 @@ -20887,7 +21218,7 @@ packages: y18n: 4.0.3 yargs-parser: 13.1.2 - /yargs/15.4.1: + /yargs@15.4.1: resolution: {integrity: sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==} engines: {node: '>=8'} dependencies: @@ -20904,7 +21235,7 @@ packages: yargs-parser: 18.1.3 dev: true - /yargs/16.2.0: + /yargs@16.2.0: resolution: {integrity: sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==} engines: {node: '>=10'} dependencies: @@ -20917,7 +21248,7 @@ packages: yargs-parser: 20.2.4 dev: true - /yargs/17.6.2: + /yargs@17.6.2: resolution: {integrity: sha512-1/9UrdHjDZc0eOU0HxOHoS78C69UD3JRMvzlJ7S79S2nTaWRA/whGCTV8o9e/N/1Va9YIV7Q4sOxD8VV4pCWOw==} engines: {node: '>=12'} dependencies: @@ -20930,7 +21261,7 @@ packages: yargs-parser: 21.1.1 dev: true - /yargs/17.7.1: + /yargs@17.7.1: resolution: {integrity: sha512-cwiTb08Xuv5fqF4AovYacTFNxk62th7LKJ6BL9IGUpTJrWoU7/7WdQGTP2SjKf1dUNBGzDd28p/Yfs/GI6JrLw==} engines: {node: '>=12'} dependencies: @@ -20943,7 +21274,7 @@ packages: yargs-parser: 21.1.1 dev: false - /yargs/4.8.1: + /yargs@4.8.1: resolution: {integrity: sha512-LqodLrnIDM3IFT+Hf/5sxBnEGECrfdC1uIbgZeJmESCSo4HoCAaKEus8MylXHAkdacGc0ye+Qa+dpkuom8uVYA==} dependencies: cliui: 3.2.0 @@ -20962,20 +21293,20 @@ packages: yargs-parser: 2.4.1 dev: true - /yn/3.1.1: + /yn@3.1.1: resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==} engines: {node: '>=6'} dev: true - /yocto-queue/0.1.0: + /yocto-queue@0.1.0: resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} engines: {node: '>=10'} - /zod/3.21.4: + /zod@3.21.4: resolution: {integrity: sha512-m46AKbrzKVzOzs/DZgVnG5H55N1sv1M8qZU3A8RIKbs3mrACDNeIOeilDymVb2HdmP8uwshOCF4uJ8uM9rCqJw==} dev: false - /zustand/4.1.4: + /zustand@4.1.4(react@18.2.0): resolution: {integrity: sha512-k2jVOlWo8p4R83mQ+/uyB8ILPO2PCJOf+QVjcL+1PbMCk1w5OoPYpAIxy9zd93FSfmJqoH6lGdwzzjwqJIRU5A==} engines: {node: '>=12.7.0'} peerDependencies: @@ -20987,10 +21318,11 @@ packages: react: optional: true dependencies: - use-sync-external-store: 1.2.0 + react: 18.2.0 + use-sync-external-store: 1.2.0(react@18.2.0) dev: false - /zwitch/2.0.4: + /zwitch@2.0.4: resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==} dev: false @@ -21002,7 +21334,7 @@ packages: bn.js: 4.12.0 ethereumjs-util: 6.2.1 - github.com/taikoxyz/solidity-coverage/ceb49fd1f6041e4fcd26079dfb0d3b0f58c812e5_hardhat@2.13.0: + github.com/taikoxyz/solidity-coverage/ceb49fd1f6041e4fcd26079dfb0d3b0f58c812e5(hardhat@2.13.0): resolution: {tarball: https://codeload.github.com/taikoxyz/solidity-coverage/tar.gz/ceb49fd1f6041e4fcd26079dfb0d3b0f58c812e5} id: github.com/taikoxyz/solidity-coverage/ceb49fd1f6041e4fcd26079dfb0d3b0f58c812e5 name: solidity-coverage @@ -21021,7 +21353,7 @@ packages: ghost-testrpc: 0.0.2 global-modules: 2.0.0 globby: 10.0.2 - hardhat: 2.13.0_6qtx7vkbdhwvdm4crzlegk4mvi + hardhat: 2.13.0(ts-node@10.9.1)(typescript@4.9.5) jsonschema: 1.4.1 lodash: 4.17.21 mocha: 7.1.2 From b467befff61fdf4d456ac44fccbed51c4d58355d Mon Sep 17 00:00:00 2001 From: Daniel Wang <99078276+dantaik@users.noreply.github.com> Date: Wed, 5 Apr 2023 13:24:27 +0800 Subject: [PATCH 19/47] feat(protocol): enable EIP-1559 for L2 (#13501) --- .../protocol/contracts/L1/TaikoConfig.sol | 2 - packages/protocol/contracts/L1/TaikoData.sol | 15 +- .../protocol/contracts/L1/TaikoErrors.sol | 6 +- packages/protocol/contracts/L1/TaikoL1.sol | 25 ++- .../contracts/L1/libs/LibProposing.sol | 15 +- .../protocol/contracts/L1/libs/LibProving.sol | 29 +-- ...{LibL1Tokenomics.sol => LibTokenomics.sol} | 105 +++++------ .../protocol/contracts/L1/libs/LibUtils.sol | 45 +++-- .../contracts/L1/libs/LibVerifying.sol | 9 +- packages/protocol/contracts/L2/TaikoL2.sol | 158 +++++++++++++--- .../protocol/contracts/libs/Lib1559Math.sol | 104 +++++------ .../contracts/test/L1/TestTaikoL1.sol | 1 - .../test/L1/TestTaikoL1EnableTokenomics.sol | 1 - .../contracts/test/libs/TestLib1559Math.sol | 39 ---- .../thirdparty/LibFixedPointMath.sol | 73 ++++++++ packages/protocol/docs/L2EIP1559.md | 35 ++++ packages/protocol/foundry.toml | 7 +- packages/protocol/package.json | 2 +- packages/protocol/script/DeployOnL1.s.sol | 7 +- packages/protocol/script/deploy_on_l1.sh | 24 +++ .../protocol/test/tokenomics/blockFee.test.ts | 16 -- packages/protocol/test/utils/onNewL2Block.ts | 4 +- packages/protocol/test2/GasComparison.t.sol | 145 +++++++++------ packages/protocol/test2/Lib1559Math.sol | 96 ++++++++++ .../protocol/test2/LibFixedPointMath.t.sol | 57 ++++++ ...L1Tokenomics.t.sol => LibTokenomics.t.sol} | 109 ++++++------ packages/protocol/test2/TaikoL1.t.sol | 4 +- ...koL1TestBase.sol => TaikoL1TestBase.t.sol} | 16 +- packages/protocol/test2/TaikoL2.t.sol | 168 ++++++++++++++++-- .../contract-documentation/L1/TaikoData.md | 12 +- .../contract-documentation/L1/TaikoErrors.md | 26 ++- .../contract-documentation/L1/TaikoL1.md | 12 +- .../contract-documentation/L2/TaikoL2.md | 105 +++++++++-- 33 files changed, 1068 insertions(+), 404 deletions(-) rename packages/protocol/contracts/L1/libs/{LibL1Tokenomics.sol => LibTokenomics.sol} (54%) delete mode 100644 packages/protocol/contracts/test/libs/TestLib1559Math.sol create mode 100644 packages/protocol/contracts/thirdparty/LibFixedPointMath.sol create mode 100644 packages/protocol/docs/L2EIP1559.md create mode 100755 packages/protocol/script/deploy_on_l1.sh create mode 100644 packages/protocol/test2/Lib1559Math.sol create mode 100644 packages/protocol/test2/LibFixedPointMath.t.sol rename packages/protocol/test2/{LibL1Tokenomics.t.sol => LibTokenomics.t.sol} (76%) rename packages/protocol/test2/{TaikoL1TestBase.sol => TaikoL1TestBase.t.sol} (94%) diff --git a/packages/protocol/contracts/L1/TaikoConfig.sol b/packages/protocol/contracts/L1/TaikoConfig.sol index ce912aae1f0..92209a52902 100644 --- a/packages/protocol/contracts/L1/TaikoConfig.sol +++ b/packages/protocol/contracts/L1/TaikoConfig.sol @@ -37,8 +37,6 @@ library TaikoConfig { proposerDepositPctg: 25, // - 25% // Moving average factors feeBaseMAF: 1024, - bootstrapDiscountHalvingPeriod: 1 seconds, // owner:daniel - constantFeeRewardBlocks: 1024, txListCacheExpiry: 0, enableSoloProposer: false, enableOracleProver: true, diff --git a/packages/protocol/contracts/L1/TaikoData.sol b/packages/protocol/contracts/L1/TaikoData.sol index ad2d4682284..2286e5e6fbe 100644 --- a/packages/protocol/contracts/L1/TaikoData.sol +++ b/packages/protocol/contracts/L1/TaikoData.sol @@ -29,9 +29,7 @@ library TaikoData { uint256 proposerDepositPctg; // Moving average factors uint256 feeBaseMAF; - uint64 bootstrapDiscountHalvingPeriod; - uint64 constantFeeRewardBlocks; - uint64 txListCacheExpiry; + uint256 txListCacheExpiry; bool enableSoloProposer; bool enableOracleProver; bool enableTokenomics; @@ -61,18 +59,21 @@ library TaikoData { uint8 cacheTxListInfo; // non-zero = True } - // 5 slots + // 6 slots + // Changing this struct requires chaing LibUtils.hashMetadata accordingly. struct BlockMetadata { uint64 id; uint64 timestamp; uint64 l1Height; - uint32 gasLimit; + uint64 l2Basefee; bytes32 l1Hash; bytes32 mixHash; bytes32 txListHash; uint24 txListByteStart; uint24 txListByteEnd; + uint32 gasLimit; address beneficiary; + address treasure; } struct ZKProof { @@ -137,13 +138,13 @@ library TaikoData { uint64 avgBlockTime; // miliseconds uint64 __reserved3; // Changed when a block is proven/finalized - uint64 __reserved4; uint64 lastVerifiedBlockId; + uint64 __reserved4; // the proof time moving average, note that for each block, only the // first proof's time is considered. uint64 avgProofTime; // miliseconds uint64 feeBase; // Reserved - uint256[42] __gap; + uint256[43] __gap; } } diff --git a/packages/protocol/contracts/L1/TaikoErrors.sol b/packages/protocol/contracts/L1/TaikoErrors.sol index 4d0a74135b6..16b2294f272 100644 --- a/packages/protocol/contracts/L1/TaikoErrors.sol +++ b/packages/protocol/contracts/L1/TaikoErrors.sol @@ -8,14 +8,18 @@ pragma solidity ^0.8.18; abstract contract TaikoErrors { // The following custom errors must match the definitions in other V1 libraries. + error L1_1559_X_SCALE_TOO_LARGE(); + error L1_1559_Y_SCALE_TOO_LARGE(); error L1_ALREADY_PROVEN(); error L1_BLOCK_ID(); error L1_CONTRACT_NOT_ALLOWED(); - error L1_EVIDENCE_MISMATCH(); + error L1_EVIDENCE_MISMATCH(bytes32 expected, bytes32 actual); error L1_FORK_CHOICE_NOT_FOUND(); + error L1_INSUFFICIENT_ETHER(); error L1_INSUFFICIENT_TOKEN(); error L1_INVALID_CONFIG(); error L1_INVALID_EVIDENCE(); + error L1_INVALID_L21559_PARAMS(); error L1_INVALID_METADATA(); error L1_INVALID_PARAM(); error L1_INVALID_PROOF(); diff --git a/packages/protocol/contracts/L1/TaikoL1.sol b/packages/protocol/contracts/L1/TaikoL1.sol index 2330511a38b..bdf8d9f2da9 100644 --- a/packages/protocol/contracts/L1/TaikoL1.sol +++ b/packages/protocol/contracts/L1/TaikoL1.sol @@ -9,7 +9,7 @@ pragma solidity ^0.8.18; import {AddressResolver} from "../common/AddressResolver.sol"; import {EssentialContract} from "../common/EssentialContract.sol"; import {IXchainSync} from "../common/IXchainSync.sol"; -import {LibL1Tokenomics} from "./libs/LibVerifying.sol"; +import {LibTokenomics} from "./libs/LibTokenomics.sol"; import {LibProposing} from "./libs/LibProposing.sol"; import {LibProving} from "./libs/LibProving.sol"; import {LibUtils} from "./libs/LibUtils.sol"; @@ -25,17 +25,24 @@ contract TaikoL1 is EssentialContract, IXchainSync, TaikoEvents, TaikoErrors { TaikoData.State public state; uint256[100] private __gap; + /** + * Initialize the rollup. + * + * @param _addressManager The AddressManager address. + * @param _feeBase The initial value of the proposer-fee/prover-reward feeBase. + * @param _genesisBlockHash The block hash of the genesis block. + */ function init( address _addressManager, - bytes32 _genesisBlockHash, - uint64 _feeBase + uint64 _feeBase, + bytes32 _genesisBlockHash ) external initializer { EssentialContract._init(_addressManager); LibVerifying.init({ state: state, config: getConfig(), - genesisBlockHash: _genesisBlockHash, - feeBase: _feeBase + feeBase: _feeBase, + genesisBlockHash: _genesisBlockHash }); } @@ -115,11 +122,11 @@ contract TaikoL1 is EssentialContract, IXchainSync, TaikoEvents, TaikoErrors { } function deposit(uint256 amount) external nonReentrant { - LibL1Tokenomics.deposit(state, AddressResolver(this), amount); + LibTokenomics.deposit(state, AddressResolver(this), amount); } function withdraw(uint256 amount) external nonReentrant { - LibL1Tokenomics.withdraw(state, AddressResolver(this), amount); + LibTokenomics.withdraw(state, AddressResolver(this), amount); } function getBalance(address addr) public view returns (uint256) { @@ -131,7 +138,7 @@ contract TaikoL1 is EssentialContract, IXchainSync, TaikoEvents, TaikoErrors { view returns (uint256 feeAmount, uint256 depositAmount) { - (, feeAmount, depositAmount) = LibL1Tokenomics.getBlockFee( + (, feeAmount, depositAmount) = LibTokenomics.getBlockFee( state, getConfig() ); @@ -141,7 +148,7 @@ contract TaikoL1 is EssentialContract, IXchainSync, TaikoEvents, TaikoErrors { uint64 provenAt, uint64 proposedAt ) public view returns (uint256 reward) { - (, reward, ) = LibL1Tokenomics.getProofReward({ + (, reward, ) = LibTokenomics.getProofReward({ state: state, config: getConfig(), provenAt: provenAt, diff --git a/packages/protocol/contracts/L1/libs/LibProposing.sol b/packages/protocol/contracts/L1/libs/LibProposing.sol index d9ac44a22cf..8dd15c47278 100644 --- a/packages/protocol/contracts/L1/libs/LibProposing.sol +++ b/packages/protocol/contracts/L1/libs/LibProposing.sol @@ -7,7 +7,8 @@ pragma solidity ^0.8.18; import {AddressResolver} from "../../common/AddressResolver.sol"; -import {LibL1Tokenomics} from "./LibL1Tokenomics.sol"; +import {LibAddress} from "../../libs/LibAddress.sol"; +import {LibTokenomics} from "./LibTokenomics.sol"; import {LibUtils} from "./LibUtils.sol"; import { SafeCastUpgradeable @@ -16,6 +17,8 @@ import {TaikoData} from "../TaikoData.sol"; library LibProposing { using SafeCastUpgradeable for uint256; + using LibAddress for address; + using LibAddress for address payable; using LibUtils for TaikoData.State; event BlockProposed( @@ -25,6 +28,7 @@ library LibProposing { ); error L1_BLOCK_ID(); + error L1_INSUFFICIENT_ETHER(); error L1_INSUFFICIENT_TOKEN(); error L1_INVALID_METADATA(); error L1_NOT_SOLO_PROPOSER(); @@ -66,13 +70,15 @@ library LibProposing { id: state.numBlocks, timestamp: uint64(block.timestamp), l1Height: uint64(block.number - 1), - gasLimit: input.gasLimit, + l2Basefee: 0, // will be set later l1Hash: blockhash(block.number - 1), mixHash: bytes32(block.prevrandao * state.numBlocks), txListHash: input.txListHash, txListByteStart: input.txListByteStart, txListByteEnd: input.txListByteEnd, - beneficiary: input.beneficiary + gasLimit: input.gasLimit, + beneficiary: input.beneficiary, + treasure: resolver.resolve(config.chainId, "treasure", false) }); } @@ -89,7 +95,7 @@ library LibProposing { blk.proposer = msg.sender; if (config.enableTokenomics) { - (uint256 newFeeBase, uint256 fee, uint256 deposit) = LibL1Tokenomics + (uint256 newFeeBase, uint256 fee, uint64 deposit) = LibTokenomics .getBlockFee(state, config); uint256 burnAmount = fee + deposit; @@ -155,6 +161,7 @@ library LibProposing { if ( input.beneficiary == address(0) || + input.gasLimit == 0 || input.gasLimit > config.blockMaxGasLimit ) revert L1_INVALID_METADATA(); diff --git a/packages/protocol/contracts/L1/libs/LibProving.sol b/packages/protocol/contracts/L1/libs/LibProving.sol index 23810f362c9..e86c2140900 100644 --- a/packages/protocol/contracts/L1/libs/LibProving.sol +++ b/packages/protocol/contracts/L1/libs/LibProving.sol @@ -7,7 +7,7 @@ pragma solidity ^0.8.18; import {AddressResolver} from "../../common/AddressResolver.sol"; -import {LibL1Tokenomics} from "./LibL1Tokenomics.sol"; +import {LibTokenomics} from "./LibTokenomics.sol"; import {LibUtils} from "./LibUtils.sol"; import {TaikoData} from "../../L1/TaikoData.sol"; @@ -33,7 +33,7 @@ library LibProving { error L1_ALREADY_PROVEN(); error L1_BLOCK_ID(); - error L1_EVIDENCE_MISMATCH(); + error L1_EVIDENCE_MISMATCH(bytes32 expected, bytes32 actual); error L1_FORK_CHOICE_NOT_FOUND(); error L1_INVALID_PROOF(); error L1_INVALID_EVIDENCE(); @@ -68,8 +68,9 @@ library LibProving { meta.id % config.ringBufferSize ]; - if (blk.metaHash != LibUtils.hashMetadata(meta)) - revert L1_EVIDENCE_MISMATCH(); + bytes32 _metaHash = LibUtils.hashMetadata(meta); + if (blk.metaHash != _metaHash) + revert L1_EVIDENCE_MISMATCH(blk.metaHash, _metaHash); TaikoData.ForkChoice storage fc; bool oracleProving; @@ -144,16 +145,16 @@ library LibProving { false ); - bytes32[9] memory inputs; - inputs[0] = bytes32(uint256(uint160(l1SignalService))); - inputs[1] = bytes32(uint256(uint160(l2SignalService))); - inputs[2] = bytes32(uint256(uint160(taikoL2))); - inputs[3] = evidence.parentHash; - inputs[4] = evidence.blockHash; - inputs[5] = evidence.signalRoot; - inputs[6] = evidence.graffiti; - inputs[7] = bytes32(uint256(uint160(evidence.prover))); - inputs[8] = blk.metaHash; + uint256[9] memory inputs; + inputs[0] = uint160(l1SignalService); + inputs[1] = uint160(l2SignalService); + inputs[2] = uint160(taikoL2); + inputs[3] = uint256(evidence.parentHash); + inputs[4] = uint256(evidence.blockHash); + inputs[5] = uint256(evidence.signalRoot); + inputs[6] = uint256(evidence.graffiti); + inputs[7] = uint160(evidence.prover); + inputs[8] = uint256(blk.metaHash); assembly { instance := keccak256(inputs, mul(32, 9)) diff --git a/packages/protocol/contracts/L1/libs/LibL1Tokenomics.sol b/packages/protocol/contracts/L1/libs/LibTokenomics.sol similarity index 54% rename from packages/protocol/contracts/L1/libs/LibL1Tokenomics.sol rename to packages/protocol/contracts/L1/libs/LibTokenomics.sol index 41342081682..2e034569d39 100644 --- a/packages/protocol/contracts/L1/libs/LibL1Tokenomics.sol +++ b/packages/protocol/contracts/L1/libs/LibTokenomics.sol @@ -14,9 +14,8 @@ import { import {TaikoData} from "../TaikoData.sol"; import {TaikoToken} from "../TaikoToken.sol"; -library LibL1Tokenomics { +library LibTokenomics { using LibMath for uint256; - uint256 private constant TWEI_TO_WEI = 1E12; error L1_INSUFFICIENT_TOKEN(); error L1_INVALID_PARAM(); @@ -59,39 +58,24 @@ library LibL1Tokenomics { ) internal view - returns (uint256 newFeeBase, uint256 fee, uint256 depositAmount) + returns (uint64 newFeeBase, uint64 fee, uint64 depositAmount) { - if (state.numBlocks <= config.constantFeeRewardBlocks) { - fee = state.feeBase; - newFeeBase = state.feeBase; - } else { - (newFeeBase, ) = getTimeAdjustedFee({ - feeConfig: config.proposingConfig, - feeBase: state.feeBase, - isProposal: true, - timeUsed: block.timestamp - state.lastProposedAt, - timeAverage: state.avgBlockTime - }); - fee = getSlotsAdjustedFee({ - state: state, - config: config, - isProposal: true, - feeBase: newFeeBase - }); - } - - if (config.bootstrapDiscountHalvingPeriod > 0) { - unchecked { - uint256 halves = uint256( - block.timestamp - state.genesisTimestamp - ) / config.bootstrapDiscountHalvingPeriod; - uint256 gamma = 1024 - (1024 >> (1 + halves)); - fee = (fee * gamma) / 1024; - } - } + (newFeeBase, ) = getTimeAdjustedFee({ + feeConfig: config.proposingConfig, + feeBase: state.feeBase, + isProposal: true, + timeUsed: block.timestamp - state.lastProposedAt, + timeAverage: state.avgBlockTime + }); + fee = getSlotsAdjustedFee({ + state: state, + config: config, + isProposal: true, + feeBase: newFeeBase + }); unchecked { - depositAmount = (fee * config.proposerDepositPctg) / 100; + depositAmount = uint64((config.proposerDepositPctg * fee) / 100); } } @@ -103,31 +87,26 @@ library LibL1Tokenomics { ) internal view - returns (uint256 newFeeBase, uint256 reward, uint256 premiumRate) + returns (uint64 newFeeBase, uint64 reward, uint64 premiumRate) { if (proposedAt > provenAt) revert L1_INVALID_PARAM(); - if (state.lastVerifiedBlockId <= config.constantFeeRewardBlocks) { - reward = state.feeBase; - newFeeBase = state.feeBase; - // premiumRate = 0; - } else { - (newFeeBase, premiumRate) = getTimeAdjustedFee({ - feeConfig: config.provingConfig, - feeBase: state.feeBase, - isProposal: false, - timeUsed: provenAt - proposedAt, - timeAverage: state.avgProofTime - }); - reward = getSlotsAdjustedFee({ - state: state, - config: config, - isProposal: false, - feeBase: newFeeBase - }); - } + (newFeeBase, premiumRate) = getTimeAdjustedFee({ + feeConfig: config.provingConfig, + feeBase: state.feeBase, + isProposal: false, + timeUsed: provenAt - proposedAt, + timeAverage: state.avgProofTime + }); + reward = getSlotsAdjustedFee({ + state: state, + config: config, + isProposal: false, + feeBase: newFeeBase + }); + unchecked { - reward = (reward * (10000 - config.rewardBurnBips)) / 10000; + reward = uint64((reward * (10000 - config.rewardBurnBips)) / 10000); } } @@ -136,8 +115,8 @@ library LibL1Tokenomics { TaikoData.State storage state, TaikoData.Config memory config, bool isProposal, - uint256 feeBase - ) internal view returns (uint256) { + uint64 feeBase + ) internal view returns (uint64) { unchecked { // m is the `n'` in the whitepaper uint256 m = 1000 * @@ -148,32 +127,32 @@ library LibL1Tokenomics { (state.numBlocks - state.lastVerifiedBlockId - 1); // k is `m − n + 1` or `m − n - 1`in the whitepaper uint256 k = isProposal ? m - n - 1000 : m - n + 1000; - return (feeBase * (m - 1000) * m) / (m - n) / k; + return uint64((feeBase * (m - 1000) * m) / (m - n) / k); } } // Implement "Incentive Multipliers", see the whitepaper. function getTimeAdjustedFee( TaikoData.FeeConfig memory feeConfig, - uint256 feeBase, + uint64 feeBase, bool isProposal, uint256 timeUsed, // seconds uint256 timeAverage // milliseconds - ) internal pure returns (uint256 newFeeBase, uint256 premiumRate) { + ) internal pure returns (uint64 newFeeBase, uint64 premiumRate) { if (timeAverage == 0) { return (feeBase, 0); } unchecked { - uint p = feeConfig.dampingFactorBips; // [0-10000] - uint a = timeAverage; - uint t = (timeUsed * 1000).min(a * 2); // millisconds + uint256 p = feeConfig.dampingFactorBips; // [0-10000] + uint256 a = timeAverage; + uint256 t = (timeUsed * 1000).min(a * 2); // millisconds - newFeeBase = (feeBase * (10000 + (t * p) / a - p)) / 10000; + newFeeBase = uint64((feeBase * (10000 + (t * p) / a - p)) / 10000); if (isProposal) { newFeeBase = (feeBase * 2) - newFeeBase; } else if (p > 0) { - premiumRate = ((t.max(a) - a) * 10000) / a; + premiumRate = uint64(((t.max(a) - a) * 10000) / a); } } } diff --git a/packages/protocol/contracts/L1/libs/LibUtils.sol b/packages/protocol/contracts/L1/libs/LibUtils.sol index 38fa4eb3a2d..acc2aa2fcf5 100644 --- a/packages/protocol/contracts/L1/libs/LibUtils.sol +++ b/packages/protocol/contracts/L1/libs/LibUtils.sol @@ -7,7 +7,7 @@ pragma solidity ^0.8.18; import {LibMath} from "../../libs/LibMath.sol"; -import {LibL1Tokenomics} from "./LibL1Tokenomics.sol"; +import {LibTokenomics} from "./LibTokenomics.sol"; import { SafeCastUpgradeable } from "@openzeppelin/contracts-upgradeable/utils/math/SafeCastUpgradeable.sol"; @@ -56,23 +56,46 @@ library LibUtils { return _ma > 0 ? _ma : maValue; } + struct BlockMetadata { + uint64 id; + uint64 timestamp; + uint64 l1Height; + uint64 basefee; + bytes32 l1Hash; + bytes32 mixHash; + bytes32 txListHash; + uint24 txListByteStart; + uint24 txListByteEnd; + uint32 gasLimit; + address beneficiary; + address treasure; + } + function hashMetadata( TaikoData.BlockMetadata memory meta ) internal pure returns (bytes32 hash) { - bytes32[5] memory inputs; + uint256[6] memory inputs; + inputs[0] = - bytes32(uint256(meta.id) << 192) | - bytes32(uint256(meta.gasLimit) << 128) | - bytes32(uint256(meta.timestamp) << 64) | - bytes32(uint256(meta.l1Height)); + (uint256(meta.id) << 192) | + (uint256(meta.timestamp) << 128) | + (uint256(meta.l1Height) << 64) | + uint256(meta.l2Basefee); + + inputs[1] = uint256(meta.l1Hash); + inputs[2] = uint256(meta.mixHash); + inputs[3] = uint256(meta.txListHash); + + inputs[4] = + (uint256(meta.txListByteStart) << 232) | + (uint256(meta.txListByteEnd) << 208) | + (uint256(meta.gasLimit) << 176) | + (uint256(uint160(meta.beneficiary)) << 16); - inputs[1] = meta.l1Hash; - inputs[2] = meta.mixHash; - inputs[3] = meta.txListHash; - inputs[4] = bytes32(uint256(uint160(meta.beneficiary))); + inputs[5] = (uint256(uint160(meta.treasure)) << 96); assembly { - hash := keccak256(inputs, mul(5, 32)) + hash := keccak256(inputs, mul(6, 32)) } } } diff --git a/packages/protocol/contracts/L1/libs/LibVerifying.sol b/packages/protocol/contracts/L1/libs/LibVerifying.sol index 455b418f4fb..2678e1880d4 100644 --- a/packages/protocol/contracts/L1/libs/LibVerifying.sol +++ b/packages/protocol/contracts/L1/libs/LibVerifying.sol @@ -7,7 +7,7 @@ pragma solidity ^0.8.18; import {AddressResolver} from "../../common/AddressResolver.sol"; -import {LibL1Tokenomics} from "./LibL1Tokenomics.sol"; +import {LibTokenomics} from "./LibTokenomics.sol"; import {LibUtils} from "./LibUtils.sol"; import { SafeCastUpgradeable @@ -19,6 +19,7 @@ library LibVerifying { using LibUtils for TaikoData.State; error L1_INVALID_CONFIG(); + error L1_INVALID_L21559_PARAMS(); event BlockVerified(uint256 indexed id, bytes32 blockHash); event XchainSynced( @@ -30,8 +31,8 @@ library LibVerifying { function init( TaikoData.State storage state, TaikoData.Config memory config, - bytes32 genesisBlockHash, - uint64 feeBase + uint64 feeBase, + bytes32 genesisBlockHash ) internal { _checkConfig(config); @@ -120,7 +121,7 @@ library LibVerifying { uint256 newFeeBase, uint256 amount, uint256 premiumRate - ) = LibL1Tokenomics.getProofReward({ + ) = LibTokenomics.getProofReward({ state: state, config: config, provenAt: fc.provenAt, diff --git a/packages/protocol/contracts/L2/TaikoL2.sol b/packages/protocol/contracts/L2/TaikoL2.sol index 790de867db3..8c13c383310 100644 --- a/packages/protocol/contracts/L2/TaikoL2.sol +++ b/packages/protocol/contracts/L2/TaikoL2.sol @@ -8,13 +8,32 @@ pragma solidity ^0.8.18; import {EssentialContract} from "../common/EssentialContract.sol"; import {IXchainSync} from "../common/IXchainSync.sol"; +import {LibMath} from "../libs/LibMath.sol"; +import {Lib1559Math} from "../libs/Lib1559Math.sol"; import {TaikoL2Signer} from "./TaikoL2Signer.sol"; +import { + SafeCastUpgradeable +} from "@openzeppelin/contracts-upgradeable/utils/math/SafeCastUpgradeable.sol"; contract TaikoL2 is EssentialContract, TaikoL2Signer, IXchainSync { + using SafeCastUpgradeable for uint256; + using LibMath for uint256; + + // TODO(david): need you to confirm this value. + uint64 public ANCHOR_GAS_COST = 47000; + struct VerifiedBlock { bytes32 blockHash; bytes32 signalRoot; } + + struct EIP1559Params { + uint64 basefee; + uint64 gasIssuedPerSecond; + uint64 gasExcessMax; + uint64 gasTarget; + uint64 ratio2x1x; + } /********************** * State Variables * **********************/ @@ -28,10 +47,16 @@ contract TaikoL2 is EssentialContract, TaikoL2Signer, IXchainSync { // A hash to check te integrity of public inputs. bytes32 public publicInputHash; - // The latest L1 block where a L2 block has been proposed. - uint256 public latestSyncedL1Height; + uint128 public yscale; + uint64 public xscale; + uint64 public gasIssuedPerSecond; + + uint64 public parentTimestamp; + uint64 public latestSyncedL1Height; + uint64 public gasExcess; + uint64 public __reserved1; - uint256[46] private __gap; + uint256[45] private __gap; /********************** * Events and Errors * @@ -40,29 +65,65 @@ contract TaikoL2 is EssentialContract, TaikoL2Signer, IXchainSync { // Captures all block variables mentioned in // https://docs.soliditylang.org/en/v0.8.18/units-and-global-variables.html event BlockVars( - uint256 number, + uint64 number, + uint64 basefee, + uint64 gaslimit, + uint64 timestamp, bytes32 parentHash, - uint256 timestamp, - uint256 basefee, uint256 prevrandao, address coinbase, - uint256 gaslimit, - uint256 chainid + uint32 chainid ); + error L2_BASEFEE_MISMATCH(uint64 expected, uint64 actual); + error L2_INVALID_1559_PARAMS(); error L2_INVALID_CHAIN_ID(); error L2_INVALID_SENDER(); - error L2_PUBLIC_INPUT_HASH_MISMATCH(); + error L2_PUBLIC_INPUT_HASH_MISMATCH(bytes32 expected, bytes32 actual); error L2_TOO_LATE(); + error M1559_UNEXPECTED_CHANGE(uint64 expected, uint64 actual); + error M1559_OUT_OF_STOCK(); + /********************** * Constructor * **********************/ - function init(address _addressManager) external initializer { - if (block.chainid <= 1) revert L2_INVALID_CHAIN_ID(); + function init( + address _addressManager, + EIP1559Params calldata _param1559 + ) external initializer { + if (block.chainid <= 1 || block.chainid >= type(uint32).max) + revert L2_INVALID_CHAIN_ID(); if (block.number > 1) revert L2_TOO_LATE(); + if (_param1559.gasIssuedPerSecond != 0) { + if ( + _param1559.basefee == 0 || + _param1559.gasExcessMax == 0 || + _param1559.gasTarget == 0 || + _param1559.ratio2x1x == 0 + ) revert L2_INVALID_1559_PARAMS(); + + uint128 _xscale; + (_xscale, yscale) = Lib1559Math.calculateScales({ + xExcessMax: _param1559.gasExcessMax, + price: _param1559.basefee, + target: _param1559.gasTarget, + ratio2x1x: _param1559.ratio2x1x + }); + + if (_xscale == 0 || _xscale >= type(uint64).max || yscale == 0) + revert L2_INVALID_1559_PARAMS(); + xscale = uint64(_xscale); + + // basefee = _param1559.basefee; + gasIssuedPerSecond = _param1559.gasIssuedPerSecond; + gasExcess = _param1559.gasExcessMax / 2; + } + + parentTimestamp = uint64(block.timestamp); + EssentialContract._init(_addressManager); (publicInputHash, ) = _calcPublicInputHash(block.number); @@ -89,15 +150,17 @@ contract TaikoL2 is EssentialContract, TaikoL2Signer, IXchainSync { * * This transaction shall be the first transaction in every L2 block. * - * @param l1Height The latest L1 block height when this block was proposed. * @param l1Hash The latest L1 block hash when this block was proposed. * @param l1SignalRoot The latest value of the L1 "signal service storage root". + * @param l1Height The latest L1 block height when this block was proposed. + * @param parentGasUsed the gas used in the parent block. */ function anchor( - uint256 l1Height, bytes32 l1Hash, - bytes32 l1SignalRoot + bytes32 l1SignalRoot, + uint64 l1Height, + uint64 parentGasUsed ) external { if (msg.sender != GOLDEN_TOUCH_ADDRESS) revert L2_INVALID_SENDER(); @@ -107,11 +170,10 @@ contract TaikoL2 is EssentialContract, TaikoL2Signer, IXchainSync { (bytes32 prevPIH, bytes32 currPIH) = _calcPublicInputHash(parentHeight); if (publicInputHash != prevPIH) { - revert L2_PUBLIC_INPUT_HASH_MISMATCH(); + revert L2_PUBLIC_INPUT_HASH_MISMATCH(publicInputHash, prevPIH); } // replace the oldest block hash with the parent's blockhash - publicInputHash = currPIH; _l2Hashes[parentHeight] = parentHash; @@ -120,18 +182,34 @@ contract TaikoL2 is EssentialContract, TaikoL2Signer, IXchainSync { emit XchainSynced(l1Height, l1Hash, l1SignalRoot); + // Check EIP-1559 basefee + uint64 basefee; + if (gasIssuedPerSecond != 0) { + (basefee, gasExcess) = _calcBasefee( + block.timestamp - parentTimestamp, + uint64(block.gaslimit), + parentGasUsed + ); + } + + if (block.basefee != basefee) + revert L2_BASEFEE_MISMATCH(basefee, uint64(block.basefee)); + + parentTimestamp = uint64(block.timestamp); + // We emit this event so circuits can grab its data to verify block variables. // If plonk lookup table already has all these data, we can still use this // event for debugging purpose. + emit BlockVars({ - number: block.number, + number: uint64(block.number), + basefee: basefee, + gaslimit: uint64(block.gaslimit), + timestamp: uint64(block.timestamp), parentHash: parentHash, - timestamp: block.timestamp, - basefee: 0, //block.basefee, prevrandao: block.prevrandao, coinbase: block.coinbase, - gaslimit: block.gaslimit, - chainid: block.chainid + chainid: uint32(block.chainid) }); } @@ -139,6 +217,18 @@ contract TaikoL2 is EssentialContract, TaikoL2Signer, IXchainSync { * Public Functions * **********************/ + function getBasefee( + uint32 timeSinceNow, + uint64 gasLimit, + uint64 parentGasUsed + ) public view returns (uint64 _basefee) { + (_basefee, ) = _calcBasefee( + timeSinceNow + block.timestamp - parentTimestamp, + gasLimit, + parentGasUsed + ); + } + function getXchainBlockHash( uint256 number ) public view override returns (bytes32) { @@ -181,7 +271,6 @@ contract TaikoL2 is EssentialContract, TaikoL2Signer, IXchainSync { } inputs[255] = bytes32(block.chainid); - // inputs[256] = bytes32(block.basefee); assembly { prevPIH := keccak256(inputs, mul(256, 32)) @@ -192,4 +281,29 @@ contract TaikoL2 is EssentialContract, TaikoL2Signer, IXchainSync { currPIH := keccak256(inputs, mul(256, 32)) } } + + function _calcBasefee( + uint256 timeSinceParent, + uint64 gasLimit, + uint64 parentGasUsed + ) private view returns (uint64 _basefee, uint64 _gasExcess) { + // Very important to cap _gasExcess uint64 + uint64 parentGasUsedNet = parentGasUsed > ANCHOR_GAS_COST + ? parentGasUsed - ANCHOR_GAS_COST + : 0; + + uint256 a = uint256(gasExcess) + parentGasUsedNet; + uint256 b = gasIssuedPerSecond * timeSinceParent; + _gasExcess = uint64((a.max(b) - b).min(type(uint64).max)); + + uint256 __basefee = Lib1559Math.calculatePrice({ + xscale: xscale, + yscale: yscale, + xExcess: _gasExcess, + xPurchase: gasLimit + }); + + // Very important to cap basefee uint64 + _basefee = uint64(__basefee.min(type(uint64).max)); + } } diff --git a/packages/protocol/contracts/libs/Lib1559Math.sol b/packages/protocol/contracts/libs/Lib1559Math.sol index c86196d9e83..7d3a3b26215 100644 --- a/packages/protocol/contracts/libs/Lib1559Math.sol +++ b/packages/protocol/contracts/libs/Lib1559Math.sol @@ -6,68 +6,60 @@ pragma solidity ^0.8.18; -/** - * @notice This library offers two functions for EIP-1559-style math. - * See more at https://dankradfeist.de/ethereum/2022/03/16/exponential-eip1559.html - */ +import {LibFixedPointMath} from "../thirdparty/LibFixedPointMath.sol"; +import { + SafeCastUpgradeable +} from "@openzeppelin/contracts-upgradeable/utils/math/SafeCastUpgradeable.sol"; + library Lib1559Math { - /** - * @notice Calculates and returns the next round's target value using the equation below: - * - * `nextTarget = prevTarget * ((A-1) * T + prevMeasured / (A * T)` - * which implies if `prevMeasured` is larger than `T`, `nextTarget` will - * become larger than `prevTarget`. - * - * @param prevTarget The previous round's target value. - * @param prevMeasured The previous round's measured value. It must be in the same unit as `T`. - * @param t The base target value. It must be in the same unit as `prevMeasured`. - * @param a The adjustment factor. Bigger values change the next round's target more slowly. - * @return nextTarget The next round's target value. - */ - function adjustTarget( - uint256 prevTarget, - uint256 prevMeasured, - uint256 t, - uint256 a - ) internal pure returns (uint256 nextTarget) { - assert(prevTarget != 0 && t != 0 && a > 1); + using SafeCastUpgradeable for uint256; - uint256 x = prevTarget * ((a - 1) * t + prevMeasured); - uint256 y = a * t; - nextTarget = x / y; + error M1559_UNEXPECTED_CHANGE(uint64 expected, uint64 actual); + error M1559_OUT_OF_STOCK(); - if (nextTarget == 0) { - nextTarget = prevTarget; - } - } + function calculateScales( + uint64 xExcessMax, + uint64 price, + uint64 target, + uint64 ratio2x1x + ) internal pure returns (uint128 xscale, uint128 yscale) { + assert(xExcessMax != 0); + uint64 x = xExcessMax / 2; + + // calculate xscale + xscale = LibFixedPointMath.MAX_EXP_INPUT / xExcessMax; - /** - * @notice Calculates and returns the next round's target value using the equation below: - * - * `nextTarget = prevTarget * A * T / ((A-1) * T + prevMeasured)` - * which implies if `prevMeasured` is larger than `T`, `nextTarget` will - * become smaller than `prevTarget`. - * - * @param prevTarget The previous round's target value. - * @param prevMeasured The previous round's measured value. It must be in the same unit as `T`. - * @param t The base target value. It must be in the same unit as `prevMeasured`. - * @param a The adjustment factor. Bigger values change the next round's target more slowly. - * @return nextTarget The next round's target value. - */ - function adjustTargetReverse( - uint256 prevTarget, - uint256 prevMeasured, - uint256 t, - uint256 a - ) internal pure returns (uint256 nextTarget) { - assert(prevTarget != 0 && t != 0 && a > 1); + // calculate yscale + yscale = calculatePrice(xscale, price, x, target).toUint128(); - uint256 x = prevTarget * a * t; - uint256 y = (a - 1) * t + prevMeasured; - nextTarget = x / y; + // Verify the gas price ratio between two blocks, one has + // 2*target gas and the other one has target gas. + uint256 price1x = calculatePrice(xscale, yscale, x, target); + uint256 price2x = calculatePrice(xscale, yscale, x, target * 2); + uint64 ratio = uint64((price2x * 100) / price1x); + + if (ratio2x1x != ratio) + revert M1559_UNEXPECTED_CHANGE(ratio2x1x, ratio); + } + + function calculatePrice( + uint128 xscale, + uint128 yscale, + uint64 xExcess, + uint64 xPurchase + ) internal pure returns (uint256) { + assert(xscale != 0 && yscale != 0); + uint64 _xPurchase = xPurchase == 0 ? 1 : xPurchase; + uint256 _before = _calcY(xExcess, xscale); + uint256 _after = _calcY(xExcess + _xPurchase, xscale); + return (_after - _before) / _xPurchase / yscale; + } - if (nextTarget == 0) { - nextTarget = prevTarget; + function _calcY(uint256 x, uint128 xscale) private pure returns (uint256) { + uint256 _x = x * xscale; + if (_x >= LibFixedPointMath.MAX_EXP_INPUT) { + revert M1559_OUT_OF_STOCK(); } + return uint256(LibFixedPointMath.exp(int256(_x))); } } diff --git a/packages/protocol/contracts/test/L1/TestTaikoL1.sol b/packages/protocol/contracts/test/L1/TestTaikoL1.sol index b55e87593aa..b631fed880f 100644 --- a/packages/protocol/contracts/test/L1/TestTaikoL1.sol +++ b/packages/protocol/contracts/test/L1/TestTaikoL1.sol @@ -31,7 +31,6 @@ contract TestTaikoL1 is TaikoL1 { config.rewardBurnBips = 100; // 100 basis points or 1% config.proposerDepositPctg = 25; // 25% - config.bootstrapDiscountHalvingPeriod = 1 seconds; config.enableTokenomics = false; config.skipZKPVerification = true; config.feeBaseMAF = 1024; diff --git a/packages/protocol/contracts/test/L1/TestTaikoL1EnableTokenomics.sol b/packages/protocol/contracts/test/L1/TestTaikoL1EnableTokenomics.sol index ee6aad6679d..8d55b35a6e4 100644 --- a/packages/protocol/contracts/test/L1/TestTaikoL1EnableTokenomics.sol +++ b/packages/protocol/contracts/test/L1/TestTaikoL1EnableTokenomics.sol @@ -34,7 +34,6 @@ contract TestTaikoL1EnableTokenomics is TaikoL1 { // Moving average factors config.feeBaseMAF = 1024; - config.bootstrapDiscountHalvingPeriod = 1 seconds; config.enableTokenomics = true; config.skipZKPVerification = true; diff --git a/packages/protocol/contracts/test/libs/TestLib1559Math.sol b/packages/protocol/contracts/test/libs/TestLib1559Math.sol deleted file mode 100644 index 0bbb57b9a05..00000000000 --- a/packages/protocol/contracts/test/libs/TestLib1559Math.sol +++ /dev/null @@ -1,39 +0,0 @@ -// SPDX-License-Identifier: MIT -// _____ _ _ _ _ -// |_ _|_ _(_) |_____ | | __ _| |__ ___ -// | |/ _` | | / / _ \ | |__/ _` | '_ (_-< -// |_|\__,_|_|_\_\___/ |____\__,_|_.__/__/ - -pragma solidity ^0.8.18; - -import {Lib1559Math} from "../../libs/Lib1559Math.sol"; - -contract TestLib1559Math { - function adjustTarget( - uint256 firstTarget, - uint256 startingMeasurement, - uint256 baseTargetVal, - uint256 adjustmentFactor - ) public pure returns (uint256 nextTarget) { - nextTarget = Lib1559Math.adjustTarget( - firstTarget, - startingMeasurement, - baseTargetVal, - adjustmentFactor - ); - } - - function adjustTargetReverse( - uint256 firstTarget, - uint256 startingMeasurement, - uint256 baseTargetVal, - uint256 adjustmentFactor - ) public pure returns (uint256 nextTarget) { - nextTarget = Lib1559Math.adjustTargetReverse( - firstTarget, - startingMeasurement, - baseTargetVal, - adjustmentFactor - ); - } -} diff --git a/packages/protocol/contracts/thirdparty/LibFixedPointMath.sol b/packages/protocol/contracts/thirdparty/LibFixedPointMath.sol new file mode 100644 index 00000000000..1bae4223d96 --- /dev/null +++ b/packages/protocol/contracts/thirdparty/LibFixedPointMath.sol @@ -0,0 +1,73 @@ +// SPDX-License-Identifier: UNLICENSED +// Taken from: https://github.com/recmo/experiment-solexp/blob/main/src/FixedPointMathLib.sol +pragma solidity ^0.8.18; + +library LibFixedPointMath { + uint128 public constant MAX_EXP_INPUT = 135305999368893231588; + + error Overflow(); + + // Computes e^x in 1e18 fixed point. + function exp(int256 x) internal pure returns (int256 r) { + unchecked { + // Input x is in fixed point format, with scale factor 1/1e18. + + // When the result is < 0.5 we return zero. This happens when + // x <= floor(log(0.5e18) * 1e18) ~ -42e18 + if (x <= -42139678854452767551) { + return 0; + } + + // When the result is > (2**255 - 1) / 1e18 we can not represent it + // as an int256. This happens when x >= floor(log((2**255 -1) / 1e18) * 1e18) ~ 135. + if (x >= 135305999368893231589) revert Overflow(); + + // x is now in the range (-42, 136) * 1e18. Convert to (-42, 136) * 2**96 + // for more intermediate precision and a binary basis. This base conversion + // is a multiplication by 1e18 / 2**96 = 5**18 / 2**78. + x = (x << 78) / 5 ** 18; + + // Reduce range of x to (-½ ln 2, ½ ln 2) * 2**96 by factoring out powers of two + // such that exp(x) = exp(x') * 2**k, where k is an integer. + // Solving this gives k = round(x / log(2)) and x' = x - k * log(2). + int256 k = ((x << 96) / 54916777467707473351141471128 + 2 ** 95) >> + 96; + x = x - k * 54916777467707473351141471128; + // k is in the range [-61, 195]. + + // Evaluate using a (6, 7)-term rational approximation + // p is made monic, we will multiply by a scale factor later + int256 p = x + 2772001395605857295435445496992; + p = ((p * x) >> 96) + 44335888930127919016834873520032; + p = ((p * x) >> 96) + 398888492587501845352592340339721; + p = ((p * x) >> 96) + 1993839819670624470859228494792842; + p = p * x + (4385272521454847904632057985693276 << 96); + // We leave p in 2**192 basis so we don't need to scale it back up for the division. + // Evaluate using using Knuth's scheme from p. 491. + int256 z = x + 750530180792738023273180420736; + z = ((z * x) >> 96) + 32788456221302202726307501949080; + int256 w = x - 2218138959503481824038194425854; + w = ((w * z) >> 96) + 892943633302991980437332862907700; + int256 q = z + w - 78174809823045304726920794422040; + q = ((q * w) >> 96) + 4203224763890128580604056984195872; + assembly { + // Div in assembly because solidity adds a zero check despite the `unchecked`. + // The q polynomial is known not to have zeros in the domain. (All roots are complex) + // No scaling required because p is already 2**96 too large. + r := sdiv(p, q) + } + // r should be in the range (0.09, 0.25) * 2**96. + + // We now need to multiply r by + // * the scale factor s = ~6.031367120..., + // * the 2**k factor from the range reduction, and + // * the 1e18 / 2**96 factor for base converison. + // We do all of this at once, with an intermediate result in 2**213 basis + // so the final right shift is always by a positive amount. + r = int( + (uint(r) * 3822833074963236453042738258902158003155416615667) >> + uint256(195 - k) + ); + } + } +} diff --git a/packages/protocol/docs/L2EIP1559.md b/packages/protocol/docs/L2EIP1559.md new file mode 100644 index 00000000000..3ff6502a02c --- /dev/null +++ b/packages/protocol/docs/L2EIP1559.md @@ -0,0 +1,35 @@ +# Taiko L2 EIP-1559 + +## The overall design + +The EIP-1559 base fee per gas (basefee) on Taiko L2 is calculated by Taiko L1 protocol contracts and injected into the block's metadata. The Taiko client should skip calculating the basefee value, and stop burning the basefee, and send it to a named address ("treasure") specified in Taiko L1 protocol contracts, which will be verified by Taiko ZKP. + +## Basefee Calculation + +We use Vitalik's idea proposed here: https://ethresear.ch/t/make-eip-1559-more-like-an-amm-curve/9082 (read it first!). The x-axis represents the current gas _excess_, the y-axis is the ether amount. When some gas are sold, excess goes up, and the difference of the new and the old y value is the total cost of the gas purchase, or $$cost(gasAmount) = e^{(gasExcess + gasAmount)} -e^{gasExcess}$$, and $$basefee(gasAmount) = cost(gasAmount)/gasAmount$$. + +A nice property of the $e^x$ curve is that for a chosen gas target $T$, the basefee ($basefee(T)$) for a block with $T$ gas and the basefee ($basefee(2T)$) for a block with $2T$ gas always have the fixed ratio: $$R == basefee(2T)/basefee(T)$$ regardless of the current _gas excess_ value, $T$ and $R$ together determine the shape of the curve. In Ethereum, $T$ is 15 million and $R$ is 12.5%; it's yet to be decided what value we should use in Taiko. + +![4f785d35722c2f255a448c7803d511a0bb2b148c](https://user-images.githubusercontent.com/99078276/229010491-a3fcddd5-1798-47af-bafc-5d680fbb574c.png) + +### Implementation of $e^x$ + +We steal the `exp(x)` implementation from https://github.com/recmo/experiment-solexp/blob/main/src/test/FixedPointMathLib.t.sol. This implementation has a limitation: the range is input parameter `x` is `[-42.139678854, + 135.305999369]` with 18 decimals/precision. In our case, we need to map gas excess to the range of `[0, K]` where `K` equals `135.305999369` or `135305999368893231588` in fixed point integer form. + +The $e^x$ curve can be expressed using $$py=e^{qx}$$, as you can see below: the two parameters $p$ and $q$ defines the shape/slope of the curve. We need to find the right value for them, otherwise, the basefee movement will not be as expected. + +Screenshot 2023-03-30 at 17 21 19 + +(the plot above is available at https://www.desmos.com/calculator/yncurfx3ar) + +## Scaling + +The following is how we calculate $p$ and $q$. Assuming the max gas excess $M$, a uint64. then $q = 135305999368893231588/M$ (internally we keep $q'=q <<64$ as it fits into a uint64). + +We also assuming the initial value of gasExcess is $M/2$; and the initial basefee (the fee for purchasing 1 gas) is $b_0$, or $$b_0=p e^{(M/2 + 1)} + p e^{M/2}$$, so $$p = b_0/(e^{(M/2 + 1)} + e^{M/2})$$. + +It turns out the initial value of gasExcess doesn't really matter for the above calculation due to the nature of the e-curve. But choosing $M/2$ allows price to go up and down by the same max amount. + +## Adjust the slope + +To adjust the slope of the curve to satisfy $R == basefee(2T)/basefee(T)$, we simply need to chose $M$ and $b_0$. $b_0$ is simply to decide -- if we believe the cost of a L2 transaction is $1/n$ of the same L1 transaction, we simply use the current L1 base fee divided by $n$. Then we can simply tune $M$ to make sure $R == basefee(2T)/basefee(T)$ holds. This is very simply manually a try-and-adjust approach as shown in `Lib1559Math.t.sol`. The TaikoL1 contract will check if $R == basefee(2T)/basefee(T)$ holds but will not calculate $M$ for us. diff --git a/packages/protocol/foundry.toml b/packages/protocol/foundry.toml index b20a5c1e9d4..270d8ff083d 100644 --- a/packages/protocol/foundry.toml +++ b/packages/protocol/foundry.toml @@ -1,3 +1,6 @@ +# See more config options https://github.com/foundry-rs/foundry/tree/master/config + + [profile.default] src = 'contracts' out = 'out' @@ -5,6 +8,6 @@ test = 'test2' libs = ['lib'] optimizer = true optimizer_runs = 200 -gas_reports = ["TaikoL1", "TaikoWithConfig", "TaikoL2", "GasComparision", "SignalService", "Bridge", "BridgedERC20", "TaikoToken", "EtherVault", "TokenVault"] -# See more config options https://github.com/foundry-rs/foundry/tree/master/config +# Do not change the block_gas_limit value, TaikoL2.t.sol depends on it. +block_gas_limit = 30000000 #30M diff --git a/packages/protocol/package.json b/packages/protocol/package.json index a3b798d1f54..129c13f6251 100644 --- a/packages/protocol/package.json +++ b/packages/protocol/package.json @@ -21,7 +21,7 @@ "test:integration": "TEST_TYPE=integration ./test/test_integration.sh", "test:tokenomics": "TEST_TYPE=tokenomics ./test/test_integration.sh", "test:all": "pnpm run test && pnpm run test:integration && pnpm run test:tokenomics && pnpm run test:genesis", - "deploy:foundry": "./script/download_solc.sh && PRIVATE_KEY=ac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80 ORACLE_PROVER_ADDRESS=0xa0Ee7A142d267C1f36714E4a8F75612F20a79720 SOLO_PROPOSER=0xa0Ee7A142d267C1f36714E4a8F75612F20a79720 OWNER=0x70997970C51812dc3A010C7d01b50e0d17dc79C8 TAIKO_L2_ADDRESS=0xa0Ee7A142d267C1f36714E4a8F75612F20a79720 TAIKO_TOKEN_PREMINT_RECIPIENT=0xa0Ee7A142d267C1f36714E4a8F75612F20a79720 TAIKO_TOKEN_PREMINT_AMOUNT=0xffff L2_GENESIS_HASH=0xee1950562d42f0da28bd4550d88886bc90894c77c9c9eaefef775d4c8223f259 L2_CHAIN_ID=167001 forge script script/DeployOnL1.s.sol:DeployOnL1 --fork-url http://localhost:8545 --broadcast --ffi -vvvv --via-ir", + "deploy:foundry": "./script/download_solc.sh && ./script/deploy_on_l1.sh", "lint-staged": "lint-staged --allow-empty", "sizer": "pnpm hardhat size-contracts" }, diff --git a/packages/protocol/script/DeployOnL1.s.sol b/packages/protocol/script/DeployOnL1.s.sol index 96873fa3762..d3ef4e57a3f 100644 --- a/packages/protocol/script/DeployOnL1.s.sol +++ b/packages/protocol/script/DeployOnL1.s.sol @@ -9,6 +9,7 @@ pragma solidity ^0.8.18; import "forge-std/Script.sol"; import "forge-std/console2.sol"; import "@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol"; +import "@openzeppelin/contracts-upgradeable/utils/math/SafeCastUpgradeable.sol"; import "../contracts/common/AddressResolver.sol"; import "../contracts/L1/TaikoToken.sol"; import "../contracts/L1/TaikoL1.sol"; @@ -20,9 +21,10 @@ import "../contracts/test/erc20/FreeMintERC20.sol"; import "../contracts/test/erc20/MayFailFreeMintERC20.sol"; contract DeployOnL1 is Script, AddressResolver { + using SafeCastUpgradeable for uint256; uint256 public l2ChainId = vm.envUint("L2_CHAIN_ID"); - bytes32 public l2GensisHash = vm.envBytes32("L2_GENESIS_HASH"); + bytes32 public gensisHash = vm.envBytes32("L2_GENESIS_HASH"); uint256 public deployerPrivateKey = vm.envUint("PRIVATE_KEY"); @@ -105,13 +107,14 @@ contract DeployOnL1 is Script, AddressResolver { // TaikoL1 TaikoL1 taikoL1 = new TaikoL1(); + uint64 feeBase = 1 ** 8; // Taiko Token's decimals is 8, not 18 address taikoL1Proxy = deployProxy( "taiko", address(taikoL1), bytes.concat( taikoL1.init.selector, - abi.encode(addressManagerProxy, l2GensisHash, feeBase) + abi.encode(addressManagerProxy, feeBase, gensisHash) ) ); setAddress("proto_broker", taikoL1Proxy); diff --git a/packages/protocol/script/deploy_on_l1.sh b/packages/protocol/script/deploy_on_l1.sh new file mode 100755 index 00000000000..2ec0baa644b --- /dev/null +++ b/packages/protocol/script/deploy_on_l1.sh @@ -0,0 +1,24 @@ +#!/bin/sh + +# Please reference Lib1559Math.t.sol for L2 EIP-1559 related variables. +set -e + +PRIVATE_KEY=ac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80 \ +ORACLE_PROVER_ADDRESS=0xa0Ee7A142d267C1f36714E4a8F75612F20a79720 \ +SOLO_PROPOSER=0xa0Ee7A142d267C1f36714E4a8F75612F20a79720 \ +OWNER=0x70997970C51812dc3A010C7d01b50e0d17dc79C8 \ +TAIKO_L2_ADDRESS=0xa0Ee7A142d267C1f36714E4a8F75612F20a79720 \ +TAIKO_TOKEN_PREMINT_RECIPIENT=0xa0Ee7A142d267C1f36714E4a8F75612F20a79720 \ +TAIKO_TOKEN_PREMINT_AMOUNT=0xffff \ +L2_GENESIS_HASH=0xee1950562d42f0da28bd4550d88886bc90894c77c9c9eaefef775d4c8223f259 \ +L2_CHAIN_ID=167001 \ +L2_GAS_EXCESS_MAX=3840000000 \ +L2_BASE_FEE=5000000000 \ +L2_GAS_TARGET=6000000 \ +L2_EXPECTED_2X1X_RATIO=111 \ +forge script script/DeployOnL1.s.sol:DeployOnL1 \ + --fork-url http://localhost:8545 \ + --broadcast \ + --ffi \ + -vvvv \ + --via-ir \ diff --git a/packages/protocol/test/tokenomics/blockFee.test.ts b/packages/protocol/test/tokenomics/blockFee.test.ts index 98a37f5f490..75529c54aa5 100644 --- a/packages/protocol/test/tokenomics/blockFee.test.ts +++ b/packages/protocol/test/tokenomics/blockFee.test.ts @@ -50,22 +50,6 @@ describe("tokenomics: blockFee", function () { expect(blockFee).to.be.eq(0); }); - it("block fee should increase as the halving period passes, while no blocks are proposed", async function () { - const iterations: number = 5; - const period: number = config.bootstrapDiscountHalvingPeriod - .mul(1000) - .toNumber(); - - let lastBlockFee: BigNumber = await taikoL1.getBlockFee(); - - for (let i = 0; i < iterations; i++) { - await sleep(period); - const blockFee = await taikoL1.getBlockFee(); - expect(blockFee).to.be.gt(lastBlockFee); - lastBlockFee = blockFee; - } - }); - it( "proposes blocks on interval, proposer's balance for TkoToken should decrease as it pays proposer fee, " + "proofReward should increase since more slots are used and " + diff --git a/packages/protocol/test/utils/onNewL2Block.ts b/packages/protocol/test/utils/onNewL2Block.ts index dea3097801e..a9a969e206e 100644 --- a/packages/protocol/test/utils/onNewL2Block.ts +++ b/packages/protocol/test/utils/onNewL2Block.ts @@ -2,7 +2,6 @@ import { BigNumber, ethers } from "ethers"; import { TaikoL1, TaikoToken } from "../../typechain"; import { BlockProposedEvent } from "../../typechain/LibProposing"; import Proposer from "./proposer"; -import sleep from "./sleep"; // onNewL2Block should be called from a tokenomics test case when a new block // is generated from the l2Provider. @@ -22,7 +21,7 @@ async function onNewL2Block( newBlockFee: BigNumber; newProofReward: BigNumber; }> { - const config = await taikoL1.getConfig(); + // const config = await taikoL1.getConfig(); const block = await l2Provider.getBlock(blockNumber); const { proposedEvent } = await proposer.proposeBlock(block); @@ -39,7 +38,6 @@ async function onNewL2Block( ? await taikoTokenL1.balanceOf(await proposerSigner.getAddress()) : BigNumber.from(0); - await sleep(1000 * config.bootstrapDiscountHalvingPeriod.toNumber()); const newBlockFee = await taikoL1.getBlockFee(); console.log("-------------------proposed----------", id); diff --git a/packages/protocol/test2/GasComparison.t.sol b/packages/protocol/test2/GasComparison.t.sol index ecb17f9b68f..c9b6547ff6f 100644 --- a/packages/protocol/test2/GasComparison.t.sol +++ b/packages/protocol/test2/GasComparison.t.sol @@ -23,19 +23,19 @@ struct MyStruct { } contract FooBar { - function loadBlockMetadata_1(bytes memory data) public { - MyStruct memory meta = abi.decode(data, (MyStruct)); + function loadBlockMetadata_1(bytes memory data) public pure { + abi.decode(data, (MyStruct)); } - function loadBlockMetadata_2(bytes calldata data) public { - MyStruct memory meta = abi.decode(data, (MyStruct)); + function loadBlockMetadata_2(bytes calldata data) public pure { + abi.decode(data, (MyStruct)); } - function loadBlockMetadata_3(MyStruct memory data) public {} + function loadBlockMetadata_3(MyStruct memory data) public pure {} - function loadBlockMetadata_4(MyStruct calldata data) public {} + function loadBlockMetadata_4(MyStruct calldata data) public pure {} - function loadBlockMetadata_5(bytes calldata data) public { + function loadBlockMetadata_5(bytes calldata data) public pure { MyStruct memory meta; meta.id = uint256(bytes32(data[0:32])); meta.l1Height = uint256(bytes32(data[32:64])); @@ -44,7 +44,7 @@ contract FooBar { meta.timestamp = uint64(bytes8(data[104:112])); } - function loadBlockMetadata_6() public { + function loadBlockMetadata_6() public pure { MyStruct memory meta; uint256 a; assembly { @@ -71,50 +71,65 @@ contract FooBar { meta.timestamp = uint64(uint256((a << (128 + 64)) >> (128 + 64))); } - function return_1() public returns (TaikoData.BlockMetadata memory meta) { + function return_1() + public + view + returns (TaikoData.BlockMetadata memory meta) + { meta = TaikoData.BlockMetadata({ id: 1, l1Height: 1, l1Hash: bytes32(uint256(1)), beneficiary: address(this), + treasure: address(this), txListHash: bytes32(uint256(1)), txListByteStart: 0, txListByteEnd: 1000, gasLimit: 1, + l2Basefee: 1000000, mixHash: bytes32(uint256(1)), timestamp: 1 }); } - function return_2() public { - TaikoData.BlockMetadata memory meta = TaikoData.BlockMetadata({ + function return_2() public view { + TaikoData.BlockMetadata({ id: 1, l1Height: 1, l1Hash: bytes32(uint256(1)), beneficiary: address(this), + treasure: address(this), txListHash: bytes32(uint256(1)), txListByteStart: 0, txListByteEnd: 1000, gasLimit: 1, + l2Basefee: 1000000, mixHash: bytes32(uint256(1)), timestamp: 1 }); } //------ - function hashString_1(string memory str) public returns (bytes32 hash) { + function hashString_1( + string memory str + ) public pure returns (bytes32 hash) { assembly { hash := keccak256(add(str, 32), mload(str)) } } - function hashString_2(string memory str) public returns (bytes32 hash) { + function hashString_2( + string memory str + ) public pure returns (bytes32 hash) { hash = keccak256(bytes(str)); } //------ - function hashTwo_1(address a, bytes32 b) public returns (bytes32 hash) { + function hashTwo_1( + address a, + bytes32 b + ) public pure returns (bytes32 hash) { assembly { // Load the free memory pointer and allocate memory for the concatenated arguments let input := mload(64) @@ -130,7 +145,10 @@ contract FooBar { } } - function hashTwo_2(address a, bytes32 b) public returns (bytes32 hash) { + function hashTwo_2( + address a, + bytes32 b + ) public pure returns (bytes32 hash) { hash = keccak256(bytes.concat(bytes20(uint160(a)), b)); // the following will work too. // hash = keccak256(abi.encodePacked(a, b)); @@ -138,21 +156,21 @@ contract FooBar { //------ - function increment_1(uint256 count) public { + function increment_1(uint256 count) public pure { uint256 a; for (uint256 i = 0; i < count; i++) { a += i; } } - function increment_2(uint256 count) public { + function increment_2(uint256 count) public pure { uint256 a; for (uint256 i = 0; i < count; ++i) { a += i; } } - function increment_3(uint256 count) public { + function increment_3(uint256 count) public pure { uint256 a; for (uint256 i = 0; i < count; ) { a += i; @@ -162,7 +180,7 @@ contract FooBar { } } - function increment_4(uint256 count) public { + function increment_4(uint256 count) public pure { uint256 a; for (uint256 i = 0; i < count; ) { a += i; @@ -176,14 +194,14 @@ contract FooBar { function hashKey_1( uint256 chainId, string memory name - ) public view returns (bytes32) { + ) public pure returns (bytes32) { return keccak256(bytes(string.concat(Strings.toString(chainId), name))); } function hashKey_2( uint256 chainId, string memory name - ) public view returns (bytes32) { + ) public pure returns (bytes32) { return keccak256(abi.encodePacked(chainId, name)); } @@ -205,32 +223,44 @@ contract GasComparisonTest is Test { foobar = new FooBar(); } - function testCompareHashString(uint256 count) external { + function testCompare_hashString(uint256 count) public { vm.assume(count > 10 && count < 1000); + string memory str = string(new bytes(count)); assertEq( foobar.hashString_1(str), foobar.hashString_2(str) //best ); + } + + function testCompare_increment(uint256 count) public view { + vm.assume(count > 10 && count < 1000); + foobar.increment_1(count); + foobar.increment_2(count); + foobar.increment_3(count); // best + foobar.increment_4(count); + } + function testCompare_hashTwo() public { address a = address(this); bytes32 b = blockhash(block.number - 1); assertEq( foobar.hashTwo_1(a, b), //best foobar.hashTwo_2(a, b) ); + } - foobar.increment_1(count); - foobar.increment_2(count); - foobar.increment_3(count); // best - foobar.increment_4(count); + function testCompare_hashKey() public view { + foobar.hashKey_1(123, "abc"); + foobar.hashKey_2(123, "abc"); + } + function testCompare_return() public view { foobar.return_1(); foobar.return_2(); // cheaper + } - foobar.hashKey_1(123, "abc"); - foobar.hashKey_2(123, "abc"); - + function testCompare_loadBlockMetadata() public { MyStruct memory meta = MyStruct({ id: 123, l1Height: 456, @@ -238,36 +268,33 @@ contract GasComparisonTest is Test { gasLimit: 333, timestamp: 999 }); - { - bytes memory b = abi.encode(meta); - foobar.loadBlockMetadata_1(b); - foobar.loadBlockMetadata_2(b); - foobar.loadBlockMetadata_3(meta); - foobar.loadBlockMetadata_4(meta); // best - } - { - bytes memory b = bytes.concat( - bytes32(meta.id), - bytes32(meta.l1Height), - meta.l1Hash, - bytes8(meta.gasLimit), - bytes8(meta.timestamp) - ); - - foobar.loadBlockMetadata_5(b); - - bytes memory c = bytes.concat( - FooBar.loadBlockMetadata_6.selector, - b - ); - - address(foobar).call(c); - } - { - address to = 0x50081b12838240B1bA02b3177153Bca678a86078; - foobar.send0Ether_CheckInside(to, 0); - foobar.send0Ether_CheckOutside(to, 0); - } + bytes memory b; + + b = abi.encode(meta); + foobar.loadBlockMetadata_1(b); + foobar.loadBlockMetadata_2(b); + foobar.loadBlockMetadata_3(meta); + foobar.loadBlockMetadata_4(meta); // best + + b = bytes.concat( + bytes32(meta.id), + bytes32(meta.l1Height), + meta.l1Hash, + bytes8(meta.gasLimit), + bytes8(meta.timestamp) + ); + + foobar.loadBlockMetadata_5(b); + + bytes memory c = bytes.concat(FooBar.loadBlockMetadata_6.selector, b); + + address(foobar).call(c); + } + + function testCompare_send0Ether() public { + address to = 0x50081b12838240B1bA02b3177153Bca678a86078; + foobar.send0Ether_CheckInside(to, 0); + foobar.send0Ether_CheckOutside(to, 0); } } diff --git a/packages/protocol/test2/Lib1559Math.sol b/packages/protocol/test2/Lib1559Math.sol new file mode 100644 index 00000000000..528447b3fa2 --- /dev/null +++ b/packages/protocol/test2/Lib1559Math.sol @@ -0,0 +1,96 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity ^0.8.18; + +import {Test} from "forge-std/Test.sol"; +import {console2} from "forge-std/console2.sol"; +import {Lib1559Math as T} from "../contracts/libs/Lib1559Math.sol"; +import { + SafeCastUpgradeable +} from "@openzeppelin/contracts-upgradeable/utils/math/SafeCastUpgradeable.sol"; + +contract TestLib1559Math is Test { + using SafeCastUpgradeable for uint256; + + function test1559_2X1XRatio(uint16 rand) public { + vm.assume(rand != 0); + + uint64 xExcessMax = (uint(15000000) * 256 * rand).toUint64(); + uint64 xTarget = (uint(6000000) * rand).toUint64(); + uint64 price0 = (uint(5000000000) * rand).toUint64(); + uint64 ratio2x1x = 111; + (uint128 xscale, uint128 yscale) = T.calculateScales({ + xExcessMax: xExcessMax, + price: price0, + target: xTarget, + ratio2x1x: ratio2x1x + }); + + // basefee should be 0 when xExcess is 0 + assertEq(T.calculatePrice(xscale, yscale, 0, xTarget), 0); + + uint64 N = 50; + // In the [xExcessMax/2 - 50 * xTarget, xExcessMax/2 + 50 * xTarget] + // x range, the ratio2x1x holds, and the price is still smaller + // than uint64.max + for ( + uint64 xExcess = xExcessMax / 2 - N * xTarget; + xExcess <= xExcessMax / 2 + N * xTarget; + xExcess += xTarget + ) { + uint256 basefee1 = T.calculatePrice( + xscale, + yscale, + xExcess, + xTarget + ); + assertLt(basefee1, type(uint64).max); + + uint256 basefee2 = T.calculatePrice( + xscale, + yscale, + xExcess, + 2 * xTarget + ); + + assertLt(basefee2, type(uint64).max); + + if (basefee1 != 0) { + assertEq((basefee2 * 100) / basefee1, ratio2x1x); + } + } + } + + function test1559_SpecalCases(uint16 rand) public { + vm.assume(rand != 0); + + uint64 xExcessMax = (uint(15000000) * 256 * rand).toUint64(); + uint64 xTarget = (uint(6000000) * rand).toUint64(); + uint64 price0 = (uint(5000000000) * rand).toUint64(); + uint64 ratio2x1x = 111; + + (uint128 xscale, uint128 yscale) = T.calculateScales({ + xExcessMax: xExcessMax, + price: price0, + target: xTarget, + ratio2x1x: ratio2x1x + }); + + assertEq(T.calculatePrice(xscale, yscale, 0, 0), 0); + assertEq(T.calculatePrice(xscale, yscale, 0, 1), 0); + + assertGt( + T.calculatePrice(xscale, yscale, xExcessMax - xTarget, xTarget), + type(uint64).max + ); + + assertGt( + T.calculatePrice(xscale, yscale, 0, xExcessMax), + type(uint64).max + ); + + assertGt( + T.calculatePrice(xscale, yscale, xExcessMax / 2, xExcessMax / 2), + type(uint64).max + ); + } +} diff --git a/packages/protocol/test2/LibFixedPointMath.t.sol b/packages/protocol/test2/LibFixedPointMath.t.sol new file mode 100644 index 00000000000..8846efaeaf7 --- /dev/null +++ b/packages/protocol/test2/LibFixedPointMath.t.sol @@ -0,0 +1,57 @@ +// SPDX-License-Identifier: UNLICENSED +// Some of the tests are taken from: +// https://github.com/recmo/experiment-solexp/blob/main/src/test/FixedPointMathLib.t.sol +pragma solidity 0.8.18; + +import {Test} from "forge-std/Test.sol"; +import {console2} from "forge-std/console2.sol"; +import "../contracts/thirdparty/LibFixedPointMath.sol"; + +contract LibFixedPointMathTest is Test { + function testExp1() public { + assertEq(LibFixedPointMath.exp(-1e18), 367879441171442321); + } + + function testExpSmallest() public view { + int y = LibFixedPointMath.exp(-42139678854452767550); + + console2.log( + "LibFixedPointMath.exp(-42139678854452767550)=", + uint256(y) + ); + } + + function testExpLargest() public view { + int y = LibFixedPointMath.exp( + int(uint256(LibFixedPointMath.MAX_EXP_INPUT)) + ); + console2.log( + "LibFixedPointMath.exp(135305999368893231588)=", + uint256(y) + ); + } + + function testExpSome() public view { + int y = LibFixedPointMath.exp(5e18); + console2.log("LibFixedPointMath.exp(5e18)=", uint256(y)); + } + + function testExpGas() public view { + uint256 g0 = gasleft(); + LibFixedPointMath.exp(133e18); + uint256 g1 = gasleft(); + LibFixedPointMath.exp(-23e18); + uint256 g2 = gasleft(); + LibFixedPointMath.exp(5e18); + uint256 g3 = gasleft(); + console2.logUint(g0 - g1); + console2.logUint(g1 - g2); + console2.logUint(g2 - g3); + } + + function testExp3() public pure { + LibFixedPointMath.exp(133e18); + LibFixedPointMath.exp(10e18); + LibFixedPointMath.exp(-23e18); + } +} diff --git a/packages/protocol/test2/LibL1Tokenomics.t.sol b/packages/protocol/test2/LibTokenomics.t.sol similarity index 76% rename from packages/protocol/test2/LibL1Tokenomics.t.sol rename to packages/protocol/test2/LibTokenomics.t.sol index 61da8fd4fc6..b13c26e6f1a 100644 --- a/packages/protocol/test2/LibL1Tokenomics.t.sol +++ b/packages/protocol/test2/LibTokenomics.t.sol @@ -4,9 +4,14 @@ pragma solidity ^0.8.18; import {Test} from "forge-std/Test.sol"; import {console2} from "forge-std/console2.sol"; import {TaikoData} from "../contracts/L1/TaikoData.sol"; -import {LibL1Tokenomics} from "../contracts/L1/libs/LibL1Tokenomics.sol"; +import {LibTokenomics} from "../contracts/L1/libs/LibTokenomics.sol"; +import { + SafeCastUpgradeable +} from "@openzeppelin/contracts-upgradeable/utils/math/SafeCastUpgradeable.sol"; + +contract TestLibTokenomics is Test { + using SafeCastUpgradeable for uint256; -contract TestLibL1Tokenomics is Test { struct FeeConfig { uint64 avgTimeMAF; uint64 avgTimeCap; @@ -18,248 +23,248 @@ contract TestLibL1Tokenomics is Test { function testTokenomicsFeeCalcWithNonZeroStartBips() public { testTimeAdjustedFee({ - feeBase: 100 ether, + feeBase: 100 * 1E8, timeAverageSec: 40 seconds, timeUsedSec: 0 seconds, isProposal: true, dampingFactorBips: 4000, // 40% - expectedFeeBase: 140 ether, + expectedFeeBase: 140 * 1E8, expectedPreimumRate: 0 }); testTimeAdjustedFee({ - feeBase: 100 ether, + feeBase: 100 * 1E8, timeAverageSec: 40 seconds, timeUsedSec: 20 seconds, isProposal: true, dampingFactorBips: 4000, // 40% - expectedFeeBase: 120 ether, + expectedFeeBase: 120 * 1E8, expectedPreimumRate: 0 }); testTimeAdjustedFee({ - feeBase: 100 ether, + feeBase: 100 * 1E8, timeAverageSec: 40 seconds, timeUsedSec: 40 seconds, isProposal: true, dampingFactorBips: 4000, // 40% - expectedFeeBase: 100 ether, + expectedFeeBase: 100 * 1E8, expectedPreimumRate: 0 }); testTimeAdjustedFee({ - feeBase: 100 ether, + feeBase: 100 * 1E8, timeAverageSec: 40 seconds, timeUsedSec: 60 seconds, isProposal: true, dampingFactorBips: 4000, // 40% - expectedFeeBase: 80 ether, + expectedFeeBase: 80 * 1E8, expectedPreimumRate: 0 }); testTimeAdjustedFee({ - feeBase: 100 ether, + feeBase: 100 * 1E8, timeAverageSec: 40 seconds, timeUsedSec: 80 seconds, isProposal: true, dampingFactorBips: 4000, // 40% - expectedFeeBase: 60 ether, + expectedFeeBase: 60 * 1E8, expectedPreimumRate: 0 }); testTimeAdjustedFee({ - feeBase: 100 ether, + feeBase: 100 * 1E8, timeAverageSec: 40 seconds, timeUsedSec: 81 seconds, isProposal: true, dampingFactorBips: 4000, // 40% - expectedFeeBase: 60 ether, + expectedFeeBase: 60 * 1E8, expectedPreimumRate: 0 }); } function testTokenomicsFeeCalcWithZeroStartBips() public { testTimeAdjustedFee({ - feeBase: 100 ether, + feeBase: 100 * 1E8, timeAverageSec: 40 seconds, timeUsedSec: 0 seconds, isProposal: true, dampingFactorBips: 0, // 0% - expectedFeeBase: 100 ether, + expectedFeeBase: 100 * 1E8, expectedPreimumRate: 0 }); testTimeAdjustedFee({ - feeBase: 100 ether, + feeBase: 100 * 1E8, timeAverageSec: 40 seconds, timeUsedSec: 20 seconds, isProposal: true, dampingFactorBips: 0, // 0% - expectedFeeBase: 100 ether, + expectedFeeBase: 100 * 1E8, expectedPreimumRate: 0 }); testTimeAdjustedFee({ - feeBase: 100 ether, + feeBase: 100 * 1E8, timeAverageSec: 40 seconds, timeUsedSec: 40 seconds, isProposal: true, dampingFactorBips: 0, // 0% - expectedFeeBase: 100 ether, + expectedFeeBase: 100 * 1E8, expectedPreimumRate: 0 }); testTimeAdjustedFee({ - feeBase: 100 ether, + feeBase: 100 * 1E8, timeAverageSec: 40 seconds, timeUsedSec: 60 seconds, isProposal: true, dampingFactorBips: 0, // 0% - expectedFeeBase: 100 ether, + expectedFeeBase: 100 * 1E8, expectedPreimumRate: 0 }); testTimeAdjustedFee({ - feeBase: 100 ether, + feeBase: 100 * 1E8, timeAverageSec: 40 seconds, timeUsedSec: 80 seconds, isProposal: true, dampingFactorBips: 0, // 0% - expectedFeeBase: 100 ether, + expectedFeeBase: 100 * 1E8, expectedPreimumRate: 0 }); testTimeAdjustedFee({ - feeBase: 100 ether, + feeBase: 100 * 1E8, timeAverageSec: 40 seconds, timeUsedSec: 81 seconds, isProposal: true, dampingFactorBips: 0, // 0% - expectedFeeBase: 100 ether, + expectedFeeBase: 100 * 1E8, expectedPreimumRate: 0 }); } function testTokenomicsRewardCalcWithNonZeroStartBips() public { testTimeAdjustedFee({ - feeBase: 100 ether, + feeBase: 100 * 1E8, timeAverageSec: 40 seconds, timeUsedSec: 0 seconds, isProposal: false, dampingFactorBips: 4000, // 40% - expectedFeeBase: 60 ether, + expectedFeeBase: 60 * 1E8, expectedPreimumRate: 0 }); testTimeAdjustedFee({ - feeBase: 100 ether, + feeBase: 100 * 1E8, timeAverageSec: 40 seconds, timeUsedSec: 20 seconds, isProposal: false, dampingFactorBips: 4000, // 40% - expectedFeeBase: 80 ether, + expectedFeeBase: 80 * 1E8, expectedPreimumRate: 0 }); testTimeAdjustedFee({ - feeBase: 100 ether, + feeBase: 100 * 1E8, timeAverageSec: 40 seconds, timeUsedSec: 40 seconds, isProposal: false, dampingFactorBips: 4000, // 40% - expectedFeeBase: 100 ether, + expectedFeeBase: 100 * 1E8, expectedPreimumRate: 0 }); testTimeAdjustedFee({ - feeBase: 100 ether, + feeBase: 100 * 1E8, timeAverageSec: 40 seconds, timeUsedSec: 60 seconds, isProposal: false, dampingFactorBips: 4000, // 40% - expectedFeeBase: 120 ether, + expectedFeeBase: 120 * 1E8, expectedPreimumRate: 5000 }); testTimeAdjustedFee({ - feeBase: 100 ether, + feeBase: 100 * 1E8, timeAverageSec: 40 seconds, timeUsedSec: 80 seconds, isProposal: false, dampingFactorBips: 4000, // 40% - expectedFeeBase: 140 ether, + expectedFeeBase: 140 * 1E8, expectedPreimumRate: 10000 }); testTimeAdjustedFee({ - feeBase: 100 ether, + feeBase: 100 * 1E8, timeAverageSec: 40 seconds, timeUsedSec: 81 seconds, isProposal: false, dampingFactorBips: 4000, // 40% - expectedFeeBase: 140 ether, + expectedFeeBase: 140 * 1E8, expectedPreimumRate: 10000 }); } function testTokenomicsRewardCalcWithZeroStartBips() public { testTimeAdjustedFee({ - feeBase: 100 ether, + feeBase: 100 * 1E8, timeAverageSec: 40 seconds, timeUsedSec: 0 seconds, isProposal: false, dampingFactorBips: 0, // 0% - expectedFeeBase: 100 ether, + expectedFeeBase: 100 * 1E8, expectedPreimumRate: 0 }); testTimeAdjustedFee({ - feeBase: 100 ether, + feeBase: 100 * 1E8, timeAverageSec: 40 seconds, timeUsedSec: 20 seconds, isProposal: false, dampingFactorBips: 0, // 0% - expectedFeeBase: 100 ether, + expectedFeeBase: 100 * 1E8, expectedPreimumRate: 0 }); testTimeAdjustedFee({ - feeBase: 100 ether, + feeBase: 100 * 1E8, timeAverageSec: 40 seconds, timeUsedSec: 40 seconds, isProposal: false, dampingFactorBips: 0, // 0% - expectedFeeBase: 100 ether, + expectedFeeBase: 100 * 1E8, expectedPreimumRate: 0 }); testTimeAdjustedFee({ - feeBase: 100 ether, + feeBase: 100 * 1E8, timeAverageSec: 40 seconds, timeUsedSec: 60 seconds, isProposal: false, dampingFactorBips: 0, // 0% - expectedFeeBase: 100 ether, + expectedFeeBase: 100 * 1E8, expectedPreimumRate: 0 }); testTimeAdjustedFee({ - feeBase: 100 ether, + feeBase: 100 * 1E8, timeAverageSec: 40 seconds, timeUsedSec: 80 seconds, isProposal: false, dampingFactorBips: 0, // 0% - expectedFeeBase: 100 ether, + expectedFeeBase: 100 * 1E8, expectedPreimumRate: 0 }); testTimeAdjustedFee({ - feeBase: 100 ether, + feeBase: 100 * 1E8, timeAverageSec: 40 seconds, timeUsedSec: 81 seconds, isProposal: false, dampingFactorBips: 0, // 0% - expectedFeeBase: 100 ether, + expectedFeeBase: 100 * 1E8, expectedPreimumRate: 0 }); } @@ -278,10 +283,10 @@ contract TestLibL1Tokenomics is Test { dampingFactorBips: dampingFactorBips }); - (uint256 _feeBase, uint256 _premiumRate) = LibL1Tokenomics + (uint256 _feeBase, uint256 _premiumRate) = LibTokenomics .getTimeAdjustedFee( feeConfig, - feeBase, + feeBase.toUint64(), isProposal, timeUsedSec, timeAverageSec * 1000 diff --git a/packages/protocol/test2/TaikoL1.t.sol b/packages/protocol/test2/TaikoL1.t.sol index cd87527c94a..96334e76212 100644 --- a/packages/protocol/test2/TaikoL1.t.sol +++ b/packages/protocol/test2/TaikoL1.t.sol @@ -10,7 +10,7 @@ import {TaikoL1} from "../contracts/L1/TaikoL1.sol"; import {TaikoToken} from "../contracts/L1/TaikoToken.sol"; import {SignalService} from "../contracts/signal/SignalService.sol"; import {Strings} from "@openzeppelin/contracts/utils/Strings.sol"; -import {TaikoL1TestBase} from "./TaikoL1TestBase.sol"; +import {TaikoL1TestBase} from "./TaikoL1TestBase.t.sol"; contract TaikoL1WithConfig is TaikoL1 { function getConfig() @@ -22,8 +22,6 @@ contract TaikoL1WithConfig is TaikoL1 { config = TaikoConfig.getConfig(); config.enableTokenomics = true; - config.bootstrapDiscountHalvingPeriod = 0; - config.constantFeeRewardBlocks = 0; config.txListCacheExpiry = 5 minutes; config.proposerDepositPctg = 0; config.maxVerificationsPerTx = 0; diff --git a/packages/protocol/test2/TaikoL1TestBase.sol b/packages/protocol/test2/TaikoL1TestBase.t.sol similarity index 94% rename from packages/protocol/test2/TaikoL1TestBase.sol rename to packages/protocol/test2/TaikoL1TestBase.t.sol index 0ac865e5fea..ead9a2f5f74 100644 --- a/packages/protocol/test2/TaikoL1TestBase.sol +++ b/packages/protocol/test2/TaikoL1TestBase.t.sol @@ -22,7 +22,10 @@ abstract contract TaikoL1TestBase is Test { bytes32 public constant GENESIS_BLOCK_HASH = keccak256("GENESIS_BLOCK_HASH"); uint64 feeBase = 1E8; // 1 TKO + uint64 l2GasExcess = 1E18; + address public constant L2Treasure = + 0x859d74b52762d9ed07D1b2B8d7F93d26B1EA78Bb; address public constant L2SS = 0xa008AE5Ba00656a3Cc384de589579e3E52aC030C; address public constant L2TaikoL2 = 0x0082D90249342980d011C58105a03b35cCb4A315; @@ -41,7 +44,7 @@ abstract contract TaikoL1TestBase is Test { addressManager.init(); L1 = deployTaikoL1(); - L1.init(address(addressManager), GENESIS_BLOCK_HASH, feeBase); + L1.init(address(addressManager), feeBase, GENESIS_BLOCK_HASH); conf = L1.getConfig(); tko = new TaikoToken(); @@ -66,6 +69,7 @@ abstract contract TaikoL1TestBase is Test { _registerAddress("taiko_token", address(tko)); _registerAddress("proto_broker", address(L1)); _registerAddress("signal_service", address(ss)); + _registerL2Address("treasure", L2Treasure); _registerL2Address("signal_service", address(L2SS)); _registerL2Address("taiko_l2", address(L2TaikoL2)); @@ -96,13 +100,17 @@ abstract contract TaikoL1TestBase is Test { } meta.id = variables.numBlocks; + meta.timestamp = uint64(block.timestamp); meta.l1Height = uint64(block.number - 1); + meta.l2Basefee = 0; meta.l1Hash = blockhash(block.number - 1); - meta.beneficiary = proposer; - meta.txListHash = keccak256(txList); meta.mixHash = bytes32(_mixHash); + meta.txListHash = keccak256(txList); + meta.txListByteStart = 0; + meta.txListByteEnd = txListSize; meta.gasLimit = gasLimit; - meta.timestamp = uint64(block.timestamp); + meta.beneficiary = proposer; + meta.treasure = L2Treasure; vm.prank(proposer, proposer); L1.proposeBlock(abi.encode(input), txList); diff --git a/packages/protocol/test2/TaikoL2.t.sol b/packages/protocol/test2/TaikoL2.t.sol index f8f5525e045..0106deeb1b5 100644 --- a/packages/protocol/test2/TaikoL2.t.sol +++ b/packages/protocol/test2/TaikoL2.t.sol @@ -1,41 +1,118 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.18; -import "forge-std/Test.sol"; -import "forge-std/console2.sol"; -import "../contracts/L2/TaikoL2.sol"; +import {Test} from "forge-std/Test.sol"; +import {console2} from "forge-std/console2.sol"; +import {Strings} from "@openzeppelin/contracts/utils/Strings.sol"; +import {TaikoL2} from "../contracts/L2/TaikoL2.sol"; +import { + SafeCastUpgradeable +} from "@openzeppelin/contracts-upgradeable/utils/math/SafeCastUpgradeable.sol"; contract TestTaikoL2 is Test { + using SafeCastUpgradeable for uint256; + uint64 public constant BLOCK_GAS_LIMIT = 30000000; // same as `block_gas_limit` in foundry.toml + TaikoL2 public L2; + uint private logIndex; + uint64 private ANCHOR_GAS_COST; function setUp() public { + uint16 rand = 2; + TaikoL2.EIP1559Params memory param1559 = TaikoL2.EIP1559Params({ + basefee: (uint(BLOCK_GAS_LIMIT * 10) * rand).toUint64(), + gasIssuedPerSecond: 1000000, + gasExcessMax: (uint(15000000) * 256 * rand).toUint64(), + gasTarget: (uint(6000000) * rand).toUint64(), + ratio2x1x: 111 + }); + L2 = new TaikoL2(); - L2.init(address(1)); // Dummy address manager address. + L2.init(address(1), param1559); // Dummy address manager address. + ANCHOR_GAS_COST = L2.ANCHOR_GAS_COST(); + vm.roll(block.number + 1); + vm.warp(block.timestamp + 30); } - function testAnchorTxs() external { - for (uint256 i = 0; i < 1000; i++) { + function testAnchorTxsBlocktimeConstant() external { + uint64 firstBasefee; + for (uint256 i = 0; i < 100; i++) { + uint64 basefee = _getBasefeeAndPrint(0, BLOCK_GAS_LIMIT); + vm.fee(basefee); + + if (firstBasefee == 0) { + firstBasefee = basefee; + } else { + assertEq(firstBasefee, basefee); + } + vm.prank(L2.GOLDEN_TOUCH_ADDRESS()); - L2.anchor(12345, keccak256("a"), keccak256("b")); + _anchor(BLOCK_GAS_LIMIT); + vm.roll(block.number + 1); + vm.warp(block.timestamp + 30); + } + } + + function testAnchorTxsBlocktimeDecreasing() external { + uint64 prevBasefee; + + for (uint256 i = 0; i < 32; i++) { + uint64 basefee = _getBasefeeAndPrint(0, BLOCK_GAS_LIMIT); + vm.fee(basefee); + + assertGe(basefee, prevBasefee); + prevBasefee = basefee; + + vm.prank(L2.GOLDEN_TOUCH_ADDRESS()); + _anchor(BLOCK_GAS_LIMIT); + + vm.roll(block.number + 1); + vm.warp(block.timestamp + 30 - i); + } + } + + function testAnchorTxsBlocktimeIncreasing() external { + uint64 prevBasefee; + + for (uint256 i = 0; i < 30; i++) { + uint64 basefee = _getBasefeeAndPrint(0, BLOCK_GAS_LIMIT); + vm.fee(basefee); + + if (prevBasefee != 0) { + assertLe(basefee, prevBasefee); + } + prevBasefee = basefee; + + vm.prank(L2.GOLDEN_TOUCH_ADDRESS()); + _anchor(BLOCK_GAS_LIMIT); + + vm.roll(block.number + 1); + + vm.warp(block.timestamp + 30 + i); } } // calling anchor in the same block more than once should fail function testAnchorTxsFailInTheSameBlock() external { + uint64 expectedBasefee = _getBasefeeAndPrint(0, BLOCK_GAS_LIMIT); + vm.fee(expectedBasefee); + vm.prank(L2.GOLDEN_TOUCH_ADDRESS()); - L2.anchor(12345, keccak256("a"), keccak256("b")); + _anchor(BLOCK_GAS_LIMIT); vm.prank(L2.GOLDEN_TOUCH_ADDRESS()); vm.expectRevert(); - L2.anchor(12345, keccak256("a"), keccak256("b")); + _anchor(BLOCK_GAS_LIMIT); } // calling anchor in the same block more than once should fail function testAnchorTxsFailByNonTaikoL2Signer() external { + uint64 expectedBasefee = _getBasefeeAndPrint(0, BLOCK_GAS_LIMIT); + vm.fee(expectedBasefee); vm.expectRevert(); - L2.anchor(12345, keccak256("a"), keccak256("b")); + _anchor(BLOCK_GAS_LIMIT); } function testAnchorSigning(bytes32 digest) external { @@ -53,4 +130,75 @@ contract TestTaikoL2 is Test { vm.expectRevert(); L2.signAnchor(digest, uint8(3)); } + + function testGetBasefee() external { + assertEq(_getBasefeeAndPrint(0, 0, 0), 317609019); + assertEq(_getBasefeeAndPrint(0, 1, 0), 317609019); + assertEq(_getBasefeeAndPrint(0, 1000000, 0), 320423332); + assertEq(_getBasefeeAndPrint(0, 5000000, 0), 332018053); + assertEq(_getBasefeeAndPrint(0, 10000000, 0), 347305199); + + assertEq(_getBasefeeAndPrint(100, 0, 0), 54544902); + assertEq(_getBasefeeAndPrint(100, 1, 0), 54544902); + assertEq(_getBasefeeAndPrint(100, 1000000, 0), 55028221); + assertEq(_getBasefeeAndPrint(100, 5000000, 0), 57019452); + assertEq(_getBasefeeAndPrint(100, 10000000, 0), 59644805); + } + + function _getBasefeeAndPrint( + uint32 timeSinceNow, + uint64 gasLimit, + uint64 parentGasUsed + ) private returns (uint64 _basefee) { + uint256 timeSinceParent = timeSinceNow + + block.timestamp - + L2.parentTimestamp(); + uint256 gasIssued = L2.gasIssuedPerSecond() * timeSinceParent; + string memory msg = string.concat( + "#", + Strings.toString(logIndex++), + ": gasExcess=", + Strings.toString(L2.gasExcess()), + ", timeSinceParent=", + Strings.toString(timeSinceParent), + ", gasIssued=", + Strings.toString(gasIssued), + ", gasLimit=", + Strings.toString(gasLimit), + ", parentGasUsed=", + Strings.toString(parentGasUsed) + ); + _basefee = L2.getBasefee(timeSinceNow, gasLimit, parentGasUsed); + + msg = string.concat( + msg, + ", gasExcess(changed)=", + Strings.toString(L2.gasExcess()), + ", basefee=", + Strings.toString(_basefee) + ); + + console2.log(msg); + } + + function _getBasefeeAndPrint( + uint32 timeSinceNow, + uint64 gasLimit + ) private returns (uint64 _basefee) { + return + _getBasefeeAndPrint( + timeSinceNow, + gasLimit, + gasLimit + ANCHOR_GAS_COST + ); + } + + function _anchor(uint64 parentGasLimit) private { + L2.anchor( + keccak256("a"), + keccak256("b"), + 12345, + parentGasLimit + ANCHOR_GAS_COST + ); + } } diff --git a/packages/website/pages/docs/reference/contract-documentation/L1/TaikoData.md b/packages/website/pages/docs/reference/contract-documentation/L1/TaikoData.md index 12e85529087..ae201800cd3 100644 --- a/packages/website/pages/docs/reference/contract-documentation/L1/TaikoData.md +++ b/packages/website/pages/docs/reference/contract-documentation/L1/TaikoData.md @@ -26,9 +26,7 @@ struct Config { uint256 rewardBurnBips; uint256 proposerDepositPctg; uint256 feeBaseMAF; - uint64 bootstrapDiscountHalvingPeriod; - uint64 constantFeeRewardBlocks; - uint64 txListCacheExpiry; + uint256 txListCacheExpiry; bool enableSoloProposer; bool enableOracleProver; bool enableTokenomics; @@ -73,13 +71,15 @@ struct BlockMetadata { uint64 id; uint64 timestamp; uint64 l1Height; - uint32 gasLimit; + uint64 l2Basefee; bytes32 l1Hash; bytes32 mixHash; bytes32 txListHash; uint24 txListByteStart; uint24 txListByteEnd; + uint32 gasLimit; address beneficiary; + address treasure; } ``` @@ -157,10 +157,10 @@ struct State { uint64 lastProposedAt; uint64 avgBlockTime; uint64 __reserved3; - uint64 __reserved4; uint64 lastVerifiedBlockId; + uint64 __reserved4; uint64 avgProofTime; uint64 feeBase; - uint256[42] __gap; + uint256[43] __gap; } ``` diff --git a/packages/website/pages/docs/reference/contract-documentation/L1/TaikoErrors.md b/packages/website/pages/docs/reference/contract-documentation/L1/TaikoErrors.md index abf6e6d91e9..0857d6e2950 100644 --- a/packages/website/pages/docs/reference/contract-documentation/L1/TaikoErrors.md +++ b/packages/website/pages/docs/reference/contract-documentation/L1/TaikoErrors.md @@ -1,5 +1,17 @@ ## TaikoErrors +### L1_1559_X_SCALE_TOO_LARGE + +```solidity +error L1_1559_X_SCALE_TOO_LARGE() +``` + +### L1_1559_Y_SCALE_TOO_LARGE + +```solidity +error L1_1559_Y_SCALE_TOO_LARGE() +``` + ### L1_ALREADY_PROVEN ```solidity @@ -21,7 +33,7 @@ error L1_CONTRACT_NOT_ALLOWED() ### L1_EVIDENCE_MISMATCH ```solidity -error L1_EVIDENCE_MISMATCH() +error L1_EVIDENCE_MISMATCH(bytes32 expected, bytes32 actual) ``` ### L1_FORK_CHOICE_NOT_FOUND @@ -30,6 +42,12 @@ error L1_EVIDENCE_MISMATCH() error L1_FORK_CHOICE_NOT_FOUND() ``` +### L1_INSUFFICIENT_ETHER + +```solidity +error L1_INSUFFICIENT_ETHER() +``` + ### L1_INSUFFICIENT_TOKEN ```solidity @@ -48,6 +66,12 @@ error L1_INVALID_CONFIG() error L1_INVALID_EVIDENCE() ``` +### L1_INVALID_L21559_PARAMS + +```solidity +error L1_INVALID_L21559_PARAMS() +``` + ### L1_INVALID_METADATA ```solidity diff --git a/packages/website/pages/docs/reference/contract-documentation/L1/TaikoL1.md b/packages/website/pages/docs/reference/contract-documentation/L1/TaikoL1.md index 29eac1c1433..c71c722c9ef 100644 --- a/packages/website/pages/docs/reference/contract-documentation/L1/TaikoL1.md +++ b/packages/website/pages/docs/reference/contract-documentation/L1/TaikoL1.md @@ -9,9 +9,19 @@ struct TaikoData.State state ### init ```solidity -function init(address _addressManager, bytes32 _genesisBlockHash, uint64 _feeBase) external +function init(address _addressManager, uint64 _feeBase, bytes32 _genesisBlockHash) external ``` +Initialize the rollup. + +#### Parameters + +| Name | Type | Description | +| ------------------ | ------- | ------------------------------------------------------------ | +| \_addressManager | address | The AddressManager address. | +| \_feeBase | uint64 | The initial value of the proposer-fee/prover-reward feeBase. | +| \_genesisBlockHash | bytes32 | The block hash of the genesis block. | + ### proposeBlock ```solidity diff --git a/packages/website/pages/docs/reference/contract-documentation/L2/TaikoL2.md b/packages/website/pages/docs/reference/contract-documentation/L2/TaikoL2.md index 378cd881c69..12f80dc0d11 100644 --- a/packages/website/pages/docs/reference/contract-documentation/L2/TaikoL2.md +++ b/packages/website/pages/docs/reference/contract-documentation/L2/TaikoL2.md @@ -1,5 +1,11 @@ ## TaikoL2 +### ANCHOR_GAS_COST + +```solidity +uint64 ANCHOR_GAS_COST +``` + ### VerifiedBlock ```solidity @@ -9,22 +15,82 @@ struct VerifiedBlock { } ``` +### EIP1559Params + +```solidity +struct EIP1559Params { + uint64 basefee; + uint64 gasIssuedPerSecond; + uint64 gasExcessMax; + uint64 gasTarget; + uint64 ratio2x1x; +} +``` + ### publicInputHash ```solidity bytes32 publicInputHash ``` +### yscale + +```solidity +uint128 yscale +``` + +### xscale + +```solidity +uint64 xscale +``` + +### gasIssuedPerSecond + +```solidity +uint64 gasIssuedPerSecond +``` + +### parentTimestamp + +```solidity +uint64 parentTimestamp +``` + ### latestSyncedL1Height ```solidity -uint256 latestSyncedL1Height +uint64 latestSyncedL1Height +``` + +### gasExcess + +```solidity +uint64 gasExcess +``` + +### \_\_reserved1 + +```solidity +uint64 __reserved1 ``` ### BlockVars ```solidity -event BlockVars(uint256 number, bytes32 parentHash, uint256 timestamp, uint256 basefee, uint256 prevrandao, address coinbase, uint256 gaslimit, uint256 chainid) +event BlockVars(uint64 number, uint64 basefee, uint64 gaslimit, uint64 timestamp, bytes32 parentHash, uint256 prevrandao, address coinbase, uint32 chainid) +``` + +### L2_BASEFEE_MISMATCH + +```solidity +error L2_BASEFEE_MISMATCH(uint64 expected, uint64 actual) +``` + +### L2_INVALID_1559_PARAMS + +```solidity +error L2_INVALID_1559_PARAMS() ``` ### L2_INVALID_CHAIN_ID @@ -42,7 +108,7 @@ error L2_INVALID_SENDER() ### L2_PUBLIC_INPUT_HASH_MISMATCH ```solidity -error L2_PUBLIC_INPUT_HASH_MISMATCH() +error L2_PUBLIC_INPUT_HASH_MISMATCH(bytes32 expected, bytes32 actual) ``` ### L2_TOO_LATE @@ -51,16 +117,28 @@ error L2_PUBLIC_INPUT_HASH_MISMATCH() error L2_TOO_LATE() ``` +### M1559_UNEXPECTED_CHANGE + +```solidity +error M1559_UNEXPECTED_CHANGE(uint64 expected, uint64 actual) +``` + +### M1559_OUT_OF_STOCK + +```solidity +error M1559_OUT_OF_STOCK() +``` + ### init ```solidity -function init(address _addressManager) external +function init(address _addressManager, struct TaikoL2.EIP1559Params _param1559) external ``` ### anchor ```solidity -function anchor(uint256 l1Height, bytes32 l1Hash, bytes32 l1SignalRoot) external +function anchor(bytes32 l1Hash, bytes32 l1SignalRoot, uint64 l1Height, uint64 parentGasUsed) external ``` Persist the latest L1 block height and hash to L2 for cross-layer @@ -78,11 +156,18 @@ This transaction shall be the first transaction in every L2 block. #### Parameters -| Name | Type | Description | -| ------------ | ------- | --------------------------------------------------------- | -| l1Height | uint256 | The latest L1 block height when this block was proposed. | -| l1Hash | bytes32 | The latest L1 block hash when this block was proposed. | -| l1SignalRoot | bytes32 | The latest value of the L1 "signal service storage root". | +| Name | Type | Description | +| ------------- | ------- | --------------------------------------------------------- | +| l1Hash | bytes32 | The latest L1 block hash when this block was proposed. | +| l1SignalRoot | bytes32 | The latest value of the L1 "signal service storage root". | +| l1Height | uint64 | The latest L1 block height when this block was proposed. | +| parentGasUsed | uint64 | the gas used in the parent block. | + +### getBasefee + +```solidity +function getBasefee(uint32 timeSinceNow, uint64 gasLimit, uint64 parentGasUsed) public view returns (uint64 _basefee) +``` ### getXchainBlockHash From 112c45b47140b2e06506ea81f2beb49836f82c9f Mon Sep 17 00:00:00 2001 From: Daniel Wang Date: Wed, 5 Apr 2023 13:26:24 +0800 Subject: [PATCH 20/47] fix --- packages/protocol/.gas-snapshot | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) create mode 100644 packages/protocol/.gas-snapshot diff --git a/packages/protocol/.gas-snapshot b/packages/protocol/.gas-snapshot new file mode 100644 index 00000000000..9c77a8c5dd8 --- /dev/null +++ b/packages/protocol/.gas-snapshot @@ -0,0 +1,31 @@ +GasComparisonTest:testCompare_hashKey() (gas: 8911) +GasComparisonTest:testCompare_hashString(uint256) (runs: 256, μ: 13091, ~: 12617) +GasComparisonTest:testCompare_hashTwo() (gas: 6991) +GasComparisonTest:testCompare_increment(uint256) (runs: 256, μ: 256896, ~: 210364) +GasComparisonTest:testCompare_loadBlockMetadata() (gas: 16191) +GasComparisonTest:testCompare_return() (gas: 8617) +GasComparisonTest:testCompare_send0Ether() (gas: 6531) +LibFixedPointMathTest:testExp1() (gas: 697) +LibFixedPointMathTest:testExp3() (gas: 1533) +LibFixedPointMathTest:testExpGas() (gas: 5328) +LibFixedPointMathTest:testExpLargest() (gas: 3929) +LibFixedPointMathTest:testExpSmallest() (gas: 3909) +LibFixedPointMathTest:testExpSome() (gas: 3827) +TaikoL1Test:test_block_time_decreases_but_fee_remains() (gas: 14868515) +TaikoL1Test:test_block_time_increases_and_fee_decreases() (gas: 14862630) +TaikoL1Test:test_more_blocks_than_ring_buffer_size() (gas: 16845131) +TaikoL1Test:test_multiple_blocks_in_one_L1_block() (gas: 671686) +TaikoL1Test:test_verifying_multiple_blocks_once() (gas: 2827699) +TestLib1559Math:test1559_2X1XRatio(uint16) (runs: 256, μ: 489986, ~: 489986) +TestLib1559Math:test1559_SpecalCases(uint16) (runs: 256, μ: 19937, ~: 19937) +TestLibTokenomics:testTokenomicsFeeCalcWithNonZeroStartBips() (gas: 4930) +TestLibTokenomics:testTokenomicsFeeCalcWithZeroStartBips() (gas: 4875) +TestLibTokenomics:testTokenomicsRewardCalcWithNonZeroStartBips() (gas: 5571) +TestLibTokenomics:testTokenomicsRewardCalcWithZeroStartBips() (gas: 4799) +TestTaikoL2:testAnchorSigning(bytes32) (runs: 256, μ: 23542, ~: 23563) +TestTaikoL2:testAnchorTxsBlocktimeConstant() (gas: 7245201) +TestTaikoL2:testAnchorTxsBlocktimeDecreasing() (gas: 2184915) +TestTaikoL2:testAnchorTxsBlocktimeIncreasing() (gas: 2046549) +TestTaikoL2:testAnchorTxsFailByNonTaikoL2Signer() (gas: 62542) +TestTaikoL2:testAnchorTxsFailInTheSameBlock() (gas: 161344) +TestTaikoL2:testGetBasefee() (gas: 229572) \ No newline at end of file From d9d8d2729c0e6e8c525b6b991051637afdf0d9df Mon Sep 17 00:00:00 2001 From: Daniel Wang <99078276+dantaik@users.noreply.github.com> Date: Wed, 5 Apr 2023 21:59:25 +0800 Subject: [PATCH 21/47] Update packages/protocol/contracts/L1/TaikoData.sol Co-authored-by: David --- packages/protocol/contracts/L1/TaikoData.sol | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/protocol/contracts/L1/TaikoData.sol b/packages/protocol/contracts/L1/TaikoData.sol index 2286e5e6fbe..9360f486dbb 100644 --- a/packages/protocol/contracts/L1/TaikoData.sol +++ b/packages/protocol/contracts/L1/TaikoData.sol @@ -60,7 +60,7 @@ library TaikoData { } // 6 slots - // Changing this struct requires chaing LibUtils.hashMetadata accordingly. + // Changing this struct requires changing LibUtils.hashMetadata accordingly. struct BlockMetadata { uint64 id; uint64 timestamp; From 887008b3c28a91200cd21b6efada790dcde86fae Mon Sep 17 00:00:00 2001 From: Daniel Wang Date: Wed, 5 Apr 2023 22:01:55 +0800 Subject: [PATCH 22/47] cleanup --- packages/protocol/contracts/L1/TaikoData.sol | 1 - packages/protocol/contracts/L1/libs/LibProposing.sol | 1 - packages/protocol/contracts/L1/libs/LibUtils.sol | 3 +-- packages/protocol/test2/GasComparison.t.sol | 2 -- packages/protocol/test2/TaikoL1TestBase.t.sol | 1 - 5 files changed, 1 insertion(+), 7 deletions(-) diff --git a/packages/protocol/contracts/L1/TaikoData.sol b/packages/protocol/contracts/L1/TaikoData.sol index 9360f486dbb..b800440fcc7 100644 --- a/packages/protocol/contracts/L1/TaikoData.sol +++ b/packages/protocol/contracts/L1/TaikoData.sol @@ -65,7 +65,6 @@ library TaikoData { uint64 id; uint64 timestamp; uint64 l1Height; - uint64 l2Basefee; bytes32 l1Hash; bytes32 mixHash; bytes32 txListHash; diff --git a/packages/protocol/contracts/L1/libs/LibProposing.sol b/packages/protocol/contracts/L1/libs/LibProposing.sol index 8dd15c47278..f03431bec32 100644 --- a/packages/protocol/contracts/L1/libs/LibProposing.sol +++ b/packages/protocol/contracts/L1/libs/LibProposing.sol @@ -70,7 +70,6 @@ library LibProposing { id: state.numBlocks, timestamp: uint64(block.timestamp), l1Height: uint64(block.number - 1), - l2Basefee: 0, // will be set later l1Hash: blockhash(block.number - 1), mixHash: bytes32(block.prevrandao * state.numBlocks), txListHash: input.txListHash, diff --git a/packages/protocol/contracts/L1/libs/LibUtils.sol b/packages/protocol/contracts/L1/libs/LibUtils.sol index acc2aa2fcf5..c27bdf5e288 100644 --- a/packages/protocol/contracts/L1/libs/LibUtils.sol +++ b/packages/protocol/contracts/L1/libs/LibUtils.sol @@ -79,8 +79,7 @@ library LibUtils { inputs[0] = (uint256(meta.id) << 192) | (uint256(meta.timestamp) << 128) | - (uint256(meta.l1Height) << 64) | - uint256(meta.l2Basefee); + (uint256(meta.l1Height) << 64); inputs[1] = uint256(meta.l1Hash); inputs[2] = uint256(meta.mixHash); diff --git a/packages/protocol/test2/GasComparison.t.sol b/packages/protocol/test2/GasComparison.t.sol index c9b6547ff6f..5f16d56c025 100644 --- a/packages/protocol/test2/GasComparison.t.sol +++ b/packages/protocol/test2/GasComparison.t.sol @@ -86,7 +86,6 @@ contract FooBar { txListByteStart: 0, txListByteEnd: 1000, gasLimit: 1, - l2Basefee: 1000000, mixHash: bytes32(uint256(1)), timestamp: 1 }); @@ -103,7 +102,6 @@ contract FooBar { txListByteStart: 0, txListByteEnd: 1000, gasLimit: 1, - l2Basefee: 1000000, mixHash: bytes32(uint256(1)), timestamp: 1 }); diff --git a/packages/protocol/test2/TaikoL1TestBase.t.sol b/packages/protocol/test2/TaikoL1TestBase.t.sol index ead9a2f5f74..70bcf042e83 100644 --- a/packages/protocol/test2/TaikoL1TestBase.t.sol +++ b/packages/protocol/test2/TaikoL1TestBase.t.sol @@ -102,7 +102,6 @@ abstract contract TaikoL1TestBase is Test { meta.id = variables.numBlocks; meta.timestamp = uint64(block.timestamp); meta.l1Height = uint64(block.number - 1); - meta.l2Basefee = 0; meta.l1Hash = blockhash(block.number - 1); meta.mixHash = bytes32(_mixHash); meta.txListHash = keccak256(txList); From ac52f45d0a27fa0be7ee51efea10da1eb07a4d4b Mon Sep 17 00:00:00 2001 From: Daniel Wang Date: Wed, 5 Apr 2023 22:02:34 +0800 Subject: [PATCH 23/47] more --- .../pages/docs/reference/contract-documentation/L1/TaikoData.md | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/website/pages/docs/reference/contract-documentation/L1/TaikoData.md b/packages/website/pages/docs/reference/contract-documentation/L1/TaikoData.md index ae201800cd3..92fe047b3be 100644 --- a/packages/website/pages/docs/reference/contract-documentation/L1/TaikoData.md +++ b/packages/website/pages/docs/reference/contract-documentation/L1/TaikoData.md @@ -71,7 +71,6 @@ struct BlockMetadata { uint64 id; uint64 timestamp; uint64 l1Height; - uint64 l2Basefee; bytes32 l1Hash; bytes32 mixHash; bytes32 txListHash; From e5251ddae1069f63e9a9e0c1e425a8f2776fccda Mon Sep 17 00:00:00 2001 From: Daniel Wang Date: Wed, 5 Apr 2023 22:13:10 +0800 Subject: [PATCH 24/47] more --- packages/protocol/test2/TaikoL1.t.sol | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/protocol/test2/TaikoL1.t.sol b/packages/protocol/test2/TaikoL1.t.sol index 96334e76212..caeeffb99a9 100644 --- a/packages/protocol/test2/TaikoL1.t.sol +++ b/packages/protocol/test2/TaikoL1.t.sol @@ -12,7 +12,7 @@ import {SignalService} from "../contracts/signal/SignalService.sol"; import {Strings} from "@openzeppelin/contracts/utils/Strings.sol"; import {TaikoL1TestBase} from "./TaikoL1TestBase.t.sol"; -contract TaikoL1WithConfig is TaikoL1 { +contract TaikoL1_a is TaikoL1 { function getConfig() public pure @@ -52,7 +52,7 @@ contract Verifier { contract TaikoL1Test is TaikoL1TestBase { function deployTaikoL1() internal override returns (TaikoL1 taikoL1) { - taikoL1 = new TaikoL1WithConfig(); + taikoL1 = new TaikoL1_a(); } function setUp() public override { From 39d66e5c4ba20b04564a83533d740962a6f9b6ca Mon Sep 17 00:00:00 2001 From: Daniel Wang Date: Thu, 6 Apr 2023 13:27:03 +0800 Subject: [PATCH 25/47] recommend changes --- packages/protocol/contracts/L2/TaikoL2.sol | 15 ++++++-------- packages/protocol/test2/TaikoL2.t.sol | 20 +++++++++---------- .../contract-documentation/L2/TaikoL2.md | 2 +- 3 files changed, 17 insertions(+), 20 deletions(-) diff --git a/packages/protocol/contracts/L2/TaikoL2.sol b/packages/protocol/contracts/L2/TaikoL2.sol index 8c13c383310..ff7754c5c9b 100644 --- a/packages/protocol/contracts/L2/TaikoL2.sol +++ b/packages/protocol/contracts/L2/TaikoL2.sol @@ -183,7 +183,7 @@ contract TaikoL2 is EssentialContract, TaikoL2Signer, IXchainSync { emit XchainSynced(l1Height, l1Hash, l1SignalRoot); // Check EIP-1559 basefee - uint64 basefee; + uint256 basefee; if (gasIssuedPerSecond != 0) { (basefee, gasExcess) = _calcBasefee( block.timestamp - parentTimestamp, @@ -193,7 +193,7 @@ contract TaikoL2 is EssentialContract, TaikoL2Signer, IXchainSync { } if (block.basefee != basefee) - revert L2_BASEFEE_MISMATCH(basefee, uint64(block.basefee)); + revert L2_BASEFEE_MISMATCH(uint64(basefee), uint64(block.basefee)); parentTimestamp = uint64(block.timestamp); @@ -203,7 +203,7 @@ contract TaikoL2 is EssentialContract, TaikoL2Signer, IXchainSync { emit BlockVars({ number: uint64(block.number), - basefee: basefee, + basefee: uint64(basefee), gaslimit: uint64(block.gaslimit), timestamp: uint64(block.timestamp), parentHash: parentHash, @@ -221,7 +221,7 @@ contract TaikoL2 is EssentialContract, TaikoL2Signer, IXchainSync { uint32 timeSinceNow, uint64 gasLimit, uint64 parentGasUsed - ) public view returns (uint64 _basefee) { + ) public view returns (uint256 _basefee) { (_basefee, ) = _calcBasefee( timeSinceNow + block.timestamp - parentTimestamp, gasLimit, @@ -286,7 +286,7 @@ contract TaikoL2 is EssentialContract, TaikoL2Signer, IXchainSync { uint256 timeSinceParent, uint64 gasLimit, uint64 parentGasUsed - ) private view returns (uint64 _basefee, uint64 _gasExcess) { + ) private view returns (uint256 _basefee, uint64 _gasExcess) { // Very important to cap _gasExcess uint64 uint64 parentGasUsedNet = parentGasUsed > ANCHOR_GAS_COST ? parentGasUsed - ANCHOR_GAS_COST @@ -296,14 +296,11 @@ contract TaikoL2 is EssentialContract, TaikoL2Signer, IXchainSync { uint256 b = gasIssuedPerSecond * timeSinceParent; _gasExcess = uint64((a.max(b) - b).min(type(uint64).max)); - uint256 __basefee = Lib1559Math.calculatePrice({ + _basefee = Lib1559Math.calculatePrice({ xscale: xscale, yscale: yscale, xExcess: _gasExcess, xPurchase: gasLimit }); - - // Very important to cap basefee uint64 - _basefee = uint64(__basefee.min(type(uint64).max)); } } diff --git a/packages/protocol/test2/TaikoL2.t.sol b/packages/protocol/test2/TaikoL2.t.sol index 0106deeb1b5..b58b17e8ead 100644 --- a/packages/protocol/test2/TaikoL2.t.sol +++ b/packages/protocol/test2/TaikoL2.t.sol @@ -36,9 +36,9 @@ contract TestTaikoL2 is Test { } function testAnchorTxsBlocktimeConstant() external { - uint64 firstBasefee; + uint256 firstBasefee; for (uint256 i = 0; i < 100; i++) { - uint64 basefee = _getBasefeeAndPrint(0, BLOCK_GAS_LIMIT); + uint256 basefee = _getBasefeeAndPrint(0, BLOCK_GAS_LIMIT); vm.fee(basefee); if (firstBasefee == 0) { @@ -56,10 +56,10 @@ contract TestTaikoL2 is Test { } function testAnchorTxsBlocktimeDecreasing() external { - uint64 prevBasefee; + uint256 prevBasefee; for (uint256 i = 0; i < 32; i++) { - uint64 basefee = _getBasefeeAndPrint(0, BLOCK_GAS_LIMIT); + uint256 basefee = _getBasefeeAndPrint(0, BLOCK_GAS_LIMIT); vm.fee(basefee); assertGe(basefee, prevBasefee); @@ -74,10 +74,10 @@ contract TestTaikoL2 is Test { } function testAnchorTxsBlocktimeIncreasing() external { - uint64 prevBasefee; + uint256 prevBasefee; for (uint256 i = 0; i < 30; i++) { - uint64 basefee = _getBasefeeAndPrint(0, BLOCK_GAS_LIMIT); + uint256 basefee = _getBasefeeAndPrint(0, BLOCK_GAS_LIMIT); vm.fee(basefee); if (prevBasefee != 0) { @@ -96,7 +96,7 @@ contract TestTaikoL2 is Test { // calling anchor in the same block more than once should fail function testAnchorTxsFailInTheSameBlock() external { - uint64 expectedBasefee = _getBasefeeAndPrint(0, BLOCK_GAS_LIMIT); + uint256 expectedBasefee = _getBasefeeAndPrint(0, BLOCK_GAS_LIMIT); vm.fee(expectedBasefee); vm.prank(L2.GOLDEN_TOUCH_ADDRESS()); @@ -109,7 +109,7 @@ contract TestTaikoL2 is Test { // calling anchor in the same block more than once should fail function testAnchorTxsFailByNonTaikoL2Signer() external { - uint64 expectedBasefee = _getBasefeeAndPrint(0, BLOCK_GAS_LIMIT); + uint256 expectedBasefee = _getBasefeeAndPrint(0, BLOCK_GAS_LIMIT); vm.fee(expectedBasefee); vm.expectRevert(); _anchor(BLOCK_GAS_LIMIT); @@ -149,7 +149,7 @@ contract TestTaikoL2 is Test { uint32 timeSinceNow, uint64 gasLimit, uint64 parentGasUsed - ) private returns (uint64 _basefee) { + ) private returns (uint256 _basefee) { uint256 timeSinceParent = timeSinceNow + block.timestamp - L2.parentTimestamp(); @@ -184,7 +184,7 @@ contract TestTaikoL2 is Test { function _getBasefeeAndPrint( uint32 timeSinceNow, uint64 gasLimit - ) private returns (uint64 _basefee) { + ) private returns (uint256 _basefee) { return _getBasefeeAndPrint( timeSinceNow, diff --git a/packages/website/pages/docs/reference/contract-documentation/L2/TaikoL2.md b/packages/website/pages/docs/reference/contract-documentation/L2/TaikoL2.md index 12f80dc0d11..83876f342a8 100644 --- a/packages/website/pages/docs/reference/contract-documentation/L2/TaikoL2.md +++ b/packages/website/pages/docs/reference/contract-documentation/L2/TaikoL2.md @@ -166,7 +166,7 @@ This transaction shall be the first transaction in every L2 block. ### getBasefee ```solidity -function getBasefee(uint32 timeSinceNow, uint64 gasLimit, uint64 parentGasUsed) public view returns (uint64 _basefee) +function getBasefee(uint32 timeSinceNow, uint64 gasLimit, uint64 parentGasUsed) public view returns (uint256 _basefee) ``` ### getXchainBlockHash From 6af8a92a0e934773e3811da9592e7c58f42387e3 Mon Sep 17 00:00:00 2001 From: David Date: Thu, 6 Apr 2023 14:06:23 +0800 Subject: [PATCH 26/47] chore(protocol): update L1 deployment script to set treasure address (#13545) --- packages/protocol/script/DeployOnL1.s.sol | 4 ++++ packages/protocol/script/deploy_on_l1.sh | 5 +---- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/packages/protocol/script/DeployOnL1.s.sol b/packages/protocol/script/DeployOnL1.s.sol index d3ef4e57a3f..d58235d02f4 100644 --- a/packages/protocol/script/DeployOnL1.s.sol +++ b/packages/protocol/script/DeployOnL1.s.sol @@ -36,6 +36,8 @@ contract DeployOnL1 is Script, AddressResolver { address public soloProposer = vm.envAddress("SOLO_PROPOSER"); + address public treasure = vm.envAddress("TREASURE"); + address public taikoTokenPremintRecipient = vm.envAddress("TAIKO_TOKEN_PREMINT_RECIPIENT"); @@ -50,6 +52,7 @@ contract DeployOnL1 is Script, AddressResolver { require(l2ChainId != block.chainid, "same chainid"); require(owner != address(0), "owner is zero"); require(taikoL2Address != address(0), "taikoL2Address is zero"); + require(treasure != address(0), "treasure is zero"); require( taikoTokenPremintRecipient != address(0), "taikoTokenPremintRecipient is zero" @@ -72,6 +75,7 @@ contract DeployOnL1 is Script, AddressResolver { setAddress(l2ChainId, "taiko", taikoL2Address); setAddress("oracle_prover", oracleProver); setAddress("solo_proposer", soloProposer); + setAddress(l2ChainId, "treasure", treasure); // TaikoToken TaikoToken taikoToken = new TaikoToken(); diff --git a/packages/protocol/script/deploy_on_l1.sh b/packages/protocol/script/deploy_on_l1.sh index 2ec0baa644b..6d1ceae95e7 100755 --- a/packages/protocol/script/deploy_on_l1.sh +++ b/packages/protocol/script/deploy_on_l1.sh @@ -10,12 +10,9 @@ OWNER=0x70997970C51812dc3A010C7d01b50e0d17dc79C8 \ TAIKO_L2_ADDRESS=0xa0Ee7A142d267C1f36714E4a8F75612F20a79720 \ TAIKO_TOKEN_PREMINT_RECIPIENT=0xa0Ee7A142d267C1f36714E4a8F75612F20a79720 \ TAIKO_TOKEN_PREMINT_AMOUNT=0xffff \ +TREASURE=0xa0Ee7A142d267C1f36714E4a8F75612F20a79720 \ L2_GENESIS_HASH=0xee1950562d42f0da28bd4550d88886bc90894c77c9c9eaefef775d4c8223f259 \ L2_CHAIN_ID=167001 \ -L2_GAS_EXCESS_MAX=3840000000 \ -L2_BASE_FEE=5000000000 \ -L2_GAS_TARGET=6000000 \ -L2_EXPECTED_2X1X_RATIO=111 \ forge script script/DeployOnL1.s.sol:DeployOnL1 \ --fork-url http://localhost:8545 \ --broadcast \ From 0509218ecaf6310c71128130b7ad7eefc601b868 Mon Sep 17 00:00:00 2001 From: David Date: Thu, 6 Apr 2023 15:15:34 +0800 Subject: [PATCH 27/47] feat(protocol): refactor L2 genesis generation scripts / tests by foundry && update `ANCHOR_GAS_COST` (#13541) Co-authored-by: Daniel Wang <99078276+dantaik@users.noreply.github.com> --- .github/workflows/protocol.yml | 2 +- packages/protocol/README.md | 10 +- .../protocol/contracts/L1/TaikoConfig.sol | 4 +- packages/protocol/contracts/L2/TaikoL2.sol | 3 +- packages/protocol/foundry.toml | 9 +- packages/protocol/package.json | 2 +- .../test/genesis/generate_genesis.test.ts | 325 ------------------ packages/protocol/test2/Lib1559Math.sol | 2 +- packages/protocol/test2/LibTokenomics.t.sol | 2 +- packages/protocol/test2/TaikoL1.t.sol | 2 +- packages/protocol/test2/TaikoL1TestBase.t.sol | 2 +- .../test2/genesis/GenerateGenesis.t.sol | 213 ++++++++++++ .../genesis/generate_genesis.test.sh | 42 ++- .../{test => test2}/genesis/test_config.json | 68 +--- .../genesis/testnet/docker-compose.yml | 0 .../genesis/testnet/init_geth.sh | 0 .../protocol/utils/generate_genesis/erc20.ts | 8 +- .../utils/generate_genesis/interface.ts | 1 + .../utils/generate_genesis/taikoL2.ts | 57 +-- 19 files changed, 329 insertions(+), 423 deletions(-) delete mode 100644 packages/protocol/test/genesis/generate_genesis.test.ts create mode 100644 packages/protocol/test2/genesis/GenerateGenesis.t.sol rename packages/protocol/{test => test2}/genesis/generate_genesis.test.sh (66%) rename packages/protocol/{test => test2}/genesis/test_config.json (54%) rename packages/protocol/{test => test2}/genesis/testnet/docker-compose.yml (100%) rename packages/protocol/{test => test2}/genesis/testnet/init_geth.sh (100%) diff --git a/.github/workflows/protocol.yml b/.github/workflows/protocol.yml index a59d3f9a298..b35ae667e33 100644 --- a/.github/workflows/protocol.yml +++ b/.github/workflows/protocol.yml @@ -55,7 +55,7 @@ jobs: working-directory: ./packages/protocol run: pnpm test:coverage - - name: protocol - Generate Genesis (hardhat) + - name: protocol - Generate Genesis (foundry) working-directory: ./packages/protocol run: pnpm test:genesis diff --git a/packages/protocol/README.md b/packages/protocol/README.md index 39fa49340d4..d987a33b91c 100644 --- a/packages/protocol/README.md +++ b/packages/protocol/README.md @@ -32,16 +32,20 @@ Start by creating a `config.json`, for example: { // Owner address of the pre-deployed L2 contracts. "contractOwner": "0xDf08F82De32B8d460adbE8D72043E3a7e25A3B39", - // Chain ID of the Taiko L2 network. "chainId": 167, - // Account address and pre-mint ETH amount as key-value pairs. "seedAccounts": [ { "0xDf08F82De32B8d460adbE8D72043E3a7e25A3B39": 1024 }, { "0x79fcdef22feed20eddacbb2587640e45491b757f": 1024 } ], - + // L2 EIP-1559 baseFee calculation related fields. + "param1559": { + "yscale": "358298803609133338137582400989", + "xscale": "1488514844", + "gasIssuedPerSecond": "12500000", + "gasExcess": "45450000000" + }, // Option to pre-deploy an ERC-20 token. "predeployERC20": true } diff --git a/packages/protocol/contracts/L1/TaikoConfig.sol b/packages/protocol/contracts/L1/TaikoConfig.sol index 92209a52902..73259836337 100644 --- a/packages/protocol/contracts/L1/TaikoConfig.sol +++ b/packages/protocol/contracts/L1/TaikoConfig.sol @@ -17,13 +17,13 @@ library TaikoConfig { maxNumProposedBlocks: 120960, ringBufferSize: 120960 + 10, maxNumVerifiedBlocks: 4096, - //Each time one more block is verified, there will be ~20k + // Each time one more block is verified, there will be ~20k // more gas cost. maxVerificationsPerTx: 10, // Set it to 6M, since its the upper limit of the Alpha-2 // testnet's circuits. blockMaxGasLimit: 6000000, - // Set it to 79 (+1 TaikoL2.anchor transaction = 80), + // Set it to 79 (+1 TaikoL2.anchor transaction = 80), // and 80 is the upper limit of the Alpha-2 testnet's circuits. maxTransactionsPerBlock: 79, // Set it to 120KB, since 128KB is the upper size limit diff --git a/packages/protocol/contracts/L2/TaikoL2.sol b/packages/protocol/contracts/L2/TaikoL2.sol index ff7754c5c9b..ec0f314462f 100644 --- a/packages/protocol/contracts/L2/TaikoL2.sol +++ b/packages/protocol/contracts/L2/TaikoL2.sol @@ -19,8 +19,7 @@ contract TaikoL2 is EssentialContract, TaikoL2Signer, IXchainSync { using SafeCastUpgradeable for uint256; using LibMath for uint256; - // TODO(david): need you to confirm this value. - uint64 public ANCHOR_GAS_COST = 47000; + uint64 public ANCHOR_GAS_COST = 150000; // owner:david struct VerifiedBlock { bytes32 blockHash; diff --git a/packages/protocol/foundry.toml b/packages/protocol/foundry.toml index 270d8ff083d..717b9ef3fdf 100644 --- a/packages/protocol/foundry.toml +++ b/packages/protocol/foundry.toml @@ -1,7 +1,6 @@ # See more config options https://github.com/foundry-rs/foundry/tree/master/config - - [profile.default] +solc-version = "0.8.18" src = 'contracts' out = 'out' test = 'test2' @@ -11,3 +10,9 @@ optimizer_runs = 200 # Do not change the block_gas_limit value, TaikoL2.t.sol depends on it. block_gas_limit = 30000000 #30M + +fs_permissions = [ + { access = "read", path = "./out"}, + { access = "read", path = "./deployments"}, + { access = "read", path = "./test2"} +] diff --git a/packages/protocol/package.json b/packages/protocol/package.json index 129c13f6251..674fe16334b 100644 --- a/packages/protocol/package.json +++ b/packages/protocol/package.json @@ -16,7 +16,7 @@ "test:coverage": "pnpm coverage", "test:foundry": "forge test -vvv --gas-report", "generate:genesis": "ts-node ./utils/generate_genesis/main.ts", - "test:genesis": "./test/genesis/generate_genesis.test.sh", + "test:genesis": "./test2/genesis/generate_genesis.test.sh", "test:bridge": "TEST_TYPE=integrationbridge ./test/test_integration.sh", "test:integration": "TEST_TYPE=integration ./test/test_integration.sh", "test:tokenomics": "TEST_TYPE=tokenomics ./test/test_integration.sh", diff --git a/packages/protocol/test/genesis/generate_genesis.test.ts b/packages/protocol/test/genesis/generate_genesis.test.ts deleted file mode 100644 index 93e49bd578d..00000000000 --- a/packages/protocol/test/genesis/generate_genesis.test.ts +++ /dev/null @@ -1,325 +0,0 @@ -import { expect } from "chai"; -import * as hre from "hardhat"; -import { txShouldRevertWithCustomError } from "../utils/errors"; - -const ethers = hre.ethers; -const action = process.env.TEST_L2_GENESIS ? describe : describe.skip; - -action("Generate Genesis", function () { - let alloc: any = null; - - if (process.env.TEST_L2_GENESIS) { - alloc = require("../../deployments/genesis_alloc.json"); - } - - const provider = new hre.ethers.providers.JsonRpcProvider( - "http://localhost:18545" - ); - - const signer = new hre.ethers.Wallet( - "2bdd21761a483f71054e14f5b827213567971c676928d9a1808cbfa4b7501200", - provider - ); - - const testConfig = require("./test_config"); - - const seedAccounts = testConfig.seedAccounts; - - before(async () => { - let retry = 0; - - while (true) { - try { - const network = await provider.getNetwork(); - if (network.chainId) break; - } catch (_) {} - - if (++retry > 10) { - throw new Error("geth initializing timeout"); - } - - await sleep(1000); - } - - console.log("geth initialized"); - }); - - it("contracts should be deployed", async function () { - for (const address of Object.keys(alloc)) { - if ( - seedAccounts - .map((seedAccount: any) => { - const accountAddress = Object.keys(seedAccount)[0]; - return accountAddress; - }) - .includes(address) - ) { - continue; - } - const code: string = await provider.getCode(address); - const expectCode: string = alloc[address].code; - - expect(code.toLowerCase()).to.be.equal(expectCode.toLowerCase()); - - if (testConfig.contractAddresses[alloc[address].contractName]) { - expect(address).to.be.equal( - testConfig.contractAddresses[alloc[address].contractName] - ); - } - } - }); - - it("premint ETH should be allocated", async function () { - let etherVaultBalance = hre.ethers.BigNumber.from("2").pow(128).sub(1); // MaxUint128 - - for (const seedAccount of seedAccounts) { - const accountAddress = Object.keys(seedAccount)[0]; - const balance = hre.ethers.utils.parseEther( - `${Object.values(seedAccount)[0]}` - ); - expect(await provider.getBalance(accountAddress)).to.be.equal( - balance.toHexString() - ); - - etherVaultBalance = etherVaultBalance.sub(balance); - } - - const etherVaultAddress = getContractAlloc("EtherVault").address; - - expect(await provider.getBalance(etherVaultAddress)).to.be.equal( - etherVaultBalance.toHexString() - ); - }); - - describe("contracts can be called normally", function () { - it("AddressManager", async function () { - const addressManagerAlloc = getContractAlloc("AddressManager"); - - const addressManager = new hre.ethers.Contract( - addressManagerAlloc.address, - require("../../artifacts/contracts/thirdparty/AddressManager.sol/AddressManager.json").abi, - signer - ); - - const owner = await addressManager.owner(); - - expect(owner).to.be.equal(testConfig.contractOwner); - - const bridge = await addressManager.getAddress( - `${testConfig.chainId}.bridge` - ); - - expect(bridge).to.be.equal(getContractAlloc("Bridge").address); - - const tokenVault = await addressManager.getAddress( - `${testConfig.chainId}.token_vault` - ); - - expect(tokenVault).to.be.equal( - getContractAlloc("TokenVault").address - ); - - const etherVault = await addressManager.getAddress( - `${testConfig.chainId}.ether_vault` - ); - - expect(etherVault).to.be.equal( - getContractAlloc("EtherVault").address - ); - - const taikoL2 = await addressManager.getAddress( - `${testConfig.chainId}.taiko` - ); - - expect(taikoL2).to.be.equal(getContractAlloc("TaikoL2").address); - - const signalService = await addressManager.getAddress( - `${testConfig.chainId}.signal_service` - ); - - expect(signalService).to.be.equal( - getContractAlloc("SignalService").address - ); - }); - - it("Bridge", async function () { - const BridgeAlloc = getContractAlloc("Bridge"); - const Bridge = new hre.ethers.Contract( - BridgeAlloc.address, - require("../../artifacts/contracts/bridge/Bridge.sol/Bridge.json").abi, - signer - ); - - const owner = await Bridge.owner(); - - expect(owner).to.be.equal(testConfig.contractOwner); - - const txPromise = ( - await Bridge.processMessage( - { - id: 0, - sender: ethers.Wallet.createRandom().address, - srcChainId: Math.floor(Math.random() * 1024), - destChainId: testConfig.chainId, - owner: ethers.Wallet.createRandom().address, - to: ethers.Wallet.createRandom().address, - refundAddress: ethers.constants.AddressZero, - depositValue: 0, - callValue: 0, - processingFee: 0, - gasLimit: 0, - data: ethers.utils.randomBytes(1024), - memo: "", - }, - ethers.utils.randomBytes(1024), - { - gasLimit: 5000000, - } - ) - ).wait(1); - - await txShouldRevertWithCustomError( - txPromise, - provider, - "B_FORBIDDEN()" - ); - }); - - it("TokenVault", async function () { - const TokenVaultAlloc = getContractAlloc("TokenVault"); - const TokenVault = new hre.ethers.Contract( - TokenVaultAlloc.address, - require("../../artifacts/contracts/bridge/TokenVault.sol/TokenVault.json").abi, - signer - ); - - const owner = await TokenVault.owner(); - - expect(owner).to.be.equal(testConfig.contractOwner); - - const addressManager = new hre.ethers.Contract( - getContractAlloc("AddressManager").address, - require("../../artifacts/contracts/thirdparty/AddressManager.sol/AddressManager.json").abi, - signer - ); - - await expect( - addressManager.setAddress( - "1.token_vault", - getContractAlloc("TokenVault").address - ) - ).not.to.be.reverted; - - await expect( - addressManager.setAddress( - "1.bridge", - getContractAlloc("Bridge").address - ) - ).not.to.be.reverted; - - await expect( - TokenVault.sendEther( - 1, - ethers.Wallet.createRandom().address, - 100, - 0, - ethers.Wallet.createRandom().address, - "memo", - { - gasLimit: 10000000, - value: hre.ethers.utils.parseEther("100"), - } - ) - ).to.emit(TokenVault, "EtherSent"); - }); - - it("EtherVault", async function () { - const EtherVault = new hre.ethers.Contract( - getContractAlloc("EtherVault").address, - require("../../artifacts/contracts/bridge/EtherVault.sol/EtherVault.json").abi, - signer - ); - - const owner = await EtherVault.owner(); - - expect(owner).to.be.equal(testConfig.contractOwner); - - expect( - await EtherVault.isAuthorized( - getContractAlloc("Bridge").address - ) - ).to.be.true; - - expect( - await EtherVault.isAuthorized( - ethers.Wallet.createRandom().address - ) - ).to.be.false; - }); - - it("SignalService", async function () { - const SignalService = new hre.ethers.Contract( - getContractAlloc("SignalService").address, - require("../../artifacts/contracts/signal/SignalService.sol/SignalService.json").abi, - signer - ); - - const owner = await SignalService.owner(); - - expect(owner).to.be.equal(testConfig.contractOwner); - - await expect( - SignalService.sendSignal(ethers.utils.randomBytes(32)) - ).not.to.reverted; - }); - - it("ERC20", async function () { - const ERC20 = new hre.ethers.Contract( - getContractAlloc("TestERC20").address, - require("../../artifacts/contracts/test/thirdparty/TestERC20.sol/TestERC20.json").abi, - signer - ); - - const { - TOKEN_NAME, - TOKEN_SYMBOL, - PREMINT_SEED_ACCOUNT_BALANCE, - } = require("../../utils/generate_genesis/erc20"); - - expect(await ERC20.name()).to.be.equal(TOKEN_NAME); - expect(await ERC20.symbol()).to.be.equal(TOKEN_SYMBOL); - - for (const seedAccount of seedAccounts) { - const accountAddress = Object.keys(seedAccount)[0]; - - expect(await ERC20.balanceOf(accountAddress)).to.be.equal( - PREMINT_SEED_ACCOUNT_BALANCE - ); - } - - expect(await ERC20.totalSupply()).to.be.equal( - seedAccounts.length * PREMINT_SEED_ACCOUNT_BALANCE - ); - - await expect( - ERC20.transfer(ethers.Wallet.createRandom().address, 1) - ).to.emit(ERC20, "Transfer"); - }); - }); - - function getContractAlloc(name: string): any { - for (const address of Object.keys(alloc)) { - if (alloc[address].contractName === name) { - return Object.assign(alloc[address], { address }); - } - } - - throw new Error(`contract alloc: ${name} not found`); - } -}); - -function sleep(ms: number) { - return new Promise((resolve) => { - setTimeout(resolve, ms); - }); -} diff --git a/packages/protocol/test2/Lib1559Math.sol b/packages/protocol/test2/Lib1559Math.sol index 528447b3fa2..4eee062fd65 100644 --- a/packages/protocol/test2/Lib1559Math.sol +++ b/packages/protocol/test2/Lib1559Math.sol @@ -1,4 +1,4 @@ -// SPDX-License-Identifier: UNLICENSED +// SPDX-License-Identifier: MIT pragma solidity ^0.8.18; import {Test} from "forge-std/Test.sol"; diff --git a/packages/protocol/test2/LibTokenomics.t.sol b/packages/protocol/test2/LibTokenomics.t.sol index b13c26e6f1a..bcdcc197d76 100644 --- a/packages/protocol/test2/LibTokenomics.t.sol +++ b/packages/protocol/test2/LibTokenomics.t.sol @@ -1,4 +1,4 @@ -// SPDX-License-Identifier: UNLICENSED +// SPDX-License-Identifier: MIT pragma solidity ^0.8.18; import {Test} from "forge-std/Test.sol"; diff --git a/packages/protocol/test2/TaikoL1.t.sol b/packages/protocol/test2/TaikoL1.t.sol index caeeffb99a9..165184dfd7d 100644 --- a/packages/protocol/test2/TaikoL1.t.sol +++ b/packages/protocol/test2/TaikoL1.t.sol @@ -1,4 +1,4 @@ -// SPDX-License-Identifier: UNLICENSED +// SPDX-License-Identifier: MIT pragma solidity ^0.8.18; import {Test} from "forge-std/Test.sol"; diff --git a/packages/protocol/test2/TaikoL1TestBase.t.sol b/packages/protocol/test2/TaikoL1TestBase.t.sol index 70bcf042e83..cb6bb00a394 100644 --- a/packages/protocol/test2/TaikoL1TestBase.t.sol +++ b/packages/protocol/test2/TaikoL1TestBase.t.sol @@ -1,4 +1,4 @@ -// SPDX-License-Identifier: UNLICENSED +// SPDX-License-Identifier: MIT pragma solidity ^0.8.18; import {Test} from "forge-std/Test.sol"; diff --git a/packages/protocol/test2/genesis/GenerateGenesis.t.sol b/packages/protocol/test2/genesis/GenerateGenesis.t.sol new file mode 100644 index 00000000000..d330483c56e --- /dev/null +++ b/packages/protocol/test2/genesis/GenerateGenesis.t.sol @@ -0,0 +1,213 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.18; + +import "forge-std/StdJson.sol"; +import "../../contracts/bridge/BridgeErrors.sol"; +import "../../contracts/bridge/IBridge.sol"; +import "../../contracts/common/AddressResolver.sol"; +import {Test} from "forge-std/Test.sol"; +import {console2} from "forge-std/console2.sol"; +import {TaikoL2} from "../../contracts/L2/TaikoL2.sol"; +import {AddressManager} from "../../contracts/thirdparty/AddressManager.sol"; +import {Bridge} from "../../contracts/bridge/Bridge.sol"; +import {TokenVault} from "../../contracts/bridge/TokenVault.sol"; +import {EtherVault} from "../../contracts/bridge/EtherVault.sol"; +import {SignalService} from "../../contracts/signal/SignalService.sol"; +import {LibBridgeStatus} from "../../contracts/bridge/libs/LibBridgeStatus.sol"; +import {TestERC20} from "../../contracts/test/thirdparty/TestERC20.sol"; + +contract TestGenerateGenesis is Test, AddressResolver { + using stdJson for string; + + string private configJSON = + vm.readFile( + string.concat(vm.projectRoot(), "/test2/genesis/test_config.json") + ); + string private genesisAllocJSON = + vm.readFile( + string.concat(vm.projectRoot(), "/deployments/genesis_alloc.json") + ); + address private owner = configJSON.readAddress(".contractOwner"); + uint64 public constant BLOCK_GAS_LIMIT = 30000000; + + function testContractDeployment() public { + assertEq(block.chainid, 167); + + checkDeployedCode("TaikoL2"); + checkDeployedCode("TokenVault"); + checkDeployedCode("EtherVault"); + checkDeployedCode("Bridge"); + checkDeployedCode("TestERC20"); + checkDeployedCode("AddressManager"); + checkDeployedCode("SignalService"); + } + + function testAddressManager() public { + AddressManager addressManager = AddressManager( + getPredeployedContractAddress("AddressManager") + ); + + assertEq(owner, addressManager.owner()); + + checkSavedAddress(addressManager, "Bridge", "bridge"); + checkSavedAddress(addressManager, "TokenVault", "token_vault"); + checkSavedAddress(addressManager, "EtherVault", "ether_vault"); + checkSavedAddress(addressManager, "TaikoL2", "taiko"); + checkSavedAddress(addressManager, "SignalService", "signal_service"); + } + + function testTaikoL2() public { + TaikoL2 taikoL2 = TaikoL2(getPredeployedContractAddress("TaikoL2")); + + vm.startPrank(taikoL2.GOLDEN_TOUCH_ADDRESS()); + for (uint64 i = 0; i < 300; i++) { + vm.roll(block.number + 1); + vm.warp(taikoL2.parentTimestamp() + 12); + vm.fee( + taikoL2.getBasefee( + 0, + BLOCK_GAS_LIMIT, + i + taikoL2.ANCHOR_GAS_COST() + ) + ); + + uint256 gasLeftBefore = gasleft(); + + taikoL2.anchor( + bytes32(block.prevrandao), + bytes32(block.prevrandao), + i, + i + taikoL2.ANCHOR_GAS_COST() + ); + + if (i == 299) { + console2.log( + "TaikoL2.anchor gas cost after 256 L2 blocks:", + gasLeftBefore - gasleft() + ); + } + } + vm.stopPrank(); + } + + function testBridge() public { + address payable bridgeAddress = payable( + getPredeployedContractAddress("Bridge") + ); + Bridge bridge = Bridge(bridgeAddress); + + assertEq(owner, bridge.owner()); + + vm.expectRevert(BridgeErrors.B_FORBIDDEN.selector); + bridge.processMessage( + IBridge.Message({ + id: 0, + sender: address(0), + srcChainId: 1, + destChainId: 167, + owner: address(0), + to: address(0), + refundAddress: address(0), + depositValue: 0, + callValue: 0, + processingFee: 0, + gasLimit: 0, + data: "", + memo: "" + }), + "" + ); + } + + function testTokenVault() public { + address tokenVaultAddress = getPredeployedContractAddress("TokenVault"); + address bridgeAddress = getPredeployedContractAddress("Bridge"); + + TokenVault tokenVault = TokenVault(tokenVaultAddress); + AddressManager addressManager = AddressManager( + getPredeployedContractAddress("AddressManager") + ); + + assertEq(owner, tokenVault.owner()); + + vm.startPrank(addressManager.owner()); + addressManager.setAddress(keyForName(1, "bridge"), bridgeAddress); + addressManager.setAddress( + keyForName(1, "token_vault"), + tokenVaultAddress + ); + vm.stopPrank(); + + tokenVault.sendEther{value: 1}( + 1, + tokenVault.owner(), + 100, + 0, + tokenVault.owner(), + "" + ); + } + + function testEtherVault() public { + address payable etherVaultAddress = payable( + getPredeployedContractAddress("EtherVault") + ); + EtherVault etherVault = EtherVault(etherVaultAddress); + + assertEq(owner, etherVault.owner()); + + assertEq( + etherVault.isAuthorized(getPredeployedContractAddress("Bridge")), + true + ); + assertEq(etherVault.isAuthorized(etherVault.owner()), false); + } + + function testSignalService() public { + SignalService signalService = SignalService( + getPredeployedContractAddress("SignalService") + ); + + assertEq(owner, signalService.owner()); + + signalService.sendSignal(bytes32(block.prevrandao)); + } + + function testERC20() public { + TestERC20 testErc20 = TestERC20( + getPredeployedContractAddress("TestERC20") + ); + + assertEq(testErc20.name(), "PredeployERC20"); + assertEq(testErc20.symbol(), "PRE"); + } + + function getPredeployedContractAddress( + string memory contractName + ) private returns (address) { + return + configJSON.readAddress( + string.concat(".contractAddresses.", contractName) + ); + } + + function checkDeployedCode(string memory contractName) private { + address contractAddress = getPredeployedContractAddress(contractName); + string memory deployedCode = genesisAllocJSON.readString( + string.concat(".", vm.toString(contractAddress), ".code") + ); + + assertEq(address(contractAddress).code, vm.parseBytes(deployedCode)); + } + + function checkSavedAddress( + AddressManager addressManager, + string memory contractName, + string memory key + ) private { + assertEq( + getPredeployedContractAddress(contractName), + addressManager.getAddress(keyForName(block.chainid, key)) + ); + } +} diff --git a/packages/protocol/test/genesis/generate_genesis.test.sh b/packages/protocol/test2/genesis/generate_genesis.test.sh similarity index 66% rename from packages/protocol/test/genesis/generate_genesis.test.sh rename to packages/protocol/test2/genesis/generate_genesis.test.sh index 2e21f254fdc..ea72a25fa2f 100755 --- a/packages/protocol/test/genesis/generate_genesis.test.sh +++ b/packages/protocol/test2/genesis/generate_genesis.test.sh @@ -39,7 +39,7 @@ echo ' "epoch": 30000 } }, - "gasLimit": "10000000", + "gasLimit": "30000000", "difficulty": "1", "extraData": "0x0000000000000000000000000000000000000000000000000000000000000000df08f82de32b8d460adbe8d72043e3a7e25a3b390000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "alloc": @@ -48,7 +48,7 @@ echo ' echo "Starting generate_genesis tests..." # compile the contracts to get latest bytecode -pnpm clean && pnpm compile +rm -rf out && pnpm compile:foundry # run the task pnpm run generate:genesis $DIR/test_config.json @@ -65,9 +65,41 @@ echo "Start docker compose network..." docker compose -f $TESTNET_CONFIG down -v --remove-orphans &> /dev/null docker compose -f $TESTNET_CONFIG up -d +trap "docker compose -f $TESTNET_CONFIG down -v" EXIT INT KILL ERR + echo "" echo "Start testing..." -TEST_L2_GENESIS=true pnpm hardhat test --grep "Generate Genesis" - -docker compose -f $TESTNET_CONFIG down -v +function waitTestNode { + echo "Waiting for test node: $1" + # Wait till the test node fully started + RETRIES=120 + i=0 + until curl \ + --silent \ + --fail \ + --noproxy localhost \ + -X POST \ + -H "Content-Type: application/json" \ + -d '{"jsonrpc":"2.0","id":0,"method":"eth_chainId","params":[]}' \ + $1 + do + sleep 1 + if [ $i -eq $RETRIES ]; then + echo 'Timed out waiting for test node' + exit 1 + fi + ((i=i+1)) + done +} + +waitTestNode http://localhost:18545 + +forge test \ + -vvv \ + --gas-report \ + --fork-url http://localhost:18545 \ + --fork-retry-backoff 120 \ + --no-storage-caching \ + --match-path test2/genesis/GenerateGenesis.t.sol \ + --block-gas-limit 1000000000 diff --git a/packages/protocol/test/genesis/test_config.json b/packages/protocol/test2/genesis/test_config.json similarity index 54% rename from packages/protocol/test/genesis/test_config.json rename to packages/protocol/test2/genesis/test_config.json index 728688ddf02..e569bd31756 100644 --- a/packages/protocol/test/genesis/test_config.json +++ b/packages/protocol/test2/genesis/test_config.json @@ -1,78 +1,36 @@ { - "contractOwner": "0xDf08F82De32B8d460adbE8D72043E3a7e25A3B39", + "contractOwner": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266", "chainId": 167, "seedAccounts": [ { - "0xDf08F82De32B8d460adbE8D72043E3a7e25A3B39": 1024 - }, - { - "0x4Ec242468812B6fFC8Be8FF423Af7bd23108d991": 1024 - }, - { - "0x513b9b8bffd6b79056f5250b04b0e863814d6dd6": 1024 - }, - { - "0x79b9f64744c98cd8cc20adb79b6a297e964254cc": 1024 - }, - { - "0x8626f6940E2eb28930eFb4CeF49B2d1F2C9C1199": 1024 - }, - { - "0xdD2FD4581271e230360230F9337D5c0430Bf44C0": 1024 - }, - { - "0xbDA5747bFD65F08deb54cb465eB87D40e51B197E": 1024 - }, - { - "0x2546BcD3c84621e976D8185a91A922aE77ECEc30": 1024 - }, - { - "0xcd3B766CCDd6AE721141F452C550Ca635964ce71": 1024 - }, - { - "0xdF3e18d64BC6A983f673Ab319CCaE4f1a57C7097": 1024 - }, - { - "0x1CBd3b2770909D4e10f157cABC84C7264073C9Ec": 1024 - }, - { - "0xFABB0ac9d68B0B445fB7357272Ff202C5651694a": 1024 - }, - { - "0x71bE63f3384f5fb98995898A86B02Fb2426c5788": 1024 - }, - { - "0xBcd4042DE499D14e55001CcbB24a551F3b954096": 1024 + "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266": 1024 }, { - "0xa0Ee7A142d267C1f36714E4a8F75612F20a79720": 1024 + "0x70997970C51812dc3A010C7d01b50e0d17dc79C8": 1024 }, { - "0x23618e81E3f5cdF7f54C3d65f7FBc0aBf5B21E8f": 1024 + "0x3C44CdDdB6a900fa2b585dd299e03d12FA4293BC": 1024 }, { - "0x14dC79964da2C08b23698B3D3cc7Ca32193d9955": 1024 + "0x90F79bf6EB2c4f870365E785982E1f101E93b906": 1024 }, { - "0x976EA74026E726554dB657fA54763abd0C3a0aa9": 1024 + "0x15d34AAf54267DB7D7c367839AAf71A00a2C6A65": 1024 }, { "0x9965507D1a55bcC2695C58ba16FB37d819B0A4dc": 1024 }, { - "0x15d34AAf54267DB7D7c367839AAf71A00a2C6A65": 1024 - }, - { - "0x90F79bf6EB2c4f870365E785982E1f101E93b906": 1024 + "0x976EA74026E726554dB657fA54763abd0C3a0aa9": 1024 }, { - "0x3C44CdDdB6a900fa2b585dd299e03d12FA4293BC": 1024 + "0x14dC79964da2C08b23698B3D3cc7Ca32193d9955": 1024 }, { - "0x70997970C51812dc3A010C7d01b50e0d17dc79C8": 1024 + "0x23618e81E3f5cdF7f54C3d65f7FBc0aBf5B21E8f": 1024 }, { - "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266": 1024 + "0xa0Ee7A142d267C1f36714E4a8F75612F20a79720": 1024 } ], "contractAddresses": { @@ -84,5 +42,11 @@ "AddressManager": "0x0000777700000000000000000000000000000006", "SignalService": "0x0000777700000000000000000000000000000007" }, + "param1559": { + "yscale": "358298803609133338137582400989", + "xscale": "1488514844", + "gasIssuedPerSecond": "12500000", + "gasExcess": "45450000000" + }, "predeployERC20": true } diff --git a/packages/protocol/test/genesis/testnet/docker-compose.yml b/packages/protocol/test2/genesis/testnet/docker-compose.yml similarity index 100% rename from packages/protocol/test/genesis/testnet/docker-compose.yml rename to packages/protocol/test2/genesis/testnet/docker-compose.yml diff --git a/packages/protocol/test/genesis/testnet/init_geth.sh b/packages/protocol/test2/genesis/testnet/init_geth.sh similarity index 100% rename from packages/protocol/test/genesis/testnet/init_geth.sh rename to packages/protocol/test2/genesis/testnet/init_geth.sh diff --git a/packages/protocol/utils/generate_genesis/erc20.ts b/packages/protocol/utils/generate_genesis/erc20.ts index 887cfd1a4b5..423be08f7b6 100644 --- a/packages/protocol/utils/generate_genesis/erc20.ts +++ b/packages/protocol/utils/generate_genesis/erc20.ts @@ -1,7 +1,7 @@ import { ethers } from "ethers"; import { Result } from "./interface"; const path = require("path"); -const ARTIFACTS_PATH = path.join(__dirname, "../../artifacts/contracts"); +const ARTIFACTS_PATH = path.join(__dirname, "../../out"); const { computeStorageSlots, getStorageLayout, @@ -24,9 +24,11 @@ export async function deployERC20( const artifact = require(path.join( ARTIFACTS_PATH, - "./test/thirdparty/TestERC20.sol/TestERC20.json" + "./TestERC20.sol/TestERC20.json" )); + artifact.contractName = "TestERC20"; + let address: string; if ( config.contractAddresses && @@ -58,7 +60,7 @@ export async function deployERC20( alloc[address] = { contractName: artifact.contractName, storage: {}, - code: artifact.deployedBytecode, + code: artifact.deployedBytecode.object, balance: "0x0", }; diff --git a/packages/protocol/utils/generate_genesis/interface.ts b/packages/protocol/utils/generate_genesis/interface.ts index 0b8a1360a4f..312462f59e6 100644 --- a/packages/protocol/utils/generate_genesis/interface.ts +++ b/packages/protocol/utils/generate_genesis/interface.ts @@ -6,6 +6,7 @@ export interface Config { }>; predeployERC20: boolean; contractAddresses: Object; + param1559: Object; } export interface Result { diff --git a/packages/protocol/utils/generate_genesis/taikoL2.ts b/packages/protocol/utils/generate_genesis/taikoL2.ts index f2b3dd9b812..ed3926ecbc4 100644 --- a/packages/protocol/utils/generate_genesis/taikoL2.ts +++ b/packages/protocol/utils/generate_genesis/taikoL2.ts @@ -7,7 +7,7 @@ const { computeStorageSlots, getStorageLayout, } = require("@defi-wonderland/smock/dist/src/utils"); -const ARTIFACTS_PATH = path.join(__dirname, "../../artifacts/contracts"); +const ARTIFACTS_PATH = path.join(__dirname, "../../out"); // deployTaikoL2 generates a L2 genesis alloc of the TaikoL2 contract. export async function deployTaikoL2( @@ -40,7 +40,8 @@ export async function deployTaikoL2( const contractConfigs: any = await generateContractConfigs( contractOwner, chainId, - config.contractAddresses + config.contractAddresses, + config.param1559 ); const storageLayouts: any = {}; @@ -93,46 +94,44 @@ export async function deployTaikoL2( async function generateContractConfigs( contractOwner: string, chainId: number, - hardCodedAddresses: any + hardCodedAddresses: any, + param1559: any ): Promise { const contractArtifacts: any = { // Libraries LibTrieProof: require(path.join( ARTIFACTS_PATH, - "./libs/LibTrieProof.sol/LibTrieProof.json" + "./LibTrieProof.sol/LibTrieProof.json" )), LibBridgeRetry: require(path.join( ARTIFACTS_PATH, - "./bridge/libs/LibBridgeRetry.sol/LibBridgeRetry.json" + "./LibBridgeRetry.sol/LibBridgeRetry.json" )), LibBridgeProcess: require(path.join( ARTIFACTS_PATH, - "./bridge/libs/LibBridgeProcess.sol/LibBridgeProcess.json" + "./LibBridgeProcess.sol/LibBridgeProcess.json" )), // Contracts AddressManager: require(path.join( ARTIFACTS_PATH, - "./thirdparty/AddressManager.sol/AddressManager.json" + "./AddressManager.sol/AddressManager.json" )), TaikoL2: require(path.join( ARTIFACTS_PATH, - "./L2/TaikoL2.sol/TaikoL2.json" - )), - Bridge: require(path.join( - ARTIFACTS_PATH, - "./bridge/Bridge.sol/Bridge.json" + "./TaikoL2.sol/TaikoL2.json" )), + Bridge: require(path.join(ARTIFACTS_PATH, "./Bridge.sol/Bridge.json")), TokenVault: require(path.join( ARTIFACTS_PATH, - "./bridge/TokenVault.sol/TokenVault.json" + "./TokenVault.sol/TokenVault.json" )), EtherVault: require(path.join( ARTIFACTS_PATH, - "./bridge/EtherVault.sol/EtherVault.json" + "./EtherVault.sol/EtherVault.json" )), SignalService: require(path.join( ARTIFACTS_PATH, - "./signal/SignalService.sol/SignalService.json" + "./SignalService.sol/SignalService.json" )), }; @@ -211,12 +210,14 @@ async function generateContractConfigs( // Libraries LibTrieProof: { address: addressMap.LibTrieProof, - deployedBytecode: contractArtifacts.LibTrieProof.deployedBytecode, + deployedBytecode: + contractArtifacts.LibTrieProof.deployedBytecode.object, variables: {}, }, LibBridgeRetry: { address: addressMap.LibBridgeRetry, - deployedBytecode: contractArtifacts.LibBridgeRetry.deployedBytecode, + deployedBytecode: + contractArtifacts.LibBridgeRetry.deployedBytecode.object, variables: {}, }, LibBridgeProcess: { @@ -229,7 +230,8 @@ async function generateContractConfigs( }, AddressManager: { address: addressMap.AddressManager, - deployedBytecode: contractArtifacts.AddressManager.deployedBytecode, + deployedBytecode: + contractArtifacts.AddressManager.deployedBytecode.object, variables: { // initializer _initialized: 1, @@ -284,6 +286,13 @@ async function generateContractConfigs( ]), ] )}`, + yscale: ethers.BigNumber.from(param1559.yscale), + xscale: ethers.BigNumber.from(param1559.xscale), + gasIssuedPerSecond: ethers.BigNumber.from( + param1559.gasIssuedPerSecond + ), + parentTimestamp: Math.floor(new Date().getTime() / 1000), + gasExcess: ethers.BigNumber.from(param1559.gasExcess), }, }, Bridge: { @@ -308,7 +317,8 @@ async function generateContractConfigs( }, TokenVault: { address: addressMap.TokenVault, - deployedBytecode: contractArtifacts.TokenVault.deployedBytecode, + deployedBytecode: + contractArtifacts.TokenVault.deployedBytecode.object, variables: { // initializer _initialized: 1, @@ -323,7 +333,8 @@ async function generateContractConfigs( }, EtherVault: { address: addressMap.EtherVault, - deployedBytecode: contractArtifacts.EtherVault.deployedBytecode, + deployedBytecode: + contractArtifacts.EtherVault.deployedBytecode.object, variables: { // initializer _initialized: 1, @@ -364,10 +375,10 @@ async function generateContractConfigs( // Ref: https://docs.soliditylang.org/en/latest/using-the-compiler.html#library-linking function linkContractLibs(artifact: any, addressMap: any) { const linkedBytecode: string = linker.linkBytecode( - artifact.deployedBytecode, + artifact.deployedBytecode.object, getLinkLibs( artifact, - linker.findLinkReferences(artifact.deployedBytecode), + linker.findLinkReferences(artifact.deployedBytecode.object), addressMap ) ); @@ -384,7 +395,7 @@ function linkContractLibs(artifact: any, addressMap: any) { function getLinkLibs(artifact: any, linkRefs: any, addressMap: any) { const result: any = {}; - Object.values(artifact.deployedLinkReferences).forEach( + Object.values(artifact.deployedBytecode.linkReferences).forEach( (linkReference: any) => { const contractName = Object.keys(linkReference)[0]; const linkRefKey: any = Object.keys(linkRefs).find( From 15523afc1b9bc08fefebdea0a1c63b2208286233 Mon Sep 17 00:00:00 2001 From: David Date: Thu, 6 Apr 2023 19:05:35 +0800 Subject: [PATCH 28/47] chore(protocol): update `test:foundry` npm script (#13561) --- packages/protocol/package.json | 2 +- .../genesis/{GenerateGenesis.t.sol => GenerateGenesis.g.sol} | 0 packages/protocol/test2/genesis/generate_genesis.test.sh | 2 +- 3 files changed, 2 insertions(+), 2 deletions(-) rename packages/protocol/test2/genesis/{GenerateGenesis.t.sol => GenerateGenesis.g.sol} (100%) diff --git a/packages/protocol/package.json b/packages/protocol/package.json index 674fe16334b..606dd88e357 100644 --- a/packages/protocol/package.json +++ b/packages/protocol/package.json @@ -14,7 +14,7 @@ "test": "./script/download_solc.sh && pnpm hardhat test --grep '^[^integration]'", "coverage": "pnpm hardhat coverage --solcoverjs ./.solcover.js --show-stack-traces", "test:coverage": "pnpm coverage", - "test:foundry": "forge test -vvv --gas-report", + "test:foundry": "forge test -vvv --gas-report --match-path test2/**/*.t.sol", "generate:genesis": "ts-node ./utils/generate_genesis/main.ts", "test:genesis": "./test2/genesis/generate_genesis.test.sh", "test:bridge": "TEST_TYPE=integrationbridge ./test/test_integration.sh", diff --git a/packages/protocol/test2/genesis/GenerateGenesis.t.sol b/packages/protocol/test2/genesis/GenerateGenesis.g.sol similarity index 100% rename from packages/protocol/test2/genesis/GenerateGenesis.t.sol rename to packages/protocol/test2/genesis/GenerateGenesis.g.sol diff --git a/packages/protocol/test2/genesis/generate_genesis.test.sh b/packages/protocol/test2/genesis/generate_genesis.test.sh index ea72a25fa2f..2211715f96d 100755 --- a/packages/protocol/test2/genesis/generate_genesis.test.sh +++ b/packages/protocol/test2/genesis/generate_genesis.test.sh @@ -101,5 +101,5 @@ forge test \ --fork-url http://localhost:18545 \ --fork-retry-backoff 120 \ --no-storage-caching \ - --match-path test2/genesis/GenerateGenesis.t.sol \ + --match-path test2/genesis/*.g.sol \ --block-gas-limit 1000000000 From 2bad51854fb1e64b2bc08b07f1272c1dab990e00 Mon Sep 17 00:00:00 2001 From: Daniel Wang <99078276+dantaik@users.noreply.github.com> Date: Thu, 6 Apr 2023 19:56:25 +0800 Subject: [PATCH 29/47] refactor(protocol): optimize keyForName (#13557) Co-authored-by: David --- .github/workflows/protocol.yml | 6 +- .../contracts/common/AddressResolver.sol | 7 +- .../contracts/test/L1/TestTaikoL1.sol | 9 ++ .../test/L1/TestTaikoL1EnableTokenomics.sol | 9 ++ .../protocol/contracts/test/TestContracts.sol | 82 +++++++++++++++++++ .../TestERC20.sol => erc20/RegularERC20.sol} | 4 +- .../test/thirdparty/TestTaikoToken.sol | 10 --- .../protocol/test/bridge/BridgedERC20.test.ts | 6 +- .../test/bridge/libs/LibBridgeProcess.test.ts | 2 +- .../test/bridge/libs/LibBridgeRetry.test.ts | 2 +- .../test/bridge/libs/LibBridgeSend.test.ts | 2 +- .../test/etherVault/EtherVault.test.ts | 2 +- .../protocol/test/libs/LibTrieProof.test.ts | 2 +- .../test/tokenVault/TokenVault.test.ts | 2 +- packages/protocol/test/utils/bridge.ts | 4 +- packages/protocol/test/utils/signal.ts | 12 ++- packages/protocol/test/utils/taikoL2.ts | 4 +- packages/protocol/test/utils/taikoToken.ts | 4 +- .../test2/genesis/GenerateGenesis.g.sol | 12 +-- .../protocol/test2/genesis/test_config.json | 2 +- .../protocol/utils/generate_genesis/erc20.ts | 8 +- .../utils/generate_genesis/taikoL2.ts | 51 +++++++++--- 22 files changed, 184 insertions(+), 58 deletions(-) create mode 100644 packages/protocol/contracts/test/TestContracts.sol rename packages/protocol/contracts/test/{thirdparty/TestERC20.sol => erc20/RegularERC20.sol} (63%) delete mode 100644 packages/protocol/contracts/test/thirdparty/TestTaikoToken.sol diff --git a/.github/workflows/protocol.yml b/.github/workflows/protocol.yml index b35ae667e33..39c967903fb 100644 --- a/.github/workflows/protocol.yml +++ b/.github/workflows/protocol.yml @@ -59,9 +59,9 @@ jobs: working-directory: ./packages/protocol run: pnpm test:genesis - - name: protocol - Export ABIs - working-directory: ./packages/protocol - run: pnpm export:abi + # - name: protocol - Export ABIs + # working-directory: ./packages/protocol + # run: pnpm export:abi - name: protocol - Deploy L1 Contracts working-directory: ./packages/protocol diff --git a/packages/protocol/contracts/common/AddressResolver.sol b/packages/protocol/contracts/common/AddressResolver.sol index c690759cca5..ad3d304810c 100644 --- a/packages/protocol/contracts/common/AddressResolver.sol +++ b/packages/protocol/contracts/common/AddressResolver.sol @@ -72,11 +72,8 @@ abstract contract AddressResolver { function keyForName( uint256 chainId, string memory name - ) public pure returns (string memory key) { - key = string.concat(Strings.toString(chainId), ".", name); - // TODO: the next line is cheaper in gas but will break - // many Hardhat tests. - // key = string(bytes.concat(bytes32(chainId), bytes(name))); + ) public pure virtual returns (string memory) { + return string(bytes.concat(bytes32(chainId), bytes(name))); } function _init(address addressManager_) internal virtual { diff --git a/packages/protocol/contracts/test/L1/TestTaikoL1.sol b/packages/protocol/contracts/test/L1/TestTaikoL1.sol index b631fed880f..1459e0ed17c 100644 --- a/packages/protocol/contracts/test/L1/TestTaikoL1.sol +++ b/packages/protocol/contracts/test/L1/TestTaikoL1.sol @@ -8,6 +8,7 @@ pragma solidity ^0.8.18; import {TaikoL1} from "../../L1/TaikoL1.sol"; import {TaikoData} from "../../L1/TaikoData.sol"; +import {Strings} from "@openzeppelin/contracts/utils/Strings.sol"; contract TestTaikoL1 is TaikoL1 { function getConfig() @@ -45,4 +46,12 @@ contract TestTaikoL1 is TaikoL1 { dampingFactorBips: 5000 }); } + + // The old implementation that is also used in hardhat tests. + function keyForName( + uint256 chainId, + string memory name + ) public pure override returns (string memory key) { + key = string.concat(Strings.toString(chainId), ".", name); + } } diff --git a/packages/protocol/contracts/test/L1/TestTaikoL1EnableTokenomics.sol b/packages/protocol/contracts/test/L1/TestTaikoL1EnableTokenomics.sol index 8d55b35a6e4..56afe3ca244 100644 --- a/packages/protocol/contracts/test/L1/TestTaikoL1EnableTokenomics.sol +++ b/packages/protocol/contracts/test/L1/TestTaikoL1EnableTokenomics.sol @@ -8,6 +8,7 @@ pragma solidity ^0.8.18; import {TaikoL1} from "../../L1/TaikoL1.sol"; import {TaikoData} from "../../L1/TaikoData.sol"; +import {Strings} from "@openzeppelin/contracts/utils/Strings.sol"; contract TestTaikoL1EnableTokenomics is TaikoL1 { function getConfig() @@ -47,4 +48,12 @@ contract TestTaikoL1EnableTokenomics is TaikoL1 { dampingFactorBips: 5000 }); } + + // The old implementation that is also used in hardhat tests. + function keyForName( + uint256 chainId, + string memory name + ) public pure override returns (string memory key) { + key = string.concat(Strings.toString(chainId), ".", name); + } } diff --git a/packages/protocol/contracts/test/TestContracts.sol b/packages/protocol/contracts/test/TestContracts.sol new file mode 100644 index 00000000000..2cd17597158 --- /dev/null +++ b/packages/protocol/contracts/test/TestContracts.sol @@ -0,0 +1,82 @@ +// SPDX-License-Identifier: MIT +// _____ _ _ _ _ +// |_ _|_ _(_) |_____ | | __ _| |__ ___ +// | |/ _` | | / / _ \ | |__/ _` | '_ (_-< +// |_|\__,_|_|_\_\___/ |____\__,_|_.__/__/ + +pragma solidity ^0.8.18; + +import {ERC20} from "@openzeppelin/contracts/token/ERC20/ERC20.sol"; +import {SignalService} from "../signal/SignalService.sol"; +import {TokenVault} from "../bridge/TokenVault.sol"; +import {EtherVault} from "../bridge/EtherVault.sol"; +import {BridgedERC20} from "../bridge/BridgedERC20.sol"; +import {Bridge} from "../bridge/Bridge.sol"; +import {TaikoToken} from "../L1/TaikoToken.sol"; +import {Strings} from "@openzeppelin/contracts/utils/Strings.sol"; + +// The old implementation that is also used in hardhat tests. + +contract TestERC20 is ERC20 { + constructor(uint256 initialSupply) ERC20("TestERC20", "TEST") { + _mint(msg.sender, initialSupply); + } +} + +contract TestSignalService is SignalService { + function keyForName( + uint256 chainId, + string memory name + ) public pure override returns (string memory key) { + key = string.concat(Strings.toString(chainId), ".", name); + } +} + +contract TestTokenVault is TokenVault { + function keyForName( + uint256 chainId, + string memory name + ) public pure override returns (string memory key) { + key = string.concat(Strings.toString(chainId), ".", name); + } +} + +contract TestEtherVault is EtherVault { + function keyForName( + uint256 chainId, + string memory name + ) public pure override returns (string memory key) { + key = string.concat(Strings.toString(chainId), ".", name); + } +} + +contract TestBridgedERC20 is BridgedERC20 { + function keyForName( + uint256 chainId, + string memory name + ) public pure override returns (string memory key) { + key = string.concat(Strings.toString(chainId), ".", name); + } +} + +contract TestBridge is Bridge { + function keyForName( + uint256 chainId, + string memory name + ) public pure override returns (string memory key) { + key = string.concat(Strings.toString(chainId), ".", name); + } +} + +contract TestTaikoToken is TaikoToken { + function mintAnyone(address account, uint256 amount) public { + _mint(account, amount); + } + + function keyForName( + uint256 chainId, + string memory name + ) public pure override returns (string memory key) { + key = string.concat(Strings.toString(chainId), ".", name); + } +} diff --git a/packages/protocol/contracts/test/thirdparty/TestERC20.sol b/packages/protocol/contracts/test/erc20/RegularERC20.sol similarity index 63% rename from packages/protocol/contracts/test/thirdparty/TestERC20.sol rename to packages/protocol/contracts/test/erc20/RegularERC20.sol index 52039565ea0..e4239c1cc52 100644 --- a/packages/protocol/contracts/test/thirdparty/TestERC20.sol +++ b/packages/protocol/contracts/test/erc20/RegularERC20.sol @@ -4,8 +4,8 @@ pragma solidity ^0.8.18; import {ERC20} from "@openzeppelin/contracts/token/ERC20/ERC20.sol"; -contract TestERC20 is ERC20 { - constructor(uint256 initialSupply) ERC20("TestERC20", "TEST") { +contract RegularERC20 is ERC20 { + constructor(uint256 initialSupply) ERC20("RegularERC20", "RGL") { _mint(msg.sender, initialSupply); } } diff --git a/packages/protocol/contracts/test/thirdparty/TestTaikoToken.sol b/packages/protocol/contracts/test/thirdparty/TestTaikoToken.sol deleted file mode 100644 index 2fe5e1da777..00000000000 --- a/packages/protocol/contracts/test/thirdparty/TestTaikoToken.sol +++ /dev/null @@ -1,10 +0,0 @@ -// SPDX-License-Identifier: MIT - -pragma solidity ^0.8.18; -import {TaikoToken} from "../../L1/TaikoToken.sol"; - -contract TestTaikoToken is TaikoToken { - function mintAnyone(address account, uint256 amount) public { - _mint(account, amount); - } -} diff --git a/packages/protocol/test/bridge/BridgedERC20.test.ts b/packages/protocol/test/bridge/BridgedERC20.test.ts index e4ddb4e2c68..626108b6b8e 100644 --- a/packages/protocol/test/bridge/BridgedERC20.test.ts +++ b/packages/protocol/test/bridge/BridgedERC20.test.ts @@ -29,7 +29,9 @@ describe("BridgedERC20", function () { beforeEach(async function () { unInitAddressManager = await deployAddressManager(owner); - unInitERC20 = await (await ethers.getContractFactory("BridgedERC20")) + unInitERC20 = await ( + await ethers.getContractFactory("TestBridgedERC20") + ) .connect(owner) .deploy(); @@ -42,7 +44,7 @@ describe("BridgedERC20", function () { tokenVault.address ); - erc20 = await (await ethers.getContractFactory("BridgedERC20")) + erc20 = await (await ethers.getContractFactory("TestBridgedERC20")) .connect(owner) .deploy(); diff --git a/packages/protocol/test/bridge/libs/LibBridgeProcess.test.ts b/packages/protocol/test/bridge/libs/LibBridgeProcess.test.ts index ca7e538fabd..a4abc696464 100644 --- a/packages/protocol/test/bridge/libs/LibBridgeProcess.test.ts +++ b/packages/protocol/test/bridge/libs/LibBridgeProcess.test.ts @@ -36,7 +36,7 @@ describe("LibBridgeProcess", async function () { ).deploy(); await addressManager.init(); - etherVault = await (await ethers.getContractFactory("EtherVault")) + etherVault = await (await ethers.getContractFactory("TestEtherVault")) .connect(etherVaultOwner) .deploy(); diff --git a/packages/protocol/test/bridge/libs/LibBridgeRetry.test.ts b/packages/protocol/test/bridge/libs/LibBridgeRetry.test.ts index 146c512e58b..b090ae0451f 100644 --- a/packages/protocol/test/bridge/libs/LibBridgeRetry.test.ts +++ b/packages/protocol/test/bridge/libs/LibBridgeRetry.test.ts @@ -42,7 +42,7 @@ describe("LibBridgeRetry", function () { owner ); - etherVault = await (await ethers.getContractFactory("EtherVault")) + etherVault = await (await ethers.getContractFactory("TestEtherVault")) .connect(etherVaultOwner) .deploy(); diff --git a/packages/protocol/test/bridge/libs/LibBridgeSend.test.ts b/packages/protocol/test/bridge/libs/LibBridgeSend.test.ts index faf0d4a29c0..221e2e44505 100644 --- a/packages/protocol/test/bridge/libs/LibBridgeSend.test.ts +++ b/packages/protocol/test/bridge/libs/LibBridgeSend.test.ts @@ -38,7 +38,7 @@ describe("LibBridgeSend", function () { ); const etherVault: EtherVault = await ( - await ethers.getContractFactory("EtherVault") + await ethers.getContractFactory("TestEtherVault") ) .connect(etherVaultOwner) .deploy(); diff --git a/packages/protocol/test/etherVault/EtherVault.test.ts b/packages/protocol/test/etherVault/EtherVault.test.ts index e8481e6b7b9..4f280214a50 100644 --- a/packages/protocol/test/etherVault/EtherVault.test.ts +++ b/packages/protocol/test/etherVault/EtherVault.test.ts @@ -21,7 +21,7 @@ describe("EtherVault", function () { owner ); - etherVault = await (await ethers.getContractFactory("EtherVault")) + etherVault = await (await ethers.getContractFactory("TestEtherVault")) .connect(owner) .deploy(); await etherVault.init(addressManager.address); diff --git a/packages/protocol/test/libs/LibTrieProof.test.ts b/packages/protocol/test/libs/LibTrieProof.test.ts index b3c7717f4b5..6702f37a75b 100644 --- a/packages/protocol/test/libs/LibTrieProof.test.ts +++ b/packages/protocol/test/libs/LibTrieProof.test.ts @@ -50,7 +50,7 @@ describe("integration:LibTrieProof", function () { chainId ); - const BridgeFactory = await ethers.getContractFactory("Bridge", { + const BridgeFactory = await ethers.getContractFactory("TestBridge", { libraries: { LibTrieProof: testLibTrieProof.address, }, diff --git a/packages/protocol/test/tokenVault/TokenVault.test.ts b/packages/protocol/test/tokenVault/TokenVault.test.ts index 7de260f6f04..c498141fddd 100644 --- a/packages/protocol/test/tokenVault/TokenVault.test.ts +++ b/packages/protocol/test/tokenVault/TokenVault.test.ts @@ -48,7 +48,7 @@ describe("TokenVault", function () { const addressManagerFactory: AddressManager__factory = await ethers.getContractFactory("AddressManager"); const tokenVaultFactory: TokenVault__factory = - await ethers.getContractFactory("TokenVault"); + await ethers.getContractFactory("TestTokenVault"); tokenVaultAddressManager = await addressManagerFactory.deploy(); await tokenVaultAddressManager.init(); diff --git a/packages/protocol/test/utils/bridge.ts b/packages/protocol/test/utils/bridge.ts index d3e16a3979f..a303935f57d 100644 --- a/packages/protocol/test/utils/bridge.ts +++ b/packages/protocol/test/utils/bridge.ts @@ -24,7 +24,7 @@ async function deployBridge( .connect(signer) .deploy(); - const BridgeFactory = await hardhatEthers.getContractFactory("Bridge", { + const BridgeFactory = await hardhatEthers.getContractFactory("TestBridge", { libraries: { LibTrieProof: libTrieProof.address, }, @@ -35,7 +35,7 @@ async function deployBridge( await bridge.connect(signer).init(addressManager.address); const etherVault: EtherVault = await ( - await hardhatEthers.getContractFactory("EtherVault") + await hardhatEthers.getContractFactory("TestEtherVault") ) .connect(signer) .deploy(); diff --git a/packages/protocol/test/utils/signal.ts b/packages/protocol/test/utils/signal.ts index 2070d403c47..956954e2d3b 100644 --- a/packages/protocol/test/utils/signal.ts +++ b/packages/protocol/test/utils/signal.ts @@ -2,13 +2,17 @@ import { ethers, Signer } from "ethers"; import RLP from "rlp"; import { ethers as hardhatEthers } from "hardhat"; import { BlockHeader, EthGetProofResponse } from "./rpc"; -import { AddressManager, SignalService, LibTrieProof } from "../../typechain"; +import { + AddressManager, + TestSignalService, + LibTrieProof, +} from "../../typechain"; async function deploySignalService( signer: Signer, addressManager: AddressManager, srcChain: number -): Promise<{ signalService: SignalService }> { +): Promise<{ signalService: TestSignalService }> { const libTrieProof: LibTrieProof = await ( await hardhatEthers.getContractFactory("LibTrieProof") ) @@ -16,7 +20,7 @@ async function deploySignalService( .deploy(); const SignalServiceFactory = await hardhatEthers.getContractFactory( - "SignalService", + "TestSignalService", { libraries: { LibTrieProof: libTrieProof.address, @@ -24,7 +28,7 @@ async function deploySignalService( } ); - const signalService: SignalService = await SignalServiceFactory.connect( + const signalService: TestSignalService = await SignalServiceFactory.connect( signer ).deploy(); diff --git a/packages/protocol/test/utils/taikoL2.ts b/packages/protocol/test/utils/taikoL2.ts index 2d9b374fe08..eeeed085514 100644 --- a/packages/protocol/test/utils/taikoL2.ts +++ b/packages/protocol/test/utils/taikoL2.ts @@ -6,7 +6,9 @@ async function deployTaikoL2( signer: ethers.Signer, gasLimit: number | undefined = undefined ): Promise { - const taikoL2 = await (await hardhatEthers.getContractFactory("TaikoL2")) + const taikoL2 = await ( + await hardhatEthers.getContractFactory("TestTaikoL2") + ) .connect(signer) .deploy({ gasLimit }); diff --git a/packages/protocol/test/utils/taikoToken.ts b/packages/protocol/test/utils/taikoToken.ts index b6ccdaab556..e9740fd4eb9 100644 --- a/packages/protocol/test/utils/taikoToken.ts +++ b/packages/protocol/test/utils/taikoToken.ts @@ -7,7 +7,9 @@ const deployTaikoToken = async ( addressManager: AddressManager, protoBroker: string ) => { - const token = await (await hardhatEthers.getContractFactory("TaikoToken")) + const token = await ( + await hardhatEthers.getContractFactory("TestTaikoToken") + ) .connect(signer) .deploy(); await token.init(addressManager.address, "Taiko Token", "TKO", [], []); diff --git a/packages/protocol/test2/genesis/GenerateGenesis.g.sol b/packages/protocol/test2/genesis/GenerateGenesis.g.sol index d330483c56e..6f2a8152470 100644 --- a/packages/protocol/test2/genesis/GenerateGenesis.g.sol +++ b/packages/protocol/test2/genesis/GenerateGenesis.g.sol @@ -14,7 +14,7 @@ import {TokenVault} from "../../contracts/bridge/TokenVault.sol"; import {EtherVault} from "../../contracts/bridge/EtherVault.sol"; import {SignalService} from "../../contracts/signal/SignalService.sol"; import {LibBridgeStatus} from "../../contracts/bridge/libs/LibBridgeStatus.sol"; -import {TestERC20} from "../../contracts/test/thirdparty/TestERC20.sol"; +import {RegularERC20} from "../../contracts/test/erc20/RegularERC20.sol"; contract TestGenerateGenesis is Test, AddressResolver { using stdJson for string; @@ -37,7 +37,7 @@ contract TestGenerateGenesis is Test, AddressResolver { checkDeployedCode("TokenVault"); checkDeployedCode("EtherVault"); checkDeployedCode("Bridge"); - checkDeployedCode("TestERC20"); + checkDeployedCode("RegularERC20"); checkDeployedCode("AddressManager"); checkDeployedCode("SignalService"); } @@ -174,12 +174,12 @@ contract TestGenerateGenesis is Test, AddressResolver { } function testERC20() public { - TestERC20 testErc20 = TestERC20( - getPredeployedContractAddress("TestERC20") + RegularERC20 regularERC20 = RegularERC20( + getPredeployedContractAddress("RegularERC20") ); - assertEq(testErc20.name(), "PredeployERC20"); - assertEq(testErc20.symbol(), "PRE"); + assertEq(regularERC20.name(), "RegularERC20"); + assertEq(regularERC20.symbol(), "RGL"); } function getPredeployedContractAddress( diff --git a/packages/protocol/test2/genesis/test_config.json b/packages/protocol/test2/genesis/test_config.json index e569bd31756..9c2a914f184 100644 --- a/packages/protocol/test2/genesis/test_config.json +++ b/packages/protocol/test2/genesis/test_config.json @@ -38,7 +38,7 @@ "TokenVault": "0x0000777700000000000000000000000000000002", "EtherVault": "0x0000777700000000000000000000000000000003", "Bridge": "0x0000777700000000000000000000000000000004", - "TestERC20": "0x0000777700000000000000000000000000000005", + "RegularERC20": "0x0000777700000000000000000000000000000005", "AddressManager": "0x0000777700000000000000000000000000000006", "SignalService": "0x0000777700000000000000000000000000000007" }, diff --git a/packages/protocol/utils/generate_genesis/erc20.ts b/packages/protocol/utils/generate_genesis/erc20.ts index 423be08f7b6..6621d400143 100644 --- a/packages/protocol/utils/generate_genesis/erc20.ts +++ b/packages/protocol/utils/generate_genesis/erc20.ts @@ -7,8 +7,8 @@ const { getStorageLayout, } = require("@defi-wonderland/smock/dist/src/utils"); -export const TOKEN_NAME = "PredeployERC20"; -export const TOKEN_SYMBOL = "PRE"; +export const TOKEN_NAME = "RegularERC20"; +export const TOKEN_SYMBOL = "RGL"; export const PREMINT_SEED_ACCOUNT_BALANCE = ethers.BigNumber.from(1024000); // deployERC20 generates a L2 genesis alloc of an ERC-20 contract, @@ -24,10 +24,10 @@ export async function deployERC20( const artifact = require(path.join( ARTIFACTS_PATH, - "./TestERC20.sol/TestERC20.json" + "./RegularERC20.sol/RegularERC20.json" )); - artifact.contractName = "TestERC20"; + artifact.contractName = "RegularERC20"; let address: string; if ( diff --git a/packages/protocol/utils/generate_genesis/taikoL2.ts b/packages/protocol/utils/generate_genesis/taikoL2.ts index ed3926ecbc4..d861f3e9344 100644 --- a/packages/protocol/utils/generate_genesis/taikoL2.ts +++ b/packages/protocol/utils/generate_genesis/taikoL2.ts @@ -136,6 +136,10 @@ async function generateContractConfigs( }; const addressMap: any = {}; + const chianIdBytes32 = ethers.utils.hexZeroPad( + ethers.utils.hexlify(chainId), + 32 + ); for (const [contractName, artifact] of Object.entries(contractArtifacts)) { let bytecode = (artifact as any).bytecode; @@ -240,26 +244,51 @@ async function generateContractConfigs( _owner: contractOwner, // AddressManager addresses: { - // keccak256(abi.encodePacked(_name)) + // bytes.concat(bytes32(chainId), bytes(name)); [`${ethers.utils.solidityKeccak256( - ["string"], - [`${chainId}.taiko`] + ["bytes"], + [ + ethers.utils.concat([ + chianIdBytes32, + ethers.utils.toUtf8Bytes("taiko"), + ]), + ] )}`]: addressMap.TaikoL2, [`${ethers.utils.solidityKeccak256( - ["string"], - [`${chainId}.bridge`] + ["bytes"], + [ + ethers.utils.concat([ + chianIdBytes32, + ethers.utils.toUtf8Bytes("bridge"), + ]), + ] )}`]: addressMap.Bridge, [`${ethers.utils.solidityKeccak256( - ["string"], - [`${chainId}.token_vault`] + ["bytes"], + [ + ethers.utils.concat([ + chianIdBytes32, + ethers.utils.toUtf8Bytes("token_vault"), + ]), + ] )}`]: addressMap.TokenVault, [`${ethers.utils.solidityKeccak256( - ["string"], - [`${chainId}.ether_vault`] + ["bytes"], + [ + ethers.utils.concat([ + chianIdBytes32, + ethers.utils.toUtf8Bytes("ether_vault"), + ]), + ] )}`]: addressMap.EtherVault, [`${ethers.utils.solidityKeccak256( - ["string"], - [`${chainId}.signal_service`] + ["bytes"], + [ + ethers.utils.concat([ + chianIdBytes32, + ethers.utils.toUtf8Bytes("signal_service"), + ]), + ] )}`]: addressMap.SignalService, }, }, From f2ef66874ea54a1f6415b4c6f0bd9cf0068384fb Mon Sep 17 00:00:00 2001 From: Daniel Wang Date: Fri, 7 Apr 2023 04:27:15 +0800 Subject: [PATCH 30/47] refactor(protocol): split oracle proving into a function (#13552) Co-authored-by: Daniel Wang Co-authored-by: Daniel Wang <99078276+dantaik@users.noreply.github.com> --- packages/protocol/contracts/L1/TaikoData.sol | 6 + .../protocol/contracts/L1/TaikoErrors.sol | 12 + .../protocol/contracts/L1/TaikoEvents.sol | 9 - packages/protocol/contracts/L1/TaikoL1.sol | 21 +- .../protocol/contracts/L1/libs/LibProving.sol | 139 ++++++++---- packages/protocol/contracts/L2/TaikoL2.sol | 2 +- .../protocol/test2/TaikoL1OracleProver.t.sol | 208 ++++++++++++++++++ packages/protocol/test2/TaikoL1TestBase.t.sol | 14 ++ .../contract-documentation/L1/TaikoData.md | 10 + .../contract-documentation/L1/TaikoErrors.md | 24 ++ .../contract-documentation/L1/TaikoEvents.md | 6 - .../contract-documentation/L1/TaikoL1.md | 15 ++ .../common/AddressResolver.md | 2 +- 13 files changed, 406 insertions(+), 62 deletions(-) create mode 100644 packages/protocol/test2/TaikoL1OracleProver.t.sol diff --git a/packages/protocol/contracts/L1/TaikoData.sol b/packages/protocol/contracts/L1/TaikoData.sol index b800440fcc7..9c8d2260b8b 100644 --- a/packages/protocol/contracts/L1/TaikoData.sol +++ b/packages/protocol/contracts/L1/TaikoData.sol @@ -90,6 +90,12 @@ library TaikoData { address prover; } + struct BlockOracle { + bytes32 parentHash; + bytes32 blockHash; + bytes32 signalRoot; + } + // 3 slots struct ForkChoice { bytes32 blockHash; diff --git a/packages/protocol/contracts/L1/TaikoErrors.sol b/packages/protocol/contracts/L1/TaikoErrors.sol index 16b2294f272..eefc7adb6a1 100644 --- a/packages/protocol/contracts/L1/TaikoErrors.sol +++ b/packages/protocol/contracts/L1/TaikoErrors.sol @@ -21,14 +21,26 @@ abstract contract TaikoErrors { error L1_INVALID_EVIDENCE(); error L1_INVALID_L21559_PARAMS(); error L1_INVALID_METADATA(); + error L1_INVALID_ORACLE(); error L1_INVALID_PARAM(); error L1_INVALID_PROOF(); + error L1_NOT_ORACLE_PROVEN(); error L1_NOT_ORACLE_PROVER(); error L1_NOT_SOLO_PROPOSER(); + error L1_ORACLE_DISABLED(); error L1_TOO_MANY_BLOCKS(); error L1_TX_LIST_NOT_EXIST(); error L1_TX_LIST_HASH(); error L1_TX_LIST_RANGE(); error L1_TX_LIST(); error L1_UNEXPECTED_FORK_CHOICE_ID(); + + error L1_CONFLICTING_PROOF( + uint256 id, + bytes32 parentHash, + bytes32 conflictingBlockHash, + bytes32 conflictingSignalRoot, + bytes32 blockHash, + bytes32 signalRoot + ); } diff --git a/packages/protocol/contracts/L1/TaikoEvents.sol b/packages/protocol/contracts/L1/TaikoEvents.sol index cbd7388bb1b..752080a7efe 100644 --- a/packages/protocol/contracts/L1/TaikoEvents.sol +++ b/packages/protocol/contracts/L1/TaikoEvents.sol @@ -24,14 +24,5 @@ abstract contract TaikoEvents { address prover ); - event ConflictingProof( - uint64 blockId, - bytes32 parentHash, - bytes32 conflictingBlockHash, - bytes32 conflictingSignalRoot, - bytes32 blockHash, - bytes32 signalRoot - ); - event BlockVerified(uint256 indexed id, bytes32 blockHash); } diff --git a/packages/protocol/contracts/L1/TaikoL1.sol b/packages/protocol/contracts/L1/TaikoL1.sol index bdf8d9f2da9..7f938c64789 100644 --- a/packages/protocol/contracts/L1/TaikoL1.sol +++ b/packages/protocol/contracts/L1/TaikoL1.sol @@ -78,6 +78,26 @@ contract TaikoL1 is EssentialContract, IXchainSync, TaikoEvents, TaikoErrors { } } + /** + * Oracle prove mutliple blocks in a row. + * + * @param blockId The index of the first block to prove. This is also used + * to select the right implementation version. + * @param input An abi-encoded TaikoData.BlockOracle[] object. + */ + function oracleProveBlocks( + uint256 blockId, + bytes calldata input + ) external nonReentrant { + LibProving.oracleProveBlocks({ + state: state, + config: getConfig(), + blockId: blockId, + resolver: AddressResolver(this), + oracles: abi.decode(input, (TaikoData.BlockOracle[])) + }); + } + /** * Prove a block is valid with a zero-knowledge proof, a transaction * merkel proof, and a receipt merkel proof. @@ -86,7 +106,6 @@ contract TaikoL1 is EssentialContract, IXchainSync, TaikoEvents, TaikoErrors { * to select the right implementation version. * @param input An abi-encoded TaikoData.ValidBlockEvidence object. */ - function proveBlock( uint256 blockId, bytes calldata input diff --git a/packages/protocol/contracts/L1/libs/LibProving.sol b/packages/protocol/contracts/L1/libs/LibProving.sol index e86c2140900..53270cebf1d 100644 --- a/packages/protocol/contracts/L1/libs/LibProving.sol +++ b/packages/protocol/contracts/L1/libs/LibProving.sol @@ -22,23 +22,87 @@ library LibProving { address prover ); - event ConflictingProof( - uint64 blockId, - bytes32 parentHash, - bytes32 conflictingBlockHash, - bytes32 conflictingSignalRoot, - bytes32 blockHash, - bytes32 signalRoot - ); - error L1_ALREADY_PROVEN(); error L1_BLOCK_ID(); error L1_EVIDENCE_MISMATCH(bytes32 expected, bytes32 actual); error L1_FORK_CHOICE_NOT_FOUND(); error L1_INVALID_PROOF(); error L1_INVALID_EVIDENCE(); + error L1_INVALID_ORACLE(); + error L1_ORACLE_DISABLED(); + error L1_NOT_ORACLE_PROVEN(); error L1_NOT_ORACLE_PROVER(); error L1_UNEXPECTED_FORK_CHOICE_ID(); + error L1_CONFLICTING_PROOF( + uint256 id, + bytes32 parentHash, + bytes32 conflictingBlockHash, + bytes32 conflictingSignalRoot, + bytes32 blockHash, + bytes32 signalRoot + ); + + function oracleProveBlocks( + TaikoData.State storage state, + TaikoData.Config memory config, + AddressResolver resolver, + uint256 blockId, + TaikoData.BlockOracle[] memory oracles + ) internal { + if (!config.enableOracleProver) revert L1_ORACLE_DISABLED(); + if (msg.sender != resolver.resolve("oracle_prover", false)) + revert L1_NOT_ORACLE_PROVER(); + + for (uint i = 0; i < oracles.length; ) { + TaikoData.BlockOracle memory oracle = oracles[i]; + uint256 id = blockId + i; + + if (id <= state.lastVerifiedBlockId || id >= state.numBlocks) + revert L1_BLOCK_ID(); + + if ( + oracle.parentHash == 0 || + oracle.blockHash == 0 || + oracle.blockHash == oracle.parentHash || + oracle.signalRoot == 0 + ) revert L1_INVALID_ORACLE(); + + TaikoData.Block storage blk = state.blocks[ + id % config.ringBufferSize + ]; + + uint256 fcId = state.forkChoiceIds[id][oracle.parentHash]; + if (fcId == 0) { + fcId = blk.nextForkChoiceId; + unchecked { + ++blk.nextForkChoiceId; + } + assert(fcId > 0); + + state.forkChoiceIds[id][oracle.parentHash] = fcId; + } + + TaikoData.ForkChoice storage fc = blk.forkChoices[fcId]; + fc.blockHash = oracle.blockHash; + fc.signalRoot = oracle.signalRoot; + + // we are reusing storage slots, still need to reset the + // [provenAt+prover] slot. + fc.provenAt = uint64(block.timestamp); + fc.prover = address(0); + + emit BlockProven({ + id: id, + parentHash: oracle.parentHash, + blockHash: oracle.blockHash, + signalRoot: oracle.signalRoot, + prover: address(0) + }); + unchecked { + ++i; + } + } + } function proveBlock( TaikoData.State storage state, @@ -57,7 +121,6 @@ library LibProving { if ( evidence.parentHash == 0 || evidence.blockHash == 0 || - // cannot be the same hash evidence.blockHash == evidence.parentHash || evidence.signalRoot == 0 || // prover must not be zero @@ -72,61 +135,50 @@ library LibProving { if (blk.metaHash != _metaHash) revert L1_EVIDENCE_MISMATCH(blk.metaHash, _metaHash); - TaikoData.ForkChoice storage fc; - bool oracleProving; - uint256 fcId = state.forkChoiceIds[blockId][evidence.parentHash]; + if (fcId == 0) { + if (config.enableOracleProver) revert L1_NOT_ORACLE_PROVEN(); + fcId = blk.nextForkChoiceId; unchecked { ++blk.nextForkChoiceId; } - assert(fcId > 0); + state.forkChoiceIds[blockId][evidence.parentHash] = fcId; - fc = blk.forkChoices[fcId]; + + TaikoData.ForkChoice storage fc = blk.forkChoices[fcId]; fc.blockHash = evidence.blockHash; fc.signalRoot = evidence.signalRoot; - - if (config.enableOracleProver) { - if (msg.sender != resolver.resolve("oracle_prover", false)) - revert L1_NOT_ORACLE_PROVER(); - - oracleProving = true; - // we are reusing storage slots, still need to reset the - // [provenAt+prover] slot. - fc.provenAt = uint64(1); - fc.prover = address(0); - } else { - fc.provenAt = uint64(block.timestamp); - fc.prover = evidence.prover; - } + fc.provenAt = uint64(block.timestamp); + fc.prover = evidence.prover; } else { assert(fcId < blk.nextForkChoiceId); - fc = blk.forkChoices[fcId]; + + TaikoData.ForkChoice storage fc = blk.forkChoices[fcId]; if ( - fc.blockHash != evidence.blockHash || - fc.signalRoot != evidence.signalRoot + fc.blockHash == evidence.blockHash && + fc.signalRoot == evidence.signalRoot ) { - emit ConflictingProof({ - blockId: meta.id, + if (fc.prover != address(0)) revert L1_ALREADY_PROVEN(); + + fc.provenAt = uint64(block.timestamp); + fc.prover = evidence.prover; + } else { + revert L1_CONFLICTING_PROOF({ + id: meta.id, parentHash: evidence.parentHash, conflictingBlockHash: evidence.blockHash, conflictingSignalRoot: evidence.signalRoot, blockHash: fc.blockHash, signalRoot: fc.signalRoot }); - return; } - - if (fc.prover != address(0)) revert L1_ALREADY_PROVEN(); - - fc.provenAt = uint64(block.timestamp); - fc.prover = evidence.prover; } - if (!oracleProving && !config.skipZKPVerification) { + if (!config.skipZKPVerification) { bytes32 instance; { // otherwise: stack too deep @@ -198,9 +250,8 @@ library LibProving { if (blk.blockId != blockId) revert L1_BLOCK_ID(); uint256 fcId = state.forkChoiceIds[blockId][parentHash]; - if (fcId == 0) revert L1_FORK_CHOICE_NOT_FOUND(); - - assert(fcId < blk.nextForkChoiceId); + if (fcId == 0 || fcId >= blk.nextForkChoiceId) + revert L1_FORK_CHOICE_NOT_FOUND(); return blk.forkChoices[fcId]; } diff --git a/packages/protocol/contracts/L2/TaikoL2.sol b/packages/protocol/contracts/L2/TaikoL2.sol index ec0f314462f..9bb7538d425 100644 --- a/packages/protocol/contracts/L2/TaikoL2.sol +++ b/packages/protocol/contracts/L2/TaikoL2.sol @@ -19,7 +19,7 @@ contract TaikoL2 is EssentialContract, TaikoL2Signer, IXchainSync { using SafeCastUpgradeable for uint256; using LibMath for uint256; - uint64 public ANCHOR_GAS_COST = 150000; // owner:david + uint64 public constant ANCHOR_GAS_COST = 150000; struct VerifiedBlock { bytes32 blockHash; diff --git a/packages/protocol/test2/TaikoL1OracleProver.t.sol b/packages/protocol/test2/TaikoL1OracleProver.t.sol new file mode 100644 index 00000000000..70ffa1f44be --- /dev/null +++ b/packages/protocol/test2/TaikoL1OracleProver.t.sol @@ -0,0 +1,208 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity ^0.8.18; + +import {Test} from "forge-std/Test.sol"; +import {console2} from "forge-std/console2.sol"; +import {AddressManager} from "../contracts/thirdparty/AddressManager.sol"; +import {TaikoConfig} from "../contracts/L1/TaikoConfig.sol"; +import {TaikoData} from "../contracts/L1/TaikoData.sol"; +import {TaikoL1} from "../contracts/L1/TaikoL1.sol"; +import {TaikoToken} from "../contracts/L1/TaikoToken.sol"; +import {SignalService} from "../contracts/signal/SignalService.sol"; +import {Strings} from "@openzeppelin/contracts/utils/Strings.sol"; +import {TaikoL1TestBase} from "./TaikoL1TestBase.t.sol"; + +contract TaikoL1_withOracleProver is TaikoL1 { + function getConfig() + public + pure + override + returns (TaikoData.Config memory config) + { + config = TaikoConfig.getConfig(); + + config.enableTokenomics = true; + config.txListCacheExpiry = 5 minutes; + config.proposerDepositPctg = 0; + config.maxVerificationsPerTx = 0; + config.enableSoloProposer = false; + config.enableOracleProver = true; + config.maxNumProposedBlocks = 10; + config.ringBufferSize = 12; + // this value must be changed if `maxNumProposedBlocks` is changed. + config.slotSmoothingFactor = 4160; + + config.proposingConfig = TaikoData.FeeConfig({ + avgTimeMAF: 64, + dampingFactorBips: 5000 + }); + + config.provingConfig = TaikoData.FeeConfig({ + avgTimeMAF: 64, + dampingFactorBips: 5000 + }); + } +} + +contract Verifier { + fallback(bytes calldata) external returns (bytes memory) { + return bytes.concat(keccak256("taiko")); + } +} + +contract TaikoL1Test is TaikoL1TestBase { + function deployTaikoL1() internal override returns (TaikoL1 taikoL1) { + taikoL1 = new TaikoL1_withOracleProver(); + } + + function setUp() public override { + TaikoL1TestBase.setUp(); + _registerAddress( + string(abi.encodePacked("verifier_", uint16(100))), + address(new Verifier()) + ); + + _registerAddress("oracle_prover", Alice); + } + + // Test a block can be oracle-proven multiple times by the + // oracle prover + function testOracleProver() external { + _depositTaikoToken(Alice, 1000 * 1E8, 1000 ether); + _depositTaikoToken(Bob, 1000 * 1E8, 1000 ether); + _depositTaikoToken(Carol, 1000 * 1E8, 1000 ether); + + bytes32 parentHash = GENESIS_BLOCK_HASH; + + TaikoData.BlockMetadata memory meta = proposeBlock(Bob, 1024); + + // No forkchoice can be found + vm.expectRevert(); + TaikoData.ForkChoice memory fc = L1.getForkChoice(1, parentHash); + + // Alice cannot prove the forkchoice + vm.expectRevert(); + proveBlock( + Alice, + meta, + parentHash, + bytes32(uint256(0x100)), + bytes32(uint256(0x101)) + ); + + // Bob also cannot prove the forkchoice + vm.expectRevert(); + proveBlock( + Bob, + meta, + parentHash, + bytes32(uint256(0x100)), + bytes32(uint256(0x101)) + ); + + // Bob cannot oracle-prove the forkchoice + vm.expectRevert(); + oracleProveBlock( + Bob, + 1, + parentHash, + bytes32(uint256(0x100)), + bytes32(uint256(0x101)) + ); + + // Alice can oracle-prove the forkchoice + oracleProveBlock( + Alice, + 1, + parentHash, + bytes32(uint256(0x100)), + bytes32(uint256(0x101)) + ); + + fc = L1.getForkChoice(1, parentHash); + assertEq(fc.blockHash, bytes32(uint256(0x100))); + assertEq(fc.signalRoot, bytes32(uint256(0x101))); + assertEq(uint256(fc.provenAt), block.timestamp); + assertEq(fc.prover, address(0)); + + // Alice can oracle-prove the forkchoice more than once + for (uint i = 0; i < 2; ++i) { + mine(1); + oracleProveBlock( + Alice, + 1, + parentHash, + bytes32(uint256(0x103)), + bytes32(uint256(0x104)) + ); + } + + fc = L1.getForkChoice(1, parentHash); + assertEq(fc.blockHash, bytes32(uint256(0x103))); + assertEq(fc.signalRoot, bytes32(uint256(0x104))); + assertEq(uint256(fc.provenAt), block.timestamp); + assertEq(fc.prover, address(0)); + + // Bob cannot prove the forkchoice with conflicting proof + vm.expectRevert(); + proveBlock( + Bob, + meta, + parentHash, + bytes32(uint256(0x100)), + bytes32(uint256(0x101)) + ); + + // Bob can prove the forkchoice with a matching proof + mine(1); + proveBlock( + Bob, + meta, + parentHash, + bytes32(uint256(0x103)), + bytes32(uint256(0x104)) + ); + + fc = L1.getForkChoice(1, parentHash); + assertEq(fc.blockHash, bytes32(uint256(0x103))); + assertEq(fc.signalRoot, bytes32(uint256(0x104))); + assertEq(uint256(fc.provenAt), block.timestamp); + assertEq(fc.prover, Bob); + + // Nobody can prove the forkchoice again + vm.expectRevert(); + proveBlock( + Carol, + meta, + parentHash, + bytes32(uint256(0x103)), + bytes32(uint256(0x104)) + ); + + // Including Alice + vm.expectRevert(); + proveBlock( + Alice, + meta, + parentHash, + bytes32(uint256(0x103)), + bytes32(uint256(0x104)) + ); + + // But Alice can still oracle-proof the block again + mine(1); + oracleProveBlock( + Alice, + 1, + parentHash, + bytes32(uint256(0x105)), + bytes32(uint256(0x106)) + ); + + fc = L1.getForkChoice(1, parentHash); + assertEq(fc.blockHash, bytes32(uint256(0x105))); + assertEq(fc.signalRoot, bytes32(uint256(0x106))); + assertEq(uint256(fc.provenAt), block.timestamp); + assertEq(fc.prover, address(0)); + } +} diff --git a/packages/protocol/test2/TaikoL1TestBase.t.sol b/packages/protocol/test2/TaikoL1TestBase.t.sol index cb6bb00a394..2f3fdf2d5f9 100644 --- a/packages/protocol/test2/TaikoL1TestBase.t.sol +++ b/packages/protocol/test2/TaikoL1TestBase.t.sol @@ -115,6 +115,20 @@ abstract contract TaikoL1TestBase is Test { L1.proposeBlock(abi.encode(input), txList); } + function oracleProveBlock( + address prover, + uint256 blockId, + bytes32 parentHash, + bytes32 blockHash, + bytes32 signalRoot + ) internal { + TaikoData.BlockOracle[] memory oracles = new TaikoData.BlockOracle[](1); + + oracles[0] = TaikoData.BlockOracle(parentHash, blockHash, signalRoot); + vm.prank(prover, prover); + L1.oracleProveBlocks(blockId, abi.encode(oracles)); + } + function proveBlock( address prover, TaikoData.BlockMetadata memory meta, diff --git a/packages/website/pages/docs/reference/contract-documentation/L1/TaikoData.md b/packages/website/pages/docs/reference/contract-documentation/L1/TaikoData.md index 92fe047b3be..b6ce178801c 100644 --- a/packages/website/pages/docs/reference/contract-documentation/L1/TaikoData.md +++ b/packages/website/pages/docs/reference/contract-documentation/L1/TaikoData.md @@ -105,6 +105,16 @@ struct BlockEvidence { } ``` +### BlockOracle + +```solidity +struct BlockOracle { + bytes32 parentHash; + bytes32 blockHash; + bytes32 signalRoot; +} +``` + ### ForkChoice ```solidity diff --git a/packages/website/pages/docs/reference/contract-documentation/L1/TaikoErrors.md b/packages/website/pages/docs/reference/contract-documentation/L1/TaikoErrors.md index 0857d6e2950..ad7a090ebd4 100644 --- a/packages/website/pages/docs/reference/contract-documentation/L1/TaikoErrors.md +++ b/packages/website/pages/docs/reference/contract-documentation/L1/TaikoErrors.md @@ -78,6 +78,12 @@ error L1_INVALID_L21559_PARAMS() error L1_INVALID_METADATA() ``` +### L1_INVALID_ORACLE + +```solidity +error L1_INVALID_ORACLE() +``` + ### L1_INVALID_PARAM ```solidity @@ -90,6 +96,12 @@ error L1_INVALID_PARAM() error L1_INVALID_PROOF() ``` +### L1_NOT_ORACLE_PROVEN + +```solidity +error L1_NOT_ORACLE_PROVEN() +``` + ### L1_NOT_ORACLE_PROVER ```solidity @@ -102,6 +114,12 @@ error L1_NOT_ORACLE_PROVER() error L1_NOT_SOLO_PROPOSER() ``` +### L1_ORACLE_DISABLED + +```solidity +error L1_ORACLE_DISABLED() +``` + ### L1_TOO_MANY_BLOCKS ```solidity @@ -137,3 +155,9 @@ error L1_TX_LIST() ```solidity error L1_UNEXPECTED_FORK_CHOICE_ID() ``` + +### L1_CONFLICTING_PROOF + +```solidity +error L1_CONFLICTING_PROOF(uint256 id, bytes32 parentHash, bytes32 conflictingBlockHash, bytes32 conflictingSignalRoot, bytes32 blockHash, bytes32 signalRoot) +``` diff --git a/packages/website/pages/docs/reference/contract-documentation/L1/TaikoEvents.md b/packages/website/pages/docs/reference/contract-documentation/L1/TaikoEvents.md index e3ba883d03f..f539ab4aa86 100644 --- a/packages/website/pages/docs/reference/contract-documentation/L1/TaikoEvents.md +++ b/packages/website/pages/docs/reference/contract-documentation/L1/TaikoEvents.md @@ -12,12 +12,6 @@ event BlockProposed(uint256 id, struct TaikoData.BlockMetadata meta, bool txList event BlockProven(uint256 id, bytes32 parentHash, bytes32 blockHash, bytes32 signalRoot, address prover) ``` -### ConflictingProof - -```solidity -event ConflictingProof(uint64 blockId, bytes32 parentHash, bytes32 conflictingBlockHash, bytes32 conflictingSignalRoot, bytes32 blockHash, bytes32 signalRoot) -``` - ### BlockVerified ```solidity diff --git a/packages/website/pages/docs/reference/contract-documentation/L1/TaikoL1.md b/packages/website/pages/docs/reference/contract-documentation/L1/TaikoL1.md index c71c722c9ef..291a24c80c1 100644 --- a/packages/website/pages/docs/reference/contract-documentation/L1/TaikoL1.md +++ b/packages/website/pages/docs/reference/contract-documentation/L1/TaikoL1.md @@ -37,6 +37,21 @@ Propose a Taiko L2 block. | input | bytes | An abi-encoded BlockMetadataInput that the actual L2 block header must satisfy. | | txList | bytes | A list of transactions in this block, encoded with RLP. Note, in the corresponding L2 block an _anchor transaction_ will be the first transaction in the block -- if there are `n` transactions in `txList`, then there will be up to `n + 1` transactions in the L2 block. | +### oracleProveBlocks + +```solidity +function oracleProveBlocks(uint256 blockId, bytes input) external +``` + +Oracle prove mutliple blocks in a row. + +#### Parameters + +| Name | Type | Description | +| ------- | ------- | ---------------------------------------------------------------------------------------------------- | +| blockId | uint256 | The index of the first block to prove. This is also used to select the right implementation version. | +| input | bytes | An abi-encoded TaikoData.BlockOracle[] object. | + ### proveBlock ```solidity diff --git a/packages/website/pages/docs/reference/contract-documentation/common/AddressResolver.md b/packages/website/pages/docs/reference/contract-documentation/common/AddressResolver.md index 9c5612b34a4..cb0fe62bc5a 100644 --- a/packages/website/pages/docs/reference/contract-documentation/common/AddressResolver.md +++ b/packages/website/pages/docs/reference/contract-documentation/common/AddressResolver.md @@ -91,7 +91,7 @@ Returns the AddressManager's address. ### keyForName ```solidity -function keyForName(uint256 chainId, string name) public pure returns (string key) +function keyForName(uint256 chainId, string name) public pure virtual returns (string) ``` ### \_init From 31fcaf3431fb1b63bf590231cfb51db8c8096471 Mon Sep 17 00:00:00 2001 From: Daniel Wang <99078276+dantaik@users.noreply.github.com> Date: Fri, 7 Apr 2023 11:59:28 +0800 Subject: [PATCH 31/47] feat(protocol): make parentGasUsed verifiable on L2 (#13560) --- packages/protocol/contracts/L1/TaikoData.sol | 14 +- packages/protocol/contracts/L1/TaikoL1.sol | 8 +- .../protocol/contracts/L1/libs/LibProving.sol | 51 +++--- .../contracts/L1/libs/LibVerifying.sol | 22 +-- packages/protocol/contracts/L2/TaikoL2.sol | 5 +- packages/protocol/test2/TaikoL1.t.sol | 71 +++++++- .../protocol/test2/TaikoL1OracleProver.t.sol | 152 ++++++++++++------ packages/protocol/test2/TaikoL1TestBase.t.sol | 21 ++- .../contract-documentation/L1/TaikoData.md | 17 +- .../contract-documentation/L1/TaikoL1.md | 2 +- .../contract-documentation/L2/TaikoL2.md | 4 +- 11 files changed, 269 insertions(+), 98 deletions(-) diff --git a/packages/protocol/contracts/L1/TaikoData.sol b/packages/protocol/contracts/L1/TaikoData.sol index 9c8d2260b8b..833122d9b73 100644 --- a/packages/protocol/contracts/L1/TaikoData.sol +++ b/packages/protocol/contracts/L1/TaikoData.sol @@ -88,20 +88,29 @@ library TaikoData { bytes32 signalRoot; bytes32 graffiti; address prover; + uint32 parentGasUsed; + uint32 gasUsed; } struct BlockOracle { - bytes32 parentHash; bytes32 blockHash; + uint32 gasUsed; bytes32 signalRoot; } + struct BlockOracles { + bytes32 parentHash; + uint32 parentGasUsed; + BlockOracle[] blks; + } + // 3 slots struct ForkChoice { bytes32 blockHash; bytes32 signalRoot; uint64 provenAt; address prover; + uint32 gasUsed; } // 4 slots @@ -126,9 +135,8 @@ library TaikoData { struct State { // Ring buffer for proposed blocks and a some recent verified blocks. mapping(uint256 blockId_mode_ringBufferSize => Block) blocks; - // A mapping from (blockId, parentHash) to a reusable ForkChoice storage pointer. // solhint-disable-next-line max-line-length - mapping(uint256 blockId => mapping(bytes32 parentHash => uint256 forkChoiceId)) forkChoiceIds; + mapping(uint256 blockId => mapping(bytes32 parentHash => mapping(uint32 parentGasUsed => uint256 forkChoiceId))) forkChoiceIds; mapping(address account => uint256 balance) balances; mapping(bytes32 txListHash => TxListInfo) txListInfo; // Never or rarely changed diff --git a/packages/protocol/contracts/L1/TaikoL1.sol b/packages/protocol/contracts/L1/TaikoL1.sol index 7f938c64789..58f93166191 100644 --- a/packages/protocol/contracts/L1/TaikoL1.sol +++ b/packages/protocol/contracts/L1/TaikoL1.sol @@ -94,7 +94,7 @@ contract TaikoL1 is EssentialContract, IXchainSync, TaikoEvents, TaikoErrors { config: getConfig(), blockId: blockId, resolver: AddressResolver(this), - oracles: abi.decode(input, (TaikoData.BlockOracle[])) + oracles: abi.decode(input, (TaikoData.BlockOracles)) }); } @@ -200,14 +200,16 @@ contract TaikoL1 is EssentialContract, IXchainSync, TaikoEvents, TaikoErrors { function getForkChoice( uint256 blockId, - bytes32 parentHash + bytes32 parentHash, + uint32 parentGasUsed ) public view returns (TaikoData.ForkChoice memory) { return LibProving.getForkChoice({ state: state, config: getConfig(), blockId: blockId, - parentHash: parentHash + parentHash: parentHash, + parentGasUsed: parentGasUsed }); } diff --git a/packages/protocol/contracts/L1/libs/LibProving.sol b/packages/protocol/contracts/L1/libs/LibProving.sol index 53270cebf1d..9b69b1ea3fa 100644 --- a/packages/protocol/contracts/L1/libs/LibProving.sol +++ b/packages/protocol/contracts/L1/libs/LibProving.sol @@ -47,39 +47,41 @@ library LibProving { TaikoData.Config memory config, AddressResolver resolver, uint256 blockId, - TaikoData.BlockOracle[] memory oracles + TaikoData.BlockOracles memory oracles ) internal { if (!config.enableOracleProver) revert L1_ORACLE_DISABLED(); if (msg.sender != resolver.resolve("oracle_prover", false)) revert L1_NOT_ORACLE_PROVER(); - for (uint i = 0; i < oracles.length; ) { - TaikoData.BlockOracle memory oracle = oracles[i]; + bytes32 parentHash = oracles.parentHash; + uint32 parentGasUsed = oracles.parentGasUsed; + + for (uint i = 0; i < oracles.blks.length; ) { uint256 id = blockId + i; if (id <= state.lastVerifiedBlockId || id >= state.numBlocks) revert L1_BLOCK_ID(); + TaikoData.BlockOracle memory oracle = oracles.blks[i]; if ( - oracle.parentHash == 0 || oracle.blockHash == 0 || - oracle.blockHash == oracle.parentHash || - oracle.signalRoot == 0 + oracle.blockHash == parentHash || + oracle.signalRoot == 0 || + oracle.gasUsed == 0 ) revert L1_INVALID_ORACLE(); TaikoData.Block storage blk = state.blocks[ id % config.ringBufferSize ]; - uint256 fcId = state.forkChoiceIds[id][oracle.parentHash]; + uint256 fcId = state.forkChoiceIds[id][parentHash][parentGasUsed]; if (fcId == 0) { fcId = blk.nextForkChoiceId; unchecked { ++blk.nextForkChoiceId; } assert(fcId > 0); - - state.forkChoiceIds[id][oracle.parentHash] = fcId; + state.forkChoiceIds[id][parentHash][parentGasUsed] = fcId; } TaikoData.ForkChoice storage fc = blk.forkChoices[fcId]; @@ -90,16 +92,19 @@ library LibProving { // [provenAt+prover] slot. fc.provenAt = uint64(block.timestamp); fc.prover = address(0); + fc.gasUsed = oracle.gasUsed; emit BlockProven({ id: id, - parentHash: oracle.parentHash, + parentHash: parentHash, blockHash: oracle.blockHash, signalRoot: oracle.signalRoot, prover: address(0) }); unchecked { ++i; + parentHash = oracle.blockHash; + parentGasUsed = oracle.gasUsed; } } } @@ -124,7 +129,8 @@ library LibProving { evidence.blockHash == evidence.parentHash || evidence.signalRoot == 0 || // prover must not be zero - evidence.prover == address(0) + evidence.prover == address(0) || + evidence.gasUsed == 0 ) revert L1_INVALID_EVIDENCE(); TaikoData.Block storage blk = state.blocks[ @@ -135,7 +141,9 @@ library LibProving { if (blk.metaHash != _metaHash) revert L1_EVIDENCE_MISMATCH(blk.metaHash, _metaHash); - uint256 fcId = state.forkChoiceIds[blockId][evidence.parentHash]; + uint256 fcId = state.forkChoiceIds[blockId][evidence.parentHash][ + evidence.parentGasUsed + ]; if (fcId == 0) { if (config.enableOracleProver) revert L1_NOT_ORACLE_PROVEN(); @@ -145,14 +153,16 @@ library LibProving { ++blk.nextForkChoiceId; } assert(fcId > 0); - - state.forkChoiceIds[blockId][evidence.parentHash] = fcId; + state.forkChoiceIds[blockId][evidence.parentHash][ + evidence.parentGasUsed + ] = fcId; TaikoData.ForkChoice storage fc = blk.forkChoices[fcId]; fc.blockHash = evidence.blockHash; fc.signalRoot = evidence.signalRoot; fc.provenAt = uint64(block.timestamp); fc.prover = evidence.prover; + fc.gasUsed = evidence.gasUsed; } else { assert(fcId < blk.nextForkChoiceId); @@ -160,7 +170,8 @@ library LibProving { if ( fc.blockHash == evidence.blockHash && - fc.signalRoot == evidence.signalRoot + fc.signalRoot == evidence.signalRoot && + fc.gasUsed == evidence.gasUsed ) { if (fc.prover != address(0)) revert L1_ALREADY_PROVEN(); @@ -205,7 +216,10 @@ library LibProving { inputs[4] = uint256(evidence.blockHash); inputs[5] = uint256(evidence.signalRoot); inputs[6] = uint256(evidence.graffiti); - inputs[7] = uint160(evidence.prover); + inputs[7] = + (uint256(uint160(evidence.prover)) << 96) | + (uint256(evidence.parentGasUsed) << 64) | + (uint256(evidence.gasUsed) << 32); inputs[8] = uint256(blk.metaHash); assembly { @@ -242,14 +256,15 @@ library LibProving { TaikoData.State storage state, TaikoData.Config memory config, uint256 blockId, - bytes32 parentHash + bytes32 parentHash, + uint32 parentGasUsed ) internal view returns (TaikoData.ForkChoice storage) { TaikoData.Block storage blk = state.blocks[ blockId % config.ringBufferSize ]; if (blk.blockId != blockId) revert L1_BLOCK_ID(); - uint256 fcId = state.forkChoiceIds[blockId][parentHash]; + uint256 fcId = state.forkChoiceIds[blockId][parentHash][parentGasUsed]; if (fcId == 0 || fcId >= blk.nextForkChoiceId) revert L1_FORK_CHOICE_NOT_FOUND(); diff --git a/packages/protocol/contracts/L1/libs/LibVerifying.sol b/packages/protocol/contracts/L1/libs/LibVerifying.sol index 2678e1880d4..42847c72da5 100644 --- a/packages/protocol/contracts/L1/libs/LibVerifying.sol +++ b/packages/protocol/contracts/L1/libs/LibVerifying.sol @@ -66,9 +66,9 @@ library LibVerifying { assert(fcId > 0); bytes32 blockHash = blk.forkChoices[fcId].blockHash; - assert(blockHash != bytes32(0)); - + uint32 gasUsed = blk.forkChoices[fcId].gasUsed; bytes32 signalRoot; + uint64 processed; unchecked { ++i; @@ -76,14 +76,15 @@ library LibVerifying { while (i < state.numBlocks && processed < maxBlocks) { blk = state.blocks[i % config.ringBufferSize]; + assert(blk.blockId == i); - fcId = state.forkChoiceIds[i][blockHash]; + fcId = state.forkChoiceIds[i][blockHash][gasUsed]; if (fcId == 0) break; TaikoData.ForkChoice storage fc = blk.forkChoices[fcId]; if (fc.prover == address(0)) break; - (blockHash, signalRoot) = _markBlockVerified({ + _markBlockVerified({ state: state, config: config, blk: blk, @@ -91,9 +92,9 @@ library LibVerifying { fc: fc }); - assert(blockHash != bytes32(0)); - - emit BlockVerified(i, blockHash); + blockHash = fc.blockHash; + gasUsed = fc.gasUsed; + signalRoot = fc.signalRoot; unchecked { ++i; @@ -115,7 +116,7 @@ library LibVerifying { TaikoData.Block storage blk, TaikoData.ForkChoice storage fc, uint24 fcId - ) private returns (bytes32 blockHash, bytes32 signalRoot) { + ) private { if (config.enableTokenomics) { ( uint256 newFeeBase, @@ -159,11 +160,10 @@ library LibVerifying { }) .toUint64(); - blockHash = fc.blockHash; - signalRoot = fc.signalRoot; - blk.nextForkChoiceId = 1; blk.verifiedForkChoiceId = fcId; + + emit BlockVerified(blk.blockId, fc.blockHash); } function _addToBalance( diff --git a/packages/protocol/contracts/L2/TaikoL2.sol b/packages/protocol/contracts/L2/TaikoL2.sol index 9bb7538d425..fe5f2ad50fb 100644 --- a/packages/protocol/contracts/L2/TaikoL2.sol +++ b/packages/protocol/contracts/L2/TaikoL2.sol @@ -63,7 +63,7 @@ contract TaikoL2 is EssentialContract, TaikoL2Signer, IXchainSync { // Captures all block variables mentioned in // https://docs.soliditylang.org/en/v0.8.18/units-and-global-variables.html - event BlockVars( + event Anchored( uint64 number, uint64 basefee, uint64 gaslimit, @@ -199,8 +199,7 @@ contract TaikoL2 is EssentialContract, TaikoL2Signer, IXchainSync { // We emit this event so circuits can grab its data to verify block variables. // If plonk lookup table already has all these data, we can still use this // event for debugging purpose. - - emit BlockVars({ + emit Anchored({ number: uint64(block.number), basefee: uint64(basefee), gaslimit: uint64(block.gaslimit), diff --git a/packages/protocol/test2/TaikoL1.t.sol b/packages/protocol/test2/TaikoL1.t.sol index 165184dfd7d..ee27e3d07d6 100644 --- a/packages/protocol/test2/TaikoL1.t.sol +++ b/packages/protocol/test2/TaikoL1.t.sol @@ -70,6 +70,8 @@ contract TaikoL1Test is TaikoL1TestBase { _depositTaikoToken(Carol, 1E6 * 1E8, 100 ether); bytes32 parentHash = GENESIS_BLOCK_HASH; + uint32 parentGasUsed = 0; + uint32 gasUsed = 1000000; for ( uint256 blockId = 1; @@ -83,9 +85,19 @@ contract TaikoL1Test is TaikoL1TestBase { bytes32 blockHash = bytes32(1E10 + blockId); bytes32 signalRoot = bytes32(1E9 + blockId); - proveBlock(Bob, meta, parentHash, blockHash, signalRoot); + proveBlock( + Bob, + meta, + parentHash, + parentGasUsed, + gasUsed, + blockHash, + signalRoot + ); + verifyBlock(Carol, 1); parentHash = blockHash; + parentGasUsed = gasUsed; } printVariables(""); } @@ -96,6 +108,8 @@ contract TaikoL1Test is TaikoL1TestBase { _depositTaikoToken(Alice, 1000 * 1E8, 1000 ether); bytes32 parentHash = GENESIS_BLOCK_HASH; + uint32 parentGasUsed = 0; + uint32 gasUsed = 1000000; for (uint256 blockId = 1; blockId <= 2; blockId++) { printVariables("before propose"); @@ -104,9 +118,18 @@ contract TaikoL1Test is TaikoL1TestBase { bytes32 blockHash = bytes32(1E10 + blockId); bytes32 signalRoot = bytes32(1E9 + blockId); - proveBlock(Alice, meta, parentHash, blockHash, signalRoot); + proveBlock( + Alice, + meta, + parentHash, + parentGasUsed, + gasUsed, + blockHash, + signalRoot + ); verifyBlock(Alice, 2); parentHash = blockHash; + parentGasUsed = gasUsed; } printVariables(""); } @@ -116,6 +139,8 @@ contract TaikoL1Test is TaikoL1TestBase { _depositTaikoToken(Alice, 1E6 * 1E8, 1000 ether); bytes32 parentHash = GENESIS_BLOCK_HASH; + uint32 parentGasUsed = 0; + uint32 gasUsed = 1000000; for ( uint256 blockId = 1; @@ -128,9 +153,19 @@ contract TaikoL1Test is TaikoL1TestBase { bytes32 blockHash = bytes32(1E10 + blockId); bytes32 signalRoot = bytes32(1E9 + blockId); - proveBlock(Alice, meta, parentHash, blockHash, signalRoot); + proveBlock( + Alice, + meta, + parentHash, + parentGasUsed, + gasUsed, + blockHash, + signalRoot + ); parentHash = blockHash; + parentGasUsed = gasUsed; } + verifyBlock(Alice, conf.maxNumProposedBlocks - 1); printVariables("after verify"); verifyBlock(Alice, conf.maxNumProposedBlocks); @@ -144,6 +179,8 @@ contract TaikoL1Test is TaikoL1TestBase { _depositTaikoToken(Carol, 1E6 * 1E8, 100 ether); bytes32 parentHash = GENESIS_BLOCK_HASH; + uint32 parentGasUsed = 0; + uint32 gasUsed = 1000000; for ( uint256 blockId = 1; @@ -156,7 +193,18 @@ contract TaikoL1Test is TaikoL1TestBase { bytes32 blockHash = bytes32(1E10 + blockId); bytes32 signalRoot = bytes32(1E9 + blockId); - proveBlock(Bob, meta, parentHash, blockHash, signalRoot); + proveBlock( + Bob, + meta, + parentHash, + parentGasUsed, + gasUsed, + blockHash, + signalRoot + ); + parentHash = blockHash; + parentGasUsed = gasUsed; + verifyBlock(Carol, 1); mine(blockId); parentHash = blockHash; @@ -171,6 +219,8 @@ contract TaikoL1Test is TaikoL1TestBase { _depositTaikoToken(Carol, 1E6 * 1E8, 100 ether); bytes32 parentHash = GENESIS_BLOCK_HASH; + uint32 parentGasUsed = 0; + uint32 gasUsed = 1000000; uint256 total = conf.maxNumProposedBlocks * 10; @@ -181,7 +231,18 @@ contract TaikoL1Test is TaikoL1TestBase { bytes32 blockHash = bytes32(1E10 + blockId); bytes32 signalRoot = bytes32(1E9 + blockId); - proveBlock(Bob, meta, parentHash, blockHash, signalRoot); + proveBlock( + Bob, + meta, + parentHash, + parentGasUsed, + gasUsed, + blockHash, + signalRoot + ); + parentHash = blockHash; + parentGasUsed = gasUsed; + verifyBlock(Carol, 1); mine(total + 1 - blockId); parentHash = blockHash; diff --git a/packages/protocol/test2/TaikoL1OracleProver.t.sol b/packages/protocol/test2/TaikoL1OracleProver.t.sol index 70ffa1f44be..bf991e94abf 100644 --- a/packages/protocol/test2/TaikoL1OracleProver.t.sol +++ b/packages/protocol/test2/TaikoL1OracleProver.t.sol @@ -78,7 +78,11 @@ contract TaikoL1Test is TaikoL1TestBase { // No forkchoice can be found vm.expectRevert(); - TaikoData.ForkChoice memory fc = L1.getForkChoice(1, parentHash); + TaikoData.ForkChoice memory fc = L1.getForkChoice({ + blockId: 1, + parentHash: parentHash, + parentGasUsed: 123 + }); // Alice cannot prove the forkchoice vm.expectRevert(); @@ -86,6 +90,8 @@ contract TaikoL1Test is TaikoL1TestBase { Alice, meta, parentHash, + 123, + 456, bytes32(uint256(0x100)), bytes32(uint256(0x101)) ); @@ -96,6 +102,8 @@ contract TaikoL1Test is TaikoL1TestBase { Bob, meta, parentHash, + 123, + 456, bytes32(uint256(0x100)), bytes32(uint256(0x101)) ); @@ -106,6 +114,8 @@ contract TaikoL1Test is TaikoL1TestBase { Bob, 1, parentHash, + 123, + 456, bytes32(uint256(0x100)), bytes32(uint256(0x101)) ); @@ -115,94 +125,142 @@ contract TaikoL1Test is TaikoL1TestBase { Alice, 1, parentHash, + 123, + 456, bytes32(uint256(0x100)), bytes32(uint256(0x101)) ); - fc = L1.getForkChoice(1, parentHash); + fc = L1.getForkChoice({ + blockId: 1, + parentHash: parentHash, + parentGasUsed: 123 + }); assertEq(fc.blockHash, bytes32(uint256(0x100))); assertEq(fc.signalRoot, bytes32(uint256(0x101))); assertEq(uint256(fc.provenAt), block.timestamp); assertEq(fc.prover, address(0)); + assertEq(fc.gasUsed, 456); // Alice can oracle-prove the forkchoice more than once for (uint i = 0; i < 2; ++i) { mine(1); - oracleProveBlock( - Alice, - 1, - parentHash, - bytes32(uint256(0x103)), - bytes32(uint256(0x104)) - ); + oracleProveBlock({ + prover: Alice, + blockId: 1, + parentHash: parentHash, + parentGasUsed: 123, + gasUsed: 789, + blockHash: bytes32(uint256(0x103)), + signalRoot: bytes32(uint256(0x104)) + }); } - fc = L1.getForkChoice(1, parentHash); + fc = L1.getForkChoice({ + blockId: 1, + parentHash: parentHash, + parentGasUsed: 123 + }); + assertEq(fc.blockHash, bytes32(uint256(0x103))); assertEq(fc.signalRoot, bytes32(uint256(0x104))); assertEq(uint256(fc.provenAt), block.timestamp); assertEq(fc.prover, address(0)); + assertEq(fc.gasUsed, 789); // Bob cannot prove the forkchoice with conflicting proof vm.expectRevert(); - proveBlock( - Bob, - meta, - parentHash, - bytes32(uint256(0x100)), - bytes32(uint256(0x101)) - ); + proveBlock({ + prover: Bob, + meta: meta, + parentHash: parentHash, + parentGasUsed: 123, + gasUsed: 789, + blockHash: bytes32(uint256(0x100)), + signalRoot: bytes32(uint256(0x101)) + }); + + vm.expectRevert(); + proveBlock({ + prover: Bob, + meta: meta, + parentHash: parentHash, + parentGasUsed: 123, + gasUsed: 456, + blockHash: bytes32(uint256(0x103)), + signalRoot: bytes32(uint256(0x104)) + }); // Bob can prove the forkchoice with a matching proof mine(1); - proveBlock( - Bob, - meta, - parentHash, - bytes32(uint256(0x103)), - bytes32(uint256(0x104)) - ); + proveBlock({ + prover: Bob, + meta: meta, + parentHash: parentHash, + parentGasUsed: 123, + gasUsed: 789, + blockHash: bytes32(uint256(0x103)), + signalRoot: bytes32(uint256(0x104)) + }); + + fc = L1.getForkChoice({ + blockId: 1, + parentHash: parentHash, + parentGasUsed: 123 + }); - fc = L1.getForkChoice(1, parentHash); assertEq(fc.blockHash, bytes32(uint256(0x103))); assertEq(fc.signalRoot, bytes32(uint256(0x104))); assertEq(uint256(fc.provenAt), block.timestamp); assertEq(fc.prover, Bob); + assertEq(fc.gasUsed, 789); // Nobody can prove the forkchoice again vm.expectRevert(); - proveBlock( - Carol, - meta, - parentHash, - bytes32(uint256(0x103)), - bytes32(uint256(0x104)) - ); + proveBlock({ + prover: Carol, + meta: meta, + parentHash: parentHash, + parentGasUsed: 123, + gasUsed: 789, + blockHash: bytes32(uint256(0x103)), + signalRoot: bytes32(uint256(0x104)) + }); // Including Alice vm.expectRevert(); - proveBlock( - Alice, - meta, - parentHash, - bytes32(uint256(0x103)), - bytes32(uint256(0x104)) - ); + proveBlock({ + prover: Alice, + meta: meta, + parentHash: parentHash, + parentGasUsed: 123, + gasUsed: 789, + blockHash: bytes32(uint256(0x103)), + signalRoot: bytes32(uint256(0x104)) + }); // But Alice can still oracle-proof the block again mine(1); - oracleProveBlock( - Alice, - 1, - parentHash, - bytes32(uint256(0x105)), - bytes32(uint256(0x106)) - ); + oracleProveBlock({ + prover: Alice, + blockId: 1, + parentHash: parentHash, + parentGasUsed: 123, + gasUsed: 987, + blockHash: bytes32(uint256(0x105)), + signalRoot: bytes32(uint256(0x106)) + }); + + fc = L1.getForkChoice({ + blockId: 1, + parentHash: parentHash, + parentGasUsed: 123 + }); - fc = L1.getForkChoice(1, parentHash); assertEq(fc.blockHash, bytes32(uint256(0x105))); assertEq(fc.signalRoot, bytes32(uint256(0x106))); assertEq(uint256(fc.provenAt), block.timestamp); assertEq(fc.prover, address(0)); + assertEq(fc.gasUsed, 987); } } diff --git a/packages/protocol/test2/TaikoL1TestBase.t.sol b/packages/protocol/test2/TaikoL1TestBase.t.sol index 2f3fdf2d5f9..216a31cd98b 100644 --- a/packages/protocol/test2/TaikoL1TestBase.t.sol +++ b/packages/protocol/test2/TaikoL1TestBase.t.sol @@ -119,12 +119,23 @@ abstract contract TaikoL1TestBase is Test { address prover, uint256 blockId, bytes32 parentHash, + uint32 parentGasUsed, + uint32 gasUsed, bytes32 blockHash, bytes32 signalRoot ) internal { - TaikoData.BlockOracle[] memory oracles = new TaikoData.BlockOracle[](1); + TaikoData.BlockOracle[] memory blks = new TaikoData.BlockOracle[](1); + + blks[0].blockHash = blockHash; + blks[0].signalRoot = signalRoot; + blks[0].gasUsed = gasUsed; + + TaikoData.BlockOracles memory oracles = TaikoData.BlockOracles( + parentHash, + parentGasUsed, + blks + ); - oracles[0] = TaikoData.BlockOracle(parentHash, blockHash, signalRoot); vm.prank(prover, prover); L1.oracleProveBlocks(blockId, abi.encode(oracles)); } @@ -133,6 +144,8 @@ abstract contract TaikoL1TestBase is Test { address prover, TaikoData.BlockMetadata memory meta, bytes32 parentHash, + uint32 parentGasUsed, + uint32 gasUsed, bytes32 blockHash, bytes32 signalRoot ) internal { @@ -148,7 +161,9 @@ abstract contract TaikoL1TestBase is Test { blockHash: blockHash, signalRoot: signalRoot, graffiti: 0x0, - prover: prover + prover: prover, + parentGasUsed: parentGasUsed, + gasUsed: gasUsed }); vm.prank(prover, prover); diff --git a/packages/website/pages/docs/reference/contract-documentation/L1/TaikoData.md b/packages/website/pages/docs/reference/contract-documentation/L1/TaikoData.md index b6ce178801c..beba6ebee77 100644 --- a/packages/website/pages/docs/reference/contract-documentation/L1/TaikoData.md +++ b/packages/website/pages/docs/reference/contract-documentation/L1/TaikoData.md @@ -102,6 +102,8 @@ struct BlockEvidence { bytes32 signalRoot; bytes32 graffiti; address prover; + uint32 parentGasUsed; + uint32 gasUsed; } ``` @@ -109,12 +111,22 @@ struct BlockEvidence { ```solidity struct BlockOracle { - bytes32 parentHash; bytes32 blockHash; + uint32 gasUsed; bytes32 signalRoot; } ``` +### BlockOracles + +```solidity +struct BlockOracles { + bytes32 parentHash; + uint32 parentGasUsed; + struct TaikoData.BlockOracle[] blks; +} +``` + ### ForkChoice ```solidity @@ -123,6 +135,7 @@ struct ForkChoice { bytes32 signalRoot; uint64 provenAt; address prover; + uint32 gasUsed; } ``` @@ -155,7 +168,7 @@ struct TxListInfo { ```solidity struct State { mapping(uint256 => struct TaikoData.Block) blocks; - mapping(uint256 => mapping(bytes32 => uint256)) forkChoiceIds; + mapping(uint256 => mapping(bytes32 => mapping(uint32 => uint256))) forkChoiceIds; mapping(address => uint256) balances; mapping(bytes32 => struct TaikoData.TxListInfo) txListInfo; uint64 genesisHeight; diff --git a/packages/website/pages/docs/reference/contract-documentation/L1/TaikoL1.md b/packages/website/pages/docs/reference/contract-documentation/L1/TaikoL1.md index 291a24c80c1..9cb7f6c13a3 100644 --- a/packages/website/pages/docs/reference/contract-documentation/L1/TaikoL1.md +++ b/packages/website/pages/docs/reference/contract-documentation/L1/TaikoL1.md @@ -121,7 +121,7 @@ function getBlock(uint256 blockId) public view returns (bytes32 _metaHash, uint2 ### getForkChoice ```solidity -function getForkChoice(uint256 blockId, bytes32 parentHash) public view returns (struct TaikoData.ForkChoice) +function getForkChoice(uint256 blockId, bytes32 parentHash, uint32 parentGasUsed) public view returns (struct TaikoData.ForkChoice) ``` ### getXchainBlockHash diff --git a/packages/website/pages/docs/reference/contract-documentation/L2/TaikoL2.md b/packages/website/pages/docs/reference/contract-documentation/L2/TaikoL2.md index 83876f342a8..c8ae5477a1c 100644 --- a/packages/website/pages/docs/reference/contract-documentation/L2/TaikoL2.md +++ b/packages/website/pages/docs/reference/contract-documentation/L2/TaikoL2.md @@ -75,10 +75,10 @@ uint64 gasExcess uint64 __reserved1 ``` -### BlockVars +### Anchored ```solidity -event BlockVars(uint64 number, uint64 basefee, uint64 gaslimit, uint64 timestamp, bytes32 parentHash, uint256 prevrandao, address coinbase, uint32 chainid) +event Anchored(uint64 number, uint64 basefee, uint64 gaslimit, uint64 timestamp, bytes32 parentHash, uint256 prevrandao, address coinbase, uint32 chainid) ``` ### L2_BASEFEE_MISMATCH From b3974ad30fbbd3eb2736d21d9bd3c249f8725da3 Mon Sep 17 00:00:00 2001 From: Daniel Wang <99078276+dantaik@users.noreply.github.com> Date: Fri, 7 Apr 2023 13:53:51 +0800 Subject: [PATCH 32/47] test(protocol): add a test to calculate and verify 1559 params for alpha-3 (#13539) --- .../protocol/contracts/L2/LibL2Consts.sol | 11 ++++ packages/protocol/contracts/L2/TaikoL2.sol | 30 ++++----- .../protocol/contracts/libs/Lib1559Math.sol | 2 +- packages/protocol/test2/Lib1559Math.sol | 6 +- packages/protocol/test2/Taiko1559Params.t.sol | 62 +++++++++++++++++++ packages/protocol/test2/TaikoL2.t.sol | 14 ++--- .../test2/genesis/GenerateGenesis.g.sol | 5 +- .../contract-documentation/L2/LibL2Consts.md | 7 +++ .../contract-documentation/L2/TaikoL2.md | 6 -- 9 files changed, 110 insertions(+), 33 deletions(-) create mode 100644 packages/protocol/contracts/L2/LibL2Consts.sol create mode 100644 packages/protocol/test2/Taiko1559Params.t.sol create mode 100644 packages/website/pages/docs/reference/contract-documentation/L2/LibL2Consts.md diff --git a/packages/protocol/contracts/L2/LibL2Consts.sol b/packages/protocol/contracts/L2/LibL2Consts.sol new file mode 100644 index 00000000000..b24997851c4 --- /dev/null +++ b/packages/protocol/contracts/L2/LibL2Consts.sol @@ -0,0 +1,11 @@ +// SPDX-License-Identifier: MIT +// _____ _ _ _ _ +// |_ _|_ _(_) |_____ | | __ _| |__ ___ +// | |/ _` | | / / _ \ | |__/ _` | '_ (_-< +// |_|\__,_|_|_\_\___/ |____\__,_|_.__/__/ + +pragma solidity ^0.8.18; + +library LibL2Consts { + uint64 public constant ANCHOR_GAS_COST = 150000; // owner:david +} diff --git a/packages/protocol/contracts/L2/TaikoL2.sol b/packages/protocol/contracts/L2/TaikoL2.sol index fe5f2ad50fb..b43572cc78d 100644 --- a/packages/protocol/contracts/L2/TaikoL2.sol +++ b/packages/protocol/contracts/L2/TaikoL2.sol @@ -8,6 +8,7 @@ pragma solidity ^0.8.18; import {EssentialContract} from "../common/EssentialContract.sol"; import {IXchainSync} from "../common/IXchainSync.sol"; +import {LibL2Consts} from "./LibL2Consts.sol"; import {LibMath} from "../libs/LibMath.sol"; import {Lib1559Math} from "../libs/Lib1559Math.sol"; import {TaikoL2Signer} from "./TaikoL2Signer.sol"; @@ -19,8 +20,6 @@ contract TaikoL2 is EssentialContract, TaikoL2Signer, IXchainSync { using SafeCastUpgradeable for uint256; using LibMath for uint256; - uint64 public constant ANCHOR_GAS_COST = 150000; - struct VerifiedBlock { bytes32 blockHash; bytes32 signalRoot; @@ -220,11 +219,11 @@ contract TaikoL2 is EssentialContract, TaikoL2Signer, IXchainSync { uint64 gasLimit, uint64 parentGasUsed ) public view returns (uint256 _basefee) { - (_basefee, ) = _calcBasefee( - timeSinceNow + block.timestamp - parentTimestamp, - gasLimit, - parentGasUsed - ); + uint256 timeSinceParent; + unchecked { + timeSinceParent = timeSinceNow + block.timestamp - parentTimestamp; + } + (_basefee, ) = _calcBasefee(timeSinceParent, gasLimit, parentGasUsed); } function getXchainBlockHash( @@ -286,13 +285,16 @@ contract TaikoL2 is EssentialContract, TaikoL2Signer, IXchainSync { uint64 parentGasUsed ) private view returns (uint256 _basefee, uint64 _gasExcess) { // Very important to cap _gasExcess uint64 - uint64 parentGasUsedNet = parentGasUsed > ANCHOR_GAS_COST - ? parentGasUsed - ANCHOR_GAS_COST - : 0; - - uint256 a = uint256(gasExcess) + parentGasUsedNet; - uint256 b = gasIssuedPerSecond * timeSinceParent; - _gasExcess = uint64((a.max(b) - b).min(type(uint64).max)); + unchecked { + uint64 parentGasUsedNet = parentGasUsed > + LibL2Consts.ANCHOR_GAS_COST + ? parentGasUsed - LibL2Consts.ANCHOR_GAS_COST + : 0; + + uint256 a = uint256(gasExcess) + parentGasUsedNet; + uint256 b = gasIssuedPerSecond * timeSinceParent; + _gasExcess = uint64((a.max(b) - b).min(type(uint64).max)); + } _basefee = Lib1559Math.calculatePrice({ xscale: xscale, diff --git a/packages/protocol/contracts/libs/Lib1559Math.sol b/packages/protocol/contracts/libs/Lib1559Math.sol index 7d3a3b26215..e36c838a91d 100644 --- a/packages/protocol/contracts/libs/Lib1559Math.sol +++ b/packages/protocol/contracts/libs/Lib1559Math.sol @@ -36,7 +36,7 @@ library Lib1559Math { // 2*target gas and the other one has target gas. uint256 price1x = calculatePrice(xscale, yscale, x, target); uint256 price2x = calculatePrice(xscale, yscale, x, target * 2); - uint64 ratio = uint64((price2x * 100) / price1x); + uint64 ratio = uint64((price2x * 10000) / price1x); if (ratio2x1x != ratio) revert M1559_UNEXPECTED_CHANGE(ratio2x1x, ratio); diff --git a/packages/protocol/test2/Lib1559Math.sol b/packages/protocol/test2/Lib1559Math.sol index 4eee062fd65..9af6d90cacb 100644 --- a/packages/protocol/test2/Lib1559Math.sol +++ b/packages/protocol/test2/Lib1559Math.sol @@ -17,7 +17,7 @@ contract TestLib1559Math is Test { uint64 xExcessMax = (uint(15000000) * 256 * rand).toUint64(); uint64 xTarget = (uint(6000000) * rand).toUint64(); uint64 price0 = (uint(5000000000) * rand).toUint64(); - uint64 ratio2x1x = 111; + uint64 ratio2x1x = 11177; (uint128 xscale, uint128 yscale) = T.calculateScales({ xExcessMax: xExcessMax, price: price0, @@ -55,7 +55,7 @@ contract TestLib1559Math is Test { assertLt(basefee2, type(uint64).max); if (basefee1 != 0) { - assertEq((basefee2 * 100) / basefee1, ratio2x1x); + assertEq((basefee2 * 10000) / basefee1, ratio2x1x); } } } @@ -66,7 +66,7 @@ contract TestLib1559Math is Test { uint64 xExcessMax = (uint(15000000) * 256 * rand).toUint64(); uint64 xTarget = (uint(6000000) * rand).toUint64(); uint64 price0 = (uint(5000000000) * rand).toUint64(); - uint64 ratio2x1x = 111; + uint64 ratio2x1x = 11177; (uint128 xscale, uint128 yscale) = T.calculateScales({ xExcessMax: xExcessMax, diff --git a/packages/protocol/test2/Taiko1559Params.t.sol b/packages/protocol/test2/Taiko1559Params.t.sol new file mode 100644 index 00000000000..f83865533f9 --- /dev/null +++ b/packages/protocol/test2/Taiko1559Params.t.sol @@ -0,0 +1,62 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity ^0.8.18; + +import {Test} from "forge-std/Test.sol"; +import {console2} from "forge-std/console2.sol"; +import {Lib1559Math as T} from "../contracts/libs/Lib1559Math.sol"; +import {TaikoL2} from "../contracts/L2/TaikoL2.sol"; +import { + SafeCastUpgradeable +} from "@openzeppelin/contracts-upgradeable/utils/math/SafeCastUpgradeable.sol"; + +contract TestTaiko1559Params is Test { + using SafeCastUpgradeable for uint256; + + function testAndVerifyTaiko1559Params() external { + // Assume we scale L1 throughput by 10 times. + uint64 scaleFactor = 10; + + // Assume we lower the L1 transaction cost by 25 times. + uint64 costFactor = 25; + + // Calculate gas space issuance per second + uint64 ethereumBlockGasTarget = 15000000; + uint64 ethereumBlockTime = 12; + + // https://ultrasound.money/ + uint64 ethereumBasefeeNow = 28000000000; // 28Gwei + + uint64 gasIssuedPerSecond = (scaleFactor * ethereumBlockGasTarget) / + ethereumBlockTime; + + // Tune this number manually so ratio2x1x is ~112.5%. + uint64 maxSeconds = 7272; + + uint64 gasExcessMax = gasIssuedPerSecond * maxSeconds; + + uint64 initialBasefee = ethereumBasefeeNow / costFactor; + + TaikoL2.EIP1559Params memory param1559 = TaikoL2.EIP1559Params({ + basefee: initialBasefee, + gasIssuedPerSecond: gasIssuedPerSecond, + gasExcessMax: gasExcessMax, + gasTarget: gasIssuedPerSecond * ethereumBlockTime, + ratio2x1x: 11250 // ~12.5% increase + }); + + console2.log("basefee :", param1559.basefee); + console2.log("gasIssuedPerSecond:", param1559.gasIssuedPerSecond); + console2.log("gasExcessMax :", param1559.gasExcessMax); + console2.log("gasTarget :", param1559.gasTarget); + console2.log("ratio2x1x :", param1559.ratio2x1x); + + // basefee : 1120000000 + // gasIssuedPerSecond: 12500000 + // gasExcessMax : 90900000000 + // gasTarget : 150000000 + // ratio2x1x : 11250 + + TaikoL2 L2 = new TaikoL2(); + L2.init(address(1), param1559); // Dummy address manager address. + } +} diff --git a/packages/protocol/test2/TaikoL2.t.sol b/packages/protocol/test2/TaikoL2.t.sol index b58b17e8ead..b10b05ca483 100644 --- a/packages/protocol/test2/TaikoL2.t.sol +++ b/packages/protocol/test2/TaikoL2.t.sol @@ -3,6 +3,7 @@ pragma solidity ^0.8.18; import {Test} from "forge-std/Test.sol"; import {console2} from "forge-std/console2.sol"; +import {LibL2Consts} from "../contracts/L2/LibL2Consts.sol"; import {Strings} from "@openzeppelin/contracts/utils/Strings.sol"; import {TaikoL2} from "../contracts/L2/TaikoL2.sol"; import { @@ -15,7 +16,7 @@ contract TestTaikoL2 is Test { TaikoL2 public L2; uint private logIndex; - uint64 private ANCHOR_GAS_COST; + uint64 private ANCHOR_GAS_COST = LibL2Consts.ANCHOR_GAS_COST; function setUp() public { uint16 rand = 2; @@ -24,12 +25,11 @@ contract TestTaikoL2 is Test { gasIssuedPerSecond: 1000000, gasExcessMax: (uint(15000000) * 256 * rand).toUint64(), gasTarget: (uint(6000000) * rand).toUint64(), - ratio2x1x: 111 + ratio2x1x: 11177 }); L2 = new TaikoL2(); L2.init(address(1), param1559); // Dummy address manager address. - ANCHOR_GAS_COST = L2.ANCHOR_GAS_COST(); vm.roll(block.number + 1); vm.warp(block.timestamp + 30); @@ -154,7 +154,7 @@ contract TestTaikoL2 is Test { block.timestamp - L2.parentTimestamp(); uint256 gasIssued = L2.gasIssuedPerSecond() * timeSinceParent; - string memory msg = string.concat( + string memory _msg = string.concat( "#", Strings.toString(logIndex++), ": gasExcess=", @@ -170,15 +170,15 @@ contract TestTaikoL2 is Test { ); _basefee = L2.getBasefee(timeSinceNow, gasLimit, parentGasUsed); - msg = string.concat( - msg, + _msg = string.concat( + _msg, ", gasExcess(changed)=", Strings.toString(L2.gasExcess()), ", basefee=", Strings.toString(_basefee) ); - console2.log(msg); + console2.log(_msg); } function _getBasefeeAndPrint( diff --git a/packages/protocol/test2/genesis/GenerateGenesis.g.sol b/packages/protocol/test2/genesis/GenerateGenesis.g.sol index 6f2a8152470..e58e8ba4ec0 100644 --- a/packages/protocol/test2/genesis/GenerateGenesis.g.sol +++ b/packages/protocol/test2/genesis/GenerateGenesis.g.sol @@ -14,6 +14,7 @@ import {TokenVault} from "../../contracts/bridge/TokenVault.sol"; import {EtherVault} from "../../contracts/bridge/EtherVault.sol"; import {SignalService} from "../../contracts/signal/SignalService.sol"; import {LibBridgeStatus} from "../../contracts/bridge/libs/LibBridgeStatus.sol"; +import {LibL2Consts} from "../../contracts/L2/LibL2Consts.sol"; import {RegularERC20} from "../../contracts/test/erc20/RegularERC20.sol"; contract TestGenerateGenesis is Test, AddressResolver { @@ -67,7 +68,7 @@ contract TestGenerateGenesis is Test, AddressResolver { taikoL2.getBasefee( 0, BLOCK_GAS_LIMIT, - i + taikoL2.ANCHOR_GAS_COST() + i + LibL2Consts.ANCHOR_GAS_COST ) ); @@ -77,7 +78,7 @@ contract TestGenerateGenesis is Test, AddressResolver { bytes32(block.prevrandao), bytes32(block.prevrandao), i, - i + taikoL2.ANCHOR_GAS_COST() + i + LibL2Consts.ANCHOR_GAS_COST ); if (i == 299) { diff --git a/packages/website/pages/docs/reference/contract-documentation/L2/LibL2Consts.md b/packages/website/pages/docs/reference/contract-documentation/L2/LibL2Consts.md new file mode 100644 index 00000000000..bc1878d609a --- /dev/null +++ b/packages/website/pages/docs/reference/contract-documentation/L2/LibL2Consts.md @@ -0,0 +1,7 @@ +## LibL2Consts + +### ANCHOR_GAS_COST + +```solidity +uint64 ANCHOR_GAS_COST +``` diff --git a/packages/website/pages/docs/reference/contract-documentation/L2/TaikoL2.md b/packages/website/pages/docs/reference/contract-documentation/L2/TaikoL2.md index c8ae5477a1c..8bf470c7dc0 100644 --- a/packages/website/pages/docs/reference/contract-documentation/L2/TaikoL2.md +++ b/packages/website/pages/docs/reference/contract-documentation/L2/TaikoL2.md @@ -1,11 +1,5 @@ ## TaikoL2 -### ANCHOR_GAS_COST - -```solidity -uint64 ANCHOR_GAS_COST -``` - ### VerifiedBlock ```solidity From c40dbb325459ef8f071ab347a97bc044c995b418 Mon Sep 17 00:00:00 2001 From: Daniel Wang <99078276+dantaik@users.noreply.github.com> Date: Sat, 8 Apr 2023 11:40:46 +0800 Subject: [PATCH 33/47] test(protocol): add a fuzz test with a lot of blocks (#13543) --- .gitmodules | 4 + packages/protocol/contracts/L1/TaikoData.sol | 4 +- packages/protocol/foundry.toml | 4 + packages/protocol/lib/foundry-random | 1 + packages/protocol/package.json | 3 +- packages/protocol/remappings.txt | 1 + packages/protocol/snapshot.txt | 11 -- packages/protocol/test2/TaikoL1.sim.sol | 142 ++++++++++++++++++ packages/protocol/test2/TaikoL1.t.sol | 30 +++- .../protocol/test2/TaikoL1OracleProver.t.sol | 2 +- packages/protocol/test2/TaikoL1TestBase.t.sol | 2 +- 11 files changed, 183 insertions(+), 21 deletions(-) create mode 160000 packages/protocol/lib/foundry-random delete mode 100644 packages/protocol/snapshot.txt create mode 100644 packages/protocol/test2/TaikoL1.sim.sol diff --git a/.gitmodules b/.gitmodules index d075cf60403..d4741407013 100644 --- a/.gitmodules +++ b/.gitmodules @@ -14,3 +14,7 @@ path = packages/protocol/lib/forge-std url = https://github.com/foundry-rs/forge-std branch = chore/v1.5.1 +[submodule "packages/protocol/lib/foundry-random"] + path = packages/protocol/lib/foundry-random + url = https://github.com/joejordan/foundry-random + branch = v1.0.2 diff --git a/packages/protocol/contracts/L1/TaikoData.sol b/packages/protocol/contracts/L1/TaikoData.sol index 833122d9b73..1265b6fce54 100644 --- a/packages/protocol/contracts/L1/TaikoData.sol +++ b/packages/protocol/contracts/L1/TaikoData.sol @@ -144,13 +144,13 @@ library TaikoData { uint64 genesisTimestamp; uint64 __reserved1; uint64 __reserved2; - // Changed when a block is proposed or proven/finalized + // Changed when a block is proposed or proven/verified // Changed when a block is proposed uint64 numBlocks; uint64 lastProposedAt; // Timestamp when the last block is proposed. uint64 avgBlockTime; // miliseconds uint64 __reserved3; - // Changed when a block is proven/finalized + // Changed when a block is proven/verified uint64 lastVerifiedBlockId; uint64 __reserved4; // the proof time moving average, note that for each block, only the diff --git a/packages/protocol/foundry.toml b/packages/protocol/foundry.toml index 717b9ef3fdf..5d09b63e585 100644 --- a/packages/protocol/foundry.toml +++ b/packages/protocol/foundry.toml @@ -7,6 +7,8 @@ test = 'test2' libs = ['lib'] optimizer = true optimizer_runs = 200 +ffi = true +gas_limit = '18446744073709551615' # Do not change the block_gas_limit value, TaikoL2.t.sol depends on it. block_gas_limit = 30000000 #30M @@ -16,3 +18,5 @@ fs_permissions = [ { access = "read", path = "./deployments"}, { access = "read", path = "./test2"} ] + +fuzz = { runs = 256 } diff --git a/packages/protocol/lib/foundry-random b/packages/protocol/lib/foundry-random new file mode 160000 index 00000000000..e39ad2c18c4 --- /dev/null +++ b/packages/protocol/lib/foundry-random @@ -0,0 +1 @@ +Subproject commit e39ad2c18c4ff57c6231799f40c787e41eb2dad0 diff --git a/packages/protocol/package.json b/packages/protocol/package.json index 606dd88e357..3b380fe740e 100644 --- a/packages/protocol/package.json +++ b/packages/protocol/package.json @@ -14,7 +14,8 @@ "test": "./script/download_solc.sh && pnpm hardhat test --grep '^[^integration]'", "coverage": "pnpm hardhat coverage --solcoverjs ./.solcover.js --show-stack-traces", "test:coverage": "pnpm coverage", - "test:foundry": "forge test -vvv --gas-report --match-path test2/**/*.t.sol", + "test:foundry": "forge test -vvv --gas-report --fuzz-seed $(date +%s) --match-path test2/**/*.t.sol", + "test:sim": "forge test -vvv --gas-report --fuzz-seed $(date +%s) --match-path test2/**/*.sim.sol --block-gas-limit 30000000000 --memory-limit 1073741824", "generate:genesis": "ts-node ./utils/generate_genesis/main.ts", "test:genesis": "./test2/genesis/generate_genesis.test.sh", "test:bridge": "TEST_TYPE=integrationbridge ./test/test_integration.sh", diff --git a/packages/protocol/remappings.txt b/packages/protocol/remappings.txt index 271c7272700..452ac282ef1 100644 --- a/packages/protocol/remappings.txt +++ b/packages/protocol/remappings.txt @@ -1,5 +1,6 @@ forge-std/=lib/forge-std/src/ solmate/=lib/solmate/src/ ds-test/=lib/forge-std/lib/ds-test/src/ +foundry-random/=lib/foundry-random/src/ @openzeppelin/contracts/=lib/openzeppelin-contracts/contracts/ @openzeppelin/contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/contracts/ \ No newline at end of file diff --git a/packages/protocol/snapshot.txt b/packages/protocol/snapshot.txt deleted file mode 100644 index eb13359d002..00000000000 --- a/packages/protocol/snapshot.txt +++ /dev/null @@ -1,11 +0,0 @@ -GasComparisonTest:testCompareHashString(uint256) (runs: 256, μ: 278647, ~: 220728) -ReadBlockhashVsCalldata:testAnchorSigning(bytes32) (runs: 256, μ: 23434, ~: 23453) -ReadBlockhashVsCalldata:testAnchorTxs() (gas: 74910999) -ReadBlockhashVsCalldata:testAnchorTxsFailByNonTaikoL2Signer() (gas: 8472) -ReadBlockhashVsCalldata:testAnchorTxsFailInTheSameBlock() (gas: 121154) -TaikoL1Test:test_block_time_decreases_but_fee_remains() (gas: 18572742) -TaikoL1Test:test_block_time_increases_but_fee_decreases() (gas: 18550268) -TaikoL1Test:test_more_blocks_than_ring_buffer_size() (gas: 20880651) -TaikoL1Test:test_multiple_blocks_in_one_L1_block() (gas: 757668) -TaikoL1Test:test_verifying_multiple_blocks_once() (gas: 2724631) -TaikoWithConfig:test_getTimeAdjustedFee() (gas: 1461) \ No newline at end of file diff --git a/packages/protocol/test2/TaikoL1.sim.sol b/packages/protocol/test2/TaikoL1.sim.sol new file mode 100644 index 00000000000..3fdac21cdcb --- /dev/null +++ b/packages/protocol/test2/TaikoL1.sim.sol @@ -0,0 +1,142 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.18; + +import {Test} from "forge-std/Test.sol"; +import {console2} from "forge-std/console2.sol"; +import {FoundryRandom} from "foundry-random/FoundryRandom.sol"; +import {TaikoConfig} from "../contracts/L1/TaikoConfig.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.t.sol"; + +/// @dev Warning: this test will take 7-10 minutes and require 1GB memory. +/// `pnpm test:sim` +contract TaikoL1_b is TaikoL1 { + function getConfig() + public + pure + override + returns (TaikoData.Config memory config) + { + config = TaikoConfig.getConfig(); + + config.enableTokenomics = true; + config.txListCacheExpiry = 0; + config.proposerDepositPctg = 0; + config.enableSoloProposer = false; + config.enableOracleProver = false; + config.maxNumProposedBlocks = 36; + config.ringBufferSize = 40; + } +} + +contract Verifier { + fallback(bytes calldata) external returns (bytes memory) { + return bytes.concat(keccak256("taiko")); + } +} + +contract TaikoL1Simulation is TaikoL1TestBase, FoundryRandom { + function deployTaikoL1() internal override returns (TaikoL1 taikoL1) { + taikoL1 = new TaikoL1_b(); + } + + function setUp() public override { + TaikoL1TestBase.setUp(); + _registerAddress( + string(abi.encodePacked("verifier_", uint16(100))), + address(new Verifier()) + ); + } + + function testGeneratingManyRandomBlocks() external { + uint256 time = block.timestamp; + assertEq(time, 1); + + _depositTaikoToken(Alice, 1E6 * 1E8, 10000 ether); + + bytes32 parentHash = GENESIS_BLOCK_HASH; + uint32 parentGasUsed; + + printVariableHeaders(); + printVariables(); + + // Every 1000 blocks take about 40 seconds + // TODO(daniel|dani): change this to 10000 + uint256 blocksToSimulate = 100; + uint256 avgBlockTime = 10 seconds; + + for (uint256 blockId = 1; blockId < blocksToSimulate; blockId++) { + time += randomNumber(avgBlockTime * 2); + + while ((time / 12) * 12 > block.timestamp) { + vm.warp(block.timestamp + 12); + vm.roll(block.number + 1); + } + + uint32 gasLimit = uint32(randomNumber(100E3, 30E6)); // 100K to 30M + uint32 gasUsed = uint32(randomNumber(gasLimit / 2, gasLimit)); + uint24 txListSize = uint24(randomNumber(1, conf.maxBytesPerTxList)); + bytes32 blockHash = bytes32(randomNumber(type(uint256).max)); + bytes32 signalRoot = bytes32(randomNumber(type(uint256).max)); + + TaikoData.BlockMetadata memory meta = proposeBlock( + Alice, + gasLimit, + txListSize + ); + + proveBlock( + Bob, + meta, + parentHash, + parentGasUsed, + gasUsed, + blockHash, + signalRoot + ); + printVariables(); + + parentHash = blockHash; + parentGasUsed = gasUsed; + } + console2.log("-----------------------------"); + console2.log("avgBlockTime:", avgBlockTime); + } + + // TODO(daniel|dani): log enough state variables for analysis. + function printVariableHeaders() internal view { + string memory str = string.concat( + "\nlogCount,", + "time,", + "lastVerifiedBlockId,", + "numBlocks," + // "feeBase,", + // "fee,", + // "lastProposedAt" + ); + console2.log(str); + } + + // TODO(daniel|dani): log enough state variables for analysis. + 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) + // ",", + // Strings.toString(vars.feeBase), + // ",", + // Strings.toString(fee), + // ",", + // Strings.toString(vars.lastProposedAt) + ); + console2.log(str); + } +} diff --git a/packages/protocol/test2/TaikoL1.t.sol b/packages/protocol/test2/TaikoL1.t.sol index ee27e3d07d6..bc71b94d024 100644 --- a/packages/protocol/test2/TaikoL1.t.sol +++ b/packages/protocol/test2/TaikoL1.t.sol @@ -79,7 +79,11 @@ contract TaikoL1Test is TaikoL1TestBase { blockId++ ) { printVariables("before propose"); - TaikoData.BlockMetadata memory meta = proposeBlock(Alice, 1024); + TaikoData.BlockMetadata memory meta = proposeBlock( + Alice, + 1000000, + 1024 + ); printVariables("after propose"); mine(1); @@ -113,7 +117,11 @@ contract TaikoL1Test is TaikoL1TestBase { for (uint256 blockId = 1; blockId <= 2; blockId++) { printVariables("before propose"); - TaikoData.BlockMetadata memory meta = proposeBlock(Alice, 1024); + TaikoData.BlockMetadata memory meta = proposeBlock( + Alice, + 1000000, + 1024 + ); printVariables("after propose"); bytes32 blockHash = bytes32(1E10 + blockId); @@ -148,7 +156,11 @@ contract TaikoL1Test is TaikoL1TestBase { blockId++ ) { printVariables("before propose"); - TaikoData.BlockMetadata memory meta = proposeBlock(Alice, 1024); + TaikoData.BlockMetadata memory meta = proposeBlock( + Alice, + 1000000, + 1024 + ); printVariables("after propose"); bytes32 blockHash = bytes32(1E10 + blockId); @@ -188,7 +200,11 @@ contract TaikoL1Test is TaikoL1TestBase { blockId++ ) { printVariables("before propose"); - TaikoData.BlockMetadata memory meta = proposeBlock(Alice, 1024); + TaikoData.BlockMetadata memory meta = proposeBlock( + Alice, + 1000000, + 1024 + ); mine(1); bytes32 blockHash = bytes32(1E10 + blockId); @@ -226,7 +242,11 @@ contract TaikoL1Test is TaikoL1TestBase { for (uint256 blockId = 1; blockId < total; blockId++) { printVariables("before propose"); - TaikoData.BlockMetadata memory meta = proposeBlock(Alice, 1024); + TaikoData.BlockMetadata memory meta = proposeBlock( + Alice, + 1000000, + 1024 + ); mine(1); bytes32 blockHash = bytes32(1E10 + blockId); diff --git a/packages/protocol/test2/TaikoL1OracleProver.t.sol b/packages/protocol/test2/TaikoL1OracleProver.t.sol index bf991e94abf..7b7c1876055 100644 --- a/packages/protocol/test2/TaikoL1OracleProver.t.sol +++ b/packages/protocol/test2/TaikoL1OracleProver.t.sol @@ -74,7 +74,7 @@ contract TaikoL1Test is TaikoL1TestBase { bytes32 parentHash = GENESIS_BLOCK_HASH; - TaikoData.BlockMetadata memory meta = proposeBlock(Bob, 1024); + TaikoData.BlockMetadata memory meta = proposeBlock(Bob, 1000000, 1024); // No forkchoice can be found vm.expectRevert(); diff --git a/packages/protocol/test2/TaikoL1TestBase.t.sol b/packages/protocol/test2/TaikoL1TestBase.t.sol index 216a31cd98b..3170a9332ef 100644 --- a/packages/protocol/test2/TaikoL1TestBase.t.sol +++ b/packages/protocol/test2/TaikoL1TestBase.t.sol @@ -78,9 +78,9 @@ abstract contract TaikoL1TestBase is Test { function proposeBlock( address proposer, + uint32 gasLimit, uint24 txListSize ) internal returns (TaikoData.BlockMetadata memory meta) { - uint32 gasLimit = 1000000; bytes memory txList = new bytes(txListSize); TaikoData.BlockMetadataInput memory input = TaikoData .BlockMetadataInput({ From 3b7469a740bcf54341eba82d0dee54b4fb878b9b Mon Sep 17 00:00:00 2001 From: Daniel Wang <99078276+dantaik@users.noreply.github.com> Date: Sat, 8 Apr 2023 11:43:03 +0800 Subject: [PATCH 34/47] feat(protocol): allow multiple Taiko deployments to sync signals (#13565) --- .../protocol/contracts/L1/TaikoConfig.sol | 1 + packages/protocol/contracts/L1/TaikoData.sol | 1 + packages/protocol/contracts/L1/TaikoL1.sol | 3 + .../contracts/L1/libs/LibVerifying.sol | 10 ++ packages/protocol/script/DeployOnL1.s.sol | 30 ++-- packages/protocol/script/deploy_on_l1.sh | 3 +- .../contract-documentation/L1/TaikoData.md | 1 + .../bridge/BridgeCustomErrors.md | 137 ------------------ 8 files changed, 38 insertions(+), 148 deletions(-) delete mode 100644 packages/website/pages/docs/reference/contract-documentation/bridge/BridgeCustomErrors.md diff --git a/packages/protocol/contracts/L1/TaikoConfig.sol b/packages/protocol/contracts/L1/TaikoConfig.sol index 73259836337..d67233a67ee 100644 --- a/packages/protocol/contracts/L1/TaikoConfig.sol +++ b/packages/protocol/contracts/L1/TaikoConfig.sol @@ -38,6 +38,7 @@ library TaikoConfig { // Moving average factors feeBaseMAF: 1024, txListCacheExpiry: 0, + relaySignalRoot: false, enableSoloProposer: false, enableOracleProver: true, enableTokenomics: true, diff --git a/packages/protocol/contracts/L1/TaikoData.sol b/packages/protocol/contracts/L1/TaikoData.sol index 1265b6fce54..939ef4637cd 100644 --- a/packages/protocol/contracts/L1/TaikoData.sol +++ b/packages/protocol/contracts/L1/TaikoData.sol @@ -30,6 +30,7 @@ library TaikoData { // Moving average factors uint256 feeBaseMAF; uint256 txListCacheExpiry; + bool relaySignalRoot; bool enableSoloProposer; bool enableOracleProver; bool enableTokenomics; diff --git a/packages/protocol/contracts/L1/TaikoL1.sol b/packages/protocol/contracts/L1/TaikoL1.sol index 58f93166191..656a75543f5 100644 --- a/packages/protocol/contracts/L1/TaikoL1.sol +++ b/packages/protocol/contracts/L1/TaikoL1.sol @@ -73,6 +73,7 @@ contract TaikoL1 is EssentialContract, IXchainSync, TaikoEvents, TaikoErrors { LibVerifying.verifyBlocks({ state: state, config: config, + resolver: AddressResolver(this), maxBlocks: config.maxVerificationsPerTx }); } @@ -122,6 +123,7 @@ contract TaikoL1 is EssentialContract, IXchainSync, TaikoEvents, TaikoErrors { LibVerifying.verifyBlocks({ state: state, config: config, + resolver: AddressResolver(this), maxBlocks: config.maxVerificationsPerTx }); } @@ -136,6 +138,7 @@ contract TaikoL1 is EssentialContract, IXchainSync, TaikoEvents, TaikoErrors { LibVerifying.verifyBlocks({ state: state, config: getConfig(), + resolver: AddressResolver(this), maxBlocks: maxBlocks }); } diff --git a/packages/protocol/contracts/L1/libs/LibVerifying.sol b/packages/protocol/contracts/L1/libs/LibVerifying.sol index 42847c72da5..ad8fa5b0ca8 100644 --- a/packages/protocol/contracts/L1/libs/LibVerifying.sol +++ b/packages/protocol/contracts/L1/libs/LibVerifying.sol @@ -7,6 +7,7 @@ pragma solidity ^0.8.18; import {AddressResolver} from "../../common/AddressResolver.sol"; +import {ISignalService} from "../../signal/ISignalService.sol"; import {LibTokenomics} from "./LibTokenomics.sol"; import {LibUtils} from "./LibUtils.sol"; import { @@ -57,6 +58,7 @@ library LibVerifying { function verifyBlocks( TaikoData.State storage state, TaikoData.Config memory config, + AddressResolver resolver, uint256 maxBlocks ) internal { uint256 i = state.lastVerifiedBlockId; @@ -106,6 +108,14 @@ library LibVerifying { unchecked { state.lastVerifiedBlockId += processed; } + + if (config.relaySignalRoot) { + // Send the L2's signal root to the signal service so other TaikoL1 + // deployments, if they share the same signal service, can relay the + // signal to their corresponding TaikoL2 contract. + ISignalService(resolver.resolve("signal_service", false)) + .sendSignal(signalRoot); + } emit XchainSynced(state.lastVerifiedBlockId, blockHash, signalRoot); } } diff --git a/packages/protocol/script/DeployOnL1.s.sol b/packages/protocol/script/DeployOnL1.s.sol index d58235d02f4..c0f442bd553 100644 --- a/packages/protocol/script/DeployOnL1.s.sol +++ b/packages/protocol/script/DeployOnL1.s.sol @@ -32,10 +32,12 @@ contract DeployOnL1 is Script, AddressResolver { address public owner = vm.envAddress("OWNER"); - address public oracleProver = vm.envAddress("ORACLE_PROVER_ADDRESS"); + address public oracleProver = vm.envAddress("ORACLE_PROVER"); address public soloProposer = vm.envAddress("SOLO_PROPOSER"); + address public sharedSignalService = vm.envAddress("SHARED_SIGNAL_SERVICE"); + address public treasure = vm.envAddress("TREASURE"); address public taikoTokenPremintRecipient = @@ -143,15 +145,23 @@ contract DeployOnL1 is Script, AddressResolver { ); // SignalService - SignalService signalService = new SignalService(); - deployProxy( - "signal_service", - address(signalService), - bytes.concat( - signalService.init.selector, - abi.encode(addressManagerProxy) - ) - ); + if (sharedSignalService == address(0)) { + SignalService signalService = new SignalService(); + deployProxy( + "signal_service", + address(signalService), + bytes.concat( + signalService.init.selector, + abi.encode(addressManagerProxy) + ) + ); + } else { + console.log( + "Warining: using shared signal service: ", + sharedSignalService + ); + setAddress("signal_service", sharedSignalService); + } // PlonkVerifier deployPlonkVerifiers(); diff --git a/packages/protocol/script/deploy_on_l1.sh b/packages/protocol/script/deploy_on_l1.sh index 6d1ceae95e7..b7b5f871b73 100755 --- a/packages/protocol/script/deploy_on_l1.sh +++ b/packages/protocol/script/deploy_on_l1.sh @@ -4,7 +4,8 @@ set -e PRIVATE_KEY=ac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80 \ -ORACLE_PROVER_ADDRESS=0xa0Ee7A142d267C1f36714E4a8F75612F20a79720 \ +SHARED_SIGNAL_SERVICE=0x0000000000000000000000000000000000000000 \ +ORACLE_PROVER=0xa0Ee7A142d267C1f36714E4a8F75612F20a79720 \ SOLO_PROPOSER=0xa0Ee7A142d267C1f36714E4a8F75612F20a79720 \ OWNER=0x70997970C51812dc3A010C7d01b50e0d17dc79C8 \ TAIKO_L2_ADDRESS=0xa0Ee7A142d267C1f36714E4a8F75612F20a79720 \ diff --git a/packages/website/pages/docs/reference/contract-documentation/L1/TaikoData.md b/packages/website/pages/docs/reference/contract-documentation/L1/TaikoData.md index beba6ebee77..2731766e01a 100644 --- a/packages/website/pages/docs/reference/contract-documentation/L1/TaikoData.md +++ b/packages/website/pages/docs/reference/contract-documentation/L1/TaikoData.md @@ -27,6 +27,7 @@ struct Config { uint256 proposerDepositPctg; uint256 feeBaseMAF; uint256 txListCacheExpiry; + bool relaySignalRoot; bool enableSoloProposer; bool enableOracleProver; bool enableTokenomics; diff --git a/packages/website/pages/docs/reference/contract-documentation/bridge/BridgeCustomErrors.md b/packages/website/pages/docs/reference/contract-documentation/bridge/BridgeCustomErrors.md deleted file mode 100644 index 52e6a13fb48..00000000000 --- a/packages/website/pages/docs/reference/contract-documentation/bridge/BridgeCustomErrors.md +++ /dev/null @@ -1,137 +0,0 @@ ---- -title: BridgeCustomErrors ---- - -## BridgeCustomErrors - -### B_CANNOT_RECEIVE - -```solidity -error B_CANNOT_RECEIVE() -``` - -### B_DENIED - -```solidity -error B_DENIED() -``` - -### B_ERC20_CANNOT_RECEIVE - -```solidity -error B_ERC20_CANNOT_RECEIVE() -``` - -### B_ETHER_RELEASED_ALREADY - -```solidity -error B_ETHER_RELEASED_ALREADY() -``` - -### B_EV_DO_NOT_BURN - -```solidity -error B_EV_DO_NOT_BURN() -``` - -### B_EV_NOT_AUTHORIZED - -```solidity -error B_EV_NOT_AUTHORIZED() -``` - -### B_EV_PARAM - -```solidity -error B_EV_PARAM() -``` - -### B_FAILED_TRANSFER - -```solidity -error B_FAILED_TRANSFER() -``` - -### B_FORBIDDEN - -```solidity -error B_FORBIDDEN() -``` - -### B_GAS_LIMIT - -```solidity -error B_GAS_LIMIT() -``` - -### B_INCORRECT_VALUE - -```solidity -error B_INCORRECT_VALUE() -``` - -### B_INIT_PARAM_ERROR - -```solidity -error B_INIT_PARAM_ERROR() -``` - -### B_MSG_HASH_NULL - -```solidity -error B_MSG_HASH_NULL() -``` - -### B_MSG_NON_RETRIABLE - -```solidity -error B_MSG_NON_RETRIABLE() -``` - -### B_MSG_NOT_FAILED - -```solidity -error B_MSG_NOT_FAILED() -``` - -### B_NULL_APP_ADDR - -```solidity -error B_NULL_APP_ADDR() -``` - -### B_OWNER_IS_NULL - -```solidity -error B_OWNER_IS_NULL() -``` - -### B_SIGNAL_NOT_RECEIVED - -```solidity -error B_SIGNAL_NOT_RECEIVED() -``` - -### B_STATUS_MISMTACH - -```solidity -error B_STATUS_MISMTACH() -``` - -### B_WRONG_CHAIN_ID - -```solidity -error B_WRONG_CHAIN_ID() -``` - -### B_WRONG_TO_ADDRESS - -```solidity -error B_WRONG_TO_ADDRESS() -``` - -### B_ZERO_SIGNAL - -```solidity -error B_ZERO_SIGNAL() -``` From 670a85cffaef67ce48bd9e3a06ea1f6f4a0f1f81 Mon Sep 17 00:00:00 2001 From: Daniel Wang <99078276+dantaik@users.noreply.github.com> Date: Sat, 8 Apr 2023 11:53:34 +0800 Subject: [PATCH 35/47] refactor(protocol): optimize proveBlock gas cost (#13571) --- packages/protocol/contracts/L1/TaikoData.sol | 3 +- .../protocol/contracts/L1/TaikoErrors.sol | 3 +- .../protocol/contracts/L1/libs/LibProving.sol | 183 +++++++++++------- .../protocol/contracts/L1/libs/LibUtils.sol | 32 +++ .../contracts/L1/libs/LibVerifying.sol | 3 +- .../contract-documentation/L1/TaikoData.md | 1 + .../contract-documentation/L1/TaikoErrors.md | 2 +- 7 files changed, 150 insertions(+), 77 deletions(-) diff --git a/packages/protocol/contracts/L1/TaikoData.sol b/packages/protocol/contracts/L1/TaikoData.sol index 939ef4637cd..81aafa67b6b 100644 --- a/packages/protocol/contracts/L1/TaikoData.sol +++ b/packages/protocol/contracts/L1/TaikoData.sol @@ -105,8 +105,9 @@ library TaikoData { BlockOracle[] blks; } - // 3 slots + // 4 slots struct ForkChoice { + bytes32 key; // only written/read for the 1st fork choice. bytes32 blockHash; bytes32 signalRoot; uint64 provenAt; diff --git a/packages/protocol/contracts/L1/TaikoErrors.sol b/packages/protocol/contracts/L1/TaikoErrors.sol index eefc7adb6a1..49e1e20e7b4 100644 --- a/packages/protocol/contracts/L1/TaikoErrors.sol +++ b/packages/protocol/contracts/L1/TaikoErrors.sol @@ -36,7 +36,8 @@ abstract contract TaikoErrors { error L1_UNEXPECTED_FORK_CHOICE_ID(); error L1_CONFLICTING_PROOF( - uint256 id, + uint64 id, + uint32 parentGasUsed, bytes32 parentHash, bytes32 conflictingBlockHash, bytes32 conflictingSignalRoot, diff --git a/packages/protocol/contracts/L1/libs/LibProving.sol b/packages/protocol/contracts/L1/libs/LibProving.sol index 9b69b1ea3fa..f262842dfbf 100644 --- a/packages/protocol/contracts/L1/libs/LibProving.sol +++ b/packages/protocol/contracts/L1/libs/LibProving.sol @@ -34,7 +34,8 @@ library LibProving { error L1_NOT_ORACLE_PROVER(); error L1_UNEXPECTED_FORK_CHOICE_ID(); error L1_CONFLICTING_PROOF( - uint256 id, + uint64 id, + uint32 parentGasUsed, bytes32 parentHash, bytes32 conflictingBlockHash, bytes32 conflictingSignalRoot, @@ -74,33 +75,30 @@ library LibProving { id % config.ringBufferSize ]; - uint256 fcId = state.forkChoiceIds[id][parentHash][parentGasUsed]; + uint256 fcId = LibUtils.getForkChoiceId( + state, + blk, + parentHash, + parentGasUsed + ); + if (fcId == 0) { - fcId = blk.nextForkChoiceId; - unchecked { - ++blk.nextForkChoiceId; - } - assert(fcId > 0); - state.forkChoiceIds[id][parentHash][parentGasUsed] = fcId; + fcId = _getNextForkChoiceId(blk); } - TaikoData.ForkChoice storage fc = blk.forkChoices[fcId]; - fc.blockHash = oracle.blockHash; - fc.signalRoot = oracle.signalRoot; - - // we are reusing storage slots, still need to reset the - // [provenAt+prover] slot. - fc.provenAt = uint64(block.timestamp); - fc.prover = address(0); - fc.gasUsed = oracle.gasUsed; - - emit BlockProven({ - id: id, + _saveForkChoice({ + state: state, + config: config, + blk: blk, + fcId: fcId, parentHash: parentHash, + parentGasUsed: parentGasUsed, blockHash: oracle.blockHash, signalRoot: oracle.signalRoot, + gasUsed: oracle.gasUsed, prover: address(0) }); + unchecked { ++i; parentHash = oracle.blockHash; @@ -141,53 +139,29 @@ library LibProving { if (blk.metaHash != _metaHash) revert L1_EVIDENCE_MISMATCH(blk.metaHash, _metaHash); - uint256 fcId = state.forkChoiceIds[blockId][evidence.parentHash][ + uint256 fcId = LibUtils.getForkChoiceId( + state, + blk, + evidence.parentHash, evidence.parentGasUsed - ]; + ); if (fcId == 0) { if (config.enableOracleProver) revert L1_NOT_ORACLE_PROVEN(); - - fcId = blk.nextForkChoiceId; - unchecked { - ++blk.nextForkChoiceId; - } - assert(fcId > 0); - state.forkChoiceIds[blockId][evidence.parentHash][ - evidence.parentGasUsed - ] = fcId; - - TaikoData.ForkChoice storage fc = blk.forkChoices[fcId]; - fc.blockHash = evidence.blockHash; - fc.signalRoot = evidence.signalRoot; - fc.provenAt = uint64(block.timestamp); - fc.prover = evidence.prover; - fc.gasUsed = evidence.gasUsed; - } else { - assert(fcId < blk.nextForkChoiceId); - - TaikoData.ForkChoice storage fc = blk.forkChoices[fcId]; - - if ( - fc.blockHash == evidence.blockHash && - fc.signalRoot == evidence.signalRoot && - fc.gasUsed == evidence.gasUsed - ) { - if (fc.prover != address(0)) revert L1_ALREADY_PROVEN(); - - fc.provenAt = uint64(block.timestamp); - fc.prover = evidence.prover; - } else { - revert L1_CONFLICTING_PROOF({ - id: meta.id, - parentHash: evidence.parentHash, - conflictingBlockHash: evidence.blockHash, - conflictingSignalRoot: evidence.signalRoot, - blockHash: fc.blockHash, - signalRoot: fc.signalRoot - }); - } + fcId = _getNextForkChoiceId(blk); } + _saveForkChoice({ + state: state, + config: config, + blk: blk, + fcId: fcId, + parentHash: evidence.parentHash, + parentGasUsed: evidence.parentGasUsed, + blockHash: evidence.blockHash, + signalRoot: evidence.signalRoot, + gasUsed: evidence.gasUsed, + prover: evidence.prover + }); if (!config.skipZKPVerification) { bytes32 instance; @@ -242,14 +216,6 @@ library LibProving { bytes32(ret) != keccak256("taiko") ) revert L1_INVALID_PROOF(); } - - emit BlockProven({ - id: blockId, - parentHash: evidence.parentHash, - blockHash: evidence.blockHash, - signalRoot: evidence.signalRoot, - prover: evidence.prover - }); } function getForkChoice( @@ -264,10 +230,81 @@ library LibProving { ]; if (blk.blockId != blockId) revert L1_BLOCK_ID(); - uint256 fcId = state.forkChoiceIds[blockId][parentHash][parentGasUsed]; - if (fcId == 0 || fcId >= blk.nextForkChoiceId) - revert L1_FORK_CHOICE_NOT_FOUND(); + uint256 fcId = LibUtils.getForkChoiceId( + state, + blk, + parentHash, + parentGasUsed + ); + if (fcId == 0) revert L1_FORK_CHOICE_NOT_FOUND(); return blk.forkChoices[fcId]; } + + function _saveForkChoice( + TaikoData.State storage state, + TaikoData.Config memory config, + TaikoData.Block storage blk, + uint256 fcId, + bytes32 parentHash, + uint32 parentGasUsed, + bytes32 blockHash, + bytes32 signalRoot, + uint32 gasUsed, + address prover + ) private { + TaikoData.ForkChoice storage fc = blk.forkChoices[fcId]; + if (fcId == 1) { + // We only write the key when fcId is 1. + fc.key = LibUtils.keyForForkChoice(parentHash, parentGasUsed); + state.forkChoiceIds[blk.blockId][parentHash][parentGasUsed] = 0; + } else { + state.forkChoiceIds[blk.blockId][parentHash][parentGasUsed] = fcId; + } + + if (prover != address(0) && config.enableOracleProver) { + // This is a regular proof after the oracle proof + if (fc.prover != address(0)) revert L1_ALREADY_PROVEN(); + + if ( + fc.blockHash != blockHash || + fc.signalRoot != signalRoot || + fc.gasUsed != gasUsed + ) + revert L1_CONFLICTING_PROOF({ + id: blk.blockId, + parentGasUsed: parentGasUsed, + parentHash: parentHash, + conflictingBlockHash: blockHash, + conflictingSignalRoot: signalRoot, + blockHash: fc.blockHash, + signalRoot: fc.signalRoot + }); + } else { + // oracle proof or enableOracleProver is disabled + fc.blockHash = blockHash; + fc.signalRoot = signalRoot; + fc.gasUsed = gasUsed; + } + + fc.provenAt = uint64(block.timestamp); + fc.prover = prover; + + emit BlockProven({ + id: blk.blockId, + parentHash: parentHash, + blockHash: blockHash, + signalRoot: signalRoot, + prover: prover + }); + } + + function _getNextForkChoiceId( + TaikoData.Block storage blk + ) private returns (uint256 fcId) { + fcId = blk.nextForkChoiceId; + unchecked { + ++blk.nextForkChoiceId; + } + } } diff --git a/packages/protocol/contracts/L1/libs/LibUtils.sol b/packages/protocol/contracts/L1/libs/LibUtils.sol index c27bdf5e288..9ce744fab4c 100644 --- a/packages/protocol/contracts/L1/libs/LibUtils.sol +++ b/packages/protocol/contracts/L1/libs/LibUtils.sol @@ -28,6 +28,25 @@ library LibUtils { found = (blk.blockId == id && blk.verifiedForkChoiceId != 0); } + function getForkChoiceId( + TaikoData.State storage state, + TaikoData.Block storage blk, + bytes32 parentHash, + uint32 parentGasUsed + ) internal view returns (uint256) { + if ( + blk.forkChoices[1].key == + keyForForkChoice(parentHash, parentGasUsed) + ) return 1; + + uint256 fcId = state.forkChoiceIds[blk.blockId][parentHash][ + parentGasUsed + ]; + if (fcId >= blk.nextForkChoiceId) return 0; + + return fcId; + } + function getStateVariables( TaikoData.State storage state ) internal view returns (TaikoData.StateVariables memory) { @@ -97,4 +116,17 @@ library LibUtils { hash := keccak256(inputs, mul(6, 32)) } } + + function keyForForkChoice( + bytes32 parentHash, + uint32 parentGasUsed + ) internal pure returns (bytes32 key) { + assembly { + let ptr := mload(0x40) + mstore(ptr, parentGasUsed) + mstore(add(ptr, 32), parentHash) + key := keccak256(add(ptr, 28), 36) + mstore(0x40, add(ptr, 64)) + } + } } diff --git a/packages/protocol/contracts/L1/libs/LibVerifying.sol b/packages/protocol/contracts/L1/libs/LibVerifying.sol index ad8fa5b0ca8..86475195b10 100644 --- a/packages/protocol/contracts/L1/libs/LibVerifying.sol +++ b/packages/protocol/contracts/L1/libs/LibVerifying.sol @@ -80,7 +80,8 @@ library LibVerifying { blk = state.blocks[i % config.ringBufferSize]; assert(blk.blockId == i); - fcId = state.forkChoiceIds[i][blockHash][gasUsed]; + fcId = LibUtils.getForkChoiceId(state, blk, blockHash, gasUsed); + if (fcId == 0) break; TaikoData.ForkChoice storage fc = blk.forkChoices[fcId]; diff --git a/packages/website/pages/docs/reference/contract-documentation/L1/TaikoData.md b/packages/website/pages/docs/reference/contract-documentation/L1/TaikoData.md index 2731766e01a..696c01a09b4 100644 --- a/packages/website/pages/docs/reference/contract-documentation/L1/TaikoData.md +++ b/packages/website/pages/docs/reference/contract-documentation/L1/TaikoData.md @@ -132,6 +132,7 @@ struct BlockOracles { ```solidity struct ForkChoice { + bytes32 key; bytes32 blockHash; bytes32 signalRoot; uint64 provenAt; diff --git a/packages/website/pages/docs/reference/contract-documentation/L1/TaikoErrors.md b/packages/website/pages/docs/reference/contract-documentation/L1/TaikoErrors.md index ad7a090ebd4..dab3865104e 100644 --- a/packages/website/pages/docs/reference/contract-documentation/L1/TaikoErrors.md +++ b/packages/website/pages/docs/reference/contract-documentation/L1/TaikoErrors.md @@ -159,5 +159,5 @@ error L1_UNEXPECTED_FORK_CHOICE_ID() ### L1_CONFLICTING_PROOF ```solidity -error L1_CONFLICTING_PROOF(uint256 id, bytes32 parentHash, bytes32 conflictingBlockHash, bytes32 conflictingSignalRoot, bytes32 blockHash, bytes32 signalRoot) +error L1_CONFLICTING_PROOF(uint64 id, uint32 parentGasUsed, bytes32 parentHash, bytes32 conflictingBlockHash, bytes32 conflictingSignalRoot, bytes32 blockHash, bytes32 signalRoot) ``` From e8689cb67671f269de0a60bc99a0b76ebc5f565a Mon Sep 17 00:00:00 2001 From: David Date: Sat, 8 Apr 2023 12:01:56 +0800 Subject: [PATCH 36/47] feat(protocol): update `TaikoL2.getBasefee` parameters (#13570) Co-authored-by: Daniel Wang <99078276+dantaik@users.noreply.github.com> --- packages/protocol/contracts/L2/TaikoL2.sol | 6 +--- packages/protocol/test2/TaikoL2.t.sol | 33 +++++++++---------- .../test2/genesis/GenerateGenesis.g.sol | 2 +- 3 files changed, 18 insertions(+), 23 deletions(-) diff --git a/packages/protocol/contracts/L2/TaikoL2.sol b/packages/protocol/contracts/L2/TaikoL2.sol index b43572cc78d..9730f61dd19 100644 --- a/packages/protocol/contracts/L2/TaikoL2.sol +++ b/packages/protocol/contracts/L2/TaikoL2.sol @@ -215,14 +215,10 @@ contract TaikoL2 is EssentialContract, TaikoL2Signer, IXchainSync { **********************/ function getBasefee( - uint32 timeSinceNow, + uint32 timeSinceParent, uint64 gasLimit, uint64 parentGasUsed ) public view returns (uint256 _basefee) { - uint256 timeSinceParent; - unchecked { - timeSinceParent = timeSinceNow + block.timestamp - parentTimestamp; - } (_basefee, ) = _calcBasefee(timeSinceParent, gasLimit, parentGasUsed); } diff --git a/packages/protocol/test2/TaikoL2.t.sol b/packages/protocol/test2/TaikoL2.t.sol index b10b05ca483..b2c5070896f 100644 --- a/packages/protocol/test2/TaikoL2.t.sol +++ b/packages/protocol/test2/TaikoL2.t.sol @@ -132,27 +132,26 @@ contract TestTaikoL2 is Test { } function testGetBasefee() external { - assertEq(_getBasefeeAndPrint(0, 0, 0), 317609019); - assertEq(_getBasefeeAndPrint(0, 1, 0), 317609019); - assertEq(_getBasefeeAndPrint(0, 1000000, 0), 320423332); - assertEq(_getBasefeeAndPrint(0, 5000000, 0), 332018053); - assertEq(_getBasefeeAndPrint(0, 10000000, 0), 347305199); - - assertEq(_getBasefeeAndPrint(100, 0, 0), 54544902); - assertEq(_getBasefeeAndPrint(100, 1, 0), 54544902); - assertEq(_getBasefeeAndPrint(100, 1000000, 0), 55028221); - assertEq(_getBasefeeAndPrint(100, 5000000, 0), 57019452); - assertEq(_getBasefeeAndPrint(100, 10000000, 0), 59644805); + uint32 timeSinceParent = uint32(block.timestamp - L2.parentTimestamp()); + assertEq(_getBasefeeAndPrint(timeSinceParent, 0, 0), 317609019); + assertEq(_getBasefeeAndPrint(timeSinceParent, 1, 0), 317609019); + assertEq(_getBasefeeAndPrint(timeSinceParent, 1000000, 0), 320423332); + assertEq(_getBasefeeAndPrint(timeSinceParent, 5000000, 0), 332018053); + assertEq(_getBasefeeAndPrint(timeSinceParent, 10000000, 0), 347305199); + + timeSinceParent = uint32(100 + block.timestamp - L2.parentTimestamp()); + assertEq(_getBasefeeAndPrint(timeSinceParent, 0, 0), 54544902); + assertEq(_getBasefeeAndPrint(timeSinceParent, 1, 0), 54544902); + assertEq(_getBasefeeAndPrint(timeSinceParent, 1000000, 0), 55028221); + assertEq(_getBasefeeAndPrint(timeSinceParent, 5000000, 0), 57019452); + assertEq(_getBasefeeAndPrint(timeSinceParent, 10000000, 0), 59644805); } function _getBasefeeAndPrint( - uint32 timeSinceNow, + uint32 timeSinceParent, uint64 gasLimit, uint64 parentGasUsed ) private returns (uint256 _basefee) { - uint256 timeSinceParent = timeSinceNow + - block.timestamp - - L2.parentTimestamp(); uint256 gasIssued = L2.gasIssuedPerSecond() * timeSinceParent; string memory _msg = string.concat( "#", @@ -168,7 +167,7 @@ contract TestTaikoL2 is Test { ", parentGasUsed=", Strings.toString(parentGasUsed) ); - _basefee = L2.getBasefee(timeSinceNow, gasLimit, parentGasUsed); + _basefee = L2.getBasefee(timeSinceParent, gasLimit, parentGasUsed); _msg = string.concat( _msg, @@ -187,7 +186,7 @@ contract TestTaikoL2 is Test { ) private returns (uint256 _basefee) { return _getBasefeeAndPrint( - timeSinceNow, + uint32(timeSinceNow + block.timestamp - L2.parentTimestamp()), gasLimit, gasLimit + ANCHOR_GAS_COST ); diff --git a/packages/protocol/test2/genesis/GenerateGenesis.g.sol b/packages/protocol/test2/genesis/GenerateGenesis.g.sol index e58e8ba4ec0..b836d767122 100644 --- a/packages/protocol/test2/genesis/GenerateGenesis.g.sol +++ b/packages/protocol/test2/genesis/GenerateGenesis.g.sol @@ -66,7 +66,7 @@ contract TestGenerateGenesis is Test, AddressResolver { vm.warp(taikoL2.parentTimestamp() + 12); vm.fee( taikoL2.getBasefee( - 0, + 12, BLOCK_GAS_LIMIT, i + LibL2Consts.ANCHOR_GAS_COST ) From e18bf920278e53ca64b4255b74aef7298ca6038b Mon Sep 17 00:00:00 2001 From: Daniel Wang <99078276+dantaik@users.noreply.github.com> Date: Tue, 11 Apr 2023 06:53:29 +0800 Subject: [PATCH 37/47] refactor(protocol): minor cleanup (#13578) --- packages/protocol/contracts/L1/TaikoData.sol | 1 + .../protocol/contracts/L1/TaikoEvents.sol | 6 +----- .../contracts/L1/libs/LibProposing.sol | 19 ++++++++----------- .../protocol/contracts/L1/libs/LibUtils.sol | 3 ++- packages/protocol/test2/GasComparison.t.sol | 6 ++++-- .../contract-documentation/L1/TaikoData.md | 1 + .../contract-documentation/L1/TaikoEvents.md | 2 +- .../contract-documentation/L2/TaikoL2.md | 2 +- 8 files changed, 19 insertions(+), 21 deletions(-) diff --git a/packages/protocol/contracts/L1/TaikoData.sol b/packages/protocol/contracts/L1/TaikoData.sol index 81aafa67b6b..5497dfe351f 100644 --- a/packages/protocol/contracts/L1/TaikoData.sol +++ b/packages/protocol/contracts/L1/TaikoData.sol @@ -73,6 +73,7 @@ library TaikoData { uint24 txListByteEnd; uint32 gasLimit; address beneficiary; + uint8 cacheTxListInfo; address treasure; } diff --git a/packages/protocol/contracts/L1/TaikoEvents.sol b/packages/protocol/contracts/L1/TaikoEvents.sol index 752080a7efe..692ae6da5db 100644 --- a/packages/protocol/contracts/L1/TaikoEvents.sol +++ b/packages/protocol/contracts/L1/TaikoEvents.sol @@ -10,11 +10,7 @@ import {TaikoData} from "./TaikoData.sol"; abstract contract TaikoEvents { // The following events must match the definitions in corresponding L1 libraries. - event BlockProposed( - uint256 indexed id, - TaikoData.BlockMetadata meta, - bool txListCached - ); + event BlockProposed(uint256 indexed id, TaikoData.BlockMetadata meta); event BlockProven( uint256 indexed id, diff --git a/packages/protocol/contracts/L1/libs/LibProposing.sol b/packages/protocol/contracts/L1/libs/LibProposing.sol index f03431bec32..e8337b00099 100644 --- a/packages/protocol/contracts/L1/libs/LibProposing.sol +++ b/packages/protocol/contracts/L1/libs/LibProposing.sol @@ -21,11 +21,7 @@ library LibProposing { using LibAddress for address payable; using LibUtils for TaikoData.State; - event BlockProposed( - uint256 indexed id, - TaikoData.BlockMetadata meta, - bool txListCached - ); + event BlockProposed(uint256 indexed id, TaikoData.BlockMetadata meta); error L1_BLOCK_ID(); error L1_INSUFFICIENT_ETHER(); @@ -45,7 +41,7 @@ library LibProposing { TaikoData.BlockMetadataInput memory input, bytes calldata txList ) internal { - bool cacheTxList = _validateBlock({ + uint8 cacheTxListInfo = _validateBlock({ state: state, config: config, resolver: resolver, @@ -53,7 +49,7 @@ library LibProposing { txList: txList }); - if (cacheTxList) { + if (cacheTxListInfo != 0) { state.txListInfo[input.txListHash] = TaikoData.TxListInfo({ validSince: uint64(block.timestamp), size: uint24(txList.length) @@ -77,7 +73,8 @@ library LibProposing { txListByteEnd: input.txListByteEnd, gasLimit: input.gasLimit, beneficiary: input.beneficiary, - treasure: resolver.resolve(config.chainId, "treasure", false) + treasure: resolver.resolve(config.chainId, "treasure", false), + cacheTxListInfo: cacheTxListInfo }); } @@ -128,7 +125,7 @@ library LibProposing { state.lastProposedAt = meta.timestamp; } - emit BlockProposed(state.numBlocks, meta, cacheTxList); + emit BlockProposed(state.numBlocks, meta); unchecked { ++state.numBlocks; } @@ -149,7 +146,7 @@ library LibProposing { AddressResolver resolver, TaikoData.BlockMetadataInput memory input, bytes calldata txList - ) private view returns (bool cacheTxList) { + ) private view returns (uint8 cacheTxListInfo) { // For alpha-2 testnet, the network only allows an special address // to propose but anyone to prove. This is the first step of testing // the tokenomics. @@ -202,7 +199,7 @@ library LibProposing { if (input.txListHash != keccak256(txList)) revert L1_TX_LIST_HASH(); - cacheTxList = (input.cacheTxListInfo != 0); + cacheTxListInfo = input.cacheTxListInfo; } } } diff --git a/packages/protocol/contracts/L1/libs/LibUtils.sol b/packages/protocol/contracts/L1/libs/LibUtils.sol index 9ce744fab4c..720f3de3459 100644 --- a/packages/protocol/contracts/L1/libs/LibUtils.sol +++ b/packages/protocol/contracts/L1/libs/LibUtils.sol @@ -108,7 +108,8 @@ library LibUtils { (uint256(meta.txListByteStart) << 232) | (uint256(meta.txListByteEnd) << 208) | (uint256(meta.gasLimit) << 176) | - (uint256(uint160(meta.beneficiary)) << 16); + (uint256(uint160(meta.beneficiary)) << 16) | + (uint256(meta.cacheTxListInfo) << 8); inputs[5] = (uint256(uint160(meta.treasure)) << 96); diff --git a/packages/protocol/test2/GasComparison.t.sol b/packages/protocol/test2/GasComparison.t.sol index 5f16d56c025..41eaaf869ac 100644 --- a/packages/protocol/test2/GasComparison.t.sol +++ b/packages/protocol/test2/GasComparison.t.sol @@ -87,7 +87,8 @@ contract FooBar { txListByteEnd: 1000, gasLimit: 1, mixHash: bytes32(uint256(1)), - timestamp: 1 + timestamp: 1, + cacheTxListInfo: 0 }); } @@ -103,7 +104,8 @@ contract FooBar { txListByteEnd: 1000, gasLimit: 1, mixHash: bytes32(uint256(1)), - timestamp: 1 + timestamp: 1, + cacheTxListInfo: 0 }); } diff --git a/packages/website/pages/docs/reference/contract-documentation/L1/TaikoData.md b/packages/website/pages/docs/reference/contract-documentation/L1/TaikoData.md index 696c01a09b4..36b19fe902d 100644 --- a/packages/website/pages/docs/reference/contract-documentation/L1/TaikoData.md +++ b/packages/website/pages/docs/reference/contract-documentation/L1/TaikoData.md @@ -79,6 +79,7 @@ struct BlockMetadata { uint24 txListByteEnd; uint32 gasLimit; address beneficiary; + uint8 cacheTxListInfo; address treasure; } ``` diff --git a/packages/website/pages/docs/reference/contract-documentation/L1/TaikoEvents.md b/packages/website/pages/docs/reference/contract-documentation/L1/TaikoEvents.md index f539ab4aa86..a9ab66d65e0 100644 --- a/packages/website/pages/docs/reference/contract-documentation/L1/TaikoEvents.md +++ b/packages/website/pages/docs/reference/contract-documentation/L1/TaikoEvents.md @@ -3,7 +3,7 @@ ### BlockProposed ```solidity -event BlockProposed(uint256 id, struct TaikoData.BlockMetadata meta, bool txListCached) +event BlockProposed(uint256 id, struct TaikoData.BlockMetadata meta) ``` ### BlockProven diff --git a/packages/website/pages/docs/reference/contract-documentation/L2/TaikoL2.md b/packages/website/pages/docs/reference/contract-documentation/L2/TaikoL2.md index 8bf470c7dc0..382b00c1f33 100644 --- a/packages/website/pages/docs/reference/contract-documentation/L2/TaikoL2.md +++ b/packages/website/pages/docs/reference/contract-documentation/L2/TaikoL2.md @@ -160,7 +160,7 @@ This transaction shall be the first transaction in every L2 block. ### getBasefee ```solidity -function getBasefee(uint32 timeSinceNow, uint64 gasLimit, uint64 parentGasUsed) public view returns (uint256 _basefee) +function getBasefee(uint32 timeSinceParent, uint64 gasLimit, uint64 parentGasUsed) public view returns (uint256 _basefee) ``` ### getXchainBlockHash From 91cf9307108da3dab1c575dd7d4f5aa9646e801f Mon Sep 17 00:00:00 2001 From: Daniel Wang <99078276+dantaik@users.noreply.github.com> Date: Tue, 18 Apr 2023 13:57:06 +0800 Subject: [PATCH 38/47] refactor(protocol): minor optimize signal service merkle proof (#13579) --- .../contracts/bridge/libs/LibBridgeData.sol | 2 +- .../protocol/contracts/libs/LibTrieProof.sol | 23 ----------- .../contracts/signal/SignalService.sol | 14 +++---- .../contracts/test/libs/TestLibTrieProof.sol | 9 ----- .../thirdparty/LibSecureMerkleTrie.sol | 2 +- packages/protocol/test/utils/signal.ts | 19 +--------- packages/protocol/test2/SignalServiceCalc.sol | 38 +++++++++++++++++++ 7 files changed, 49 insertions(+), 58 deletions(-) create mode 100644 packages/protocol/test2/SignalServiceCalc.sol diff --git a/packages/protocol/contracts/bridge/libs/LibBridgeData.sol b/packages/protocol/contracts/bridge/libs/LibBridgeData.sol index e5067a18140..a48d62593cb 100644 --- a/packages/protocol/contracts/bridge/libs/LibBridgeData.sol +++ b/packages/protocol/contracts/bridge/libs/LibBridgeData.sol @@ -7,7 +7,7 @@ pragma solidity ^0.8.18; import {AddressResolver} from "../../common/AddressResolver.sol"; -import {BlockHeader, LibBlockHeader} from "../../libs/LibBlockHeader.sol"; +import {BlockHeader} from "../../libs/LibBlockHeader.sol"; import {IBridge} from "../IBridge.sol"; import {LibAddress} from "../../libs/LibAddress.sol"; import {LibMath} from "../../libs/LibMath.sol"; diff --git a/packages/protocol/contracts/libs/LibTrieProof.sol b/packages/protocol/contracts/libs/LibTrieProof.sol index 2fb19fd254a..749ddbf048f 100644 --- a/packages/protocol/contracts/libs/LibTrieProof.sol +++ b/packages/protocol/contracts/libs/LibTrieProof.sol @@ -26,29 +26,6 @@ library LibTrieProof { * Public Functions * *********************/ - /** - * Verifies that the value of a slot in the storage of an account is value. - * - * @param slot The slot in the contract. - * @param value The value to be verified. - * @param storageProof The proof obtained by encoding storage proof. - * @param storageRoot The synced storage root for the given block. - * @return verified The verification result. - */ - function verify( - bytes32 slot, - bytes32 value, - bytes calldata storageProof, - bytes32 storageRoot - ) public pure returns (bool verified) { - verified = LibSecureMerkleTrie.verifyInclusionProof( - abi.encodePacked(slot), - LibRLPWriter.writeBytes32(value), - storageProof, - storageRoot - ); - } - /** * Verifies that the value of a slot in the storage of an account is value. * diff --git a/packages/protocol/contracts/signal/SignalService.sol b/packages/protocol/contracts/signal/SignalService.sol index 6815ba2065b..9c1525fafa2 100644 --- a/packages/protocol/contracts/signal/SignalService.sol +++ b/packages/protocol/contracts/signal/SignalService.sol @@ -9,7 +9,7 @@ pragma solidity ^0.8.18; import {EssentialContract} from "../common/EssentialContract.sol"; import {ISignalService} from "./ISignalService.sol"; import {IXchainSync} from "../common/IXchainSync.sol"; -import {LibTrieProof} from "../libs/LibTrieProof.sol"; +import {LibSecureMerkleTrie} from "../thirdparty/LibSecureMerkleTrie.sol"; contract SignalService is ISignalService, EssentialContract { struct SignalProof { @@ -74,12 +74,12 @@ contract SignalService is ISignalService, EssentialContract { .getXchainSignalRoot(sp.height); return - LibTrieProof.verify({ - slot: getSignalSlot(app, signal), - value: bytes32(uint256(1)), - storageProof: sp.proof, - storageRoot: syncedSignalRoot - }); + LibSecureMerkleTrie.verifyInclusionProof( + bytes.concat(getSignalSlot(app, signal)), + hex"01", + sp.proof, + syncedSignalRoot + ); } /** diff --git a/packages/protocol/contracts/test/libs/TestLibTrieProof.sol b/packages/protocol/contracts/test/libs/TestLibTrieProof.sol index 8c1155b0831..d549b8c342c 100644 --- a/packages/protocol/contracts/test/libs/TestLibTrieProof.sol +++ b/packages/protocol/contracts/test/libs/TestLibTrieProof.sol @@ -14,13 +14,4 @@ contract TestLibTrieProof { sstore(slot, val) } } - - function verify( - bytes32 slot, - bytes32 value, - bytes calldata storageProof, - bytes32 storageRoot - ) public pure returns (bool) { - return LibTrieProof.verify(slot, value, storageProof, storageRoot); - } } diff --git a/packages/protocol/contracts/thirdparty/LibSecureMerkleTrie.sol b/packages/protocol/contracts/thirdparty/LibSecureMerkleTrie.sol index 8a8f63f597f..d79657ef7f5 100644 --- a/packages/protocol/contracts/thirdparty/LibSecureMerkleTrie.sol +++ b/packages/protocol/contracts/thirdparty/LibSecureMerkleTrie.sol @@ -88,6 +88,6 @@ library LibSecureMerkleTrie { function _getSecureKey( bytes memory _key ) private pure returns (bytes memory _secureKey) { - return abi.encodePacked(keccak256(_key)); + return bytes.concat(keccak256(_key)); } } diff --git a/packages/protocol/test/utils/signal.ts b/packages/protocol/test/utils/signal.ts index 956954e2d3b..7a830eb005e 100644 --- a/packages/protocol/test/utils/signal.ts +++ b/packages/protocol/test/utils/signal.ts @@ -2,30 +2,15 @@ import { ethers, Signer } from "ethers"; import RLP from "rlp"; import { ethers as hardhatEthers } from "hardhat"; import { BlockHeader, EthGetProofResponse } from "./rpc"; -import { - AddressManager, - TestSignalService, - LibTrieProof, -} from "../../typechain"; +import { AddressManager, TestSignalService } from "../../typechain"; async function deploySignalService( signer: Signer, addressManager: AddressManager, srcChain: number ): Promise<{ signalService: TestSignalService }> { - const libTrieProof: LibTrieProof = await ( - await hardhatEthers.getContractFactory("LibTrieProof") - ) - .connect(signer) - .deploy(); - const SignalServiceFactory = await hardhatEthers.getContractFactory( - "TestSignalService", - { - libraries: { - LibTrieProof: libTrieProof.address, - }, - } + "TestSignalService" ); const signalService: TestSignalService = await SignalServiceFactory.connect( diff --git a/packages/protocol/test2/SignalServiceCalc.sol b/packages/protocol/test2/SignalServiceCalc.sol new file mode 100644 index 00000000000..42ede313ea8 --- /dev/null +++ b/packages/protocol/test2/SignalServiceCalc.sol @@ -0,0 +1,38 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.18; + +import {Test} from "forge-std/Test.sol"; +import {console2} from "forge-std/console2.sol"; +import {LibRLPWriter} from "../contracts/thirdparty/LibRLPWriter.sol"; + +contract TestSignalServiceCalc is Test { + function setUp() public {} + + function testLibRLPWriterOne() public { + assertEq(LibRLPWriter.writeBytes32(bytes32(uint256(1))), hex"01"); + } + + function testAbiEncodeBytes32(bytes32 seed) public { + for (uint i = 0; i < 100; ++i) { + seed = keccak256(abi.encodePacked(seed)); + bytes memory _seed = bytes.concat(seed); + + bytes memory encoded = abi.encodePacked(seed); + assertEq(encoded.length, _seed.length); + for (uint j = 0; j < encoded.length; ++j) { + assertEq(encoded[j], _seed[j]); + } + } + + for (uint i = 0; i < 100; ++i) { + seed = bytes32(i); + bytes memory _seed = bytes.concat(seed); + + bytes memory encoded = abi.encodePacked(seed); + assertEq(encoded.length, _seed.length); + for (uint j = 0; j < encoded.length; ++j) { + assertEq(encoded[j], _seed[j]); + } + } + } +} From 6095326032fef820b06ec7e98c97cfe14a7d1113 Mon Sep 17 00:00:00 2001 From: jeff <113397187+cyberhorsey@users.noreply.github.com> Date: Thu, 20 Apr 2023 12:59:35 +0900 Subject: [PATCH 39/47] test(protocol): EtherVault tests in Foundry (#13625) --- .../test/etherVault/EtherVault.test.ts | 176 ------------------ packages/protocol/test2/EtherVault.t.sol | 117 ++++++++++++ 2 files changed, 117 insertions(+), 176 deletions(-) delete mode 100644 packages/protocol/test/etherVault/EtherVault.test.ts create mode 100644 packages/protocol/test2/EtherVault.t.sol diff --git a/packages/protocol/test/etherVault/EtherVault.test.ts b/packages/protocol/test/etherVault/EtherVault.test.ts deleted file mode 100644 index 4f280214a50..00000000000 --- a/packages/protocol/test/etherVault/EtherVault.test.ts +++ /dev/null @@ -1,176 +0,0 @@ -import { expect } from "chai"; -import { AddressManager, EtherVault } from "../../typechain"; -import { ethers } from "hardhat"; -import { BigNumber } from "ethers"; -import deployAddressManager from "../utils/addressManager"; - -describe("EtherVault", function () { - let owner: any; - let nonOwner: any; - let authorized: any; - let notAuthorized: any; - let etherVault: EtherVault; - - before(async function () { - [owner, nonOwner, authorized, notAuthorized] = - await ethers.getSigners(); - }); - - beforeEach(async function () { - const addressManager: AddressManager = await deployAddressManager( - owner - ); - - etherVault = await (await ethers.getContractFactory("TestEtherVault")) - .connect(owner) - .deploy(); - await etherVault.init(addressManager.address); - - await etherVault.connect(owner).authorize(authorized.address, true); - - const isAuthorized = await etherVault.isAuthorized(authorized.address); - expect(isAuthorized).to.be.true; - - await authorized.sendTransaction({ - to: etherVault.address, - value: ethers.utils.parseEther("1.0"), - }); - - expect(await ethers.provider.getBalance(etherVault.address)).to.be.eq( - ethers.utils.parseEther("1.0") - ); - }); - - describe("receive()", async function () { - it("throws if not authorized and balance > 0", async () => { - const balance = await ethers.provider.getBalance( - etherVault.address - ); - expect(balance).to.not.be.eq(BigNumber.from(0)); - await expect( - notAuthorized.sendTransaction({ - to: etherVault.address, - value: ethers.utils.parseEther("1.0"), - }) - ).to.be.revertedWith("B_EV_NOT_AUTHORIZED()"); - }); - - it("receives if authorized and balance > 0", async () => { - const amount = BigNumber.from(1); - const originalBalance = await ethers.provider.getBalance( - etherVault.address - ); - expect(originalBalance).to.not.be.eq(BigNumber.from(0)); - await authorized.sendTransaction({ - to: etherVault.address, - value: amount, - }); - const newBalance = await ethers.provider.getBalance( - etherVault.address - ); - expect(newBalance).to.be.eq(amount.add(originalBalance)); - }); - }); - - describe("releaseEther()", async function () { - it("throws if not enough ether to send", async () => { - const balance = await ethers.provider.getBalance( - etherVault.address - ); - const additionalAmount = 1; - await expect( - etherVault - .connect(authorized) - ["releaseEther(uint256)"](balance.add(additionalAmount)) - ).to.be.revertedWith("ETH transfer failed"); - }); - - it("throws if not authorized", async () => { - await expect( - etherVault.connect(notAuthorized)["releaseEther(uint256)"](1) - ).to.be.revertedWith("B_EV_NOT_AUTHORIZED()"); - }); - - it("sends ether to caller", async () => { - const amount = 100000; - const originalBalance = await ethers.provider.getBalance( - authorized.address - ); - - const tx = await etherVault - .connect(authorized) - ["releaseEther(uint256)"](amount); - const receipt = await tx.wait(); - const gasUsed = receipt.cumulativeGasUsed.mul( - receipt.effectiveGasPrice - ); - const newBalance = await ethers.provider.getBalance( - authorized.address - ); - - expect(newBalance).to.be.eq( - originalBalance.add(amount).sub(gasUsed) - ); - }); - - it("emits EtherReleased event upon success", async () => { - const amount = 69; - - await expect( - etherVault.connect(authorized)["releaseEther(uint256)"](amount) - ) - .to.emit(etherVault, "EtherReleased") - .withArgs(authorized.address, amount); - }); - }); - - describe("authorize()", async function () { - it("throws when not called by owner", async () => { - await expect( - etherVault - .connect(nonOwner) - .authorize(notAuthorized.address, true) - ).to.be.revertedWith("Ownable: caller is not the owner"); - }); - - it("throws when address is 0", async () => { - await expect( - etherVault - .connect(owner) - .authorize(ethers.constants.AddressZero, true) - ).to.be.revertedWith("B_EV_PARAM()"); - }); - - it("throws when authorized state is the same as input", async () => { - await expect( - etherVault.connect(owner).authorize(authorized.address, true) - ).to.be.revertedWith("B_EV_PARAM()"); - }); - - it("emits Authorized event upon success", async () => { - await expect( - etherVault.connect(owner).authorize(notAuthorized.address, true) - ) - .to.emit(etherVault, "Authorized") - .withArgs(notAuthorized.address, true); - }); - - it("address is authorized in mapping, can de-authorize", async () => { - await etherVault - .connect(owner) - .authorize(notAuthorized.address, true); - - let isAuthorized = await etherVault.isAuthorized( - notAuthorized.address - ); - expect(isAuthorized).to.be.true; - - await etherVault - .connect(owner) - .authorize(notAuthorized.address, false); - - isAuthorized = await etherVault.isAuthorized(notAuthorized.address); - expect(isAuthorized).to.be.false; - }); - }); -}); diff --git a/packages/protocol/test2/EtherVault.t.sol b/packages/protocol/test2/EtherVault.t.sol new file mode 100644 index 00000000000..c94428e2026 --- /dev/null +++ b/packages/protocol/test2/EtherVault.t.sol @@ -0,0 +1,117 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.18; + +import {Test} from "forge-std/Test.sol"; +import {AddressManager} from "../contracts/thirdparty/AddressManager.sol"; +import {EtherVault} from "../contracts/bridge/EtherVault.sol"; +import {BridgeErrors} from "../contracts/bridge/BridgeErrors.sol"; + +contract TestEtherVault is Test { + AddressManager addressManager; + EtherVault etherVault; + + address public constant Alice = 0x10020FCb72e27650651B05eD2CEcA493bC807Ba4; + address public constant Bob = 0x200708D76eB1B69761c23821809d53F65049939e; + + function setUp() public { + vm.deal(Alice, 1 ether); + vm.deal(Bob, 1 ether); + addressManager = new AddressManager(); + addressManager.init(); + etherVault = new EtherVault(); + vm.prank(Alice); + etherVault.init(address(addressManager)); + } + + function test_authorize_reverts_when_not_owner_authorizing() public { + vm.prank(Bob); + vm.expectRevert("Ownable: caller is not the owner"); + etherVault.authorize(Bob, true); + + bool auth = etherVault.isAuthorized(Bob); + assertEq(auth, false); + } + + function test_authorize_authorizes_when_owner_authorizing() public { + vm.prank(Alice); + etherVault.authorize(Bob, true); + + bool auth = etherVault.isAuthorized(Bob); + assertEq(auth, true); + } + + function test_authorize_reverts_when_authorizing_zero_address() public { + vm.prank(Alice); + vm.expectRevert(BridgeErrors.B_EV_PARAM.selector); + etherVault.authorize(address(0), true); + } + + function test_authorize_reverts_when_authorizing_already_authorized_address() + public + { + vm.startPrank(Alice); + etherVault.authorize(Bob, true); + vm.expectRevert(BridgeErrors.B_EV_PARAM.selector); + etherVault.authorize(Bob, true); + bool auth = etherVault.isAuthorized(Bob); + assertEq(auth, true); + vm.stopPrank(); + } + + function test_receive_allows_sending_when_authorized_only() public { + assertEq(address(etherVault).balance, 0); + assertEq(Alice.balance > 0, true); + vm.startPrank(Alice); + etherVault.authorize(Alice, true); + (bool aliceSent, ) = address(etherVault).call{value: 1}(""); + assertEq(aliceSent, true); + assertEq(address(etherVault).balance, 1); + + vm.stopPrank(); + assertEq(Bob.balance > 0, true); + vm.startPrank(Bob); + + (bool bobSent, ) = address(etherVault).call{value: 1}(""); + assertEq(bobSent, false); + vm.stopPrank(); + } + + function test_release_ether_reverts_when_zero_address() public { + vm.startPrank(Alice); + etherVault.authorize(Alice, true); + seedEtherVault(); + + vm.expectRevert(BridgeErrors.B_EV_DO_NOT_BURN.selector); + etherVault.releaseEther(address(0), 1 ether); + } + + function test_release_ether_releases_to_authorized_sender() public { + vm.startPrank(Alice); + etherVault.authorize(Alice, true); + seedEtherVault(); + + uint256 aliceBalanceBefore = Alice.balance; + etherVault.releaseEther(1 ether); + uint256 aliceBalanceAfter = Alice.balance; + assertEq(aliceBalanceAfter - aliceBalanceBefore, 1 ether); + vm.stopPrank(); + } + + function test_release_ether_releases_to_receipient_via_authorized_sender() + public + { + vm.startPrank(Alice); + etherVault.authorize(Alice, true); + seedEtherVault(); + + uint256 bobBalanceBefore = Bob.balance; + etherVault.releaseEther(Bob, 1 ether); + uint256 bobBalanceAfter = Bob.balance; + assertEq(bobBalanceAfter - bobBalanceBefore, 1 ether); + vm.stopPrank(); + } + + function seedEtherVault() internal { + vm.deal(address(etherVault), 100 ether); + } +} From 4f155272bec55fe3df8da7358bdea4f28dddcd81 Mon Sep 17 00:00:00 2001 From: jeff <113397187+cyberhorsey@users.noreply.github.com> Date: Thu, 20 Apr 2023 19:02:33 +0900 Subject: [PATCH 40/47] test(protocol): Token vault foundry tests (#13627) --- .../protocol/contracts/bridge/TokenVault.sol | 52 --- .../contracts/test/erc20/FreeMintERC20.sol | 4 +- .../test/tokenVault/TokenVault.test.ts | 367 ------------------ packages/protocol/test2/TokenVault.t.sol | 355 +++++++++++++++++ .../test2/genesis/GenerateGenesis.g.sol | 39 +- 5 files changed, 372 insertions(+), 445 deletions(-) delete mode 100644 packages/protocol/test/tokenVault/TokenVault.test.ts create mode 100644 packages/protocol/test2/TokenVault.t.sol diff --git a/packages/protocol/contracts/bridge/TokenVault.sol b/packages/protocol/contracts/bridge/TokenVault.sol index 278a1c12578..2c1add56e93 100644 --- a/packages/protocol/contracts/bridge/TokenVault.sol +++ b/packages/protocol/contracts/bridge/TokenVault.sol @@ -137,58 +137,6 @@ contract TokenVault is EssentialContract { EssentialContract._init(addressManager); } - /** - * Receives Ether and constructs a Bridge message. Sends the Ether and - * message along to the Bridge. - * - * @dev This function doesn't' seem to belong here as it has nothing to - * do with ERC20 tokens. It's added here only for convenience. - * - * @param destChainId @custom:see IBridge.Message - * @param to @custom:see IBridge.Message - * @param gasLimit @custom:see IBridge.Message - * @param processingFee @custom:see IBridge.Message - * @param refundAddress @custom:see IBridge.Message - * @param memo @custom:see IBridge.Message - */ - function sendEther( - uint256 destChainId, - address to, - uint256 gasLimit, - uint256 processingFee, - address refundAddress, - string memory memo - ) external payable nonReentrant { - if ( - to == address(0) || to == resolve(destChainId, "token_vault", false) - ) revert TOKENVAULT_INVALID_TO(); - - if (msg.value <= processingFee) revert TOKENVAULT_INVALID_VALUE(); - - IBridge.Message memory message; - message.destChainId = destChainId; - message.owner = msg.sender; - message.to = to; - message.gasLimit = gasLimit; - message.processingFee = processingFee; - message.callValue = msg.value - processingFee; - message.refundAddress = refundAddress; - message.memo = memo; - // message.depositValue = 0; - - bytes32 msgHash = IBridge(resolve("bridge", false)).sendMessage{ - value: msg.value - }(message); - - emit EtherSent({ - msgHash: msgHash, - from: message.owner, - to: message.to, - destChainId: destChainId, - amount: message.callValue - }); - } - /** * Transfers ERC20 tokens to this vault and sends a message to the * destination chain so the user can receive the same amount of tokens diff --git a/packages/protocol/contracts/test/erc20/FreeMintERC20.sol b/packages/protocol/contracts/test/erc20/FreeMintERC20.sol index b6f0025b358..2c6bc266240 100644 --- a/packages/protocol/contracts/test/erc20/FreeMintERC20.sol +++ b/packages/protocol/contracts/test/erc20/FreeMintERC20.sol @@ -18,11 +18,11 @@ contract FreeMintERC20 is ERC20 { constructor(string memory name, string memory symbol) ERC20(name, symbol) {} function mint(address to) public { - if (minters[msg.sender]) { + if (minters[to]) { revert HasMinted(); } - minters[msg.sender] = true; + minters[to] = true; _mint(to, 50 * (10 ** decimals())); } } diff --git a/packages/protocol/test/tokenVault/TokenVault.test.ts b/packages/protocol/test/tokenVault/TokenVault.test.ts deleted file mode 100644 index c498141fddd..00000000000 --- a/packages/protocol/test/tokenVault/TokenVault.test.ts +++ /dev/null @@ -1,367 +0,0 @@ -/* eslint-disable camelcase */ -import { expect } from "chai"; -import { - AddressManager, - AddressManager__factory, - BridgedERC20, - BridgedERC20__factory, - TestMessageSender__factory, - TokenVault, - TokenVault__factory, -} from "../../typechain"; -import { ethers } from "hardhat"; -import { BigNumber, BigNumberish } from "ethers"; -import { MockContract, smock } from "@defi-wonderland/smock"; - -type CanonicalERC20 = { - chainId: BigNumberish; - addr: string; - decimals: BigNumberish; - symbol: string; - name: string; -}; - -const weth: CanonicalERC20 = { - chainId: 5, - addr: "0xB4FBF271143F4FBf7B91A5ded31805e42b2208d6", - decimals: 18, - symbol: "WETH", - name: "Wrapped Ether", -}; - -describe("TokenVault", function () { - let owner: any; - let nonOwner: any; - let L1TokenVault: MockContract; - let tokenVaultAddressManager: AddressManager; - let destChainTokenVault: TokenVault; - const defaultProcessingFee = 10; - const destChainId = 167001; - let bridgedToken: MockContract; - - before(async function () { - [owner, nonOwner] = await ethers.getSigners(); - }); - - beforeEach(async function () { - const network = await ethers.provider.getNetwork(); - const addressManagerFactory: AddressManager__factory = - await ethers.getContractFactory("AddressManager"); - const tokenVaultFactory: TokenVault__factory = - await ethers.getContractFactory("TestTokenVault"); - - tokenVaultAddressManager = await addressManagerFactory.deploy(); - await tokenVaultAddressManager.init(); - - const mockTokenVaultFactory = await smock.mock( - "TokenVault" - ); - - L1TokenVault = await mockTokenVaultFactory.connect(owner).deploy(); - await L1TokenVault.init(tokenVaultAddressManager.address); - - destChainTokenVault = await tokenVaultFactory.connect(owner).deploy(); - await destChainTokenVault.init(tokenVaultAddressManager.address); - - const TestMessageSenderFactory: TestMessageSender__factory = - await ethers.getContractFactory("TestMessageSender"); - - const testMessageSender = await TestMessageSenderFactory.deploy(); - const testMessageSender2 = await TestMessageSenderFactory.deploy(); - - await tokenVaultAddressManager.setAddress( - `${network.chainId}.bridge`, - testMessageSender.address - ); - await tokenVaultAddressManager.setAddress( - `${destChainId}.bridge`, - testMessageSender2.address - ); - await tokenVaultAddressManager.setAddress( - `${network.chainId}.token_vault`, - L1TokenVault.address - ); - await tokenVaultAddressManager.setAddress( - `${destChainId}.token_vault`, - destChainTokenVault.address - ); - - const bridgedTokenFactory = await smock.mock( - "BridgedERC20" - ); - - bridgedToken = await bridgedTokenFactory.deploy(); - - await bridgedToken.init( - tokenVaultAddressManager.address, - weth.addr, - destChainId, - 18, - weth.symbol, - weth.name - ); - - await bridgedToken.setVariable("_totalSupply", 1000000); - await bridgedToken.approve(owner.address, 1000); - await bridgedToken.setVariable("_balances", { [owner.address]: 10 }); - }); - - describe("receiveERC20()", async () => { - it("throws when named 'bridge' is not the caller", async () => { - const amount = BigNumber.from(1); - - await expect( - L1TokenVault.receiveERC20( - weth, - owner.address, - nonOwner.address, - amount - ) - ).to.be.revertedWith("RESOLVER_DENIED()"); - }); - }); - - describe("sendEther()", async () => { - it("throws when msg.value is 0", async () => { - await expect( - L1TokenVault.sendEther( - destChainId, - owner.address, - 10000, - defaultProcessingFee, - owner.address, - "" - ) - ).to.be.revertedWith("TOKENVAULT_INVALID_VALUE()"); - }); - - it("throws when msg.value - processing fee is 0", async () => { - await expect( - L1TokenVault.sendEther( - destChainId, - owner.address, - 10000, - defaultProcessingFee, - owner.address, - "", - { - value: defaultProcessingFee, - } - ) - ).to.be.revertedWith("TOKENVAULT_INVALID_VALUE()"); - }); - - it("throws when msg.value is < processingFee", async () => { - await expect( - L1TokenVault.sendEther( - destChainId, - owner.address, - 10000, - defaultProcessingFee, - owner.address, - "", - { - value: defaultProcessingFee - 1, - } - ) - ).to.be.revertedWith("TOKENVAULT_INVALID_VALUE()"); - }); - - it("throws when to is 0", async () => { - await expect( - L1TokenVault.sendEther( - destChainId, - ethers.constants.AddressZero, - 10000, - defaultProcessingFee, - owner.address, - "", - { - value: defaultProcessingFee - 1, - } - ) - ).to.be.revertedWith("TOKENVAULT_INVALID_TO()"); - }); - - it("succeeds with processingFee", async () => { - const depositValue = 1000; - - const msgHash = - "0x3fd54831f488a22b28398de0c567a3b064b937f54f81739ae9bd545967f3abab"; - - await expect( - L1TokenVault.sendEther( - destChainId, - owner.address, - 10000, - defaultProcessingFee, - owner.address, - "", - { - value: depositValue, - } - ) - ) - .to.emit(L1TokenVault, "EtherSent") - .withArgs( - msgHash, - owner.address, - owner.address, - destChainId, - depositValue - defaultProcessingFee - ); - }); - - it("succeeds with 0 processingFee", async () => { - const depositValue = 1000; - - const msgHash = - "0x3fd54831f488a22b28398de0c567a3b064b937f54f81739ae9bd545967f3abab"; - - await expect( - L1TokenVault.sendEther( - destChainId, - owner.address, - 10000, - defaultProcessingFee, - owner.address, - "", - { - value: depositValue, - } - ) - ) - .to.emit(L1TokenVault, "EtherSent") - .withArgs( - msgHash, - owner.address, - owner.address, - destChainId, - depositValue - defaultProcessingFee - ); - }); - }); - - describe("sendERC20()", async () => { - it("should throw if to == address(0)", async function () { - await expect( - L1TokenVault.sendERC20( - destChainId, - ethers.constants.AddressZero, - weth.addr, - 1, - 20000000, - 1000, - owner.address, - "", - { - value: 1, - } - ) - ).to.be.revertedWith("TOKENVAULT_INVALID_TO()"); - }); - - it("should throw if to == destChainId.token_vault", async function () { - await expect( - L1TokenVault.sendERC20( - destChainId, - destChainTokenVault.address, - weth.addr, - 1, - 20000000, - 1000, - owner.address, - "", - { - value: 1, - } - ) - ).to.be.revertedWith("TOKENVAULT_INVALID_TO()"); - }); - - it("should throw if token == address(0)", async function () { - await expect( - L1TokenVault.sendERC20( - destChainId, - nonOwner.address, - ethers.constants.AddressZero, - 1, - 20000000, - 1000, - owner.address, - "", - { - value: 1, - } - ) - ).to.be.revertedWith("TOKENVAULT_INVALID_TOKEN()"); - }); - - it("should throw if amount <= 0", async function () { - await expect( - L1TokenVault.sendERC20( - destChainId, - nonOwner.address, - weth.addr, - 0, - 20000000, - 1000, - owner.address, - "", - { - value: 1, - } - ) - ).to.be.revertedWith("TOKENVAULT_INVALID_AMOUNT()"); - }); - - it("should throw if isBridgedToken, and canonicalToken.addr == address(0)", async function () { - await L1TokenVault.setVariable("isBridgedToken", { - [bridgedToken.address]: true, - }); - // don't need to manually set bridgedToCanonical since default value is addressZero - - await expect( - L1TokenVault.connect(owner).sendERC20( - destChainId, - nonOwner.address, - bridgedToken.address, - 1, - 20000000, - 1000, - owner.address, - "", - { - value: 1, - } - ) - ).to.be.revertedWith("TOKENVAULT_CANONICAL_TOKEN_NOT_FOUND()"); - }); - - it("should pass and emit ERC20Sent Event", async function () { - await L1TokenVault.setVariable("isBridgedToken", { - [bridgedToken.address]: true, - }); - - await L1TokenVault.setVariable("bridgedToCanonical", { - [bridgedToken.address]: weth, - }); - - await expect( - L1TokenVault.connect(owner).sendERC20( - destChainId, - nonOwner.address, - bridgedToken.address, - 1, - 20000000, - 1000, - owner.address, - "", - { - value: 1000, - } - ) - ).to.emit(L1TokenVault, "ERC20Sent"); - }); - }); -}); diff --git a/packages/protocol/test2/TokenVault.t.sol b/packages/protocol/test2/TokenVault.t.sol new file mode 100644 index 00000000000..18f3497275c --- /dev/null +++ b/packages/protocol/test2/TokenVault.t.sol @@ -0,0 +1,355 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.18; + +import {AddressManager} from "../contracts/thirdparty/AddressManager.sol"; +import {AddressResolver} from "../contracts/common/AddressResolver.sol"; +import {Bridge} from "../contracts/bridge/Bridge.sol"; +import {BridgedERC20} from "../contracts/bridge/BridgedERC20.sol"; +import {BridgeErrors} from "../contracts/bridge/BridgeErrors.sol"; +import {FreeMintERC20} from "../contracts/test/erc20/FreeMintERC20.sol"; +import {SignalService} from "../contracts/signal/SignalService.sol"; +import {Test} from "forge-std/Test.sol"; +import {TokenVault} from "../contracts/bridge/TokenVault.sol"; + +// PrankDestBridge lets us simulate a transaction to the TokenVault +// from a named Bridge, without having to test/run through the real Bridge code, +// outside the scope of the unit tests in the TokenVault. +contract PrankDestBridge { + TokenVault destTokenVault; + Context ctx; + + struct Context { + bytes32 msgHash; // messageHash + address sender; + uint256 srcChainId; + } + + constructor(TokenVault _tokenVault) { + destTokenVault = _tokenVault; + } + + function setTokenVault(address addr) public { + destTokenVault = TokenVault(addr); + } + + function context() public view returns (Context memory) { + return ctx; + } + + function sendReceiveERC20ToTokenVault( + TokenVault.CanonicalERC20 calldata canonicalToken, + address from, + address to, + uint256 amount, + bytes32 msgHash, + address srcChainTokenVault, + uint256 srcChainId + ) public { + ctx.sender = srcChainTokenVault; + ctx.msgHash = msgHash; + ctx.srcChainId = srcChainId; + + destTokenVault.receiveERC20(canonicalToken, from, to, amount); + + ctx.sender = address(0); + ctx.msgHash = bytes32(0); + ctx.srcChainId = 0; + } +} + +contract TestTokenVault is Test { + AddressManager addressManager; + Bridge bridge; + TokenVault tokenVault; + TokenVault destChainIdTokenVault; + PrankDestBridge destChainIdBridge; + FreeMintERC20 erc20; + SignalService signalService; + uint256 destChainId = 7; + + address public constant Alice = 0x10020FCb72e27650651B05eD2CEcA493bC807Ba4; + address public constant Bob = 0x200708D76eB1B69761c23821809d53F65049939e; + + function setUp() public { + vm.startPrank(Alice); + vm.deal(Alice, 1 ether); + vm.deal(Bob, 1 ether); + + addressManager = new AddressManager(); + addressManager.init(); + + tokenVault = new TokenVault(); + tokenVault.init(address(addressManager)); + destChainIdTokenVault = new TokenVault(); + destChainIdTokenVault.init(address(addressManager)); + + erc20 = new FreeMintERC20("ERC20", "ERC20"); + erc20.mint(Alice); + + bridge = new Bridge(); + bridge.init(address(addressManager)); + + destChainIdBridge = new PrankDestBridge(tokenVault); + + signalService = new SignalService(); + signalService.init(address(addressManager)); + + addressManager.setAddress( + string(bytes.concat(bytes32(block.chainid), bytes("bridge"))), + address(bridge) + ); + + addressManager.setAddress( + string( + bytes.concat(bytes32(block.chainid), bytes("signal_service")) + ), + address(signalService) + ); + + addressManager.setAddress( + string(bytes.concat(bytes32(block.chainid), bytes("token_vault"))), + address(tokenVault) + ); + + addressManager.setAddress( + string(bytes.concat(bytes32(destChainId), bytes("token_vault"))), + address(destChainIdTokenVault) + ); + + addressManager.setAddress( + string(bytes.concat(bytes32(destChainId), bytes("bridge"))), + address(destChainIdBridge) + ); + + vm.stopPrank(); + } + + function test_send_erc20_revert_if_allowance_not_set() public { + vm.startPrank(Alice); + + vm.expectRevert("ERC20: insufficient allowance"); + tokenVault.sendERC20( + destChainId, + Bob, + address(erc20), + 1 wei, + 1000000, + 1, + Bob, + "" + ); + } + + function test_send_erc20_no_processing_fee() public { + vm.startPrank(Alice); + + uint256 amount = 2 wei; + erc20.approve(address(tokenVault), amount); + + uint256 aliceBalanceBefore = erc20.balanceOf(Alice); + uint256 tokenVaultBalanceBefore = erc20.balanceOf(address(tokenVault)); + + tokenVault.sendERC20( + destChainId, + Bob, + address(erc20), + amount, + 1000000, + 0, + Bob, + "" + ); + + uint256 aliceBalanceAfter = erc20.balanceOf(Alice); + uint256 tokenVaultBalanceAfter = erc20.balanceOf(address(tokenVault)); + + assertEq(aliceBalanceBefore - aliceBalanceAfter, amount); + assertEq(tokenVaultBalanceAfter - tokenVaultBalanceBefore, amount); + } + + function test_send_erc20_processing_fee_reverts_if_msg_value_too_low() + public + { + vm.startPrank(Alice); + + uint256 amount = 2 wei; + erc20.approve(address(tokenVault), amount); + + vm.expectRevert(); + tokenVault.sendERC20( + destChainId, + Bob, + address(erc20), + amount, + 1000000, + amount - 1, + Bob, + "" + ); + } + + function test_send_erc20_processing_fee() public { + vm.startPrank(Alice); + + uint256 amount = 2 wei; + erc20.approve(address(tokenVault), amount); + + uint256 aliceBalanceBefore = erc20.balanceOf(Alice); + uint256 tokenVaultBalanceBefore = erc20.balanceOf(address(tokenVault)); + + tokenVault.sendERC20{value: amount}( + destChainId, + Bob, + address(erc20), + amount, + 1000000, + amount - 1, + Bob, + "" + ); + + uint256 aliceBalanceAfter = erc20.balanceOf(Alice); + uint256 tokenVaultBalanceAfter = erc20.balanceOf(address(tokenVault)); + + assertEq(aliceBalanceBefore - aliceBalanceAfter, amount); + assertEq(tokenVaultBalanceAfter - tokenVaultBalanceBefore, amount); + } + + function test_send_erc20_reverts_invalid_amount() public { + vm.startPrank(Alice); + + uint256 amount = 0; + + vm.expectRevert(TokenVault.TOKENVAULT_INVALID_AMOUNT.selector); + tokenVault.sendERC20( + destChainId, + Bob, + address(erc20), + amount, + 1000000, + 0, + Bob, + "" + ); + } + + function test_send_erc20_reverts_invalid_token_address() public { + vm.startPrank(Alice); + + uint256 amount = 1; + + vm.expectRevert(TokenVault.TOKENVAULT_INVALID_TOKEN.selector); + tokenVault.sendERC20( + destChainId, + Bob, + address(0), + amount, + 1000000, + 0, + Bob, + "" + ); + } + + function test_send_erc20_reverts_invalid_to() public { + vm.startPrank(Alice); + + uint256 amount = 1; + + vm.expectRevert(TokenVault.TOKENVAULT_INVALID_TO.selector); + tokenVault.sendERC20( + destChainId, + address(0), + address(erc20), + amount, + 1000000, + 0, + Bob, + "" + ); + } + + function test_receive_erc20_canonical_to_dest_chain_transfers_from_canonical_token() + public + { + vm.startPrank(Alice); + + uint256 srcChainId = block.chainid; + vm.chainId(destChainId); + + erc20.mint(address(tokenVault)); + + uint256 amount = 1; + address to = Bob; + + uint256 tokenVaultBalanceBefore = erc20.balanceOf(address(tokenVault)); + uint256 toBalanceBefore = erc20.balanceOf(to); + + destChainIdBridge.sendReceiveERC20ToTokenVault( + erc20ToCanonicalERC20(destChainId), + Alice, + to, + amount, + bytes32(0), + address(tokenVault), + srcChainId + ); + + uint256 tokenVaultBalanceAfter = erc20.balanceOf(address(tokenVault)); + assertEq(tokenVaultBalanceBefore - tokenVaultBalanceAfter, amount); + + uint256 toBalanceAfter = erc20.balanceOf(to); + assertEq(toBalanceAfter - toBalanceBefore, amount); + } + + function test_receive_erc20_non_canonical_to_dest_chain_deploys_new_bridged_token_and_mints() + public + { + vm.startPrank(Alice); + + uint256 srcChainId = block.chainid; + vm.chainId(destChainId); + + uint256 amount = 1; + + destChainIdBridge.setTokenVault(address(destChainIdTokenVault)); + + address bridgedAddressBefore = destChainIdTokenVault.canonicalToBridged( + srcChainId, + address(erc20) + ); + assertEq(bridgedAddressBefore == address(0), true); + + destChainIdBridge.sendReceiveERC20ToTokenVault( + erc20ToCanonicalERC20(srcChainId), + Alice, + Bob, + amount, + bytes32(0), + address(tokenVault), + srcChainId + ); + + address bridgedAddressAfter = destChainIdTokenVault.canonicalToBridged( + srcChainId, + address(erc20) + ); + assertEq(bridgedAddressAfter != address(0), true); + BridgedERC20 bridgedERC20 = BridgedERC20(bridgedAddressAfter); + + assertEq(bridgedERC20.balanceOf(Bob), amount); + } + + function erc20ToCanonicalERC20( + uint256 chainId + ) internal view returns (TokenVault.CanonicalERC20 memory) { + return + TokenVault.CanonicalERC20({ + chainId: chainId, + addr: address(erc20), + decimals: erc20.decimals(), + symbol: erc20.symbol(), + name: erc20.name() + }); + } +} diff --git a/packages/protocol/test2/genesis/GenerateGenesis.g.sol b/packages/protocol/test2/genesis/GenerateGenesis.g.sol index b836d767122..4ee7edaa24b 100644 --- a/packages/protocol/test2/genesis/GenerateGenesis.g.sol +++ b/packages/protocol/test2/genesis/GenerateGenesis.g.sol @@ -120,6 +120,21 @@ contract TestGenerateGenesis is Test, AddressResolver { ); } + function testEtherVault() public { + address payable etherVaultAddress = payable( + getPredeployedContractAddress("EtherVault") + ); + EtherVault etherVault = EtherVault(etherVaultAddress); + + assertEq(owner, etherVault.owner()); + + assertEq( + etherVault.isAuthorized(getPredeployedContractAddress("Bridge")), + true + ); + assertEq(etherVault.isAuthorized(etherVault.owner()), false); + } + function testTokenVault() public { address tokenVaultAddress = getPredeployedContractAddress("TokenVault"); address bridgeAddress = getPredeployedContractAddress("Bridge"); @@ -138,30 +153,6 @@ contract TestGenerateGenesis is Test, AddressResolver { tokenVaultAddress ); vm.stopPrank(); - - tokenVault.sendEther{value: 1}( - 1, - tokenVault.owner(), - 100, - 0, - tokenVault.owner(), - "" - ); - } - - function testEtherVault() public { - address payable etherVaultAddress = payable( - getPredeployedContractAddress("EtherVault") - ); - EtherVault etherVault = EtherVault(etherVaultAddress); - - assertEq(owner, etherVault.owner()); - - assertEq( - etherVault.isAuthorized(getPredeployedContractAddress("Bridge")), - true - ); - assertEq(etherVault.isAuthorized(etherVault.owner()), false); } function testSignalService() public { From 60eb6d9cc5ade3539c0f884a771b341eff20702c Mon Sep 17 00:00:00 2001 From: Dani <51912515+adaki2004@users.noreply.github.com> Date: Sat, 22 Apr 2023 12:50:33 +0200 Subject: [PATCH 41/47] feat(protocol): Calculate fee/reward based on proof time w/ 1559 math (#13489) Co-authored-by: Daniel Wang Co-authored-by: Daniel Wang <99078276+dantaik@users.noreply.github.com> --- README.md | 1 - packages/protocol/.solhintignore | 3 +- .../protocol/contracts/L1/TaikoConfig.sol | 17 +- packages/protocol/contracts/L1/TaikoData.sol | 50 +- packages/protocol/contracts/L1/TaikoL1.sol | 41 +- .../contracts/L1/libs/LibProposing.sol | 37 +- .../protocol/contracts/L1/libs/LibProving.sol | 10 +- .../contracts/L1/libs/LibTokenomics.sol | 152 ++- .../protocol/contracts/L1/libs/LibUtils.sol | 14 +- .../contracts/L1/libs/LibVerifying.sol | 74 +- .../contracts/test/L1/TestTaikoL1.sol | 14 - .../test/L1/TestTaikoL1EnableTokenomics.sol | 16 - .../thirdparty/LibFixedPointMath.sol | 1 + packages/protocol/foundry.toml | 4 + packages/protocol/script/DeployOnL1.s.sol | 33 +- .../protocol/test/tokenomics/blockFee.test.ts | 2 +- packages/protocol/test/utils/fixture.ts | 4 +- packages/protocol/test/utils/taikoL1.ts | 8 +- packages/protocol/test2/LibLn.sol | 226 +++++ packages/protocol/test2/LibTokenomics.t.sol | 298 ------ packages/protocol/test2/TaikoL1.sim.sol | 62 +- packages/protocol/test2/TaikoL1.t.sol | 118 +-- .../test2/TaikoL1LibTokenomicsMainnet.t.sol | 295 ++++++ .../test2/TaikoL1LibTokenomicsTestnet.t.sol | 950 ++++++++++++++++++ .../protocol/test2/TaikoL1OracleProver.t.sol | 26 +- packages/protocol/test2/TaikoL1TestBase.t.sol | 49 +- .../protocol/utils/generate_config/README.md | 12 - .../protocol/utils/generate_config/main.py | 42 - packages/relayer/TaikoL1.json | 13 +- packages/relayer/contracts/taikol1/TaikoL1.go | 40 +- packages/relayer/contracts/taikol2/TaikoL2.go | 6 +- .../status-page/src/constants/abi/TaikoL1.ts | 8 +- packages/tokenomics/.gitignore | 2 - packages/tokenomics/CHANGELOG.md | 9 - packages/tokenomics/README.md | 15 - packages/tokenomics/main.py | 395 -------- packages/tokenomics/package.json | 5 - packages/tokenomics/plots.py | 22 - packages/tokenomics/present.py | 25 - packages/tokenomics/presents/cbvp1.py | 66 -- packages/tokenomics/presents/cbvp2.py | 66 -- packages/tokenomics/presents/p0.py | 34 - packages/tokenomics/presents/vbcp1.py | 66 -- packages/tokenomics/presents/vbcp2.py | 66 -- packages/tokenomics/presents/vbvps1.py | 57 -- packages/tokenomics/presents/vbvps2.py | 56 -- .../contract-documentation/L1/TaikoData.md | 40 +- .../contract-documentation/L1/TaikoL1.md | 8 +- .../contract-documentation/L2/LibL2Consts.md | 5 +- .../contract-documentation/L2/TaikoL2.md | 26 +- pnpm-lock.yaml | 2 - 51 files changed, 1815 insertions(+), 1776 deletions(-) create mode 100644 packages/protocol/test2/LibLn.sol delete mode 100644 packages/protocol/test2/LibTokenomics.t.sol create mode 100644 packages/protocol/test2/TaikoL1LibTokenomicsMainnet.t.sol create mode 100644 packages/protocol/test2/TaikoL1LibTokenomicsTestnet.t.sol delete mode 100644 packages/protocol/utils/generate_config/README.md delete mode 100644 packages/protocol/utils/generate_config/main.py delete mode 100644 packages/tokenomics/.gitignore delete mode 100644 packages/tokenomics/CHANGELOG.md delete mode 100644 packages/tokenomics/README.md delete mode 100644 packages/tokenomics/main.py delete mode 100644 packages/tokenomics/package.json delete mode 100644 packages/tokenomics/plots.py delete mode 100644 packages/tokenomics/present.py delete mode 100644 packages/tokenomics/presents/cbvp1.py delete mode 100644 packages/tokenomics/presents/cbvp2.py delete mode 100644 packages/tokenomics/presents/p0.py delete mode 100644 packages/tokenomics/presents/vbcp1.py delete mode 100644 packages/tokenomics/presents/vbcp2.py delete mode 100644 packages/tokenomics/presents/vbvps1.py delete mode 100644 packages/tokenomics/presents/vbvps2.py diff --git a/README.md b/README.md index e17a4c90afe..970d1b96508 100644 --- a/README.md +++ b/README.md @@ -45,7 +45,6 @@ taiko-mono/ │ ├── relayer: Bridge backend relayer in Go │ ├── starter-dapp: Template for Taiko dapps │ ├── status-page: Taiko protocol status page -│ ├── tokenomics: Taiko tokenomics simulations │ ├── website: Main documentation website at taiko.xyz (https://taiko.xyz/) │ └── whitepaper: Whitepaper source files with automated publishing ... diff --git a/packages/protocol/.solhintignore b/packages/protocol/.solhintignore index 35e56e7003c..7b6a5611295 100644 --- a/packages/protocol/.solhintignore +++ b/packages/protocol/.solhintignore @@ -3,4 +3,5 @@ lib/ contracts/test/TestLibRLPReader.sol contracts/test/TestLibRLPWriter.sol **/contracts/thirdparty/**/*.sol -test2/GasComparison.t.sol \ No newline at end of file +test2/GasComparison.t.sol +test2/TestLn.sol \ No newline at end of file diff --git a/packages/protocol/contracts/L1/TaikoConfig.sol b/packages/protocol/contracts/L1/TaikoConfig.sol index d67233a67ee..fde54c2de58 100644 --- a/packages/protocol/contracts/L1/TaikoConfig.sol +++ b/packages/protocol/contracts/L1/TaikoConfig.sol @@ -31,26 +31,15 @@ library TaikoConfig { // transactions list calldata, 8K for the remaining tx fields. maxBytesPerTxList: 120000, minTxGasLimit: 21000, - slotSmoothingFactor: 946649, - // 100 basis points or 1% - rewardBurnBips: 100, - proposerDepositPctg: 25, // - 25% // Moving average factors - feeBaseMAF: 1024, txListCacheExpiry: 0, + proofTimeTarget: 1800, // 85s based on A2 testnet status, or set to 1800 for 30mins (mainnet mock) + adjustmentQuotient: 16, relaySignalRoot: false, enableSoloProposer: false, enableOracleProver: true, enableTokenomics: true, - skipZKPVerification: false, - proposingConfig: TaikoData.FeeConfig({ - avgTimeMAF: 1024, - dampingFactorBips: 2500 // [125% -> 75%] - }), - provingConfig: TaikoData.FeeConfig({ - avgTimeMAF: 1024, - dampingFactorBips: 2500 // [75% -> 125%] - }) + skipZKPVerification: false }); } } diff --git a/packages/protocol/contracts/L1/TaikoData.sol b/packages/protocol/contracts/L1/TaikoData.sol index 5497dfe351f..e147bbdbfa5 100644 --- a/packages/protocol/contracts/L1/TaikoData.sol +++ b/packages/protocol/contracts/L1/TaikoData.sol @@ -7,11 +7,6 @@ pragma solidity ^0.8.18; library TaikoData { - struct FeeConfig { - uint16 avgTimeMAF; - uint16 dampingFactorBips; - } - struct Config { uint256 chainId; uint256 maxNumProposedBlocks; @@ -24,29 +19,26 @@ library TaikoData { uint256 maxTransactionsPerBlock; uint256 maxBytesPerTxList; uint256 minTxGasLimit; - uint256 slotSmoothingFactor; - uint256 rewardBurnBips; - uint256 proposerDepositPctg; // Moving average factors - uint256 feeBaseMAF; uint256 txListCacheExpiry; + uint64 proofTimeTarget; + uint8 adjustmentQuotient; bool relaySignalRoot; bool enableSoloProposer; bool enableOracleProver; bool enableTokenomics; bool skipZKPVerification; - FeeConfig proposingConfig; - FeeConfig provingConfig; } struct StateVariables { - uint64 feeBase; + uint64 basefee; + uint64 accBlockFees; uint64 genesisHeight; uint64 genesisTimestamp; uint64 numBlocks; + uint64 proofTimeIssued; uint64 lastVerifiedBlockId; - uint64 avgBlockTime; - uint64 avgProofTime; + uint64 accProposedAt; uint64 lastProposedAt; } @@ -142,24 +134,26 @@ library TaikoData { mapping(uint256 blockId => mapping(bytes32 parentHash => mapping(uint32 parentGasUsed => uint256 forkChoiceId))) forkChoiceIds; mapping(address account => uint256 balance) balances; mapping(bytes32 txListHash => TxListInfo) txListInfo; - // Never or rarely changed + // Slot 5: never or rarely changed uint64 genesisHeight; uint64 genesisTimestamp; - uint64 __reserved1; - uint64 __reserved2; - // Changed when a block is proposed or proven/verified - // Changed when a block is proposed + uint64 __reserved51; + uint64 __reserved52; + // Slot 6: changed by proposeBlock + uint64 lastProposedAt; uint64 numBlocks; - uint64 lastProposedAt; // Timestamp when the last block is proposed. - uint64 avgBlockTime; // miliseconds - uint64 __reserved3; - // Changed when a block is proven/verified + uint64 accProposedAt; // also by verifyBlocks + uint64 accBlockFees; // also by verifyBlocks + // Slot 7: changed by proveBlock + // uint64 __reserved71; + // uint64 __reserved72; + // uint64 __reserved73; + // uint64 __reserved74; + // Slot 8: changed by verifyBlocks + uint64 basefee; + uint64 proofTimeIssued; uint64 lastVerifiedBlockId; - uint64 __reserved4; - // the proof time moving average, note that for each block, only the - // first proof's time is considered. - uint64 avgProofTime; // miliseconds - uint64 feeBase; + uint64 __reserved81; // Reserved uint256[43] __gap; } diff --git a/packages/protocol/contracts/L1/TaikoL1.sol b/packages/protocol/contracts/L1/TaikoL1.sol index 656a75543f5..8e5f0d7a6c3 100644 --- a/packages/protocol/contracts/L1/TaikoL1.sol +++ b/packages/protocol/contracts/L1/TaikoL1.sol @@ -29,20 +29,23 @@ contract TaikoL1 is EssentialContract, IXchainSync, TaikoEvents, TaikoErrors { * Initialize the rollup. * * @param _addressManager The AddressManager address. - * @param _feeBase The initial value of the proposer-fee/prover-reward feeBase. * @param _genesisBlockHash The block hash of the genesis block. + * @param _initBasefee Initial (reasonable) basefee value. + * @param _initProofTimeIssued Initial proof time which keeps the inflow/outflow in balance */ function init( address _addressManager, - uint64 _feeBase, - bytes32 _genesisBlockHash + bytes32 _genesisBlockHash, + uint64 _initBasefee, + uint64 _initProofTimeIssued ) external initializer { EssentialContract._init(_addressManager); LibVerifying.init({ state: state, config: getConfig(), - feeBase: _feeBase, - genesisBlockHash: _genesisBlockHash + genesisBlockHash: _genesisBlockHash, + initBasefee: _initBasefee, + initProofTimeIssued: _initProofTimeIssued }); } @@ -155,27 +158,19 @@ contract TaikoL1 is EssentialContract, IXchainSync, TaikoEvents, TaikoErrors { return state.balances[addr]; } - function getBlockFee() - public - view - returns (uint256 feeAmount, uint256 depositAmount) - { - (, feeAmount, depositAmount) = LibTokenomics.getBlockFee( - state, - getConfig() - ); + function getBlockFee() public view returns (uint64) { + return state.basefee; } function getProofReward( uint64 provenAt, uint64 proposedAt - ) public view returns (uint256 reward) { - (, reward, ) = LibTokenomics.getProofReward({ - state: state, - config: getConfig(), - provenAt: provenAt, - proposedAt: proposedAt - }); + ) public view returns (uint64) { + return + LibTokenomics.getProofReward({ + state: state, + proofTime: provenAt - proposedAt + }); } function getBlock( @@ -256,4 +251,8 @@ contract TaikoL1 is EssentialContract, IXchainSync, TaikoEvents, TaikoErrors { function getConfig() public pure virtual returns (TaikoData.Config memory) { return TaikoConfig.getConfig(); } + + function getVerifierName(uint16 id) public pure returns (string memory) { + return LibUtils.getVerifierName(id); + } } diff --git a/packages/protocol/contracts/L1/libs/LibProposing.sol b/packages/protocol/contracts/L1/libs/LibProposing.sol index e8337b00099..265e6c0729d 100644 --- a/packages/protocol/contracts/L1/libs/LibProposing.sol +++ b/packages/protocol/contracts/L1/libs/LibProposing.sol @@ -90,45 +90,20 @@ library LibProposing { blk.metaHash = LibUtils.hashMetadata(meta); blk.proposer = msg.sender; - if (config.enableTokenomics) { - (uint256 newFeeBase, uint256 fee, uint64 deposit) = LibTokenomics - .getBlockFee(state, config); - - uint256 burnAmount = fee + deposit; - if (state.balances[msg.sender] < burnAmount) - revert L1_INSUFFICIENT_TOKEN(); - - unchecked { - state.balances[msg.sender] -= burnAmount; - } - - // Update feeBase and avgBlockTime - state.feeBase = LibUtils - .movingAverage({ - maValue: state.feeBase, - newValue: newFeeBase, - maf: config.feeBaseMAF - }) - .toUint64(); - - blk.deposit = uint64(deposit); - } + if (state.balances[msg.sender] < state.basefee) + revert L1_INSUFFICIENT_TOKEN(); unchecked { - state.avgBlockTime = LibUtils - .movingAverage({ - maValue: state.avgBlockTime, - newValue: (meta.timestamp - state.lastProposedAt) * 1000, - maf: config.proposingConfig.avgTimeMAF - }) - .toUint64(); - state.lastProposedAt = meta.timestamp; + state.balances[msg.sender] -= state.basefee; + state.accBlockFees += state.basefee; + state.accProposedAt += meta.timestamp; } emit BlockProposed(state.numBlocks, meta); unchecked { ++state.numBlocks; } + state.lastProposedAt = meta.timestamp; } function getBlock( diff --git a/packages/protocol/contracts/L1/libs/LibProving.sol b/packages/protocol/contracts/L1/libs/LibProving.sol index f262842dfbf..086ce3ca84a 100644 --- a/packages/protocol/contracts/L1/libs/LibProving.sol +++ b/packages/protocol/contracts/L1/libs/LibProving.sol @@ -201,13 +201,11 @@ library LibProving { } } - bytes memory verifierId = abi.encodePacked( - "verifier_", - evidence.zkproof.verifierId - ); - (bool verified, bytes memory ret) = resolver - .resolve(string(verifierId), false) + .resolve( + LibUtils.getVerifierName(evidence.zkproof.verifierId), + false + ) .staticcall(bytes.concat(instance, evidence.zkproof.data)); if ( diff --git a/packages/protocol/contracts/L1/libs/LibTokenomics.sol b/packages/protocol/contracts/L1/libs/LibTokenomics.sol index 2e034569d39..8ec38cfd1a2 100644 --- a/packages/protocol/contracts/L1/libs/LibTokenomics.sol +++ b/packages/protocol/contracts/L1/libs/LibTokenomics.sol @@ -13,6 +13,9 @@ import { } from "@openzeppelin/contracts-upgradeable/utils/math/SafeCastUpgradeable.sol"; import {TaikoData} from "../TaikoData.sol"; import {TaikoToken} from "../TaikoToken.sol"; +import { + LibFixedPointMath as Math +} from "../../thirdparty/LibFixedPointMath.sol"; library LibTokenomics { using LibMath for uint256; @@ -52,108 +55,73 @@ library LibTokenomics { } } - function getBlockFee( - TaikoData.State storage state, - TaikoData.Config memory config - ) - internal - view - returns (uint64 newFeeBase, uint64 fee, uint64 depositAmount) - { - (newFeeBase, ) = getTimeAdjustedFee({ - feeConfig: config.proposingConfig, - feeBase: state.feeBase, - isProposal: true, - timeUsed: block.timestamp - state.lastProposedAt, - timeAverage: state.avgBlockTime - }); - fee = getSlotsAdjustedFee({ - state: state, - config: config, - isProposal: true, - feeBase: newFeeBase - }); - - unchecked { - depositAmount = uint64((config.proposerDepositPctg * fee) / 100); - } - } - + /** + * Update the baseFee for proofs + * + * @param state The actual state data + * @param proofTime The actual proof time + * @return reward Amount of reward given - if blocked is proved and verified + */ function getProofReward( TaikoData.State storage state, - TaikoData.Config memory config, - uint64 provenAt, - uint64 proposedAt - ) - internal - view - returns (uint64 newFeeBase, uint64 reward, uint64 premiumRate) - { - if (proposedAt > provenAt) revert L1_INVALID_PARAM(); - - (newFeeBase, premiumRate) = getTimeAdjustedFee({ - feeConfig: config.provingConfig, - feeBase: state.feeBase, - isProposal: false, - timeUsed: provenAt - proposedAt, - timeAverage: state.avgProofTime - }); - reward = getSlotsAdjustedFee({ - state: state, - config: config, - isProposal: false, - feeBase: newFeeBase - }); + uint64 proofTime + ) internal view returns (uint64) { + uint64 numBlocksUnverified = state.numBlocks - + state.lastVerifiedBlockId - + 1; + + if (numBlocksUnverified == 0) { + return 0; + } else { + uint64 totalNumProvingSeconds = uint64( + uint256(numBlocksUnverified) * + block.timestamp - + state.accProposedAt + ); + // If block timestamp is equal to state.accProposedAt (not really, but theoretically possible) + // there will be division by 0 error + if (totalNumProvingSeconds == 0) { + totalNumProvingSeconds = 1; + } - unchecked { - reward = uint64((reward * (10000 - config.rewardBurnBips)) / 10000); + return + uint64( + (uint256(state.accBlockFees) * proofTime) / + totalNumProvingSeconds + ); } } - // Implement "Slot-availability Multipliers", see the whitepaper. - function getSlotsAdjustedFee( + /** + * Calculate the newProofTimeIssued and newBasefee + * + * @param state The actual state data + * @param config Config data + * @param proofTime The actual proof time + * @return newProofTimeIssued Accumulated proof time + * @return newBasefee New basefee + */ + function getNewBaseFeeandProofTimeIssued( TaikoData.State storage state, TaikoData.Config memory config, - bool isProposal, - uint64 feeBase - ) internal view returns (uint64) { - unchecked { - // m is the `n'` in the whitepaper - uint256 m = 1000 * - config.maxNumProposedBlocks + - config.slotSmoothingFactor; - // n is the number of unverified blocks - uint256 n = 1000 * - (state.numBlocks - state.lastVerifiedBlockId - 1); - // k is `m − n + 1` or `m − n - 1`in the whitepaper - uint256 k = isProposal ? m - n - 1000 : m - n + 1000; - return uint64((feeBase * (m - 1000) * m) / (m - n) / k); - } - } - - // Implement "Incentive Multipliers", see the whitepaper. - function getTimeAdjustedFee( - TaikoData.FeeConfig memory feeConfig, - uint64 feeBase, - bool isProposal, - uint256 timeUsed, // seconds - uint256 timeAverage // milliseconds - ) internal pure returns (uint64 newFeeBase, uint64 premiumRate) { - if (timeAverage == 0) { - return (feeBase, 0); + uint64 proofTime + ) internal view returns (uint64 newProofTimeIssued, uint64 newBasefee) { + newProofTimeIssued = (state.proofTimeIssued > config.proofTimeTarget) + ? state.proofTimeIssued - config.proofTimeTarget + : uint64(0); + newProofTimeIssued += proofTime; + + uint256 x = (newProofTimeIssued * Math.SCALING_FACTOR_1E18) / + (config.proofTimeTarget * config.adjustmentQuotient); + + if (Math.MAX_EXP_INPUT <= x) { + x = Math.MAX_EXP_INPUT; } - unchecked { - uint256 p = feeConfig.dampingFactorBips; // [0-10000] - uint256 a = timeAverage; - uint256 t = (timeUsed * 1000).min(a * 2); // millisconds - newFeeBase = uint64((feeBase * (10000 + (t * p) / a - p)) / 10000); + uint256 result = (uint256(Math.exp(int256(x))) / + Math.SCALING_FACTOR_1E18) / + (config.proofTimeTarget * config.adjustmentQuotient); - if (isProposal) { - newFeeBase = (feeBase * 2) - newFeeBase; - } else if (p > 0) { - premiumRate = uint64(((t.max(a) - a) * 10000) / a); - } - } + newBasefee = uint64(result.min(type(uint64).max)); } } diff --git a/packages/protocol/contracts/L1/libs/LibUtils.sol b/packages/protocol/contracts/L1/libs/LibUtils.sol index 720f3de3459..b88ad8bf95b 100644 --- a/packages/protocol/contracts/L1/libs/LibUtils.sol +++ b/packages/protocol/contracts/L1/libs/LibUtils.sol @@ -42,6 +42,7 @@ library LibUtils { uint256 fcId = state.forkChoiceIds[blk.blockId][parentHash][ parentGasUsed ]; + if (fcId >= blk.nextForkChoiceId) return 0; return fcId; @@ -52,14 +53,15 @@ library LibUtils { ) internal view returns (TaikoData.StateVariables memory) { return TaikoData.StateVariables({ - feeBase: state.feeBase, + basefee: state.basefee, + accBlockFees: state.accBlockFees, genesisHeight: state.genesisHeight, genesisTimestamp: state.genesisTimestamp, numBlocks: state.numBlocks, - lastProposedAt: state.lastProposedAt, - avgBlockTime: state.avgBlockTime, + proofTimeIssued: state.proofTimeIssued, lastVerifiedBlockId: state.lastVerifiedBlockId, - avgProofTime: state.avgProofTime + accProposedAt: state.accProposedAt, + lastProposedAt: state.lastProposedAt }); } @@ -130,4 +132,8 @@ library LibUtils { mstore(0x40, add(ptr, 64)) } } + + function getVerifierName(uint16 id) public pure returns (string memory) { + return string(bytes.concat(bytes("verifier_"), bytes2(id))); + } } diff --git a/packages/protocol/contracts/L1/libs/LibVerifying.sol b/packages/protocol/contracts/L1/libs/LibVerifying.sol index 86475195b10..457e88e166f 100644 --- a/packages/protocol/contracts/L1/libs/LibVerifying.sol +++ b/packages/protocol/contracts/L1/libs/LibVerifying.sol @@ -32,15 +32,18 @@ library LibVerifying { function init( TaikoData.State storage state, TaikoData.Config memory config, - uint64 feeBase, - bytes32 genesisBlockHash + bytes32 genesisBlockHash, + uint64 initBasefee, + uint64 initProofTimeIssued ) internal { _checkConfig(config); uint64 timeNow = uint64(block.timestamp); state.genesisHeight = uint64(block.number); state.genesisTimestamp = timeNow; - state.feeBase = feeBase; + + state.basefee = initBasefee; + state.proofTimeIssued = initProofTimeIssued; state.numBlocks = 1; TaikoData.Block storage blk = state.blocks[0]; @@ -66,7 +69,6 @@ library LibVerifying { uint256 fcId = blk.verifiedForkChoiceId; assert(fcId > 0); - bytes32 blockHash = blk.forkChoices[fcId].blockHash; uint32 gasUsed = blk.forkChoices[fcId].gasUsed; bytes32 signalRoot; @@ -94,7 +96,6 @@ library LibVerifying { fcId: uint24(fcId), fc: fc }); - blockHash = fc.blockHash; gasUsed = fc.gasUsed; signalRoot = fc.signalRoot; @@ -128,48 +129,25 @@ library LibVerifying { TaikoData.ForkChoice storage fc, uint24 fcId ) private { - if (config.enableTokenomics) { - ( - uint256 newFeeBase, - uint256 amount, - uint256 premiumRate - ) = LibTokenomics.getProofReward({ - state: state, - config: config, - provenAt: fc.provenAt, - proposedAt: blk.proposedAt - }); + if (config.proofTimeTarget != 0) { + uint64 proofTime; + unchecked { + proofTime = uint64(fc.provenAt - blk.proposedAt); + } - // reward the prover - _addToBalance(state, fc.prover, amount); + uint64 reward = LibTokenomics.getProofReward(state, proofTime); + + (state.proofTimeIssued, state.basefee) = LibTokenomics + .getNewBaseFeeandProofTimeIssued(state, config, proofTime); unchecked { - // premiumRate in [0-10000] - amount = (blk.deposit * (10000 - premiumRate)) / 10000; + state.accBlockFees -= reward; + state.accProposedAt -= blk.proposedAt; } - _addToBalance(state, blk.proposer, amount); - - // Update feeBase and avgProofTime - state.feeBase = LibUtils - .movingAverage({ - maValue: state.feeBase, - newValue: newFeeBase, - maf: config.feeBaseMAF - }) - .toUint64(); - } - uint256 proofTime; - unchecked { - proofTime = (fc.provenAt - blk.proposedAt) * 1000; + // reward the prover + _addToBalance(state, fc.prover, reward); } - state.avgProofTime = LibUtils - .movingAverage({ - maValue: state.avgProofTime, - newValue: proofTime, - maf: config.provingConfig.avgTimeMAF - }) - .toUint64(); blk.nextForkChoiceId = 1; blk.verifiedForkChoiceId = fcId; @@ -204,20 +182,10 @@ library LibVerifying { // EIP-4844 blob size up to 128K config.maxBytesPerTxList > 128 * 1024 || config.minTxGasLimit == 0 || - config.slotSmoothingFactor == 0 || // EIP-4844 blob deleted after 30 days config.txListCacheExpiry > 30 * 24 hours || - config.rewardBurnBips >= 10000 + config.proofTimeTarget == 0 || + config.adjustmentQuotient == 0 ) revert L1_INVALID_CONFIG(); - - _checkFeeConfig(config.proposingConfig); - _checkFeeConfig(config.provingConfig); - } - - function _checkFeeConfig( - TaikoData.FeeConfig memory feeConfig - ) private pure { - if (feeConfig.avgTimeMAF <= 1 || feeConfig.dampingFactorBips > 10000) - revert L1_INVALID_CONFIG(); } } diff --git a/packages/protocol/contracts/test/L1/TestTaikoL1.sol b/packages/protocol/contracts/test/L1/TestTaikoL1.sol index 1459e0ed17c..5c1111b1c65 100644 --- a/packages/protocol/contracts/test/L1/TestTaikoL1.sol +++ b/packages/protocol/contracts/test/L1/TestTaikoL1.sol @@ -28,23 +28,9 @@ contract TestTaikoL1 is TaikoL1 { config.maxTransactionsPerBlock = 20; config.maxBytesPerTxList = 120000; config.minTxGasLimit = 21000; - config.slotSmoothingFactor = 590000; - config.rewardBurnBips = 100; // 100 basis points or 1% - config.proposerDepositPctg = 25; // 25% config.enableTokenomics = false; config.skipZKPVerification = true; - config.feeBaseMAF = 1024; - - config.proposingConfig = TaikoData.FeeConfig({ - avgTimeMAF: 64, - dampingFactorBips: 5000 - }); - - config.provingConfig = TaikoData.FeeConfig({ - avgTimeMAF: 64, - dampingFactorBips: 5000 - }); } // The old implementation that is also used in hardhat tests. diff --git a/packages/protocol/contracts/test/L1/TestTaikoL1EnableTokenomics.sol b/packages/protocol/contracts/test/L1/TestTaikoL1EnableTokenomics.sol index 56afe3ca244..0ef3f7343aa 100644 --- a/packages/protocol/contracts/test/L1/TestTaikoL1EnableTokenomics.sol +++ b/packages/protocol/contracts/test/L1/TestTaikoL1EnableTokenomics.sol @@ -28,25 +28,9 @@ contract TestTaikoL1EnableTokenomics is TaikoL1 { config.maxTransactionsPerBlock = 20; config.maxBytesPerTxList = 120000; config.minTxGasLimit = 21000; - config.slotSmoothingFactor = 590000; - config.rewardBurnBips = 100; // 100 basis points or 1% - config.proposerDepositPctg = 25; // 25% - - // Moving average factors - config.feeBaseMAF = 1024; config.enableTokenomics = true; config.skipZKPVerification = true; - - config.proposingConfig = TaikoData.FeeConfig({ - avgTimeMAF: 64, - dampingFactorBips: 5000 - }); - - config.provingConfig = TaikoData.FeeConfig({ - avgTimeMAF: 64, - dampingFactorBips: 5000 - }); } // The old implementation that is also used in hardhat tests. diff --git a/packages/protocol/contracts/thirdparty/LibFixedPointMath.sol b/packages/protocol/contracts/thirdparty/LibFixedPointMath.sol index 1bae4223d96..a056e09f44f 100644 --- a/packages/protocol/contracts/thirdparty/LibFixedPointMath.sol +++ b/packages/protocol/contracts/thirdparty/LibFixedPointMath.sol @@ -4,6 +4,7 @@ pragma solidity ^0.8.18; library LibFixedPointMath { uint128 public constant MAX_EXP_INPUT = 135305999368893231588; + uint256 public constant SCALING_FACTOR_1E18 = 1e18; // For fixed point representation factor error Overflow(); diff --git a/packages/protocol/foundry.toml b/packages/protocol/foundry.toml index 5d09b63e585..376e95994b9 100644 --- a/packages/protocol/foundry.toml +++ b/packages/protocol/foundry.toml @@ -12,6 +12,10 @@ gas_limit = '18446744073709551615' # Do not change the block_gas_limit value, TaikoL2.t.sol depends on it. block_gas_limit = 30000000 #30M +# For mainnet_mock tokenomics test we need a huge value to run lots of iterations. +# Use the above 30M for TaikoL2.t.sol related tests, only use this number with mainnet simulation. +#block_gas_limit = 3000000000 #3000M + fs_permissions = [ { access = "read", path = "./out"}, diff --git a/packages/protocol/script/DeployOnL1.s.sol b/packages/protocol/script/DeployOnL1.s.sol index c0f442bd553..9609502dba0 100644 --- a/packages/protocol/script/DeployOnL1.s.sol +++ b/packages/protocol/script/DeployOnL1.s.sol @@ -19,12 +19,14 @@ import "../contracts/signal/SignalService.sol"; import "../contracts/thirdparty/AddressManager.sol"; import "../contracts/test/erc20/FreeMintERC20.sol"; import "../contracts/test/erc20/MayFailFreeMintERC20.sol"; +import "../test2/LibLn.sol"; contract DeployOnL1 is Script, AddressResolver { using SafeCastUpgradeable for uint256; + uint256 public l2ChainId = vm.envUint("L2_CHAIN_ID"); - bytes32 public gensisHash = vm.envBytes32("L2_GENESIS_HASH"); + bytes32 public genesisHash = vm.envBytes32("L2_GENESIS_HASH"); uint256 public deployerPrivateKey = vm.envUint("PRIVATE_KEY"); @@ -46,8 +48,13 @@ contract DeployOnL1 is Script, AddressResolver { uint256 public taikoTokenPremintAmount = vm.envUint("TAIKO_TOKEN_PREMINT_AMOUNT"); + TaikoL1 taikoL1; address public addressManagerProxy; + // New fee/reward related variables + uint16 public constant PROOF_TIME_TARGET = 1800; // For mainnet it is around 30 mins, but choose carefully ! (Testnet is different !) + uint8 public constant ADJUSTMENT_QUOTIENT = 16; + error FAILED_TO_DEPLOY_PLONK_VERIFIER(string contractPath); function run() external { @@ -112,15 +119,30 @@ contract DeployOnL1 is Script, AddressResolver { console.log("BullToken", bullToken); // TaikoL1 - TaikoL1 taikoL1 = new TaikoL1(); + taikoL1 = new TaikoL1(); uint64 feeBase = 1 ** 8; // Taiko Token's decimals is 8, not 18 + + // Calculating it for our needs based on testnet/mainnet. We need it in + // order to make the fees on the same level - in ideal circumstences. + // See Brecht's comment https://github.com/taikoxyz/taiko-mono/pull/13564 + uint64 initProofTimeIssued = LibLn.calcInitProofTimeIssued( + feeBase, + PROOF_TIME_TARGET, + ADJUSTMENT_QUOTIENT + ); + address taikoL1Proxy = deployProxy( "taiko", address(taikoL1), bytes.concat( taikoL1.init.selector, - abi.encode(addressManagerProxy, feeBase, gensisHash) + abi.encode( + addressManagerProxy, + genesisHash, + feeBase, + initProofTimeIssued + ) ) ); setAddress("proto_broker", taikoL1Proxy); @@ -179,10 +201,7 @@ contract DeployOnL1 is Script, AddressResolver { ); for (uint16 i = 0; i < plonkVerifiers.length; ++i) { - setAddress( - string(abi.encodePacked("verifier_", i)), - plonkVerifiers[i] - ); + setAddress(taikoL1.getVerifierName(i), plonkVerifiers[i]); } } diff --git a/packages/protocol/test/tokenomics/blockFee.test.ts b/packages/protocol/test/tokenomics/blockFee.test.ts index 75529c54aa5..602d97d5971 100644 --- a/packages/protocol/test/tokenomics/blockFee.test.ts +++ b/packages/protocol/test/tokenomics/blockFee.test.ts @@ -43,7 +43,7 @@ describe("tokenomics: blockFee", function () { afterEach(() => clearInterval(interval)); - it("expects getBlockFee to return the initial feeBase at time of contract deployment", async function () { + it("expects getBlockFee to return the initial basefee at time of contract deployment", async function () { // deploy a new instance of TaikoL1 so no blocks have passed. const tL1 = await deployTaikoL1(l1AddressManager, genesisHash, true); const blockFee = await tL1.getBlockFee(); diff --git a/packages/protocol/test/utils/fixture.ts b/packages/protocol/test/utils/fixture.ts index ea9ca26d145..2b924eec910 100644 --- a/packages/protocol/test/utils/fixture.ts +++ b/packages/protocol/test/utils/fixture.ts @@ -10,7 +10,7 @@ import { getL2Provider, } from "./provider"; import { createAndSeedWallets, sendTinyEtherToZeroAddress } from "./seed"; -import { defaultFeeBase, deployTaikoL1 } from "./taikoL1"; +import { defaultBasefee, deployTaikoL1 } from "./taikoL1"; import { deployTaikoL2 } from "./taikoL2"; import deployTaikoToken from "./taikoToken"; @@ -51,7 +51,7 @@ async function initIntegrationFixture( l1AddressManager, genesisHash, enableTokenomics, - defaultFeeBase + defaultBasefee ); const { chainId } = await l1Provider.getNetwork(); diff --git a/packages/protocol/test/utils/taikoL1.ts b/packages/protocol/test/utils/taikoL1.ts index 71974305b20..3d205800320 100644 --- a/packages/protocol/test/utils/taikoL1.ts +++ b/packages/protocol/test/utils/taikoL1.ts @@ -2,13 +2,13 @@ import { BigNumber } from "ethers"; import { ethers } from "hardhat"; import { AddressManager, TaikoL1 } from "../../typechain"; -const defaultFeeBase = BigNumber.from(10).pow(18); +const defaultBasefee = BigNumber.from(10).pow(18); async function deployTaikoL1( addressManager: AddressManager, genesisHash: string, enableTokenomics: boolean, - feeBase?: BigNumber + basefee?: BigNumber ): Promise { // const libProposing = await ( // await ethers.getContractFactory("LibProposing") @@ -39,11 +39,11 @@ async function deployTaikoL1( await taikoL1.init( addressManager.address, genesisHash, - feeBase ?? defaultFeeBase + basefee ?? defaultBasefee ) ).wait(1); return taikoL1 as TaikoL1; } -export { deployTaikoL1, defaultFeeBase }; +export { deployTaikoL1, defaultBasefee }; diff --git a/packages/protocol/test2/LibLn.sol b/packages/protocol/test2/LibLn.sol new file mode 100644 index 00000000000..bcb8ff552d8 --- /dev/null +++ b/packages/protocol/test2/LibLn.sol @@ -0,0 +1,226 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity ^0.8.18; + +// Taken from: https://github.com/recmo/experiment-solexp/blob/main/src/FixedPointMathLib.sol +import {LibFixedPointMath} from "../contracts/thirdparty/LibFixedPointMath.sol"; + +library LibLn { + error Overflow(); + error LnNegativeUndefined(); + + // Integer log2 (alternative implementation) + // @returns floor(log2(x)) if x is nonzero, otherwise 0. + // Consumes 317 gas. This could have been an 3 gas EVM opcode though. + function ilog2_alt(uint256 x) internal pure returns (uint256 r) { + unchecked { + // Repeat first zero all the way to the right + x |= x >> 1; + x |= x >> 2; + x |= x >> 4; + x |= x >> 8; + x |= x >> 16; + x |= x >> 32; + x |= x >> 64; + x |= x >> 128; + + // Count 32 bit chunks + r = x & 0x100000001000000010000000100000001000000010000000100000001; + r *= 0x20000000200000002000000020000000200000002000000020; + r >>= 224; + + // Extract highest bit + x ^= x >> 1; + + // Copy to lowest 32 bit chunk + x |= x >> 32; + x |= x >> 64; + x |= x >> 128; + // No need to clear the other chunks + + // Map to 0-31 using the B(2, 5) de Bruijn sequence 0x077CB531. + // See + x = ((x * 0x077CB531) >> 27) & 0x1f; + + // Use a bytes32 32 entry lookup table + assembly { + // Need assembly here because solidity introduces an uncessary bounds + // check. + r := add( + r, + byte( + x, + 0x11c021d0e18031e16140f191104081f1b0d17151310071a0c12060b050a09 + ) + ) + } + } + } + + // Integer log2 + // @returns floor(log2(x)) if x is nonzero, otherwise 0. This is the same + // as the location of the highest set bit. + // Consumes 232 gas. This could have been an 3 gas EVM opcode though. + function ilog2(uint256 x) internal pure returns (uint256 r) { + assembly { + r := shl(7, lt(0xffffffffffffffffffffffffffffffff, x)) + r := or(r, shl(6, lt(0xffffffffffffffff, shr(r, x)))) + r := or(r, shl(5, lt(0xffffffff, shr(r, x)))) + r := or(r, shl(4, lt(0xffff, shr(r, x)))) + r := or(r, shl(3, lt(0xff, shr(r, x)))) + r := or(r, shl(2, lt(0xf, shr(r, x)))) + r := or(r, shl(1, lt(0x3, shr(r, x)))) + r := or(r, lt(0x1, shr(r, x))) + } + } + + function ln_pub(int256 x) public pure returns (int256 r) { + return ln(x); + } + + // Computes ln(x) in 1e18 fixed point. + // Reverts if x is negative or zero. + // Consumes 670 gas. + function ln(int256 x) internal pure returns (int256 r) { + unchecked { + if (x < 1) { + if (x < 0) revert LnNegativeUndefined(); + revert Overflow(); + } + + // We want to convert x from 10**18 fixed point to 2**96 fixed point. + // We do this by multiplying by 2**96 / 10**18. + // But since ln(x * C) = ln(x) + ln(C), we can simply do nothing here + // and add ln(2**96 / 10**18) at the end. + + // Reduce range of x to (1, 2) * 2**96 + // ln(2^k * x) = k * ln(2) + ln(x) + // Note: inlining ilog2 saves 8 gas. + int256 k = int256(ilog2(uint256(x))) - 96; + x <<= uint256(159 - k); + x = int256(uint256(x) >> 159); + + // Evaluate using a (8, 8)-term rational approximation + // p is made monic, we will multiply by a scale factor later + int256 p = x + 3273285459638523848632254066296; + p = ((p * x) >> 96) + 24828157081833163892658089445524; + p = ((p * x) >> 96) + 43456485725739037958740375743393; + p = ((p * x) >> 96) - 11111509109440967052023855526967; + p = ((p * x) >> 96) - 45023709667254063763336534515857; + p = ((p * x) >> 96) - 14706773417378608786704636184526; + p = p * x - (795164235651350426258249787498 << 96); + //emit log_named_int("p", p); + // We leave p in 2**192 basis so we don't need to scale it back up for the division. + // q is monic by convention + int256 q = x + 5573035233440673466300451813936; + q = ((q * x) >> 96) + 71694874799317883764090561454958; + q = ((q * x) >> 96) + 283447036172924575727196451306956; + q = ((q * x) >> 96) + 401686690394027663651624208769553; + q = ((q * x) >> 96) + 204048457590392012362485061816622; + q = ((q * x) >> 96) + 31853899698501571402653359427138; + q = ((q * x) >> 96) + 909429971244387300277376558375; + assembly { + // Div in assembly because solidity adds a zero check despite the `unchecked`. + // The q polynomial is known not to have zeros in the domain. (All roots are complex) + // No scaling required because p is already 2**96 too large. + r := sdiv(p, q) + } + // r is in the range (0, 0.125) * 2**96 + + // Finalization, we need to + // * multiply by the scale factor s = 5.549… + // * add ln(2**96 / 10**18) + // * add k * ln(2) + // * multiply by 10**18 / 2**96 = 5**18 >> 78 + // mul s * 5e18 * 2**96, base is now 5**18 * 2**192 + r *= 1677202110996718588342820967067443963516166; + // add ln(2) * k * 5e18 * 2**192 + r += + 16597577552685614221487285958193947469193820559219878177908093499208371 * + k; + // add ln(2**96 / 10**18) * 5e18 * 2**192 + r += 600920179829731861736702779321621459595472258049074101567377883020018308; + // base conversion: mul 2**18 / 2**192 + r >>= 174; + } + } + + // Computes e^x in 1e18 fixed point. + function exp(int256 x) internal pure returns (int256 r) { + unchecked { + // Input x is in fixed point format, with scale factor 1/1e18. + + // When the result is < 0.5 we return zero. This happens when + // x <= floor(log(0.5e18) * 1e18) ~ -42e18 + if (x <= -42139678854452767551) { + return 0; + } + + // When the result is > (2**255 - 1) / 1e18 we can not represent it + // as an int256. This happens when x >= floor(log((2**255 -1) / 1e18) * 1e18) ~ 135. + if (x >= 135305999368893231589) revert Overflow(); + + // x is now in the range (-42, 136) * 1e18. Convert to (-42, 136) * 2**96 + // for more intermediate precision and a binary basis. This base conversion + // is a multiplication by 1e18 / 2**96 = 5**18 / 2**78. + x = (x << 78) / 5 ** 18; + + // Reduce range of x to (-½ ln 2, ½ ln 2) * 2**96 by factoring out powers of two + // such that exp(x) = exp(x') * 2**k, where k is an integer. + // Solving this gives k = round(x / log(2)) and x' = x - k * log(2). + int256 k = ((x << 96) / 54916777467707473351141471128 + 2 ** 95) >> + 96; + x = x - k * 54916777467707473351141471128; + // k is in the range [-61, 195]. + + // Evaluate using a (6, 7)-term rational approximation + // p is made monic, we will multiply by a scale factor later + int256 p = x + 2772001395605857295435445496992; + p = ((p * x) >> 96) + 44335888930127919016834873520032; + p = ((p * x) >> 96) + 398888492587501845352592340339721; + p = ((p * x) >> 96) + 1993839819670624470859228494792842; + p = p * x + (4385272521454847904632057985693276 << 96); + // We leave p in 2**192 basis so we don't need to scale it back up for the division. + // Evaluate using using Knuth's scheme from p. 491. + int256 z = x + 750530180792738023273180420736; + z = ((z * x) >> 96) + 32788456221302202726307501949080; + int256 w = x - 2218138959503481824038194425854; + w = ((w * z) >> 96) + 892943633302991980437332862907700; + int256 q = z + w - 78174809823045304726920794422040; + q = ((q * w) >> 96) + 4203224763890128580604056984195872; + assembly { + // Div in assembly because solidity adds a zero check despite the `unchecked`. + // The q polynomial is known not to have zeros in the domain. (All roots are complex) + // No scaling required because p is already 2**96 too large. + r := sdiv(p, q) + } + // r should be in the range (0.09, 0.25) * 2**96. + + // We now need to multiply r by + // * the scale factor s = ~6.031367120..., + // * the 2**k factor from the range reduction, and + // * the 1e18 / 2**96 factor for base converison. + // We do all of this at once, with an intermediate result in 2**213 basis + // so the final right shift is always by a positive amount. + r = int( + (uint(r) * 3822833074963236453042738258902158003155416615667) >> + uint256(195 - k) + ); + } + } + + function calcInitProofTimeIssued( + uint64 basefee, + uint16 proofTimeTarget, + uint8 adjustmentQuotient + ) public pure returns (uint64 initProofTimeIssued) { + uint256 scale = uint256(proofTimeTarget) * adjustmentQuotient; + // ln_pub() expects 1e18 fixed format + uint256 lnReq = scale * basefee * LibFixedPointMath.SCALING_FACTOR_1E18; + require(lnReq <= uint256(type(int256).max)); + int256 log_result = ln_pub(int256(lnReq)); + initProofTimeIssued = uint64( + ((scale * (uint256(log_result))) / + (LibFixedPointMath.SCALING_FACTOR_1E18)) + ); + } +} diff --git a/packages/protocol/test2/LibTokenomics.t.sol b/packages/protocol/test2/LibTokenomics.t.sol deleted file mode 100644 index bcdcc197d76..00000000000 --- a/packages/protocol/test2/LibTokenomics.t.sol +++ /dev/null @@ -1,298 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.18; - -import {Test} from "forge-std/Test.sol"; -import {console2} from "forge-std/console2.sol"; -import {TaikoData} from "../contracts/L1/TaikoData.sol"; -import {LibTokenomics} from "../contracts/L1/libs/LibTokenomics.sol"; -import { - SafeCastUpgradeable -} from "@openzeppelin/contracts-upgradeable/utils/math/SafeCastUpgradeable.sol"; - -contract TestLibTokenomics is Test { - using SafeCastUpgradeable for uint256; - - struct FeeConfig { - uint64 avgTimeMAF; - uint64 avgTimeCap; - uint64 gracePeriodPctg; - uint64 maxPeriodPctg; - // extra fee/reward on top of baseFee - uint64 multiplerPctg; - } - - function testTokenomicsFeeCalcWithNonZeroStartBips() public { - testTimeAdjustedFee({ - feeBase: 100 * 1E8, - timeAverageSec: 40 seconds, - timeUsedSec: 0 seconds, - isProposal: true, - dampingFactorBips: 4000, // 40% - expectedFeeBase: 140 * 1E8, - expectedPreimumRate: 0 - }); - - testTimeAdjustedFee({ - feeBase: 100 * 1E8, - timeAverageSec: 40 seconds, - timeUsedSec: 20 seconds, - isProposal: true, - dampingFactorBips: 4000, // 40% - expectedFeeBase: 120 * 1E8, - expectedPreimumRate: 0 - }); - - testTimeAdjustedFee({ - feeBase: 100 * 1E8, - timeAverageSec: 40 seconds, - timeUsedSec: 40 seconds, - isProposal: true, - dampingFactorBips: 4000, // 40% - expectedFeeBase: 100 * 1E8, - expectedPreimumRate: 0 - }); - - testTimeAdjustedFee({ - feeBase: 100 * 1E8, - timeAverageSec: 40 seconds, - timeUsedSec: 60 seconds, - isProposal: true, - dampingFactorBips: 4000, // 40% - expectedFeeBase: 80 * 1E8, - expectedPreimumRate: 0 - }); - - testTimeAdjustedFee({ - feeBase: 100 * 1E8, - timeAverageSec: 40 seconds, - timeUsedSec: 80 seconds, - isProposal: true, - dampingFactorBips: 4000, // 40% - expectedFeeBase: 60 * 1E8, - expectedPreimumRate: 0 - }); - - testTimeAdjustedFee({ - feeBase: 100 * 1E8, - timeAverageSec: 40 seconds, - timeUsedSec: 81 seconds, - isProposal: true, - dampingFactorBips: 4000, // 40% - expectedFeeBase: 60 * 1E8, - expectedPreimumRate: 0 - }); - } - - function testTokenomicsFeeCalcWithZeroStartBips() public { - testTimeAdjustedFee({ - feeBase: 100 * 1E8, - timeAverageSec: 40 seconds, - timeUsedSec: 0 seconds, - isProposal: true, - dampingFactorBips: 0, // 0% - expectedFeeBase: 100 * 1E8, - expectedPreimumRate: 0 - }); - - testTimeAdjustedFee({ - feeBase: 100 * 1E8, - timeAverageSec: 40 seconds, - timeUsedSec: 20 seconds, - isProposal: true, - dampingFactorBips: 0, // 0% - expectedFeeBase: 100 * 1E8, - expectedPreimumRate: 0 - }); - - testTimeAdjustedFee({ - feeBase: 100 * 1E8, - timeAverageSec: 40 seconds, - timeUsedSec: 40 seconds, - isProposal: true, - dampingFactorBips: 0, // 0% - expectedFeeBase: 100 * 1E8, - expectedPreimumRate: 0 - }); - - testTimeAdjustedFee({ - feeBase: 100 * 1E8, - timeAverageSec: 40 seconds, - timeUsedSec: 60 seconds, - isProposal: true, - dampingFactorBips: 0, // 0% - expectedFeeBase: 100 * 1E8, - expectedPreimumRate: 0 - }); - - testTimeAdjustedFee({ - feeBase: 100 * 1E8, - timeAverageSec: 40 seconds, - timeUsedSec: 80 seconds, - isProposal: true, - dampingFactorBips: 0, // 0% - expectedFeeBase: 100 * 1E8, - expectedPreimumRate: 0 - }); - - testTimeAdjustedFee({ - feeBase: 100 * 1E8, - timeAverageSec: 40 seconds, - timeUsedSec: 81 seconds, - isProposal: true, - dampingFactorBips: 0, // 0% - expectedFeeBase: 100 * 1E8, - expectedPreimumRate: 0 - }); - } - - function testTokenomicsRewardCalcWithNonZeroStartBips() public { - testTimeAdjustedFee({ - feeBase: 100 * 1E8, - timeAverageSec: 40 seconds, - timeUsedSec: 0 seconds, - isProposal: false, - dampingFactorBips: 4000, // 40% - expectedFeeBase: 60 * 1E8, - expectedPreimumRate: 0 - }); - - testTimeAdjustedFee({ - feeBase: 100 * 1E8, - timeAverageSec: 40 seconds, - timeUsedSec: 20 seconds, - isProposal: false, - dampingFactorBips: 4000, // 40% - expectedFeeBase: 80 * 1E8, - expectedPreimumRate: 0 - }); - - testTimeAdjustedFee({ - feeBase: 100 * 1E8, - timeAverageSec: 40 seconds, - timeUsedSec: 40 seconds, - isProposal: false, - dampingFactorBips: 4000, // 40% - expectedFeeBase: 100 * 1E8, - expectedPreimumRate: 0 - }); - - testTimeAdjustedFee({ - feeBase: 100 * 1E8, - timeAverageSec: 40 seconds, - timeUsedSec: 60 seconds, - isProposal: false, - dampingFactorBips: 4000, // 40% - expectedFeeBase: 120 * 1E8, - expectedPreimumRate: 5000 - }); - - testTimeAdjustedFee({ - feeBase: 100 * 1E8, - timeAverageSec: 40 seconds, - timeUsedSec: 80 seconds, - isProposal: false, - dampingFactorBips: 4000, // 40% - expectedFeeBase: 140 * 1E8, - expectedPreimumRate: 10000 - }); - - testTimeAdjustedFee({ - feeBase: 100 * 1E8, - timeAverageSec: 40 seconds, - timeUsedSec: 81 seconds, - isProposal: false, - dampingFactorBips: 4000, // 40% - expectedFeeBase: 140 * 1E8, - expectedPreimumRate: 10000 - }); - } - - function testTokenomicsRewardCalcWithZeroStartBips() public { - testTimeAdjustedFee({ - feeBase: 100 * 1E8, - timeAverageSec: 40 seconds, - timeUsedSec: 0 seconds, - isProposal: false, - dampingFactorBips: 0, // 0% - expectedFeeBase: 100 * 1E8, - expectedPreimumRate: 0 - }); - - testTimeAdjustedFee({ - feeBase: 100 * 1E8, - timeAverageSec: 40 seconds, - timeUsedSec: 20 seconds, - isProposal: false, - dampingFactorBips: 0, // 0% - expectedFeeBase: 100 * 1E8, - expectedPreimumRate: 0 - }); - - testTimeAdjustedFee({ - feeBase: 100 * 1E8, - timeAverageSec: 40 seconds, - timeUsedSec: 40 seconds, - isProposal: false, - dampingFactorBips: 0, // 0% - expectedFeeBase: 100 * 1E8, - expectedPreimumRate: 0 - }); - - testTimeAdjustedFee({ - feeBase: 100 * 1E8, - timeAverageSec: 40 seconds, - timeUsedSec: 60 seconds, - isProposal: false, - dampingFactorBips: 0, // 0% - expectedFeeBase: 100 * 1E8, - expectedPreimumRate: 0 - }); - - testTimeAdjustedFee({ - feeBase: 100 * 1E8, - timeAverageSec: 40 seconds, - timeUsedSec: 80 seconds, - isProposal: false, - dampingFactorBips: 0, // 0% - expectedFeeBase: 100 * 1E8, - expectedPreimumRate: 0 - }); - - testTimeAdjustedFee({ - feeBase: 100 * 1E8, - timeAverageSec: 40 seconds, - timeUsedSec: 81 seconds, - isProposal: false, - dampingFactorBips: 0, // 0% - expectedFeeBase: 100 * 1E8, - expectedPreimumRate: 0 - }); - } - - function testTimeAdjustedFee( - uint256 feeBase, - uint256 timeAverageSec, - uint256 timeUsedSec, - bool isProposal, - uint16 dampingFactorBips, - uint256 expectedFeeBase, - uint256 expectedPreimumRate - ) private { - TaikoData.FeeConfig memory feeConfig = TaikoData.FeeConfig({ - avgTimeMAF: 1024, - dampingFactorBips: dampingFactorBips - }); - - (uint256 _feeBase, uint256 _premiumRate) = LibTokenomics - .getTimeAdjustedFee( - feeConfig, - feeBase.toUint64(), - isProposal, - timeUsedSec, - timeAverageSec * 1000 - ); - - assertEq(_premiumRate, expectedPreimumRate); - assertEq(_feeBase, expectedFeeBase); - } -} diff --git a/packages/protocol/test2/TaikoL1.sim.sol b/packages/protocol/test2/TaikoL1.sim.sol index 3fdac21cdcb..4861f9887c3 100644 --- a/packages/protocol/test2/TaikoL1.sim.sol +++ b/packages/protocol/test2/TaikoL1.sim.sol @@ -9,6 +9,7 @@ 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.t.sol"; +import {LibLn} from "./LibLn.sol"; /// @dev Warning: this test will take 7-10 minutes and require 1GB memory. /// `pnpm test:sim` @@ -23,11 +24,11 @@ contract TaikoL1_b is TaikoL1 { config.enableTokenomics = true; config.txListCacheExpiry = 0; - config.proposerDepositPctg = 0; config.enableSoloProposer = false; config.enableOracleProver = false; config.maxNumProposedBlocks = 36; config.ringBufferSize = 40; + config.proofTimeTarget = 200; } } @@ -43,18 +44,23 @@ contract TaikoL1Simulation is TaikoL1TestBase, FoundryRandom { } function setUp() public override { - TaikoL1TestBase.setUp(); - _registerAddress( - string(abi.encodePacked("verifier_", uint16(100))), - address(new Verifier()) + uint16 proofTimeTarget = 200; // Approx. value which close to what is in the simulation + + initProofTimeIssued = LibLn.calcInitProofTimeIssued( + feeBase, + proofTimeTarget, + ADJUSTMENT_QUOTIENT ); + + TaikoL1TestBase.setUp(); + registerAddress(L1.getVerifierName(100), address(new Verifier())); } function testGeneratingManyRandomBlocks() external { uint256 time = block.timestamp; assertEq(time, 1); - _depositTaikoToken(Alice, 1E6 * 1E8, 10000 ether); + depositTaikoToken(Alice, 1E6 * 1E8, 10000 ether); bytes32 parentHash = GENESIS_BLOCK_HASH; uint32 parentGasUsed; @@ -86,6 +92,19 @@ contract TaikoL1Simulation is TaikoL1TestBase, FoundryRandom { gasLimit, txListSize ); + // Here we need to have some time elapsed between propose and prove + // Realistically lets make it somewhere 160-240 sec, it is realistic + // for a testnet. Created this function because randomNumber seems to + // be non-working properly. + uint8 proveTimeCnt = pickRandomProveTime( + uint256( + keccak256( + abi.encodePacked(time, msg.sender, block.timestamp) + ) + ) + ); + + mine(proveTimeCnt); proveBlock( Bob, @@ -111,10 +130,10 @@ contract TaikoL1Simulation is TaikoL1TestBase, FoundryRandom { "\nlogCount,", "time,", "lastVerifiedBlockId,", - "numBlocks," - // "feeBase,", - // "fee,", - // "lastProposedAt" + "numBlocks,", + "baseFee,", + "accProposedAt,", + "lastProposedAt" ); console2.log(str); } @@ -129,14 +148,23 @@ contract TaikoL1Simulation is TaikoL1TestBase, FoundryRandom { ",", Strings.toString(vars.lastVerifiedBlockId), ",", - Strings.toString(vars.numBlocks) - // ",", - // Strings.toString(vars.feeBase), - // ",", - // Strings.toString(fee), - // ",", - // Strings.toString(vars.lastProposedAt) + Strings.toString(vars.numBlocks), + ",", + Strings.toString(vars.basefee), + ",", + Strings.toString(vars.accProposedAt), + ",", + Strings.toString(vars.lastProposedAt) ); console2.log(str); } + + function pickRandomProveTime( + uint256 randomNum + ) internal pure returns (uint8) { + // Result shall be between 8-12 (inclusive) + // so that it will result in a 160-240s proof time + // while the proof time target is 200s + return uint8(8 + (randomNum % 5)); + } } diff --git a/packages/protocol/test2/TaikoL1.t.sol b/packages/protocol/test2/TaikoL1.t.sol index bc71b94d024..48b1cbc790b 100644 --- a/packages/protocol/test2/TaikoL1.t.sol +++ b/packages/protocol/test2/TaikoL1.t.sol @@ -23,30 +23,12 @@ contract TaikoL1_a is TaikoL1 { config.enableTokenomics = true; config.txListCacheExpiry = 5 minutes; - config.proposerDepositPctg = 0; config.maxVerificationsPerTx = 0; config.enableSoloProposer = false; config.enableOracleProver = false; config.maxNumProposedBlocks = 10; config.ringBufferSize = 12; // this value must be changed if `maxNumProposedBlocks` is changed. - config.slotSmoothingFactor = 4160; - - config.proposingConfig = TaikoData.FeeConfig({ - avgTimeMAF: 64, - dampingFactorBips: 5000 - }); - - config.provingConfig = TaikoData.FeeConfig({ - avgTimeMAF: 64, - dampingFactorBips: 5000 - }); - } -} - -contract Verifier { - fallback(bytes calldata) external returns (bytes memory) { - return bytes.concat(keccak256("taiko")); } } @@ -57,17 +39,13 @@ contract TaikoL1Test is TaikoL1TestBase { function setUp() public override { TaikoL1TestBase.setUp(); - _registerAddress( - string(abi.encodePacked("verifier_", uint16(100))), - address(new Verifier()) - ); } /// @dev Test we can propose, prove, then verify more blocks than 'maxNumProposedBlocks' function test_more_blocks_than_ring_buffer_size() external { - _depositTaikoToken(Alice, 1E6 * 1E8, 100 ether); - _depositTaikoToken(Bob, 1E6 * 1E8, 100 ether); - _depositTaikoToken(Carol, 1E6 * 1E8, 100 ether); + depositTaikoToken(Alice, 1E6 * 1E8, 100 ether); + depositTaikoToken(Bob, 1E6 * 1E8, 100 ether); + depositTaikoToken(Carol, 1E6 * 1E8, 100 ether); bytes32 parentHash = GENESIS_BLOCK_HASH; uint32 parentGasUsed = 0; @@ -109,7 +87,7 @@ contract TaikoL1Test is TaikoL1TestBase { /// @dev Test more than one block can be proposed, proven, & verified in the /// same L1 block. function test_multiple_blocks_in_one_L1_block() external { - _depositTaikoToken(Alice, 1000 * 1E8, 1000 ether); + depositTaikoToken(Alice, 1000 * 1E8, 1000 ether); bytes32 parentHash = GENESIS_BLOCK_HASH; uint32 parentGasUsed = 0; @@ -144,7 +122,7 @@ contract TaikoL1Test is TaikoL1TestBase { /// @dev Test verifying multiple blocks in one transaction function test_verifying_multiple_blocks_once() external { - _depositTaikoToken(Alice, 1E6 * 1E8, 1000 ether); + depositTaikoToken(Alice, 1E6 * 1E8, 1000 ether); bytes32 parentHash = GENESIS_BLOCK_HASH; uint32 parentGasUsed = 0; @@ -183,90 +161,4 @@ contract TaikoL1Test is TaikoL1TestBase { verifyBlock(Alice, conf.maxNumProposedBlocks); printVariables("after verify"); } - - /// @dev Test block time increases and fee decreases. - function test_block_time_increases_and_fee_decreases() external { - _depositTaikoToken(Alice, 1E6 * 1E8, 100 ether); - _depositTaikoToken(Bob, 1E6 * 1E8, 100 ether); - _depositTaikoToken(Carol, 1E6 * 1E8, 100 ether); - - bytes32 parentHash = GENESIS_BLOCK_HASH; - uint32 parentGasUsed = 0; - uint32 gasUsed = 1000000; - - for ( - uint256 blockId = 1; - blockId < conf.maxNumProposedBlocks * 10; - blockId++ - ) { - printVariables("before propose"); - TaikoData.BlockMetadata memory meta = proposeBlock( - Alice, - 1000000, - 1024 - ); - mine(1); - - bytes32 blockHash = bytes32(1E10 + blockId); - bytes32 signalRoot = bytes32(1E9 + blockId); - proveBlock( - Bob, - meta, - parentHash, - parentGasUsed, - gasUsed, - blockHash, - signalRoot - ); - parentHash = blockHash; - parentGasUsed = gasUsed; - - verifyBlock(Carol, 1); - mine(blockId); - parentHash = blockHash; - } - printVariables(""); - } - - /// @dev Test block time decreases and the fee increases - function test_block_time_decreases_but_fee_remains() external { - _depositTaikoToken(Alice, 1E6 * 1E8, 100 ether); - _depositTaikoToken(Bob, 1E6 * 1E8, 100 ether); - _depositTaikoToken(Carol, 1E6 * 1E8, 100 ether); - - bytes32 parentHash = GENESIS_BLOCK_HASH; - uint32 parentGasUsed = 0; - uint32 gasUsed = 1000000; - - uint256 total = conf.maxNumProposedBlocks * 10; - - for (uint256 blockId = 1; blockId < total; blockId++) { - printVariables("before propose"); - TaikoData.BlockMetadata memory meta = proposeBlock( - Alice, - 1000000, - 1024 - ); - mine(1); - - bytes32 blockHash = bytes32(1E10 + blockId); - bytes32 signalRoot = bytes32(1E9 + blockId); - proveBlock( - Bob, - meta, - parentHash, - parentGasUsed, - gasUsed, - blockHash, - signalRoot - ); - parentHash = blockHash; - parentGasUsed = gasUsed; - - verifyBlock(Carol, 1); - mine(total + 1 - blockId); - parentHash = blockHash; - } - printVariables(""); - } } diff --git a/packages/protocol/test2/TaikoL1LibTokenomicsMainnet.t.sol b/packages/protocol/test2/TaikoL1LibTokenomicsMainnet.t.sol new file mode 100644 index 00000000000..f866ff488d8 --- /dev/null +++ b/packages/protocol/test2/TaikoL1LibTokenomicsMainnet.t.sol @@ -0,0 +1,295 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity ^0.8.18; + +// Uncomment if you want to compare fee/vs reward +import {Test} from "forge-std/Test.sol"; +import {console2} from "forge-std/console2.sol"; +import {FoundryRandom} from "foundry-random/FoundryRandom.sol"; +import {AddressManager} from "../contracts/thirdparty/AddressManager.sol"; +import {TaikoConfig} from "../contracts/L1/TaikoConfig.sol"; +import {TaikoData} from "../contracts/L1/TaikoData.sol"; +import {TaikoL1} from "../contracts/L1/TaikoL1.sol"; +import {TaikoToken} from "../contracts/L1/TaikoToken.sol"; +import {SignalService} from "../contracts/signal/SignalService.sol"; +import {Strings} from "@openzeppelin/contracts/utils/Strings.sol"; +import {TaikoL1TestBase} from "./TaikoL1TestBase.t.sol"; +import {LibLn} from "./LibLn.sol"; + +contract TaikoL1MainnetMockConfig is TaikoL1 { + function getConfig() + public + pure + override + returns (TaikoData.Config memory config) + { + config = TaikoConfig.getConfig(); + + config.txListCacheExpiry = 5 minutes; + config.maxVerificationsPerTx = 1; + config.enableSoloProposer = false; + config.enableOracleProver = false; + config.maxNumProposedBlocks = 200; + config.ringBufferSize = 240; + config.proofTimeTarget = 2160; + } +} + +contract TaikoL1LibTokenomicsMainnet is TaikoL1TestBase, FoundryRandom { + // To avoid stack too deep error + // Can play to adjust + uint32 iterationCnt = 5000; + uint8 proofTime = 180; // When proofs are coming, 180 means 180 sec + // Check balances + uint256 Alice_start_balance; + uint256 Bob_start_balance; + + function deployTaikoL1() internal override returns (TaikoL1 taikoL1) { + taikoL1 = new TaikoL1MainnetMockConfig(); + } + + function setUp() public override { + uint16 proofTimeTarget = 2160; // Approx. mainnet value + // Calculating it for our needs based on testnet/mainnet proof vars. + // See Brecht's comment https://github.com/taikoxyz/taiko-mono/pull/13564 + initProofTimeIssued = LibLn.calcInitProofTimeIssued( + feeBase, + proofTimeTarget, + ADJUSTMENT_QUOTIENT + ); + + TaikoL1TestBase.setUp(); + + depositTaikoToken(Alice, 1E8 * 1E8, 100 ether); + depositTaikoToken(Bob, 1E8 * 1E8, 100 ether); + depositTaikoToken(Carol, 1E8 * 1E8, 100 ether); + + Alice_start_balance = L1.getBalance(Alice); + Bob_start_balance = L1.getBalance(Bob); + } + + /// @dev A possible (close to) mainnet scenarios is the following: + //// - Blocks ever 10 seconds proposed + //// - Proofs coming shifted slightly below 30 min / proposed block afterwards + //// Expected result: Withdrawals and deposits are in balance but keep shrinking since quicker proofTime + function xtest_possible_mainnet_scenario_proof_time_below_target() + external + { + vm.pauseGasMetering(); + mine(1); + + depositTaikoToken(Alice, 1E8 * 1E8, 1000 ether); + depositTaikoToken(Bob, 1E8 * 1E8, 1000 ether); + depositTaikoToken(Carol, 1E8 * 1E8, 1000 ether); + + // Check balances + Alice_start_balance = L1.getBalance(Alice); + Bob_start_balance = L1.getBalance(Bob); + + // Can play to adjust + proofTime = 179; // When proofs are coming, 179 means 1790 sec + + TaikoData.BlockMetadata[] memory meta = new TaikoData.BlockMetadata[]( + iterationCnt + ); + uint64[] memory proposedAt = new uint64[](iterationCnt); + bytes32[] memory parentHashes = new bytes32[](iterationCnt); + bytes32[] memory blockHashes = new bytes32[](iterationCnt); + bytes32[] memory signalRoots = new bytes32[](iterationCnt); + + bytes32 parentHash = GENESIS_BLOCK_HASH; + console2.logBytes32(parentHash); + + // Run another session with huge times + for (uint256 blockId = 1; blockId < iterationCnt; blockId++) { + meta[blockId] = proposeBlock(Alice, 1000000, 1024); + proposedAt[blockId] = (uint64(block.timestamp)); + printVariables("after propose"); + blockHashes[blockId] = bytes32(1E10 + blockId); + signalRoots[blockId] = bytes32(1E9 + blockId); + + if (blockId > proofTime) { + //Start proving with an offset + proveBlock( + Bob, + meta[blockId - proofTime], + parentHashes[blockId - proofTime], + (blockId - proofTime == 1) ? 0 : 1000000, // Genesis block has 0 gas used + 1000000, + blockHashes[blockId - proofTime], + signalRoots[blockId - proofTime] + ); + + uint64 provenAt = uint64(block.timestamp); + console2.log( + "Proof reward is:", + L1.getProofReward(provenAt, proposedAt[blockId - proofTime]) + ); + verifyBlock(Carol, 1); + } + + mine_every_12_sec(); + + parentHashes[blockId] = parentHash; + parentHash = blockHashes[blockId]; + } + + //Check end balances + uint256 deposits = Alice_start_balance - L1.getBalance(Alice); + uint256 withdrawals = L1.getBalance(Bob) - Bob_start_balance; + + //Check end balances + deposits = Alice_start_balance - L1.getBalance(Alice); + withdrawals = L1.getBalance(Bob) - Bob_start_balance; + + console2.log("Deposits:", deposits); + console2.log("withdrawals:", withdrawals); + // Assert their balance changed relatively the same way + // 1e18 == within 100 % delta -> 1e17 10%, let's see if this is within that range + assertApproxEqRel(deposits, withdrawals, 1e17); + } + + /// @dev A possible (close to) mainnet scenarios is the following: + //// - Blocks ever 10 seconds proposed + //// - Proofs coming shifted slightly below 30 min / proposed block afterwards + //// Expected result: Withdrawals and deposits are in balance but keep shrinking since quicker proofTime + function xtest_possible_mainnet_scenario_proof_time_at_target() external { + vm.pauseGasMetering(); + mine(1); + + TaikoData.BlockMetadata[] memory meta = new TaikoData.BlockMetadata[]( + iterationCnt + ); + uint64[] memory proposedAt = new uint64[](iterationCnt); + bytes32[] memory parentHashes = new bytes32[](iterationCnt); + bytes32[] memory blockHashes = new bytes32[](iterationCnt); + bytes32[] memory signalRoots = new bytes32[](iterationCnt); + + bytes32 parentHash = GENESIS_BLOCK_HASH; + + // Run another session with huge times + for (uint256 blockId = 1; blockId < iterationCnt; blockId++) { + { + meta[blockId] = proposeBlock(Alice, 100000, 10); + proposedAt[blockId] = (uint64(block.timestamp)); + printVariables("after propose"); + blockHashes[blockId] = bytes32(1E10 + blockId); //blockHash; + signalRoots[blockId] = bytes32(1E9 + blockId); //signalRoot; + + if (blockId > proofTime) { + //Start proving with an offset + proveBlock( + Bob, + meta[blockId - proofTime], + parentHashes[blockId - proofTime], + (blockId - proofTime == 1) ? 0 : 1000000, + 1000000, + blockHashes[blockId - proofTime], + signalRoots[blockId - proofTime] + ); + + uint64 provenAt = uint64(block.timestamp); + console2.log( + "Proof reward is:", + L1.getProofReward( + provenAt, + proposedAt[blockId - proofTime] + ) + ); + } + + mine_every_12_sec(); + + parentHashes[blockId] = parentHash; + parentHash = blockHashes[blockId]; + } + } + //Check end balances + uint256 deposits = Alice_start_balance - L1.getBalance(Alice); + uint256 withdrawals = L1.getBalance(Bob) - Bob_start_balance; + + //Check end balances + deposits = Alice_start_balance - L1.getBalance(Alice); + withdrawals = L1.getBalance(Bob) - Bob_start_balance; + + console2.log("Deposits:", deposits); + console2.log("withdrawals:", withdrawals); + // Assert their balance changed relatively the same way + // 1e18 == within 100 % delta -> 1e17 10%, let's see if this is within that range + assertApproxEqRel(deposits, withdrawals, 1e17); + } + + /// @dev A possible (close to) mainnet scenarios is the following: + //// - Blocks ever 10 seconds proposed + //// - Proofs coming shifted slightly above 30 min / proposed block afterwards + //// Expected result: Withdrawals and deposits are in balance but fees keep growing bc of above target + function xtest_possible_mainnet_scenario_proof_time_above_target() + external + { + vm.pauseGasMetering(); + mine(1); + + proofTime = 181; // When proofs are coming, 181 means 1810 sec + + TaikoData.BlockMetadata[] memory meta = new TaikoData.BlockMetadata[]( + iterationCnt + ); + uint64[] memory proposedAt = new uint64[](iterationCnt); + bytes32[] memory parentHashes = new bytes32[](iterationCnt); + bytes32[] memory blockHashes = new bytes32[](iterationCnt); + bytes32[] memory signalRoots = new bytes32[](iterationCnt); + + bytes32 parentHash = GENESIS_BLOCK_HASH; + + for (uint256 blockId = 1; blockId < iterationCnt; blockId++) { + meta[blockId] = proposeBlock(Alice, 1000000, 1024); + proposedAt[blockId] = (uint64(block.timestamp)); + printVariables("after propose"); + blockHashes[blockId] = bytes32(1E10 + blockId); + signalRoots[blockId] = bytes32(1E9 + blockId); + + if (blockId > proofTime) { + //Start proving with an offset + proveBlock( + Bob, + meta[blockId - proofTime], + parentHashes[blockId - proofTime], + (blockId - proofTime == 1) ? 0 : 1000000, + 1000000, + blockHashes[blockId - proofTime], + signalRoots[blockId - proofTime] + ); + + uint64 provenAt = uint64(block.timestamp); + console2.log( + "Proof reward is:", + L1.getProofReward(provenAt, proposedAt[blockId - proofTime]) + ); + verifyBlock(Carol, 1); + } + + mine_every_12_sec(); + + parentHashes[blockId] = parentHash; + parentHash = blockHashes[blockId]; + } + + //Check end balances + uint256 deposits = Alice_start_balance - L1.getBalance(Alice); + uint256 withdrawals = L1.getBalance(Bob) - Bob_start_balance; + + //Check end balances + deposits = Alice_start_balance - L1.getBalance(Alice); + withdrawals = L1.getBalance(Bob) - Bob_start_balance; + + console2.log("Deposits:", deposits); + console2.log("withdrawals:", withdrawals); + // Assert their balance changed relatively the same way + // 1e18 == within 100 % delta -> 1e17 10%, let's see if this is within that range + assertApproxEqRel(deposits, withdrawals, 1e17); + } + + function mine_every_12_sec() internal { + vm.warp(block.timestamp + 12); + vm.roll(block.number + 1); + } +} diff --git a/packages/protocol/test2/TaikoL1LibTokenomicsTestnet.t.sol b/packages/protocol/test2/TaikoL1LibTokenomicsTestnet.t.sol new file mode 100644 index 00000000000..6399411a295 --- /dev/null +++ b/packages/protocol/test2/TaikoL1LibTokenomicsTestnet.t.sol @@ -0,0 +1,950 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.18; + +// Uncomment if you want to compare fee/vs reward +import {Test} from "forge-std/Test.sol"; +import {console2} from "forge-std/console2.sol"; +import {AddressManager} from "../contracts/thirdparty/AddressManager.sol"; +import {TaikoConfig} from "../contracts/L1/TaikoConfig.sol"; +import {TaikoData} from "../contracts/L1/TaikoData.sol"; +import {TaikoL1} from "../contracts/L1/TaikoL1.sol"; +import {TaikoToken} from "../contracts/L1/TaikoToken.sol"; +import {SignalService} from "../contracts/signal/SignalService.sol"; +import {Strings} from "@openzeppelin/contracts/utils/Strings.sol"; +import {TaikoL1TestBase} from "./TaikoL1TestBase.t.sol"; +import {LibLn} from "./LibLn.sol"; + +contract TaikoL1WithTestnetConfig is TaikoL1 { + function getConfig() + public + pure + override + returns (TaikoData.Config memory config) + { + config = TaikoConfig.getConfig(); + + config.txListCacheExpiry = 5 minutes; + config.maxVerificationsPerTx = 0; + config.enableSoloProposer = false; + config.enableOracleProver = false; + config.maxNumProposedBlocks = 40; + config.ringBufferSize = 48; + config.proofTimeTarget = 120; // Testnet example + } +} + +// Testing the base "math" and directions if all is good +contract TaikoL1LibTokenomicsTestnet is TaikoL1TestBase { + function deployTaikoL1() internal override returns (TaikoL1 taikoL1) { + taikoL1 = new TaikoL1WithTestnetConfig(); + } + + function setUp() public override { + uint16 proofTimeTarget = 120; // Approx. testnet value + // Calculating it for our needs based on testnet/mainnet proof vars. + // See Brecht's comment https://github.com/taikoxyz/taiko-mono/pull/13564 + initProofTimeIssued = LibLn.calcInitProofTimeIssued( + feeBase, + proofTimeTarget, + ADJUSTMENT_QUOTIENT + ); + + TaikoL1TestBase.setUp(); + + depositTaikoToken(Alice, 1E6 * 1E8, 100 ether); + depositTaikoToken(Bob, 1E6 * 1E8, 100 ether); + depositTaikoToken(Carol, 1E6 * 1E8, 100 ether); + } + + /// @dev Test what happens when proof time increases + function test_balanced_state_reward_and_fee_if_proof_time_increases_slowly_then_drastically() + external + { + mine(1); + depositTaikoToken(Alice, 1E6 * 1E8, 100 ether); + depositTaikoToken(Bob, 1E6 * 1E8, 100 ether); + depositTaikoToken(Carol, 1E6 * 1E8, 100 ether); + + bytes32 parentHash = GENESIS_BLOCK_HASH; + + // Check balances + uint256 Alice_start_balance = L1.getBalance(Alice); + uint256 Bob_start_balance = L1.getBalance(Bob); + console2.log("Alice balance:", Alice_start_balance); + console2.log("Bob balance:", Bob_start_balance); + + for (uint256 blockId = 1; blockId < 10; blockId++) { + TaikoData.BlockMetadata memory meta = proposeBlock( + Alice, + 1000000, + 1024 + ); + uint64 proposedAt = uint64(block.timestamp); + mine(blockId); + + bytes32 blockHash = bytes32(1E10 + blockId); + bytes32 signalRoot = bytes32(1E9 + blockId); + proveBlock( + Bob, + meta, + parentHash, + blockId == 1 ? 0 : 1000000, + 1000000, + blockHash, + signalRoot + ); + uint64 provenAt = uint64(block.timestamp); + console2.log( + "Proof reward is:", + L1.getProofReward(provenAt, proposedAt) + ); + + verifyBlock(Carol, 1); + // This is where new fee evaluated + printVariables("after verify"); + + parentHash = blockHash; + } + + //Check end balances + uint256 deposits = Alice_start_balance - L1.getBalance(Alice); + uint256 withdrawals = L1.getBalance(Bob) - Bob_start_balance; + + console2.log("Deposits:", deposits); + console2.log("withdrawals:", withdrawals); + + assertEq(deposits, withdrawals); + + // Run another session with huge times + for (uint256 blockId = 1; blockId < 10; blockId++) { + TaikoData.BlockMetadata memory meta = proposeBlock( + Alice, + 1000000, + 1024 + ); + uint64 proposedAt = uint64(block.timestamp); + mine_huge(); + + bytes32 blockHash = bytes32(1E10 + blockId); + bytes32 signalRoot = bytes32(1E9 + blockId); + + proveBlock( + Bob, + meta, + parentHash, + 1000000, + 1000000, + blockHash, + signalRoot + ); + uint64 provenAt = uint64(block.timestamp); + console2.log( + "Proof reward is:", + L1.getProofReward(provenAt, proposedAt) + ); + verifyBlock(Carol, 1); + // This is where new fee evaluated + printVariables("after verify"); + + parentHash = blockHash; + } + + //Check end balances + deposits = Alice_start_balance - L1.getBalance(Alice); + withdrawals = L1.getBalance(Bob) - Bob_start_balance; + + assertEq(deposits, withdrawals); + } + + /// @dev Test what happens when proof time hectic couple of proposes, without prove, then some proofs + function test_balanced_state_reward_and_fee_if_proof_time_hectic() + external + { + mine(1); + //Needs lot of token here - because there is lots of time elapsed between 2 'propose' blocks, which will raise the fee + depositTaikoToken(Alice, 1E8 * 1E8, 100 ether); + depositTaikoToken(Bob, 1E8 * 1E8, 100 ether); + depositTaikoToken(Carol, 1E8 * 1E8, 100 ether); + + TaikoData.BlockMetadata[] memory metas = new TaikoData.BlockMetadata[]( + 20 + ); + uint64[] memory proposedAtArr = new uint64[](20); + + bytes32 parentHash = GENESIS_BLOCK_HASH; + + // Check balances + uint256 Alice_start_balance = L1.getBalance(Alice); + uint256 Bob_start_balance = L1.getBalance(Bob); + console2.log("Alice balance:", Alice_start_balance); + console2.log("Bob balance:", Bob_start_balance); + + // Propose blocks - but dont go above a certain iterationi count because the drastically increasing + // proof time will be an issue + for (uint256 blockId = 1; blockId < 10; blockId++) { + //printVariables("before propose"); + metas[blockId] = proposeBlock(Alice, 1000000, 1024); + proposedAtArr[blockId] = (uint64(block.timestamp)); + printVariables("after propose"); + mine(blockId); + } + + // Wait random X + mine(6); + // Prove and verify + for (uint256 blockId = 1; blockId < 10; blockId++) { + bytes32 blockHash = bytes32(1E10 + blockId); + bytes32 signalRoot = bytes32(1E9 + blockId); + proveBlock( + Bob, + metas[blockId], + parentHash, + blockId == 1 ? 0 : 1000000, + 1000000, + blockHash, + signalRoot + ); + uint64 provenAt = uint64(block.timestamp); + console2.log( + "Proof reward is:", + L1.getProofReward(provenAt, proposedAtArr[blockId]) + ); + + verifyBlock(Carol, 1); + + printVariables("after verify"); + mine(blockId); + parentHash = blockHash; + } + + //Check end balances + uint256 deposits = Alice_start_balance - L1.getBalance(Alice); + uint256 withdrawals = L1.getBalance(Bob) - Bob_start_balance; + + // Run another iteration + for (uint256 blockId = 1; blockId < 10; blockId++) { + printVariables("before propose"); + TaikoData.BlockMetadata memory meta = proposeBlock( + Alice, + 1000000, + 1024 + ); + uint64 proposedAt = uint64(block.timestamp); + printVariables("after propose"); + mine_proofTime(); + + bytes32 blockHash = bytes32(1E10 + blockId); + bytes32 signalRoot = bytes32(1E9 + blockId); + proveBlock( + Bob, + meta, + parentHash, + 1000000, + 1000000, + blockHash, + signalRoot + ); + uint64 provenAt = uint64(block.timestamp); + console2.log( + "Proof reward is:", + L1.getProofReward(provenAt, proposedAt) + ); + verifyBlock(Carol, 1); + + parentHash = blockHash; + } + + //Check end balances + deposits = Alice_start_balance - L1.getBalance(Alice); + withdrawals = L1.getBalance(Bob) - Bob_start_balance; + + console2.log("Deposits:", deposits); + console2.log("withdrawals:", withdrawals); + assertEq(deposits, withdrawals); + } + + /// @dev Test and see what happens when proof time is stable below the target and proving consecutive + function test_balanced_state_reward_and_fee_if_proof_time_stable_below_target_prooving_consecutive() + external + { + mine(1); + depositTaikoToken(Alice, 1E6 * 1E8, 100 ether); + depositTaikoToken(Bob, 1E6 * 1E8, 100 ether); + depositTaikoToken(Carol, 1E6 * 1E8, 100 ether); + + bytes32 parentHash = GENESIS_BLOCK_HASH; + + // Check balances + uint256 Alice_start_balance = L1.getBalance(Alice); + uint256 Bob_start_balance = L1.getBalance(Bob); + console2.log("Alice balance:", Alice_start_balance); + console2.log("Bob balance:", Bob_start_balance); + + //parentHash = prove_with_increasing_time(parentHash, 10); + for (uint256 blockId = 1; blockId < 10; blockId++) { + printVariables("before propose"); + TaikoData.BlockMetadata memory meta = proposeBlock( + Alice, + 1000000, + 1024 + ); + uint64 proposedAt = uint64(block.timestamp); + printVariables("after propose"); + mine(2); + + bytes32 blockHash = bytes32(1E10 + blockId); + bytes32 signalRoot = bytes32(1E9 + blockId); + proveBlock( + Bob, + meta, + parentHash, + blockId == 1 ? 0 : 1000000, + 1000000, + blockHash, + signalRoot + ); + uint64 provenAt = uint64(block.timestamp); + console2.log( + "Proof reward is:", + L1.getProofReward(provenAt, proposedAt) + ); + + verifyBlock(Carol, 1); + + parentHash = blockHash; + } + + //Check end balances + uint256 deposits = Alice_start_balance - L1.getBalance(Alice); + uint256 withdrawals = L1.getBalance(Bob) - Bob_start_balance; + + console2.log("Deposits:", deposits); + console2.log("withdrawals:", withdrawals); + + assertEq(deposits, withdrawals); + } + + /// @dev Test and see what happens when proof time is stable below the target and proving non consecutive + function test_balanced_state_reward_and_fee_if_proof_time_stable_below_target_proving_non_consecutive() + external + { + mine(1); + depositTaikoToken(Alice, 1E6 * 1E8, 100 ether); + depositTaikoToken(Bob, 1E6 * 1E8, 100 ether); + depositTaikoToken(Carol, 1E6 * 1E8, 100 ether); + + TaikoData.BlockMetadata[] memory meta = new TaikoData.BlockMetadata[]( + 30 + ); + uint64[] memory proposedAt = new uint64[](30); + + bytes32 parentHash = GENESIS_BLOCK_HASH; + + // Check balances + uint256 Alice_start_balance = L1.getBalance(Alice); + uint256 Bob_start_balance = L1.getBalance(Bob); + console2.log("Alice balance:", Alice_start_balance); + console2.log("Bob balance:", Bob_start_balance); + + // Propose blocks + for (uint256 blockId = 1; blockId < 30; blockId++) { + //printVariables("before propose"); + meta[blockId] = proposeBlock(Alice, 1000000, 1024); + proposedAt[blockId] = (uint64(block.timestamp)); + printVariables("after propose"); + mine(blockId); + } + + // Wait random X + mine(6); + //Prove and verify + for (uint256 blockId = 1; blockId < 30; blockId++) { + bytes32 blockHash = bytes32(1E10 + blockId); + bytes32 signalRoot = bytes32(1E9 + blockId); + + proveBlock( + Bob, + meta[blockId], + parentHash, + blockId == 1 ? 0 : 1000000, + 1000000, + blockHash, + signalRoot + ); + + uint64 provenAt = uint64(block.timestamp); + console2.log( + "Proof reward is:", + L1.getProofReward(provenAt, proposedAt[blockId]) + ); + + verifyBlock(Carol, 1); + + mine(3); + parentHash = blockHash; + } + + //Check end balances + uint256 deposits = Alice_start_balance - L1.getBalance(Alice); + uint256 withdrawals = L1.getBalance(Bob) - Bob_start_balance; + + console2.log("Deposits:", deposits); + console2.log("withdrawals:", withdrawals); + + assertEq(deposits, withdrawals); + } + + /// @dev Test what happens when proof time decreases + function test_balanced_state_reward_and_fee_if_proof_time_decreases() + external + { + mine(1); + depositTaikoToken(Alice, 1E6 * 1E8, 100 ether); + depositTaikoToken(Bob, 1E6 * 1E8, 100 ether); + depositTaikoToken(Carol, 1E6 * 1E8, 100 ether); + + TaikoData.BlockMetadata[] memory meta = new TaikoData.BlockMetadata[]( + 20 + ); + uint64[] memory proposedAt = new uint64[](20); + + bytes32 parentHash = GENESIS_BLOCK_HASH; + + // Check balances + uint256 Alice_start_balance = L1.getBalance(Alice); + uint256 Bob_start_balance = L1.getBalance(Bob); + console2.log("Alice balance:", Alice_start_balance); + console2.log("Bob balance:", Bob_start_balance); + + // Propose blocks + for (uint256 blockId = 1; blockId < 20; blockId++) { + //printVariables("before propose"); + meta[blockId] = proposeBlock(Alice, 1000000, 1024); + proposedAt[blockId] = (uint64(block.timestamp)); + printVariables("after propose"); + mine(blockId); + } + + // Wait random X + mine(6); + // Prove and verify + for (uint256 blockId = 1; blockId < 20; blockId++) { + bytes32 blockHash = bytes32(1E10 + blockId); + bytes32 signalRoot = bytes32(1E9 + blockId); + proveBlock( + Bob, + meta[blockId], + parentHash, + blockId == 1 ? 0 : 1000000, + 1000000, + blockHash, + signalRoot + ); + + uint64 provenAt = uint64(block.timestamp); + console2.log( + "Proof reward is:", + L1.getProofReward(provenAt, proposedAt[blockId]) + ); + + verifyBlock(Carol, 1); + mine(21 - blockId); + parentHash = blockHash; + } + + //Check end balances + uint256 deposits = Alice_start_balance - L1.getBalance(Alice); + uint256 withdrawals = L1.getBalance(Bob) - Bob_start_balance; + // console2.log("Deposits:", deposits); + // console2.log("withdrawals:", withdrawals); + assertEq(deposits, withdrawals); + } + + /// @dev Test and see what happens when proof time is stable above the target and proving consecutive + function test_balanced_state_reward_and_fee_if_proof_time_stable_above_target_prooving_consecutive() + external + { + mine(1); + depositTaikoToken(Alice, 1E6 * 1E8, 100 ether); + depositTaikoToken(Bob, 1E6 * 1E8, 100 ether); + depositTaikoToken(Carol, 1E6 * 1E8, 100 ether); + + bytes32 parentHash = GENESIS_BLOCK_HASH; + + // Check balances + uint256 Alice_start_balance = L1.getBalance(Alice); + uint256 Bob_start_balance = L1.getBalance(Bob); + console2.log("Alice balance:", Alice_start_balance); + console2.log("Bob balance:", Bob_start_balance); + + //parentHash = prove_with_increasing_time(parentHash, 10); + for (uint256 blockId = 1; blockId < 10; blockId++) { + printVariables("before propose"); + TaikoData.BlockMetadata memory meta = proposeBlock( + Alice, + 1000000, + 1024 + ); + uint64 proposedAt = uint64(block.timestamp); + printVariables("after propose"); + mine(5); + + bytes32 blockHash = bytes32(1E10 + blockId); + bytes32 signalRoot = bytes32(1E9 + blockId); + proveBlock( + Bob, + meta, + parentHash, + blockId == 1 ? 0 : 1000000, + 1000000, + blockHash, + signalRoot + ); + uint64 provenAt = uint64(block.timestamp); + console2.log( + "Proof reward is:", + L1.getProofReward(provenAt, proposedAt) + ); + + verifyBlock(Carol, 1); + + parentHash = blockHash; + } + + //Check end balances + uint256 deposits = Alice_start_balance - L1.getBalance(Alice); + uint256 withdrawals = L1.getBalance(Bob) - Bob_start_balance; + + console2.log("Deposits:", deposits); + console2.log("withdrawals:", withdrawals); + + assertEq(deposits, withdrawals); + } + + /// @dev Test and see what happens when proof time is stable above the target and proving non consecutive + function test_balanced_state_reward_and_fee_if_proof_time_stable_above_target_proving_non_consecutive() + external + { + mine(1); + depositTaikoToken(Alice, 1E6 * 1E8, 100 ether); + depositTaikoToken(Bob, 1E6 * 1E8, 100 ether); + depositTaikoToken(Carol, 1E6 * 1E8, 100 ether); + + TaikoData.BlockMetadata[] memory meta = new TaikoData.BlockMetadata[]( + 30 + ); + uint64[] memory proposedAt = new uint64[](30); + + bytes32 parentHash = GENESIS_BLOCK_HASH; + + // Check balances + uint256 Alice_start_balance = L1.getBalance(Alice); + uint256 Bob_start_balance = L1.getBalance(Bob); + console2.log("Alice balance:", Alice_start_balance); + console2.log("Bob balance:", Bob_start_balance); + + // Propose blocks + for (uint256 blockId = 1; blockId < 30; blockId++) { + //printVariables("before propose"); + meta[blockId] = proposeBlock(Alice, 1000000, 1024); + proposedAt[blockId] = (uint64(block.timestamp)); + printVariables("after propose"); + mine(blockId); + } + + // Wait random X + mine(6); + // Prove and verify + for (uint256 blockId = 1; blockId < 30; blockId++) { + bytes32 blockHash = bytes32(1E10 + blockId); + bytes32 signalRoot = bytes32(1E9 + blockId); + + proveBlock( + Bob, + meta[blockId], + parentHash, + blockId == 1 ? 0 : 1000000, + 1000000, + blockHash, + signalRoot + ); + + uint64 provenAt = uint64(block.timestamp); + console2.log( + "Proof reward is:", + L1.getProofReward(provenAt, proposedAt[blockId]) + ); + + verifyBlock(Carol, 1); + mine(5); + parentHash = blockHash; + } + + //Check end balances + uint256 deposits = Alice_start_balance - L1.getBalance(Alice); + uint256 withdrawals = L1.getBalance(Bob) - Bob_start_balance; + + console2.log("Deposits:", deposits); + console2.log("withdrawals:", withdrawals); + + assertEq(deposits, withdrawals); + } + + /// @dev Test what happens when proof time decreases + function test_balanced_state_reward_and_fee_if_proof_time_decreasses_then_stabilizes_consecutive() + external + { + mine(1); + depositTaikoToken(Alice, 1E6 * 1E8, 100 ether); + depositTaikoToken(Bob, 1E6 * 1E8, 100 ether); + depositTaikoToken(Carol, 1E6 * 1E8, 100 ether); + + bytes32 parentHash = GENESIS_BLOCK_HASH; + + // Check balances + uint256 Alice_start_balance = L1.getBalance(Alice); + uint256 Bob_start_balance = L1.getBalance(Bob); + console2.log("Alice balance:", Alice_start_balance); + console2.log("Bob balance:", Bob_start_balance); + + //parentHash = prove_with_increasing_time(parentHash, 10); + for (uint256 blockId = 1; blockId < 10; blockId++) { + TaikoData.BlockMetadata memory meta = proposeBlock( + Alice, + 1000000, + 1024 + ); + printVariables("after propose"); + uint64 proposedAt = uint64(block.timestamp); + mine(11 - blockId); + + bytes32 blockHash = bytes32(1E10 + blockId); + bytes32 signalRoot = bytes32(1E9 + blockId); + proveBlock( + Bob, + meta, + parentHash, + blockId == 1 ? 0 : 1000000, + 1000000, + blockHash, + signalRoot + ); + uint64 provenAt = uint64(block.timestamp); + console2.log( + "Proof reward is:", + L1.getProofReward(provenAt, proposedAt) + ); + + verifyBlock(Carol, 1); + + parentHash = blockHash; + } + + //Check end balances + uint256 deposits = Alice_start_balance - L1.getBalance(Alice); + uint256 withdrawals = L1.getBalance(Bob) - Bob_start_balance; + + console2.log("Deposits:", deposits); + console2.log("withdrawals:", withdrawals); + + assertEq(deposits, withdrawals); + + // Run another session with huge times + for (uint256 blockId = 1; blockId < 10; blockId++) { + printVariables("before propose"); + TaikoData.BlockMetadata memory meta = proposeBlock( + Alice, + 1000000, + 1024 + ); + uint64 proposedAt = uint64(block.timestamp); + printVariables("after propose"); + mine_proofTime(); + + bytes32 blockHash = bytes32(1E10 + blockId); + bytes32 signalRoot = bytes32(1E9 + blockId); + proveBlock( + Bob, + meta, + parentHash, + 1000000, + 1000000, + blockHash, + signalRoot + ); + uint64 provenAt = uint64(block.timestamp); + console2.log( + "Proof reward is:", + L1.getProofReward(provenAt, proposedAt) + ); + verifyBlock(Carol, 1); + + parentHash = blockHash; + } + + //Check end balances + deposits = Alice_start_balance - L1.getBalance(Alice); + withdrawals = L1.getBalance(Bob) - Bob_start_balance; + + assertEq(deposits, withdrawals); + } + + /// @dev Test what happens when proof time decreases + function test_balanced_state_reward_and_fee_if_proof_time_decreases_then_stabilizes_non_consecutive() + external + { + mine(1); + // Requires a bit more tokens + depositTaikoToken(Alice, 1E8 * 1E8, 100 ether); + depositTaikoToken(Bob, 1E8 * 1E8, 100 ether); + depositTaikoToken(Carol, 1E8 * 1E8, 100 ether); + + TaikoData.BlockMetadata[] + memory metaArr = new TaikoData.BlockMetadata[](20); + uint64[] memory proposedAtArr = new uint64[](20); + + bytes32 parentHash = GENESIS_BLOCK_HASH; + + // Check balances + uint256 Alice_start_balance = L1.getBalance(Alice); + uint256 Bob_start_balance = L1.getBalance(Bob); + console2.log("Alice balance:", Alice_start_balance); + console2.log("Bob balance:", Bob_start_balance); + + // Propose blocks + for (uint256 blockId = 1; blockId < 10; blockId++) { + //printVariables("before propose"); + metaArr[blockId] = proposeBlock(Alice, 1000000, 1024); + proposedAtArr[blockId] = (uint64(block.timestamp)); + printVariables("after propose"); + mine(blockId); + } + + // Wait random X + mine(6); + // Prove and verify + for (uint256 blockId = 1; blockId < 10; blockId++) { + bytes32 blockHash = bytes32(1E10 + blockId); + bytes32 signalRoot = bytes32(1E9 + blockId); + proveBlock( + Bob, + metaArr[blockId], + parentHash, + (blockId == 1 ? 0 : 1000000), + 1000000, + blockHash, + signalRoot + ); + + uint64 provenAt = uint64(block.timestamp); + console2.log( + "Proof reward is:", + L1.getProofReward(provenAt, proposedAtArr[blockId]) + ); + + verifyBlock(Carol, 1); + mine(21 - blockId); + parentHash = blockHash; + } + + //Check end balances + uint256 deposits = Alice_start_balance - L1.getBalance(Alice); + uint256 withdrawals = L1.getBalance(Bob) - Bob_start_balance; + + console2.log("Deposits:", deposits); + console2.log("withdrawals:", withdrawals); + + assertEq(deposits, withdrawals); + + // Run another session with huge times + for (uint256 blockId = 1; blockId < 10; blockId++) { + printVariables("before propose"); + TaikoData.BlockMetadata memory meta = proposeBlock( + Alice, + 1000000, + 1024 + ); + uint64 proposedAt = uint64(block.timestamp); + printVariables("after propose"); + mine_proofTime(); + + bytes32 blockHash = bytes32(1E10 + blockId); + bytes32 signalRoot = bytes32(1E9 + blockId); + proveBlock( + Bob, + meta, + parentHash, + 1000000, + 1000000, + blockHash, + signalRoot + ); + uint64 provenAt = uint64(block.timestamp); + console2.log( + "Proof reward is:", + L1.getProofReward(provenAt, proposedAt) + ); + verifyBlock(Carol, 1); + + parentHash = blockHash; + } + + //Check end balances + deposits = Alice_start_balance - L1.getBalance(Alice); + withdrawals = L1.getBalance(Bob) - Bob_start_balance; + + // console2.log("Deposits:", deposits); + // console2.log("withdrawals:", withdrawals); + assertEq(deposits, withdrawals); + } + + /// @dev Test and see what happens when proof time is stable at the target and proving consecutive + function test_balanced_state_reward_and_fee_if_proof_time_stable_consecutive() + external + { + mine(1); + depositTaikoToken(Alice, 1E6 * 1E8, 100 ether); + depositTaikoToken(Bob, 1E6 * 1E8, 100 ether); + depositTaikoToken(Carol, 1E6 * 1E8, 100 ether); + + bytes32 parentHash = GENESIS_BLOCK_HASH; + + // Check balances + uint256 Alice_start_balance = L1.getBalance(Alice); + uint256 Bob_start_balance = L1.getBalance(Bob); + console2.log("Alice balance:", Alice_start_balance); + console2.log("Bob balance:", Bob_start_balance); + + //parentHash = prove_with_increasing_time(parentHash, 10); + for (uint256 blockId = 1; blockId < 10; blockId++) { + printVariables("before propose"); + TaikoData.BlockMetadata memory meta = proposeBlock( + Alice, + 1000000, + 1024 + ); + uint64 proposedAt = uint64(block.timestamp); + printVariables("after propose"); + mine_proofTime(); + + bytes32 blockHash = bytes32(1E10 + blockId); + bytes32 signalRoot = bytes32(1E9 + blockId); + proveBlock( + Bob, + meta, + parentHash, + blockId == 1 ? 0 : 1000000, + 1000000, + blockHash, + signalRoot + ); + uint64 provenAt = uint64(block.timestamp); + console2.log( + "Proof reward is:", + L1.getProofReward(provenAt, proposedAt) + ); + + verifyBlock(Carol, 1); + + parentHash = blockHash; + } + + //Check end balances + uint256 deposits = Alice_start_balance - L1.getBalance(Alice); + uint256 withdrawals = L1.getBalance(Bob) - Bob_start_balance; + + console2.log("Deposits:", deposits); + console2.log("withdrawals:", withdrawals); + + assertEq(deposits, withdrawals); + } + + /// @dev Test a scenario which very close to a testnet behaviour + function test_balanced_state_reward_and_fee_if_proof_time_stable_non_consecutive() + external + { + uint256 Alice_start_balance = L1.getBalance(Alice); + uint256 Bob_start_balance = L1.getBalance(Bob); + + // Need constants here and in loop counter to avoid stack too deep error + TaikoData.BlockMetadata[] memory meta = new TaikoData.BlockMetadata[]( + 200 + ); + uint64[] memory proposedAt = new uint64[](200); + bytes32[] memory parentHashes = new bytes32[](200); + bytes32[] memory blockHashes = new bytes32[](200); + bytes32[] memory signalRoots = new bytes32[](200); + + bytes32 parentHash = GENESIS_BLOCK_HASH; + uint8 proofTime = 10; + console2.logBytes32(parentHash); + + // Run another session with huge times + for (uint256 blockId = 1; blockId < 150; blockId++) { + { + meta[blockId] = proposeBlock(Alice, 1000000, 1024); + proposedAt[blockId] = (uint64(block.timestamp)); + printVariables("after propose"); + + blockHashes[blockId] = bytes32(1E10 + blockId); //blockHash; + signalRoots[blockId] = bytes32(1E9 + blockId); //signalRoot; + + if (blockId > proofTime) { + //Start proving with an offset + proveBlock( + Bob, + meta[blockId - proofTime], + parentHashes[blockId - proofTime], + (blockId - proofTime == 1) ? 0 : 1000000, + 1000000, + blockHashes[blockId - proofTime], + signalRoots[blockId - proofTime] + ); + + uint64 provenAt = uint64(block.timestamp); + console2.log( + "Proof reward is:", + L1.getProofReward( + provenAt, + proposedAt[blockId - proofTime] + ) + ); + } + + mine_every_12_sec(); + + parentHashes[blockId] = parentHash; + parentHash = blockHashes[blockId]; + verifyBlock(Carol, 1); + } + } + //Check end balances + uint256 deposits = Alice_start_balance - L1.getBalance(Alice); + uint256 withdrawals = L1.getBalance(Bob) - Bob_start_balance; + + //Check end balances + deposits = Alice_start_balance - L1.getBalance(Alice); + withdrawals = L1.getBalance(Bob) - Bob_start_balance; + + console2.log("Deposits:", deposits); + console2.log("withdrawals:", withdrawals); + // Assert their balance changed relatively the same way + // 1e18 == within 100 % delta -> 1e17 10%, let's see if this is within that range + assertApproxEqRel(deposits, withdrawals, 1e17); + } + + function mine_huge() internal { + vm.warp(block.timestamp + 1200); + vm.roll(block.number + 300); + } + + function mine_every_12_sec() internal { + vm.warp(block.timestamp + 12); + vm.roll(block.number + 1); + } + + function mine_proofTime() internal { + vm.warp(block.timestamp + 120); + vm.roll(block.number + 5); + } +} diff --git a/packages/protocol/test2/TaikoL1OracleProver.t.sol b/packages/protocol/test2/TaikoL1OracleProver.t.sol index 7b7c1876055..3b0634f060e 100644 --- a/packages/protocol/test2/TaikoL1OracleProver.t.sol +++ b/packages/protocol/test2/TaikoL1OracleProver.t.sol @@ -23,24 +23,11 @@ contract TaikoL1_withOracleProver is TaikoL1 { config.enableTokenomics = true; config.txListCacheExpiry = 5 minutes; - config.proposerDepositPctg = 0; config.maxVerificationsPerTx = 0; config.enableSoloProposer = false; config.enableOracleProver = true; config.maxNumProposedBlocks = 10; config.ringBufferSize = 12; - // this value must be changed if `maxNumProposedBlocks` is changed. - config.slotSmoothingFactor = 4160; - - config.proposingConfig = TaikoData.FeeConfig({ - avgTimeMAF: 64, - dampingFactorBips: 5000 - }); - - config.provingConfig = TaikoData.FeeConfig({ - avgTimeMAF: 64, - dampingFactorBips: 5000 - }); } } @@ -57,20 +44,17 @@ contract TaikoL1Test is TaikoL1TestBase { function setUp() public override { TaikoL1TestBase.setUp(); - _registerAddress( - string(abi.encodePacked("verifier_", uint16(100))), - address(new Verifier()) - ); + registerAddress(L1.getVerifierName(100), address(new Verifier())); - _registerAddress("oracle_prover", Alice); + registerAddress("oracle_prover", Alice); } // Test a block can be oracle-proven multiple times by the // oracle prover function testOracleProver() external { - _depositTaikoToken(Alice, 1000 * 1E8, 1000 ether); - _depositTaikoToken(Bob, 1000 * 1E8, 1000 ether); - _depositTaikoToken(Carol, 1000 * 1E8, 1000 ether); + depositTaikoToken(Alice, 1000 * 1E8, 1000 ether); + depositTaikoToken(Bob, 1000 * 1E8, 1000 ether); + depositTaikoToken(Carol, 1000 * 1E8, 1000 ether); bytes32 parentHash = GENESIS_BLOCK_HASH; diff --git a/packages/protocol/test2/TaikoL1TestBase.t.sol b/packages/protocol/test2/TaikoL1TestBase.t.sol index 3170a9332ef..21be8dd66c2 100644 --- a/packages/protocol/test2/TaikoL1TestBase.t.sol +++ b/packages/protocol/test2/TaikoL1TestBase.t.sol @@ -11,6 +11,12 @@ import {TaikoToken} from "../contracts/L1/TaikoToken.sol"; import {SignalService} from "../contracts/signal/SignalService.sol"; import {Strings} from "@openzeppelin/contracts/utils/Strings.sol"; +contract Verifier { + fallback(bytes calldata) external returns (bytes memory) { + return bytes.concat(keccak256("taiko")); + } +} + abstract contract TaikoL1TestBase is Test { AddressManager public addressManager; TaikoToken public tko; @@ -36,6 +42,10 @@ abstract contract TaikoL1TestBase is Test { address public constant Dave = 0x400147C0Eb43D8D71b2B03037bB7B31f8f78EF5F; address public constant Eve = 0x50081b12838240B1bA02b3177153Bca678a86078; + // Calculation shall be done in derived contracts - based on testnet or mainnet expected proof time + uint64 public initProofTimeIssued; + uint8 public constant ADJUSTMENT_QUOTIENT = 16; + function deployTaikoL1() internal virtual returns (TaikoL1 taikoL1); function setUp() public virtual { @@ -44,7 +54,12 @@ abstract contract TaikoL1TestBase is Test { addressManager.init(); L1 = deployTaikoL1(); - L1.init(address(addressManager), feeBase, GENESIS_BLOCK_HASH); + L1.init( + address(addressManager), + GENESIS_BLOCK_HASH, + feeBase, + initProofTimeIssued + ); conf = L1.getConfig(); tko = new TaikoToken(); @@ -62,16 +77,17 @@ abstract contract TaikoL1TestBase is Test { ss.init(address(addressManager)); // set proto_broker to this address to mint some TKO - _registerAddress("proto_broker", address(this)); + registerAddress("proto_broker", address(this)); tko.mint(address(this), 1E9 * 1E8); // register all addresses - _registerAddress("taiko_token", address(tko)); - _registerAddress("proto_broker", address(L1)); - _registerAddress("signal_service", address(ss)); - _registerL2Address("treasure", L2Treasure); - _registerL2Address("signal_service", address(L2SS)); - _registerL2Address("taiko_l2", address(L2TaikoL2)); + registerAddress("taiko_token", address(tko)); + registerAddress("proto_broker", address(L1)); + registerAddress("signal_service", address(ss)); + registerL2Address("treasure", L2Treasure); + registerL2Address("signal_service", address(L2SS)); + registerL2Address("taiko_l2", address(L2TaikoL2)); + registerAddress(L1.getVerifierName(100), address(new Verifier())); printVariables("init "); } @@ -175,19 +191,19 @@ abstract contract TaikoL1TestBase is Test { L1.verifyBlocks(count); } - function _registerAddress(string memory name, address addr) internal { + function registerAddress(string memory name, address addr) internal { string memory key = L1.keyForName(block.chainid, name); addressManager.setAddress(key, addr); console2.log(key, unicode"→", addr); } - function _registerL2Address(string memory name, address addr) internal { + function registerL2Address(string memory name, address addr) internal { string memory key = L1.keyForName(conf.chainId, name); addressManager.setAddress(key, addr); console2.log(key, unicode"→", addr); } - function _depositTaikoToken( + function depositTaikoToken( address who, uint256 amountTko, uint256 amountEth @@ -200,21 +216,18 @@ abstract contract TaikoL1TestBase is Test { function printVariables(string memory comment) internal { TaikoData.StateVariables memory vars = L1.getStateVariables(); - (uint256 fee, ) = L1.getBlockFee(); + + uint256 fee = L1.getBlockFee(); + string memory str = string.concat( Strings.toString(logCount++), ":[", Strings.toString(vars.lastVerifiedBlockId), unicode"→", Strings.toString(vars.numBlocks), - "] feeBase:", - Strings.toString(vars.feeBase), + "]", " fee:", Strings.toString(fee), - " avgBlockTime:", - Strings.toString(vars.avgBlockTime), - " avgProofTime:", - Strings.toString(vars.avgProofTime), " lastProposedAt:", Strings.toString(vars.lastProposedAt), " // ", diff --git a/packages/protocol/utils/generate_config/README.md b/packages/protocol/utils/generate_config/README.md deleted file mode 100644 index d8d3c7986e8..00000000000 --- a/packages/protocol/utils/generate_config/README.md +++ /dev/null @@ -1,12 +0,0 @@ -# README - -A script to calculate `slotSmoothingFactor` in `TaikoData.Config` given: - -- expected block time -- expected proof time -- expected slot availability multiplier - ... - -## How to run - -`python3 main.py` diff --git a/packages/protocol/utils/generate_config/main.py b/packages/protocol/utils/generate_config/main.py deleted file mode 100644 index 160dba63e12..00000000000 --- a/packages/protocol/utils/generate_config/main.py +++ /dev/null @@ -1,42 +0,0 @@ -import math - - -if __name__ == "__main__": - print("Expected block time (seconds)", end=": ") - block_time = int(input()) - - print("Expected proof time (minutes)", end=": ") - proof_time = int(input()) * 60 - - print("Max baseFee upside (5 = 5x)", end=": ") - max_basefee_upside = int(input()) - if max_basefee_upside < 5: - print("error: Max baseFee upside < 5") - exit(1) - - min_num_slots = math.ceil(1.0 * proof_time / block_time) - - print("Extra slots (e.g, 50 means 50% more slots)", end=": ") - extra_slots = int(input()) - - print("---------") - - print("min num slots:", min_num_slots) - max_num_slots = min_num_slots + math.ceil(min_num_slots * extra_slots / 100) + 1 - - k = max_basefee_upside - n = max_num_slots - - # https://www.wolframalpha.com/input?i=solve++%28n%2Bx%29%28n%2Bx-1%29%3Dk*%281%2Bx%29x+for+x - fee_smoothing_factor = ( - k - 2 * n + 1 - math.sqrt(k * (k + 4 * n * n - 8 * n + 2) + 1.0) - ) / (2 - 2 * k) - - fee_smoothing_factor = int(fee_smoothing_factor * 1000) - - # f = fee_smoothing_factor - # print(1.0*(f+n*1000)*(f+n*1000-1000)/((f+1000)*f)) - - print("---------") - print("maxNumProposedBlocks:", max_num_slots) - print("slotSmoothingFactor:", fee_smoothing_factor) diff --git a/packages/relayer/TaikoL1.json b/packages/relayer/TaikoL1.json index f9410f57423..49d131b5910 100644 --- a/packages/relayer/TaikoL1.json +++ b/packages/relayer/TaikoL1.json @@ -516,11 +516,6 @@ "name": "slotSmoothingFactor", "type": "uint256" }, - { - "internalType": "uint256", - "name": "rewardBurnBips", - "type": "uint256" - }, { "internalType": "uint256", "name": "proposerDepositPctg", @@ -528,7 +523,7 @@ }, { "internalType": "uint256", - "name": "feeBaseMAF", + "name": "basefeeMAF", "type": "uint256" }, { @@ -741,7 +736,7 @@ "components": [ { "internalType": "uint256", - "name": "feeBase", + "name": "basefee", "type": "uint256" }, { @@ -826,7 +821,7 @@ }, { "internalType": "uint256", - "name": "_feeBase", + "name": "_basefee", "type": "uint256" } ], @@ -1046,7 +1041,7 @@ }, { "internalType": "uint256", - "name": "feeBase", + "name": "basefee", "type": "uint256" }, { diff --git a/packages/relayer/contracts/taikol1/TaikoL1.go b/packages/relayer/contracts/taikol1/TaikoL1.go index e90754ac72d..f1ae8e258aa 100644 --- a/packages/relayer/contracts/taikol1/TaikoL1.go +++ b/packages/relayer/contracts/taikol1/TaikoL1.go @@ -31,7 +31,7 @@ var ( // LibUtilsStateVariables is an auto generated low-level Go binding around an user-defined struct. type LibUtilsStateVariables struct { - FeeBase *big.Int + Basefee *big.Int GenesisHeight uint64 GenesisTimestamp uint64 NextBlockId uint64 @@ -72,7 +72,7 @@ type TaikoDataConfig struct { SlotSmoothingFactor *big.Int RewardBurnBips *big.Int ProposerDepositPctg *big.Int - FeeBaseMAF *big.Int + BasefeeMAF *big.Int BlockTimeMAF *big.Int ProofTimeMAF *big.Int RewardMultiplierPctg uint64 @@ -103,7 +103,7 @@ type TaikoDataProposedBlock struct { // TaikoL1MetaData contains all meta data concerning the TaikoL1 contract. var TaikoL1MetaData = &bind.MetaData{ - ABI: "[{\"inputs\":[],\"name\":\"L1_0_FEE_BASE\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"L1_ALREADY_PROVEN\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"L1_ANCHOR_CALLDATA\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"L1_ANCHOR_DEST\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"L1_ANCHOR_GAS_LIMIT\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"L1_ANCHOR_RECEIPT_ADDR\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"L1_ANCHOR_RECEIPT_DATA\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"L1_ANCHOR_RECEIPT_LOGS\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"L1_ANCHOR_RECEIPT_PROOF\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"L1_ANCHOR_RECEIPT_STATUS\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"L1_ANCHOR_RECEIPT_TOPICS\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"L1_ANCHOR_SIG_R\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"L1_ANCHOR_SIG_S\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"L1_ANCHOR_TX_PROOF\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"L1_ANCHOR_TYPE\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"L1_BLOCK_NUMBER\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"L1_BLOCK_NUMBER\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"L1_CANNOT_BE_FIRST_PROVER\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"L1_COMMITTED\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"L1_CONFLICT_PROOF\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"L1_CONTRACT_NOT_ALLOWED\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"L1_DUP_PROVERS\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"L1_EXTRA_DATA\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"L1_GAS_LIMIT\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"L1_ID\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"L1_ID\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"L1_INPUT_SIZE\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"L1_INVALID_PARAM\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"L1_METADATA_FIELD\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"L1_META_MISMATCH\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"L1_NOT_COMMITTED\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"L1_NOT_ORACLE_PROVER\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"L1_PROOF_LENGTH\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"L1_PROVER\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"L1_SOLO_PROPOSER\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"L1_TOO_MANY_BLOCKS\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"L1_TX_LIST\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"L1_ZKP\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"RESOLVER_DENIED\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"RESOLVER_INVALID_ADDR\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"commitSlot\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"commitHash\",\"type\":\"bytes32\"}],\"name\":\"BlockCommitted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"l1Height\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"l1Hash\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"beneficiary\",\"type\":\"address\"},{\"internalType\":\"bytes32\",\"name\":\"txListHash\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"mixHash\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"extraData\",\"type\":\"bytes\"},{\"internalType\":\"uint64\",\"name\":\"gasLimit\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"timestamp\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"commitHeight\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"commitSlot\",\"type\":\"uint64\"}],\"indexed\":false,\"internalType\":\"structTaikoData.BlockMetadata\",\"name\":\"meta\",\"type\":\"tuple\"}],\"name\":\"BlockProposed\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"parentHash\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"blockHash\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"prover\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"provenAt\",\"type\":\"uint64\"}],\"name\":\"BlockProven\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"blockHash\",\"type\":\"bytes32\"}],\"name\":\"BlockVerified\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"srcHeight\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"srcHash\",\"type\":\"bytes32\"}],\"name\":\"HeaderSynced\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"version\",\"type\":\"uint8\"}],\"name\":\"Initialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"addressManager\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"commitSlot\",\"type\":\"uint64\"},{\"internalType\":\"bytes32\",\"name\":\"commitHash\",\"type\":\"bytes32\"}],\"name\":\"commitBlock\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getBlockFee\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getConfig\",\"outputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"chainId\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxNumProposedBlocks\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxNumVerifiedBlocks\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxVerificationsPerTx\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"commitConfirmations\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"blockMaxGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxTransactionsPerBlock\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxBytesPerTxList\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"minTxGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"anchorTxGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"slotSmoothingFactor\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"rewardBurnBips\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"proposerDepositPctg\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"feeBaseMAF\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"blockTimeMAF\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"proofTimeMAF\",\"type\":\"uint256\"},{\"internalType\":\"uint64\",\"name\":\"feeMultiplierPctg\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"feeGracePeriodPctg\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"feeMaxPctg\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"blockTimeCap\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"proofTimeCap\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"bootstrapDiscountHalvingPeriod\",\"type\":\"uint64\"},{\"internalType\":\"bool\",\"name\":\"enableTokenomics\",\"type\":\"bool\"},{\"internalType\":\"bool\",\"name\":\"enablePublicInputsCheck\",\"type\":\"bool\"},{\"internalType\":\"bool\",\"name\":\"enableAnchorValidation\",\"type\":\"bool\"}],\"internalType\":\"structTaikoData.Config\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"parentHash\",\"type\":\"bytes32\"}],\"name\":\"getForkChoice\",\"outputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"blockHash\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"prover\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"provenAt\",\"type\":\"uint64\"}],\"internalType\":\"structTaikoData.ForkChoice\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getLatestSyncedHeader\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"provenAt\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"proposedAt\",\"type\":\"uint64\"}],\"name\":\"getProofReward\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"reward\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"}],\"name\":\"getProposedBlock\",\"outputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"metaHash\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"deposit\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"proposer\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"proposedAt\",\"type\":\"uint64\"}],\"internalType\":\"structTaikoData.ProposedBlock\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"addr\",\"type\":\"address\"}],\"name\":\"getBalance\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getStateVariables\",\"outputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"feeBase\",\"type\":\"uint256\"},{\"internalType\":\"uint64\",\"name\":\"genesisHeight\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"genesisTimestamp\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"nextBlockId\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"lastProposedAt\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"avgBlockTime\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"latestVerifiedHeight\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"lastBlockId\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"avgProofTime\",\"type\":\"uint64\"}],\"internalType\":\"structLibUtils.StateVariables\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"number\",\"type\":\"uint256\"}],\"name\":\"getSyncedHeader\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_addressManager\",\"type\":\"address\"},{\"internalType\":\"bytes32\",\"name\":\"_genesisBlockHash\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"_feeBase\",\"type\":\"uint256\"}],\"name\":\"init\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"commitSlot\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"commitHeight\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"commitHash\",\"type\":\"bytes32\"}],\"name\":\"isCommitValid\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes[]\",\"name\":\"inputs\",\"type\":\"bytes[]\"}],\"name\":\"proposeBlock\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"blockId\",\"type\":\"uint256\"},{\"internalType\":\"bytes[]\",\"name\":\"inputs\",\"type\":\"bytes[]\"}],\"name\":\"proveBlock\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"blockId\",\"type\":\"uint256\"},{\"internalType\":\"bytes[]\",\"name\":\"inputs\",\"type\":\"bytes[]\"}],\"name\":\"proveBlockInvalid\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"name\",\"type\":\"string\"},{\"internalType\":\"bool\",\"name\":\"allowZeroAddress\",\"type\":\"bool\"}],\"name\":\"resolve\",\"outputs\":[{\"internalType\":\"addresspayable\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"chainId\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"name\",\"type\":\"string\"},{\"internalType\":\"bool\",\"name\":\"allowZeroAddress\",\"type\":\"bool\"}],\"name\":\"resolve\",\"outputs\":[{\"internalType\":\"addresspayable\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"hash\",\"type\":\"bytes32\"},{\"internalType\":\"uint8\",\"name\":\"k\",\"type\":\"uint8\"}],\"name\":\"signWithGoldenTouch\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"v\",\"type\":\"uint8\"},{\"internalType\":\"uint256\",\"name\":\"r\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"s\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"state\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"genesisHeight\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"genesisTimestamp\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"__reservedA1\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"__reservedA2\",\"type\":\"uint64\"},{\"internalType\":\"uint256\",\"name\":\"feeBase\",\"type\":\"uint256\"},{\"internalType\":\"uint64\",\"name\":\"nextBlockId\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"lastProposedAt\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"avgBlockTime\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"__avgGasLimit\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"latestVerifiedHeight\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"lastBlockId\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"avgProofTime\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"__reservedC1\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"maxBlocks\",\"type\":\"uint256\"}],\"name\":\"verifyBlocks\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"withdrawBalance\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]", + ABI: "[{\"inputs\":[],\"name\":\"L1_0_FEE_BASE\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"L1_ALREADY_PROVEN\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"L1_ANCHOR_CALLDATA\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"L1_ANCHOR_DEST\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"L1_ANCHOR_GAS_LIMIT\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"L1_ANCHOR_RECEIPT_ADDR\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"L1_ANCHOR_RECEIPT_DATA\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"L1_ANCHOR_RECEIPT_LOGS\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"L1_ANCHOR_RECEIPT_PROOF\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"L1_ANCHOR_RECEIPT_STATUS\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"L1_ANCHOR_RECEIPT_TOPICS\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"L1_ANCHOR_SIG_R\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"L1_ANCHOR_SIG_S\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"L1_ANCHOR_TX_PROOF\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"L1_ANCHOR_TYPE\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"L1_BLOCK_NUMBER\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"L1_BLOCK_NUMBER\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"L1_CANNOT_BE_FIRST_PROVER\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"L1_COMMITTED\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"L1_CONFLICT_PROOF\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"L1_CONTRACT_NOT_ALLOWED\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"L1_DUP_PROVERS\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"L1_EXTRA_DATA\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"L1_GAS_LIMIT\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"L1_ID\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"L1_ID\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"L1_INPUT_SIZE\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"L1_INVALID_PARAM\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"L1_METADATA_FIELD\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"L1_META_MISMATCH\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"L1_NOT_COMMITTED\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"L1_NOT_ORACLE_PROVER\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"L1_PROOF_LENGTH\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"L1_PROVER\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"L1_SOLO_PROPOSER\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"L1_TOO_MANY_BLOCKS\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"L1_TX_LIST\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"L1_ZKP\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"RESOLVER_DENIED\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"RESOLVER_INVALID_ADDR\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"commitSlot\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"commitHash\",\"type\":\"bytes32\"}],\"name\":\"BlockCommitted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"l1Height\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"l1Hash\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"beneficiary\",\"type\":\"address\"},{\"internalType\":\"bytes32\",\"name\":\"txListHash\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"mixHash\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"extraData\",\"type\":\"bytes\"},{\"internalType\":\"uint64\",\"name\":\"gasLimit\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"timestamp\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"commitHeight\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"commitSlot\",\"type\":\"uint64\"}],\"indexed\":false,\"internalType\":\"structTaikoData.BlockMetadata\",\"name\":\"meta\",\"type\":\"tuple\"}],\"name\":\"BlockProposed\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"parentHash\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"blockHash\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"prover\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"provenAt\",\"type\":\"uint64\"}],\"name\":\"BlockProven\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"blockHash\",\"type\":\"bytes32\"}],\"name\":\"BlockVerified\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"srcHeight\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"srcHash\",\"type\":\"bytes32\"}],\"name\":\"HeaderSynced\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"version\",\"type\":\"uint8\"}],\"name\":\"Initialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"addressManager\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"commitSlot\",\"type\":\"uint64\"},{\"internalType\":\"bytes32\",\"name\":\"commitHash\",\"type\":\"bytes32\"}],\"name\":\"commitBlock\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getBlockFee\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getConfig\",\"outputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"chainId\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxNumProposedBlocks\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxNumVerifiedBlocks\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxVerificationsPerTx\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"commitConfirmations\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"blockMaxGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxTransactionsPerBlock\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxBytesPerTxList\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"minTxGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"anchorTxGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"slotSmoothingFactor\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"rewardBurnBips\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"proposerDepositPctg\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"basefeeMAF\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"blockTimeMAF\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"proofTimeMAF\",\"type\":\"uint256\"},{\"internalType\":\"uint64\",\"name\":\"feeMultiplierPctg\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"feeGracePeriodPctg\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"feeMaxPctg\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"blockTimeCap\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"proofTimeCap\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"bootstrapDiscountHalvingPeriod\",\"type\":\"uint64\"},{\"internalType\":\"bool\",\"name\":\"enableTokenomics\",\"type\":\"bool\"},{\"internalType\":\"bool\",\"name\":\"enablePublicInputsCheck\",\"type\":\"bool\"},{\"internalType\":\"bool\",\"name\":\"enableAnchorValidation\",\"type\":\"bool\"}],\"internalType\":\"structTaikoData.Config\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"parentHash\",\"type\":\"bytes32\"}],\"name\":\"getForkChoice\",\"outputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"blockHash\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"prover\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"provenAt\",\"type\":\"uint64\"}],\"internalType\":\"structTaikoData.ForkChoice\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getLatestSyncedHeader\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"provenAt\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"proposedAt\",\"type\":\"uint64\"}],\"name\":\"getProofReward\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"reward\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"}],\"name\":\"getProposedBlock\",\"outputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"metaHash\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"deposit\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"proposer\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"proposedAt\",\"type\":\"uint64\"}],\"internalType\":\"structTaikoData.ProposedBlock\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"addr\",\"type\":\"address\"}],\"name\":\"getBalance\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getStateVariables\",\"outputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"basefee\",\"type\":\"uint256\"},{\"internalType\":\"uint64\",\"name\":\"genesisHeight\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"genesisTimestamp\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"nextBlockId\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"lastProposedAt\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"avgBlockTime\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"latestVerifiedHeight\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"lastBlockId\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"avgProofTime\",\"type\":\"uint64\"}],\"internalType\":\"structLibUtils.StateVariables\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"number\",\"type\":\"uint256\"}],\"name\":\"getSyncedHeader\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_addressManager\",\"type\":\"address\"},{\"internalType\":\"bytes32\",\"name\":\"_genesisBlockHash\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"_basefee\",\"type\":\"uint256\"}],\"name\":\"init\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"commitSlot\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"commitHeight\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"commitHash\",\"type\":\"bytes32\"}],\"name\":\"isCommitValid\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes[]\",\"name\":\"inputs\",\"type\":\"bytes[]\"}],\"name\":\"proposeBlock\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"blockId\",\"type\":\"uint256\"},{\"internalType\":\"bytes[]\",\"name\":\"inputs\",\"type\":\"bytes[]\"}],\"name\":\"proveBlock\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"blockId\",\"type\":\"uint256\"},{\"internalType\":\"bytes[]\",\"name\":\"inputs\",\"type\":\"bytes[]\"}],\"name\":\"proveBlockInvalid\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"name\",\"type\":\"string\"},{\"internalType\":\"bool\",\"name\":\"allowZeroAddress\",\"type\":\"bool\"}],\"name\":\"resolve\",\"outputs\":[{\"internalType\":\"addresspayable\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"chainId\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"name\",\"type\":\"string\"},{\"internalType\":\"bool\",\"name\":\"allowZeroAddress\",\"type\":\"bool\"}],\"name\":\"resolve\",\"outputs\":[{\"internalType\":\"addresspayable\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"hash\",\"type\":\"bytes32\"},{\"internalType\":\"uint8\",\"name\":\"k\",\"type\":\"uint8\"}],\"name\":\"signWithGoldenTouch\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"v\",\"type\":\"uint8\"},{\"internalType\":\"uint256\",\"name\":\"r\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"s\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"state\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"genesisHeight\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"genesisTimestamp\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"__reservedA1\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"__reservedA2\",\"type\":\"uint64\"},{\"internalType\":\"uint256\",\"name\":\"basefee\",\"type\":\"uint256\"},{\"internalType\":\"uint64\",\"name\":\"nextBlockId\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"lastProposedAt\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"avgBlockTime\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"__avgGasLimit\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"latestVerifiedHeight\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"lastBlockId\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"avgProofTime\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"__reservedC1\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"maxBlocks\",\"type\":\"uint256\"}],\"name\":\"verifyBlocks\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"withdrawBalance\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]", } // TaikoL1ABI is the input ABI used to generate the binding from. @@ -738,13 +738,13 @@ func (_TaikoL1 *TaikoL1CallerSession) SignWithGoldenTouch(hash [32]byte, k uint8 // State is a free data retrieval call binding the contract method 0xc19d93fb. // -// Solidity: function state() view returns(uint64 genesisHeight, uint64 genesisTimestamp, uint64 __reservedA1, uint64 __reservedA2, uint256 feeBase, uint64 nextBlockId, uint64 lastProposedAt, uint64 avgBlockTime, uint64 __avgGasLimit, uint64 latestVerifiedHeight, uint64 lastBlockId, uint64 avgProofTime, uint64 __reservedC1) +// Solidity: function state() view returns(uint64 genesisHeight, uint64 genesisTimestamp, uint64 __reservedA1, uint64 __reservedA2, uint256 basefee, uint64 nextBlockId, uint64 lastProposedAt, uint64 avgBlockTime, uint64 __avgGasLimit, uint64 latestVerifiedHeight, uint64 lastBlockId, uint64 avgProofTime, uint64 __reservedC1) func (_TaikoL1 *TaikoL1Caller) State(opts *bind.CallOpts) (struct { GenesisHeight uint64 GenesisTimestamp uint64 ReservedA1 uint64 ReservedA2 uint64 - FeeBase *big.Int + Basefee *big.Int NextBlockId uint64 LastProposedAt uint64 AvgBlockTime uint64 @@ -762,7 +762,7 @@ func (_TaikoL1 *TaikoL1Caller) State(opts *bind.CallOpts) (struct { GenesisTimestamp uint64 ReservedA1 uint64 ReservedA2 uint64 - FeeBase *big.Int + Basefee *big.Int NextBlockId uint64 LastProposedAt uint64 AvgBlockTime uint64 @@ -780,7 +780,7 @@ func (_TaikoL1 *TaikoL1Caller) State(opts *bind.CallOpts) (struct { outstruct.GenesisTimestamp = *abi.ConvertType(out[1], new(uint64)).(*uint64) outstruct.ReservedA1 = *abi.ConvertType(out[2], new(uint64)).(*uint64) outstruct.ReservedA2 = *abi.ConvertType(out[3], new(uint64)).(*uint64) - outstruct.FeeBase = *abi.ConvertType(out[4], new(*big.Int)).(**big.Int) + outstruct.Basefee = *abi.ConvertType(out[4], new(*big.Int)).(**big.Int) outstruct.NextBlockId = *abi.ConvertType(out[5], new(uint64)).(*uint64) outstruct.LastProposedAt = *abi.ConvertType(out[6], new(uint64)).(*uint64) outstruct.AvgBlockTime = *abi.ConvertType(out[7], new(uint64)).(*uint64) @@ -796,13 +796,13 @@ func (_TaikoL1 *TaikoL1Caller) State(opts *bind.CallOpts) (struct { // State is a free data retrieval call binding the contract method 0xc19d93fb. // -// Solidity: function state() view returns(uint64 genesisHeight, uint64 genesisTimestamp, uint64 __reservedA1, uint64 __reservedA2, uint256 feeBase, uint64 nextBlockId, uint64 lastProposedAt, uint64 avgBlockTime, uint64 __avgGasLimit, uint64 latestVerifiedHeight, uint64 lastBlockId, uint64 avgProofTime, uint64 __reservedC1) +// Solidity: function state() view returns(uint64 genesisHeight, uint64 genesisTimestamp, uint64 __reservedA1, uint64 __reservedA2, uint256 basefee, uint64 nextBlockId, uint64 lastProposedAt, uint64 avgBlockTime, uint64 __avgGasLimit, uint64 latestVerifiedHeight, uint64 lastBlockId, uint64 avgProofTime, uint64 __reservedC1) func (_TaikoL1 *TaikoL1Session) State() (struct { GenesisHeight uint64 GenesisTimestamp uint64 ReservedA1 uint64 ReservedA2 uint64 - FeeBase *big.Int + Basefee *big.Int NextBlockId uint64 LastProposedAt uint64 AvgBlockTime uint64 @@ -817,13 +817,13 @@ func (_TaikoL1 *TaikoL1Session) State() (struct { // State is a free data retrieval call binding the contract method 0xc19d93fb. // -// Solidity: function state() view returns(uint64 genesisHeight, uint64 genesisTimestamp, uint64 __reservedA1, uint64 __reservedA2, uint256 feeBase, uint64 nextBlockId, uint64 lastProposedAt, uint64 avgBlockTime, uint64 __avgGasLimit, uint64 latestVerifiedHeight, uint64 lastBlockId, uint64 avgProofTime, uint64 __reservedC1) +// Solidity: function state() view returns(uint64 genesisHeight, uint64 genesisTimestamp, uint64 __reservedA1, uint64 __reservedA2, uint256 basefee, uint64 nextBlockId, uint64 lastProposedAt, uint64 avgBlockTime, uint64 __avgGasLimit, uint64 latestVerifiedHeight, uint64 lastBlockId, uint64 avgProofTime, uint64 __reservedC1) func (_TaikoL1 *TaikoL1CallerSession) State() (struct { GenesisHeight uint64 GenesisTimestamp uint64 ReservedA1 uint64 ReservedA2 uint64 - FeeBase *big.Int + Basefee *big.Int NextBlockId uint64 LastProposedAt uint64 AvgBlockTime uint64 @@ -859,23 +859,23 @@ func (_TaikoL1 *TaikoL1TransactorSession) CommitBlock(commitSlot uint64, commitH // Init is a paid mutator transaction binding the contract method 0x9c5e9f06. // -// Solidity: function init(address _addressManager, bytes32 _genesisBlockHash, uint256 _feeBase) returns() -func (_TaikoL1 *TaikoL1Transactor) Init(opts *bind.TransactOpts, _addressManager common.Address, _genesisBlockHash [32]byte, _feeBase *big.Int) (*types.Transaction, error) { - return _TaikoL1.contract.Transact(opts, "init", _addressManager, _genesisBlockHash, _feeBase) +// Solidity: function init(address _addressManager, bytes32 _genesisBlockHash, uint256 _basefee) returns() +func (_TaikoL1 *TaikoL1Transactor) Init(opts *bind.TransactOpts, _addressManager common.Address, _genesisBlockHash [32]byte, _basefee *big.Int) (*types.Transaction, error) { + return _TaikoL1.contract.Transact(opts, "init", _addressManager, _genesisBlockHash, _basefee) } // Init is a paid mutator transaction binding the contract method 0x9c5e9f06. // -// Solidity: function init(address _addressManager, bytes32 _genesisBlockHash, uint256 _feeBase) returns() -func (_TaikoL1 *TaikoL1Session) Init(_addressManager common.Address, _genesisBlockHash [32]byte, _feeBase *big.Int) (*types.Transaction, error) { - return _TaikoL1.Contract.Init(&_TaikoL1.TransactOpts, _addressManager, _genesisBlockHash, _feeBase) +// Solidity: function init(address _addressManager, bytes32 _genesisBlockHash, uint256 _basefee) returns() +func (_TaikoL1 *TaikoL1Session) Init(_addressManager common.Address, _genesisBlockHash [32]byte, _basefee *big.Int) (*types.Transaction, error) { + return _TaikoL1.Contract.Init(&_TaikoL1.TransactOpts, _addressManager, _genesisBlockHash, _basefee) } // Init is a paid mutator transaction binding the contract method 0x9c5e9f06. // -// Solidity: function init(address _addressManager, bytes32 _genesisBlockHash, uint256 _feeBase) returns() -func (_TaikoL1 *TaikoL1TransactorSession) Init(_addressManager common.Address, _genesisBlockHash [32]byte, _feeBase *big.Int) (*types.Transaction, error) { - return _TaikoL1.Contract.Init(&_TaikoL1.TransactOpts, _addressManager, _genesisBlockHash, _feeBase) +// Solidity: function init(address _addressManager, bytes32 _genesisBlockHash, uint256 _basefee) returns() +func (_TaikoL1 *TaikoL1TransactorSession) Init(_addressManager common.Address, _genesisBlockHash [32]byte, _basefee *big.Int) (*types.Transaction, error) { + return _TaikoL1.Contract.Init(&_TaikoL1.TransactOpts, _addressManager, _genesisBlockHash, _basefee) } // ProposeBlock is a paid mutator transaction binding the contract method 0xa043dbdf. diff --git a/packages/relayer/contracts/taikol2/TaikoL2.go b/packages/relayer/contracts/taikol2/TaikoL2.go index efd19a7c899..041a57d5296 100644 --- a/packages/relayer/contracts/taikol2/TaikoL2.go +++ b/packages/relayer/contracts/taikol2/TaikoL2.go @@ -44,7 +44,7 @@ type TaikoDataConfig struct { SlotSmoothingFactor *big.Int RewardBurnBips *big.Int ProposerDepositPctg *big.Int - FeeBaseMAF *big.Int + BasefeeMAF *big.Int BlockTimeMAF *big.Int ProofTimeMAF *big.Int RewardMultiplierPctg uint64 @@ -60,11 +60,11 @@ type TaikoDataConfig struct { // TaikoL2MetaData contains all meta data concerning the TaikoL2 contract. var TaikoL2MetaData = &bind.MetaData{ - ABI: "[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_addressManager\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"ERR_INVALID_HINT\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ERR_INVALID_TX_IDX\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ERR_PARAMS_NOT_DEFAULTS\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ERR_VERIFICAITON_FAILURE\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"L2_INVALID_CHAIN_ID\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"L2_INVALID_GAS_PRICE\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"L2_INVALID_SENDER\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"L2_PUBLIC_INPUT_HASH_MISMATCH\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"RESOLVER_DENIED\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"RESOLVER_INVALID_ADDR\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"txListHash\",\"type\":\"bytes32\"}],\"name\":\"BlockInvalidated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"srcHeight\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"srcHash\",\"type\":\"bytes32\"}],\"name\":\"HeaderSynced\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"addressManager\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"l1Height\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"l1Hash\",\"type\":\"bytes32\"}],\"name\":\"anchor\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"number\",\"type\":\"uint256\"}],\"name\":\"getBlockHash\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getConfig\",\"outputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"chainId\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxNumProposedBlocks\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxNumVerifiedBlocks\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxVerificationsPerTx\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"commitConfirmations\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"blockMaxGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxTransactionsPerBlock\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxBytesPerTxList\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"minTxGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"anchorTxGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"slotSmoothingFactor\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"rewardBurnBips\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"proposerDepositPctg\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"feeBaseMAF\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"blockTimeMAF\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"proofTimeMAF\",\"type\":\"uint256\"},{\"internalType\":\"uint64\",\"name\":\"rewardMultiplierPctg\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"feeGracePeriodPctg\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"feeMaxPeriodPctg\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"blockTimeCap\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"proofTimeCap\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"bootstrapDiscountHalvingPeriod\",\"type\":\"uint64\"},{\"internalType\":\"bool\",\"name\":\"enableTokenomics\",\"type\":\"bool\"},{\"internalType\":\"bool\",\"name\":\"enablePublicInputsCheck\",\"type\":\"bool\"},{\"internalType\":\"bool\",\"name\":\"enableAnchorValidation\",\"type\":\"bool\"}],\"internalType\":\"structTaikoData.Config\",\"name\":\"config\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getLatestSyncedHeader\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"number\",\"type\":\"uint256\"}],\"name\":\"getSyncedHeader\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"txList\",\"type\":\"bytes\"},{\"internalType\":\"enumLibInvalidTxList.Hint\",\"name\":\"hint\",\"type\":\"uint8\"},{\"internalType\":\"uint256\",\"name\":\"txIdx\",\"type\":\"uint256\"}],\"name\":\"invalidateBlock\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"latestSyncedL1Height\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"name\",\"type\":\"string\"},{\"internalType\":\"bool\",\"name\":\"allowZeroAddress\",\"type\":\"bool\"}],\"name\":\"resolve\",\"outputs\":[{\"internalType\":\"addresspayable\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"chainId\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"name\",\"type\":\"string\"},{\"internalType\":\"bool\",\"name\":\"allowZeroAddress\",\"type\":\"bool\"}],\"name\":\"resolve\",\"outputs\":[{\"internalType\":\"addresspayable\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"}]", + ABI: "[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_addressManager\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"ERR_INVALID_HINT\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ERR_INVALID_TX_IDX\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ERR_PARAMS_NOT_DEFAULTS\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ERR_VERIFICAITON_FAILURE\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"L2_INVALID_CHAIN_ID\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"L2_INVALID_GAS_PRICE\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"L2_INVALID_SENDER\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"L2_PUBLIC_INPUT_HASH_MISMATCH\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"RESOLVER_DENIED\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"RESOLVER_INVALID_ADDR\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"txListHash\",\"type\":\"bytes32\"}],\"name\":\"BlockInvalidated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"srcHeight\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"srcHash\",\"type\":\"bytes32\"}],\"name\":\"HeaderSynced\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"addressManager\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"l1Height\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"l1Hash\",\"type\":\"bytes32\"}],\"name\":\"anchor\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"number\",\"type\":\"uint256\"}],\"name\":\"getBlockHash\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getConfig\",\"outputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"chainId\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxNumProposedBlocks\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxNumVerifiedBlocks\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxVerificationsPerTx\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"commitConfirmations\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"blockMaxGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxTransactionsPerBlock\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxBytesPerTxList\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"minTxGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"anchorTxGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"slotSmoothingFactor\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"rewardBurnBips\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"proposerDepositPctg\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"basefeeMAF\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"blockTimeMAF\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"proofTimeMAF\",\"type\":\"uint256\"},{\"internalType\":\"uint64\",\"name\":\"rewardMultiplierPctg\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"feeGracePeriodPctg\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"feeMaxPeriodPctg\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"blockTimeCap\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"proofTimeCap\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"bootstrapDiscountHalvingPeriod\",\"type\":\"uint64\"},{\"internalType\":\"bool\",\"name\":\"enableTokenomics\",\"type\":\"bool\"},{\"internalType\":\"bool\",\"name\":\"enablePublicInputsCheck\",\"type\":\"bool\"},{\"internalType\":\"bool\",\"name\":\"enableAnchorValidation\",\"type\":\"bool\"}],\"internalType\":\"structTaikoData.Config\",\"name\":\"config\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getLatestSyncedHeader\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"number\",\"type\":\"uint256\"}],\"name\":\"getSyncedHeader\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"txList\",\"type\":\"bytes\"},{\"internalType\":\"enumLibInvalidTxList.Hint\",\"name\":\"hint\",\"type\":\"uint8\"},{\"internalType\":\"uint256\",\"name\":\"txIdx\",\"type\":\"uint256\"}],\"name\":\"invalidateBlock\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"latestSyncedL1Height\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"name\",\"type\":\"string\"},{\"internalType\":\"bool\",\"name\":\"allowZeroAddress\",\"type\":\"bool\"}],\"name\":\"resolve\",\"outputs\":[{\"internalType\":\"addresspayable\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"chainId\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"name\",\"type\":\"string\"},{\"internalType\":\"bool\",\"name\":\"allowZeroAddress\",\"type\":\"bool\"}],\"name\":\"resolve\",\"outputs\":[{\"internalType\":\"addresspayable\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"}]", } // TaikoL2ABI is the input ABI used to generate the binding from. -const TaikoL2ABI = "[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_addressManager\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"txListHash\",\"type\":\"bytes32\"}],\"name\":\"BlockInvalidated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"height\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"srcHeight\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"srcHash\",\"type\":\"bytes32\"}],\"name\":\"HeaderSynced\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"addressManager\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"l1Height\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"l1Hash\",\"type\":\"bytes32\"}],\"name\":\"anchor\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"number\",\"type\":\"uint256\"}],\"name\":\"getBlockHash\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getConfig\",\"outputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"chainId\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxNumProposedBlocks\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxNumVerifiedBlocks\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"zkProofsPerBlock\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxVerificationsPerTx\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"commitConfirmations\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxProofsPerForkChoice\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"blockMaxGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxTransactionsPerBlock\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxBytesPerTxList\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"minTxGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"anchorTxGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"feePremiumLamda\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"rewardBurnBips\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"proposerDepositPctg\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"feeBaseMAF\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"blockTimeMAF\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"proofTimeMAF\",\"type\":\"uint256\"},{\"internalType\":\"uint64\",\"name\":\"feeMultiplierPctg\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"feeGracePeriodPctg\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"feeMaxPctg\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"blockTimeCap\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"proofTimeCap\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"bootstrapDiscountHalvingPeriod\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"initialUncleDelay\",\"type\":\"uint64\"},{\"internalType\":\"bool\",\"name\":\"enableTokenomics\",\"type\":\"bool\"},{\"internalType\":\"bool\",\"name\":\"enablePublicInputsCheck\",\"type\":\"bool\"},{\"internalType\":\"bool\",\"name\":\"enableAnchorValidation\",\"type\":\"bool\"}],\"internalType\":\"structTaikoData.Config\",\"name\":\"config\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getLatestSyncedHeader\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"number\",\"type\":\"uint256\"}],\"name\":\"getSyncedHeader\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"txList\",\"type\":\"bytes\"},{\"internalType\":\"enumLibInvalidTxList.Reason\",\"name\":\"hint\",\"type\":\"uint8\"},{\"internalType\":\"uint256\",\"name\":\"txIdx\",\"type\":\"uint256\"}],\"name\":\"invalidateBlock\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"latestSyncedL1Height\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"publicInputHash\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"name\",\"type\":\"string\"},{\"internalType\":\"bool\",\"name\":\"allowZeroAddress\",\"type\":\"bool\"}],\"name\":\"resolve\",\"outputs\":[{\"internalType\":\"addresspayable\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"chainId\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"name\",\"type\":\"string\"},{\"internalType\":\"bool\",\"name\":\"allowZeroAddress\",\"type\":\"bool\"}],\"name\":\"resolve\",\"outputs\":[{\"internalType\":\"addresspayable\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"}]" +const TaikoL2ABI = "[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_addressManager\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"txListHash\",\"type\":\"bytes32\"}],\"name\":\"BlockInvalidated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"height\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"srcHeight\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"srcHash\",\"type\":\"bytes32\"}],\"name\":\"HeaderSynced\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"addressManager\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"l1Height\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"l1Hash\",\"type\":\"bytes32\"}],\"name\":\"anchor\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"number\",\"type\":\"uint256\"}],\"name\":\"getBlockHash\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getConfig\",\"outputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"chainId\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxNumProposedBlocks\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxNumVerifiedBlocks\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"zkProofsPerBlock\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxVerificationsPerTx\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"commitConfirmations\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxProofsPerForkChoice\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"blockMaxGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxTransactionsPerBlock\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxBytesPerTxList\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"minTxGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"anchorTxGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"feePremiumLamda\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"rewardBurnBips\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"proposerDepositPctg\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"basefeeMAF\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"blockTimeMAF\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"proofTimeMAF\",\"type\":\"uint256\"},{\"internalType\":\"uint64\",\"name\":\"feeMultiplierPctg\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"feeGracePeriodPctg\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"feeMaxPctg\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"blockTimeCap\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"proofTimeCap\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"bootstrapDiscountHalvingPeriod\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"initialUncleDelay\",\"type\":\"uint64\"},{\"internalType\":\"bool\",\"name\":\"enableTokenomics\",\"type\":\"bool\"},{\"internalType\":\"bool\",\"name\":\"enablePublicInputsCheck\",\"type\":\"bool\"},{\"internalType\":\"bool\",\"name\":\"enableAnchorValidation\",\"type\":\"bool\"}],\"internalType\":\"structTaikoData.Config\",\"name\":\"config\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getLatestSyncedHeader\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"number\",\"type\":\"uint256\"}],\"name\":\"getSyncedHeader\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"txList\",\"type\":\"bytes\"},{\"internalType\":\"enumLibInvalidTxList.Reason\",\"name\":\"hint\",\"type\":\"uint8\"},{\"internalType\":\"uint256\",\"name\":\"txIdx\",\"type\":\"uint256\"}],\"name\":\"invalidateBlock\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"latestSyncedL1Height\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"publicInputHash\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"name\",\"type\":\"string\"},{\"internalType\":\"bool\",\"name\":\"allowZeroAddress\",\"type\":\"bool\"}],\"name\":\"resolve\",\"outputs\":[{\"internalType\":\"addresspayable\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"chainId\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"name\",\"type\":\"string\"},{\"internalType\":\"bool\",\"name\":\"allowZeroAddress\",\"type\":\"bool\"}],\"name\":\"resolve\",\"outputs\":[{\"internalType\":\"addresspayable\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"}]" // TaikoL2 is an auto generated Go binding around an Ethereum contract. type TaikoL2 struct { diff --git a/packages/status-page/src/constants/abi/TaikoL1.ts b/packages/status-page/src/constants/abi/TaikoL1.ts index 555ddec6060..2220bc4637f 100644 --- a/packages/status-page/src/constants/abi/TaikoL1.ts +++ b/packages/status-page/src/constants/abi/TaikoL1.ts @@ -533,7 +533,7 @@ export default [ }, { internalType: "uint256", - name: "feeBaseMAF", + name: "basefeeMAF", type: "uint256", }, { @@ -746,7 +746,7 @@ export default [ components: [ { internalType: "uint256", - name: "feeBase", + name: "basefee", type: "uint256", }, { @@ -831,7 +831,7 @@ export default [ }, { internalType: "uint256", - name: "_feeBase", + name: "_basefee", type: "uint256", }, ], @@ -1051,7 +1051,7 @@ export default [ }, { internalType: "uint256", - name: "feeBase", + name: "basefee", type: "uint256", }, { diff --git a/packages/tokenomics/.gitignore b/packages/tokenomics/.gitignore deleted file mode 100644 index 932765aeba6..00000000000 --- a/packages/tokenomics/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -__pycache__/ -venv diff --git a/packages/tokenomics/CHANGELOG.md b/packages/tokenomics/CHANGELOG.md deleted file mode 100644 index 61b27a90fae..00000000000 --- a/packages/tokenomics/CHANGELOG.md +++ /dev/null @@ -1,9 +0,0 @@ -# Changelog - -## [0.1.0](https://github.com/taikoxyz/taiko-mono/compare/tokenomics-v0.0.1...tokenomics-v0.1.0) (2023-01-19) - - -### Features - -* implement release-please workflow ([#12967](https://github.com/taikoxyz/taiko-mono/issues/12967)) ([b0c8b60](https://github.com/taikoxyz/taiko-mono/commit/b0c8b60da0af3160db758f83c1f6368a3a712593)) -* **protocol:** implement & simulate tokenomics ([#376](https://github.com/taikoxyz/taiko-mono/issues/376)) ([191eb11](https://github.com/taikoxyz/taiko-mono/commit/191eb110990d60b49883eb3f3d7841c33421d067)) diff --git a/packages/tokenomics/README.md b/packages/tokenomics/README.md deleted file mode 100644 index fc129660dc5..00000000000 --- a/packages/tokenomics/README.md +++ /dev/null @@ -1,15 +0,0 @@ -# README - -## Installation - -You need to install python, **salabim**, **streamlit**, and **matplotlib**. - -```sh -python3 -m venv venv -pip install salabim streamlit matplotlib -``` - -## Usage - -Then in this directory, simply run `streamlit run main.py`, -then visit [http://localhost:8501](http://localhost:8501/) to see simulation results. diff --git a/packages/tokenomics/main.py b/packages/tokenomics/main.py deleted file mode 100644 index f637c36bf84..00000000000 --- a/packages/tokenomics/main.py +++ /dev/null @@ -1,395 +0,0 @@ -import salabim as sim -import matplotlib.pyplot as plt -import streamlit as st -from enum import Enum -from typing import NamedTuple -from plots import plot -from present import Config, Present -from presents.p0 import present as p0 -from presents.cbvp1 import present as cbvp1 -from presents.cbvp2 import present as cbvp2 -from presents.vbcp1 import present as vbcp1 -from presents.vbcp2 import present as vbcp2 -from presents.vbvps1 import present as vbvps1 -from presents.vbvps2 import present as vbvps2 - -# from presents.p7 import present as p7 -# from presents.p8 import present as p8 -# from presents.p9 import present as p9 -# from presents.p10 import present as p10 -# from presents.p11 import present as p11 - -DAY = 24 * 3600 -K_FEE_GRACE_PERIOD = 125 -K_FEE_MAX_PERIOD = 375 -K_BLOCK_TIME_CAP = 48 # 48 seconds -K_PROOF_TIME_CAP = 3600 * 1.5 # 1.5 hour - - -class Status(Enum): - PENDING = 1 - PROVEN = 2 - VERIFIED = 3 - - -class Block(NamedTuple): - status: Status - fee: int - proposed_at: int - proven_at: int - - -def get_day(config): - day = int(env.now() / DAY) - if day >= len(config.timing): - day = len(config.timing) - 1 - return day - - -def get_block_time_avg_second(config): - return config.timing[get_day(config)].block_time_avg_second - - -def get_proof_time_avg_second(config): - return config.timing[get_day(config)].proof_time_avg_minute * 60 - - -def moving_average(ma, v, maf): - if ma == 0: - return v - else: - _ma = (ma * (maf - 1) + v) * 1.0 / maf - if _ma > 0: - return _ma - else: - return ma - - -class Protocol(sim.Component): - def setup(self, config): - self.config = config - self.fee_base = config.fee_base - self.last_proposed_at = env.now() - self.last_VERIFIED_id = 0 - self.tko_supply = 0 - self.avg_block_time = 0 - self.avg_proof_time = 0 - - genesis = Block( - status=Status.VERIFIED, - fee=0, - proposed_at=env.now(), - proven_at=env.now(), - ) - self.blocks = [genesis] - - # monitors - self.m_pending_count = sim.Monitor("m_pending_count", level=True) - self.m_fee_base = sim.Monitor( - "m_fee_base", level=True, initial_tally=self.fee_base - ) - self.m_block_fee = sim.Monitor("m_block_fee", level=True) - self.m_proof_reward = sim.Monitor("m_proof_reward", level=True) - self.m_tko_supply = sim.Monitor("m_tko_supply", level=True) - self.m_block_time = sim.Monitor("m_block_time", level=True) - self.m_proof_time = sim.Monitor("m_proof_time", level=True) - - def get_time_adjusted_fee(self, is_proposal, t_now, t_last, t_avg, t_cap): - # if (tAvg == 0) { - # return s.feeBase; - # } - # uint256 _tAvg = tAvg > tCap ? tCap : tAvg; - # uint256 tGrace = (LibConstants.K_FEE_GRACE_PERIOD * _tAvg) / 100; - # uint256 tMax = (LibConstants.K_FEE_MAX_PERIOD * _tAvg) / 100; - # uint256 a = tLast + tGrace; - # uint256 b = tNow > a ? tNow - a : 0; - # uint256 tRel = (b.min(tMax) * 10000) / tMax; // [0 - 10000] - # uint256 alpha = 10000 + - # ((LibConstants.K_REWARD_MULTIPLIER - 100) * tRel) / - # 100; - # if (isProposal) { - # return (s.feeBase * 10000) / alpha; // fee - # } else { - # return (s.feeBase * alpha) / 10000; // reward - # } - - if t_avg == 0: - return self.fee_base - - if t_avg > t_cap: - _avg = t_cap - else: - _avg = t_avg - - t_grace = K_FEE_GRACE_PERIOD * _avg / 100.0 - t_max = K_FEE_MAX_PERIOD * _avg / 100.0 - a = t_last + t_grace - - if t_now > a: - b = t_now - a - else: - b = 0 - - if b > t_max: - b = t_max - - t_rel = 10000 * b / t_max - - alpha = 10000 + (self.config.reward_multiplier - 1) * t_rel - - if is_proposal: - return self.fee_base * 10000 / alpha - else: - return self.fee_base * alpha / 10000 - - def get_slots_adjusted_fee(self, is_proposal, fee): - # uint256 m = LibConstants.K_MAX_NUM_BLOCKS - - # 1 + - # LibConstants.K_FEE_PREMIUM_LAMDA; - # uint256 n = s.nextBlockId - s.latestVERIFIEDId - 1; - # uint256 k = isProposal ? m - n - 1 : m - n + 1; - # return (fee * (m - 1) * m) / (m - n) / k; - - m = self.config.max_blocks - 1 + self.config.lamda - n = self.num_pending() - if is_proposal: # fee - k = m - n - 1 - else: # reward - k = m - n + 1 - return fee * (m - 1) * m / (m - n) / k - - def get_block_fee(self): - fee = self.get_time_adjusted_fee( - True, - env.now(), - self.last_proposed_at, - self.avg_block_time, - K_BLOCK_TIME_CAP, - ) - - premium_fee = self.get_slots_adjusted_fee(True, fee) - # bootstrap discount not simulated - return (fee, premium_fee) - - def get_proof_reward(self, proven_at, proposed_at): - reward = self.get_time_adjusted_fee( - False, proven_at, proposed_at, self.avg_proof_time, K_PROOF_TIME_CAP - ) - premium_reward = self.get_slots_adjusted_fee(False, reward) - return (reward, premium_reward) - - def print_me(self, st): - st.markdown("-----") - st.markdown("##### Protocol state") - st.write("last_VERIFIED_id = {}".format(self.last_VERIFIED_id)) - st.write("num_blocks = {}".format(self.num_pending())) - st.write("fee_base = {}".format(self.fee_base)) - st.write("tko_supply = {}".format(self.tko_supply)) - - def num_pending(self): - return len(self.blocks) - self.last_VERIFIED_id - 1 - - def can_propose(self): - return self.num_pending() < self.config.max_blocks - - def propose_block(self): - if env.now() == 0 or not self.can_propose(): - return - - block_time = env.now() - self.last_proposed_at - - (fee, premium_fee) = self.get_block_fee() - - self.fee_base = moving_average(self.fee_base, fee, self.config.fee_maf) - self.avg_block_time = moving_average( - self.avg_block_time, - block_time, - self.config.time_avg_maf, - ) - self.last_proposed_at = env.now() - self.tko_supply -= premium_fee - - block = Block( - status=Status.PENDING, - fee=premium_fee, - proposed_at=env.now(), - proven_at=0, - ) - self.blocks.append(block) - - Prover(protocol=self, config=self.config, blockId=len(self.blocks) - 1) - self.verify_block() - - self.m_fee_base.tally(self.fee_base) - self.m_block_fee.tally(premium_fee) - self.m_tko_supply.tally(self.tko_supply) - self.m_block_time.tally(block_time) - self.m_pending_count.tally(self.num_pending()) - - def can_prove(self, id): - return ( - id > self.last_VERIFIED_id - and len(self.blocks) > id - and self.blocks[id].status == Status.PENDING - ) - - def prove_block(self, id): - if self.can_prove(id): - self.blocks[id] = self.blocks[id]._replace( - status=Status.PROVEN, proven_at=env.now() - ) - self.verify_block() - - def can_verify(self): - return ( - len(self.blocks) > self.last_VERIFIED_id + 1 - and self.blocks[self.last_VERIFIED_id + 1].status == Status.PROVEN - and env.now() - > self.blocks[self.last_VERIFIED_id + 1].proven_at + self.avg_proof_time - ) - - def verify_block(self): - for i in range(0, 5): - if self.can_verify(): - - k = self.last_VERIFIED_id + 1 - - self.blocks[k] = self.blocks[k]._replace(status=Status.VERIFIED) - - proof_time = self.blocks[k].proven_at - self.blocks[k].proposed_at - - (reward, premium_reward) = self.get_proof_reward( - self.blocks[k].proven_at, self.blocks[k].proposed_at - ) - - self.fee_base = moving_average( - self.fee_base, - reward, - self.config.fee_maf, - ) - - self.avg_proof_time = moving_average( - self.avg_proof_time, - proof_time, - self.config.time_avg_maf, - ) - - self.tko_supply += premium_reward - self.m_fee_base.tally(self.fee_base) - self.m_proof_reward.tally(premium_reward) - self.m_tko_supply.tally(self.tko_supply) - self.m_proof_time.tally(proof_time) - - self.last_VERIFIED_id = k - else: - break - - self.m_pending_count.tally(self.num_pending()) - - -class Prover(sim.Component): - def setup(self, protocol, config, blockId): - self.protocol = protocol - self.config = config - self.blockId = blockId - - def process(self): - _proof_time_avg_second = get_proof_time_avg_second(self.config) - yield self.hold( - sim.Bounded( - sim.Normal( - _proof_time_avg_second, - _proof_time_avg_second * self.config.proof_time_sd_pctg / 100, - ), - lowerbound=1, - ).sample() - ) - self.protocol.prove_block(self.blockId) - - -class Proposer(sim.Component): - def setup(self, protocol): - self.protocol = protocol - self.config = protocol.config - - def process(self): - while True: - if not self.protocol.can_propose(): - yield self.hold(1) - else: - self.protocol.propose_block() - _block_time_avg_second = get_block_time_avg_second(self.config) - yield self.hold( - sim.Bounded( - sim.Normal( - _block_time_avg_second, - _block_time_avg_second - * self.config.block_time_sd_pctg - / 100, - ), - lowerbound=1, - ).sample() - ) - - -def simulate(config, days): - st.markdown("-----") - st.markdown("##### Block & proof time and deviation settings") - st.caption("[block_time (seconds), proof_time (minutes)]") - time_str = "" - for t in config.timing: - time_str += str(t._asdict().values()) - st.write(time_str.replace("dict_values", " ☀️").replace("(", "").replace(")", "")) - - st.markdown("-----") - st.markdown("##### You can change these settings") - cols = st.columns([1, 1, 1, 1]) - inputs = {} - i = 0 - for (k, v) in config._asdict().items(): - if k != "timing": - inputs[k] = cols[i % 4].number_input(k, value=v) - i += 1 - - st.markdown("-----") - if st.button("Simulate {} days".format(days), key="run"): - actual_config = Config(timing=config.timing, **inputs) - - protocol = Protocol(config=actual_config) - proposer = Proposer(protocol=protocol) - - env.run(till=days * DAY) - - st.markdown("-----") - st.markdown("##### Block/Proof Time") - plot(days, [(protocol.m_block_time, "block time")], color="tab:blue") - plot(days, [(protocol.m_proof_time, "proof time")], color="tab:blue") - - st.markdown("-----") - st.markdown("##### Result") - plot(days, [(protocol.m_pending_count, "num pending blocks")]) - plot(days, [(protocol.m_fee_base, "fee_base")]) - plot(days, [(protocol.m_block_fee, "block fee")], color="tab:green") - plot(days, [(protocol.m_proof_reward, "proof reward")]) - - plot(days, [(protocol.m_tko_supply, "tko supply")], color="tab:red") - - protocol.print_me(st) - - -if __name__ == "__main__": - env = sim.Environment(trace=False) - st.title("Taiko Block Fee/Reward Simulation") - - presents = [p0, cbvp1, cbvp2, vbcp1, vbcp2, vbvps1, vbvps2] - st.markdown("## Configs") - selected = st.radio( - "Please choose one of the following predefined configs:", - range(0, len(presents)), - format_func=lambda x: presents[x].title, - ) - present = presents[selected] - st.markdown("-----") - st.markdown("##### Description") - st.markdown(present.desc) - simulate(present.config, present.days) diff --git a/packages/tokenomics/package.json b/packages/tokenomics/package.json deleted file mode 100644 index c7190abde75..00000000000 --- a/packages/tokenomics/package.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "name": "@taiko/tokenomics", - "version": "0.1.0", - "private": true -} diff --git a/packages/tokenomics/plots.py b/packages/tokenomics/plots.py deleted file mode 100644 index 926848d139b..00000000000 --- a/packages/tokenomics/plots.py +++ /dev/null @@ -1,22 +0,0 @@ -import matplotlib.pyplot as plt -import matplotlib.ticker as ticker -import streamlit as st -import numpy as np - - -@ticker.FuncFormatter -def major_formatter(x, pos): - return "d%d" % (x / 24 / 3600) - - -def plot(days, sources, color="#E28BFD"): - fig, ax = plt.subplots(figsize=(15, 5), nrows=1, ncols=1) - for s in sources: - data = s[0].xt() - ax.plot(data[1], data[0], color, label=s[1]) - ax.legend(loc="lower center", fontsize=18.0) - ax.xaxis.set_ticks(np.arange(0, 24 * 3600 * (days + 1), 24 * 3600)) - ax.xaxis.set_tick_params(labelrotation=45) - ax.xaxis.set_major_formatter(major_formatter) - - st.write(fig) diff --git a/packages/tokenomics/present.py b/packages/tokenomics/present.py deleted file mode 100644 index 02b2e819762..00000000000 --- a/packages/tokenomics/present.py +++ /dev/null @@ -1,25 +0,0 @@ -from typing import NamedTuple - - -class Timing(NamedTuple): - block_time_avg_second: int - proof_time_avg_minute: int - - -class Config(NamedTuple): - max_blocks: int - lamda: float - fee_base: int - fee_maf: int - reward_multiplier: float - block_time_sd_pctg: int - proof_time_sd_pctg: int - time_avg_maf: int - timing: list[Timing] - - -class Present(NamedTuple): - title: str - desc: str - days: int - config: Config diff --git a/packages/tokenomics/presents/cbvp1.py b/packages/tokenomics/presents/cbvp1.py deleted file mode 100644 index f94cb1b9027..00000000000 --- a/packages/tokenomics/presents/cbvp1.py +++ /dev/null @@ -1,66 +0,0 @@ -from present import Config, Timing, Present - -present = Present( - title="cbvp1: constant block time, proof time goes down, up, then restores", - desc=""" - -**About this config** - -- the block time average set to a constant. -- the proof time average varies but eventually changes back to the initial value. - -**What to verify** -- fee_base will become smaller if proof time becomes larger. -- fee_base remains the same if proof time becomes smaller. - -""", - days=21, - config=Config( - max_blocks=2048, - lamda=590, - fee_base=100.0, - fee_maf=1024, - reward_multiplier=4.0, - time_avg_maf=1024, - block_time_sd_pctg=0, - proof_time_sd_pctg=0, - timing=[ - Timing( - block_time_avg_second=15, - proof_time_avg_minute=45, - ), - Timing( - block_time_avg_second=15, - proof_time_avg_minute=45/1.3, - ), - Timing( - block_time_avg_second=15, - proof_time_avg_minute=45/1.3/1.3, - ), - Timing( - block_time_avg_second=15, - proof_time_avg_minute=45/1.3, - ), - Timing( - block_time_avg_second=15, - proof_time_avg_minute=45, - ), - Timing( - block_time_avg_second=15, - proof_time_avg_minute=45*1.3, - ), - Timing( - block_time_avg_second=15, - proof_time_avg_minute=45*1.3*1.3, - ), - Timing( - block_time_avg_second=15, - proof_time_avg_minute=45*1.3, - ), - Timing( - block_time_avg_second=15, - proof_time_avg_minute=45, - ), - ], - ), -) diff --git a/packages/tokenomics/presents/cbvp2.py b/packages/tokenomics/presents/cbvp2.py deleted file mode 100644 index efa29142887..00000000000 --- a/packages/tokenomics/presents/cbvp2.py +++ /dev/null @@ -1,66 +0,0 @@ -from present import Config, Timing, Present - -present = Present( - title="cbvp2: constant block time, proof time goes up, down, then restores", - desc=""" - -**About this config** - -- the block time average set to a constant. -- the proof time average varies but eventually changes back to the initial value. - -**What to verify** -- fee_base will become smaller if proof time becomes larger. -- fee_base remains the same if proof time becomes smaller. - -""", - days=21, - config=Config( - max_blocks=2048, - lamda=590, - fee_base=100.0, - fee_maf=1024, - reward_multiplier=4.0, - time_avg_maf=1024, - block_time_sd_pctg=0, - proof_time_sd_pctg=0, - timing=[ - Timing( - block_time_avg_second=15, - proof_time_avg_minute=45, - ), - Timing( - block_time_avg_second=15, - proof_time_avg_minute=45*1.3, - ), - Timing( - block_time_avg_second=15, - proof_time_avg_minute=45*1.3*1.3, - ), - Timing( - block_time_avg_second=15, - proof_time_avg_minute=45*1.3, - ), - Timing( - block_time_avg_second=15, - proof_time_avg_minute=45, - ), - Timing( - block_time_avg_second=15, - proof_time_avg_minute=45/1.3, - ), - Timing( - block_time_avg_second=15, - proof_time_avg_minute=45/1.3/1.3, - ), - Timing( - block_time_avg_second=15, - proof_time_avg_minute=45/1.3, - ), - Timing( - block_time_avg_second=15, - proof_time_avg_minute=45, - ), - ], - ), -) diff --git a/packages/tokenomics/presents/p0.py b/packages/tokenomics/presents/p0.py deleted file mode 100644 index 52da6756a95..00000000000 --- a/packages/tokenomics/presents/p0.py +++ /dev/null @@ -1,34 +0,0 @@ -from present import Config, Timing, Present - -present = Present( - title="p0: block time and proof time both constant", - desc=""" - -**What to simulate?** - -The most basic model where the block time average and proof time average are both constant. - -**About this config** - -- TKO supply changes initially but stablizes. -- fee_base remains constant - -""", - days=7, - config=Config( - max_blocks=2048, - lamda=590, - fee_base=100.0, - fee_maf=1024, - reward_multiplier=4.0, - time_avg_maf=1024, - block_time_sd_pctg=0, - proof_time_sd_pctg=0, - timing=[ - Timing( - block_time_avg_second=15, - proof_time_avg_minute=45, - ), - ], - ), -) diff --git a/packages/tokenomics/presents/vbcp1.py b/packages/tokenomics/presents/vbcp1.py deleted file mode 100644 index 476c4d05397..00000000000 --- a/packages/tokenomics/presents/vbcp1.py +++ /dev/null @@ -1,66 +0,0 @@ -from present import Config, Timing, Present - -present = Present( - title="vbcp1: constant proof time, block time goes down, up, then restores", - desc=""" - -**About this config** - -- the proof time average set to a constant. -- the block time average varies but eventually changes back to the initial value. - -**What to verify** -- fee_base will become smaller if block time becomes larger. -- fee_base remains the same if block time becomes smaller. - -""", - days=21, - config=Config( - max_blocks=2048, - lamda=590, - fee_base=100.0, - fee_maf=1024, - reward_multiplier=4.0, - time_avg_maf=1024, - block_time_sd_pctg=0, - proof_time_sd_pctg=0, - timing=[ - Timing( - block_time_avg_second=15, - proof_time_avg_minute=45, - ), - Timing( - block_time_avg_second=15/1.3, - proof_time_avg_minute=45, - ), - Timing( - block_time_avg_second=15/1.3/1.3, - proof_time_avg_minute=45, - ), - Timing( - block_time_avg_second=15/1.3, - proof_time_avg_minute=45, - ), - Timing( - block_time_avg_second=15, - proof_time_avg_minute=45, - ), - Timing( - block_time_avg_second=15*1.3, - proof_time_avg_minute=45, - ), - Timing( - block_time_avg_second=15*1.3*1.3, - proof_time_avg_minute=45, - ), - Timing( - block_time_avg_second=15*1.3, - proof_time_avg_minute=45, - ), - Timing( - block_time_avg_second=15, - proof_time_avg_minute=45, - ), - ], - ), -) diff --git a/packages/tokenomics/presents/vbcp2.py b/packages/tokenomics/presents/vbcp2.py deleted file mode 100644 index c581fdb0c25..00000000000 --- a/packages/tokenomics/presents/vbcp2.py +++ /dev/null @@ -1,66 +0,0 @@ -from present import Config, Timing, Present - -present = Present( - title="vbcp2: constant proof time, block time goes up, down, then restores", - desc=""" - -**About this config** - -- the proof time average set to a constant. -- the block time average varies but eventually changes back to the initial value. - -**What to verify** -- fee_base will become smaller if block time becomes larger. -- fee_base remains the same if block time becomes smaller. - -""", - days=21, - config=Config( - max_blocks=2048, - lamda=590, - fee_base=100.0, - fee_maf=1024, - reward_multiplier=4.0, - time_avg_maf=1024, - block_time_sd_pctg=0, - proof_time_sd_pctg=0, - timing=[ - Timing( - block_time_avg_second=15, - proof_time_avg_minute=45, - ), - Timing( - block_time_avg_second=15*1.3, - proof_time_avg_minute=45, - ), - Timing( - block_time_avg_second=15*1.3*1.3, - proof_time_avg_minute=45, - ), - Timing( - block_time_avg_second=15*1.3, - proof_time_avg_minute=45, - ), - Timing( - block_time_avg_second=15, - proof_time_avg_minute=45, - ), - Timing( - block_time_avg_second=15/1.3, - proof_time_avg_minute=45, - ), - Timing( - block_time_avg_second=15/1.3/1.3, - proof_time_avg_minute=45, - ), - Timing( - block_time_avg_second=15/1.3, - proof_time_avg_minute=45, - ), - Timing( - block_time_avg_second=15, - proof_time_avg_minute=45, - ), - ], - ), -) diff --git a/packages/tokenomics/presents/vbvps1.py b/packages/tokenomics/presents/vbvps1.py deleted file mode 100644 index 1808d62b917..00000000000 --- a/packages/tokenomics/presents/vbvps1.py +++ /dev/null @@ -1,57 +0,0 @@ -from present import Config, Timing, Present - -present = Present( - title="vbvps1: block time & proof time both go down, up to the SAME direction, then restores", - desc=""" - -""", - days=21, - config=Config( - max_blocks=2048, - lamda=590, - fee_base=100.0, - fee_maf=1024, - reward_multiplier=4.0, - time_avg_maf=1024, - block_time_sd_pctg=0, - proof_time_sd_pctg=0, - timing=[ - Timing( - block_time_avg_second=15, - proof_time_avg_minute=45, - ), - Timing( - block_time_avg_second=15/1.3, - proof_time_avg_minute=45/1.3, - ), - Timing( - block_time_avg_second=15/1.3/1.3, - proof_time_avg_minute=45/1.3/1.3, - ), - Timing( - block_time_avg_second=15/1.3, - proof_time_avg_minute=45/1.3, - ), - Timing( - block_time_avg_second=15, - proof_time_avg_minute=45, - ), - Timing( - block_time_avg_second=15*1.3, - proof_time_avg_minute=45*1.3, - ), - Timing( - block_time_avg_second=15*1.3*1.3, - proof_time_avg_minute=45*1.3*1.3, - ), - Timing( - block_time_avg_second=15*1.3, - proof_time_avg_minute=45*1.3, - ), - Timing( - block_time_avg_second=15, - proof_time_avg_minute=45, - ), - ], - ), -) diff --git a/packages/tokenomics/presents/vbvps2.py b/packages/tokenomics/presents/vbvps2.py deleted file mode 100644 index f93e04f0df8..00000000000 --- a/packages/tokenomics/presents/vbvps2.py +++ /dev/null @@ -1,56 +0,0 @@ -from present import Config, Timing, Present - -present = Present( - title="vbvps2: block time & proof time both go up, down to the SAME direction, then restores", - desc=""" -""", - days=21, - config=Config( - max_blocks=2048, - lamda=590, - fee_base=100.0, - fee_maf=1024, - reward_multiplier=4.0, - time_avg_maf=1024, - block_time_sd_pctg=0, - proof_time_sd_pctg=0, - timing=[ - Timing( - block_time_avg_second=15, - proof_time_avg_minute=45, - ), - Timing( - block_time_avg_second=15*1.3, - proof_time_avg_minute=45*1.3, - ), - Timing( - block_time_avg_second=15*1.3*1.3, - proof_time_avg_minute=45*1.3*1.3, - ), - Timing( - block_time_avg_second=15*1.3, - proof_time_avg_minute=45*1.3, - ), - Timing( - block_time_avg_second=15, - proof_time_avg_minute=45, - ), - Timing( - block_time_avg_second=15/1.3, - proof_time_avg_minute=45/1.3, - ), - Timing( - block_time_avg_second=15/1.3/1.3, - proof_time_avg_minute=45/1.3/1.3, - ), - Timing( - block_time_avg_second=15/1.3, - proof_time_avg_minute=45/1.3, - ), - Timing( - block_time_avg_second=15, - proof_time_avg_minute=45, - ), - ], - ), -) diff --git a/packages/website/pages/docs/reference/contract-documentation/L1/TaikoData.md b/packages/website/pages/docs/reference/contract-documentation/L1/TaikoData.md index 36b19fe902d..a2e613033bd 100644 --- a/packages/website/pages/docs/reference/contract-documentation/L1/TaikoData.md +++ b/packages/website/pages/docs/reference/contract-documentation/L1/TaikoData.md @@ -1,14 +1,5 @@ ## TaikoData -### FeeConfig - -```solidity -struct FeeConfig { - uint16 avgTimeMAF; - uint16 dampingFactorBips; -} -``` - ### Config ```solidity @@ -22,18 +13,13 @@ struct Config { uint256 maxTransactionsPerBlock; uint256 maxBytesPerTxList; uint256 minTxGasLimit; - uint256 slotSmoothingFactor; - uint256 rewardBurnBips; - uint256 proposerDepositPctg; - uint256 feeBaseMAF; uint256 txListCacheExpiry; - bool relaySignalRoot; + uint64 proofTimeTarget; + uint8 adjustmentQuotient; bool enableSoloProposer; bool enableOracleProver; bool enableTokenomics; bool skipZKPVerification; - struct TaikoData.FeeConfig proposingConfig; - struct TaikoData.FeeConfig provingConfig; } ``` @@ -41,13 +27,12 @@ struct Config { ```solidity struct StateVariables { - uint64 feeBase; + uint64 basefee; + uint64 accBlockFees; uint64 genesisHeight; uint64 genesisTimestamp; uint64 numBlocks; uint64 lastVerifiedBlockId; - uint64 avgBlockTime; - uint64 avgProofTime; uint64 lastProposedAt; } ``` @@ -137,6 +122,7 @@ struct ForkChoice { bytes32 blockHash; bytes32 signalRoot; uint64 provenAt; + uint32 gasUsed; address prover; uint32 gasUsed; } @@ -176,16 +162,16 @@ struct State { mapping(bytes32 => struct TaikoData.TxListInfo) txListInfo; uint64 genesisHeight; uint64 genesisTimestamp; - uint64 __reserved1; - uint64 __reserved2; - uint64 numBlocks; + uint64 __reserved51; + uint64 __reserved52; uint64 lastProposedAt; - uint64 avgBlockTime; - uint64 __reserved3; + uint64 numBlocks; + uint64 accProposedAt; + uint64 accBlockFees; + uint64 basefee; + uint64 proofTimeIssued; uint64 lastVerifiedBlockId; - uint64 __reserved4; - uint64 avgProofTime; - uint64 feeBase; + uint64 __reserved81; uint256[43] __gap; } ``` diff --git a/packages/website/pages/docs/reference/contract-documentation/L1/TaikoL1.md b/packages/website/pages/docs/reference/contract-documentation/L1/TaikoL1.md index 9cb7f6c13a3..ea1cf5aff58 100644 --- a/packages/website/pages/docs/reference/contract-documentation/L1/TaikoL1.md +++ b/packages/website/pages/docs/reference/contract-documentation/L1/TaikoL1.md @@ -10,6 +10,7 @@ struct TaikoData.State state ```solidity function init(address _addressManager, uint64 _feeBase, bytes32 _genesisBlockHash) external + ``` Initialize the rollup. @@ -22,10 +23,11 @@ Initialize the rollup. | \_feeBase | uint64 | The initial value of the proposer-fee/prover-reward feeBase. | | \_genesisBlockHash | bytes32 | The block hash of the genesis block. | + ### proposeBlock ```solidity -function proposeBlock(bytes input, bytes txList) external +function proposeBlock(bytes input, bytes txList) external payable ``` Propose a Taiko L2 block. @@ -103,13 +105,13 @@ function getBalance(address addr) public view returns (uint256) ### getBlockFee ```solidity -function getBlockFee() public view returns (uint256 feeAmount, uint256 depositAmount) +function getBlockFee() public view returns (uint64 feeAmount) ``` ### getProofReward ```solidity -function getProofReward(uint64 provenAt, uint64 proposedAt) public view returns (uint256 reward) +function getProofReward(uint64 provenAt, uint64 proposedAt, uint32 gasUsed) public view returns (uint256 reward) ``` ### getBlock diff --git a/packages/website/pages/docs/reference/contract-documentation/L2/LibL2Consts.md b/packages/website/pages/docs/reference/contract-documentation/L2/LibL2Consts.md index bc1878d609a..ee2f11323a4 100644 --- a/packages/website/pages/docs/reference/contract-documentation/L2/LibL2Consts.md +++ b/packages/website/pages/docs/reference/contract-documentation/L2/LibL2Consts.md @@ -1,7 +1,10 @@ +--- +title: LibL2Consts +--- ## LibL2Consts ### ANCHOR_GAS_COST ```solidity -uint64 ANCHOR_GAS_COST +uint32 ANCHOR_GAS_COST ``` diff --git a/packages/website/pages/docs/reference/contract-documentation/L2/TaikoL2.md b/packages/website/pages/docs/reference/contract-documentation/L2/TaikoL2.md index 382b00c1f33..423660edf2d 100644 --- a/packages/website/pages/docs/reference/contract-documentation/L2/TaikoL2.md +++ b/packages/website/pages/docs/reference/contract-documentation/L2/TaikoL2.md @@ -67,6 +67,7 @@ uint64 gasExcess ```solidity uint64 __reserved1 + ``` ### Anchored @@ -83,6 +84,18 @@ error L2_BASEFEE_MISMATCH(uint64 expected, uint64 actual) ### L2_INVALID_1559_PARAMS +```solidity +event BlockVars(uint64 number, uint64 basefee, uint64 gaslimit, uint64 timestamp, bytes32 parentHash, uint256 prevrandao, address coinbase, uint32 chainid) +``` + +### L2_BASEFEE_MISMATCH + +```solidity +error L2_BASEFEE_MISMATCH(uint64 expected, uint64 actual) +``` + +### L2_INVALID_1559_PARAMS + ```solidity error L2_INVALID_1559_PARAMS() ``` @@ -150,17 +163,16 @@ This transaction shall be the first transaction in every L2 block. #### Parameters -| Name | Type | Description | -| ------------- | ------- | --------------------------------------------------------- | -| l1Hash | bytes32 | The latest L1 block hash when this block was proposed. | -| l1SignalRoot | bytes32 | The latest value of the L1 "signal service storage root". | -| l1Height | uint64 | The latest L1 block height when this block was proposed. | -| parentGasUsed | uint64 | the gas used in the parent block. | +| Name | Type | Description | +| ------------ | ------- | --------------------------------------------------------- | +| l1Height | uint64 | The latest L1 block height when this block was proposed. | +| l1Hash | bytes32 | The latest L1 block hash when this block was proposed. | +| l1SignalRoot | bytes32 | The latest value of the L1 "signal service storage root". | ### getBasefee ```solidity -function getBasefee(uint32 timeSinceParent, uint64 gasLimit, uint64 parentGasUsed) public view returns (uint256 _basefee) +function getBasefee(uint32 timeSinceNow, uint64 gasLimit) public view returns (uint64 _basefee) ``` ### getXchainBlockHash diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index eeaf03b7125..9b5850a0fd2 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -639,8 +639,6 @@ importers: specifier: ^0.12.0 version: 0.12.0(vite@3.2.4) - packages/tokenomics: {} - packages/website: dependencies: next: From 32d1df0605d92e04467b8c6a8ee4c4150823bbe9 Mon Sep 17 00:00:00 2001 From: Daniel Wang <99078276+dantaik@users.noreply.github.com> Date: Sat, 22 Apr 2023 19:30:44 +0800 Subject: [PATCH 42/47] feat(protocol): enable ETH deposit from L1 to L2 using withdrawalsRoot [1] (#13617) Co-authored-by: adaki2004 Co-authored-by: Dani <51912515+adaki2004@users.noreply.github.com> --- .../protocol/contracts/L1/TaikoConfig.sol | 4 + packages/protocol/contracts/L1/TaikoData.sol | 43 +++--- .../protocol/contracts/L1/TaikoErrors.sol | 1 + .../protocol/contracts/L1/TaikoEvents.sol | 2 + packages/protocol/contracts/L1/TaikoL1.sol | 31 +++-- .../contracts/L1/libs/LibEthDepositing.sol | 130 ++++++++++++++++++ .../contracts/L1/libs/LibProposing.sol | 40 +++--- .../protocol/contracts/L1/libs/LibProving.sol | 2 +- .../contracts/L1/libs/LibTokenomics.sol | 37 ++++- .../protocol/contracts/L1/libs/LibUtils.sol | 17 ++- .../contracts/L1/libs/LibVerifying.sol | 51 +++---- .../thirdparty/LibFixedPointMath.sol | 5 +- packages/protocol/foundry.toml | 1 + .../test/tokenomics/proofReward.test.ts | 2 +- packages/protocol/test2/GasComparison.t.sol | 8 +- .../protocol/test2/LibFixedPointMath.t.sol | 8 +- packages/protocol/test2/LibLn.sol | 5 +- packages/protocol/test2/TaikoL1.sim.sol | 7 +- .../test2/TaikoL1LibTokenomicsMainnet.t.sol | 32 ++--- .../test2/TaikoL1LibTokenomicsTestnet.t.sol | 117 ++++++++-------- .../protocol/test2/TaikoL1OracleProver.t.sol | 1 - packages/protocol/test2/TaikoL1TestBase.t.sol | 18 ++- .../contract-documentation/L1/TaikoData.md | 35 +++-- .../contract-documentation/L1/TaikoErrors.md | 6 + .../contract-documentation/L1/TaikoEvents.md | 6 + .../contract-documentation/L1/TaikoL1.md | 51 ++++--- .../contract-documentation/L2/LibL2Consts.md | 5 +- .../contract-documentation/L2/TaikoL2.md | 26 +--- .../bridge/TokenVault.md | 23 ---- 29 files changed, 463 insertions(+), 251 deletions(-) create mode 100644 packages/protocol/contracts/L1/libs/LibEthDepositing.sol diff --git a/packages/protocol/contracts/L1/TaikoConfig.sol b/packages/protocol/contracts/L1/TaikoConfig.sol index fde54c2de58..0d03fe029e7 100644 --- a/packages/protocol/contracts/L1/TaikoConfig.sol +++ b/packages/protocol/contracts/L1/TaikoConfig.sol @@ -26,6 +26,10 @@ library TaikoConfig { // Set it to 79 (+1 TaikoL2.anchor transaction = 80), // and 80 is the upper limit of the Alpha-2 testnet's circuits. maxTransactionsPerBlock: 79, + minEthDepositsPerBlock: 8, + maxEthDepositsPerBlock: 32, + maxEthDepositAmount: 10000 ether, + minEthDepositAmount: 1 ether, // Set it to 120KB, since 128KB is the upper size limit // of a geth transaction, so using 120KB for the proposed // transactions list calldata, 8K for the remaining tx fields. diff --git a/packages/protocol/contracts/L1/TaikoData.sol b/packages/protocol/contracts/L1/TaikoData.sol index e147bbdbfa5..0a27db5c5e6 100644 --- a/packages/protocol/contracts/L1/TaikoData.sol +++ b/packages/protocol/contracts/L1/TaikoData.sol @@ -19,8 +19,11 @@ library TaikoData { uint256 maxTransactionsPerBlock; uint256 maxBytesPerTxList; uint256 minTxGasLimit; - // Moving average factors uint256 txListCacheExpiry; + uint64 minEthDepositsPerBlock; + uint64 maxEthDepositsPerBlock; + uint96 maxEthDepositAmount; + uint96 minEthDepositAmount; uint64 proofTimeTarget; uint8 adjustmentQuotient; bool relaySignalRoot; @@ -39,7 +42,8 @@ library TaikoData { uint64 proofTimeIssued; uint64 lastVerifiedBlockId; uint64 accProposedAt; - uint64 lastProposedAt; + uint64 nextEthDepositToProcess; + uint64 numEthDeposits; } // 3 slots @@ -52,7 +56,6 @@ library TaikoData { uint8 cacheTxListInfo; // non-zero = True } - // 6 slots // Changing this struct requires changing LibUtils.hashMetadata accordingly. struct BlockMetadata { uint64 id; @@ -60,6 +63,7 @@ library TaikoData { uint64 l1Height; bytes32 l1Hash; bytes32 mixHash; + bytes32 depositsRoot; // match L2 header's withdrawalsRoot bytes32 txListHash; uint24 txListByteStart; uint24 txListByteEnd; @@ -67,6 +71,7 @@ library TaikoData { address beneficiary; uint8 cacheTxListInfo; address treasure; + TaikoData.EthDeposit[] depositsProcessed; } struct ZKProof { @@ -127,34 +132,36 @@ library TaikoData { uint24 size; } + // 1 slot + struct EthDeposit { + address recipient; + uint96 amount; + } + struct State { // Ring buffer for proposed blocks and a some recent verified blocks. mapping(uint256 blockId_mode_ringBufferSize => Block) blocks; // solhint-disable-next-line max-line-length mapping(uint256 blockId => mapping(bytes32 parentHash => mapping(uint32 parentGasUsed => uint256 forkChoiceId))) forkChoiceIds; - mapping(address account => uint256 balance) balances; + mapping(address account => uint256 balance) taikoTokenBalances; mapping(bytes32 txListHash => TxListInfo) txListInfo; - // Slot 5: never or rarely changed + EthDeposit[] ethDeposits; + // Slot 6: never or rarely changed uint64 genesisHeight; uint64 genesisTimestamp; - uint64 __reserved51; - uint64 __reserved52; - // Slot 6: changed by proposeBlock - uint64 lastProposedAt; + uint64 __reserved61; + uint64 __reserved62; + // Slot 7 + uint64 accProposedAt; + uint64 accBlockFees; uint64 numBlocks; - uint64 accProposedAt; // also by verifyBlocks - uint64 accBlockFees; // also by verifyBlocks - // Slot 7: changed by proveBlock - // uint64 __reserved71; - // uint64 __reserved72; - // uint64 __reserved73; - // uint64 __reserved74; - // Slot 8: changed by verifyBlocks + uint64 nextEthDepositToProcess; + // Slot 8 uint64 basefee; uint64 proofTimeIssued; uint64 lastVerifiedBlockId; uint64 __reserved81; // Reserved - uint256[43] __gap; + uint256[42] __gap; } } diff --git a/packages/protocol/contracts/L1/TaikoErrors.sol b/packages/protocol/contracts/L1/TaikoErrors.sol index 49e1e20e7b4..88a2a6631c7 100644 --- a/packages/protocol/contracts/L1/TaikoErrors.sol +++ b/packages/protocol/contracts/L1/TaikoErrors.sol @@ -18,6 +18,7 @@ abstract contract TaikoErrors { error L1_INSUFFICIENT_ETHER(); error L1_INSUFFICIENT_TOKEN(); error L1_INVALID_CONFIG(); + error L1_INVALID_ETH_DEPOSIT(); error L1_INVALID_EVIDENCE(); error L1_INVALID_L21559_PARAMS(); error L1_INVALID_METADATA(); diff --git a/packages/protocol/contracts/L1/TaikoEvents.sol b/packages/protocol/contracts/L1/TaikoEvents.sol index 692ae6da5db..63a0ef1fad1 100644 --- a/packages/protocol/contracts/L1/TaikoEvents.sol +++ b/packages/protocol/contracts/L1/TaikoEvents.sol @@ -21,4 +21,6 @@ abstract contract TaikoEvents { ); event BlockVerified(uint256 indexed id, bytes32 blockHash); + + event EthDeposited(TaikoData.EthDeposit deposit); } diff --git a/packages/protocol/contracts/L1/TaikoL1.sol b/packages/protocol/contracts/L1/TaikoL1.sol index 8e5f0d7a6c3..7d8260b8a49 100644 --- a/packages/protocol/contracts/L1/TaikoL1.sol +++ b/packages/protocol/contracts/L1/TaikoL1.sol @@ -9,6 +9,7 @@ pragma solidity ^0.8.18; import {AddressResolver} from "../common/AddressResolver.sol"; import {EssentialContract} from "../common/EssentialContract.sol"; import {IXchainSync} from "../common/IXchainSync.sol"; +import {LibEthDepositing} from "./libs/LibEthDepositing.sol"; import {LibTokenomics} from "./libs/LibTokenomics.sol"; import {LibProposing} from "./libs/LibProposing.sol"; import {LibProving} from "./libs/LibProving.sol"; @@ -25,6 +26,10 @@ contract TaikoL1 is EssentialContract, IXchainSync, TaikoEvents, TaikoErrors { TaikoData.State public state; uint256[100] private __gap; + receive() external payable { + depositEtherToL2(); + } + /** * Initialize the rollup. * @@ -63,9 +68,9 @@ contract TaikoL1 is EssentialContract, IXchainSync, TaikoEvents, TaikoErrors { function proposeBlock( bytes calldata input, bytes calldata txList - ) external nonReentrant { + ) external nonReentrant returns (TaikoData.BlockMetadata memory meta) { TaikoData.Config memory config = getConfig(); - LibProposing.proposeBlock({ + meta = LibProposing.proposeBlock({ state: state, config: config, resolver: AddressResolver(this), @@ -146,22 +151,28 @@ contract TaikoL1 is EssentialContract, IXchainSync, TaikoEvents, TaikoErrors { }); } - function deposit(uint256 amount) external nonReentrant { - LibTokenomics.deposit(state, AddressResolver(this), amount); + function depositTaikoToken(uint256 amount) external nonReentrant { + LibTokenomics.depositTaikoToken(state, AddressResolver(this), amount); } - function withdraw(uint256 amount) external nonReentrant { - LibTokenomics.withdraw(state, AddressResolver(this), amount); + function withdrawTaikoToken(uint256 amount) external nonReentrant { + LibTokenomics.withdrawTaikoToken(state, AddressResolver(this), amount); } - function getBalance(address addr) public view returns (uint256) { - return state.balances[addr]; + function depositEtherToL2() public payable { + LibEthDepositing.depositEtherToL2( + state, + getConfig(), + AddressResolver(this) + ); } - function getBlockFee() public view returns (uint64) { - return state.basefee; + function getTaikoTokenBalance(address addr) public view returns (uint256) { + return state.taikoTokenBalances[addr]; } + function getBlockFee() public view returns (uint64) {} + function getProofReward( uint64 provenAt, uint64 proposedAt diff --git a/packages/protocol/contracts/L1/libs/LibEthDepositing.sol b/packages/protocol/contracts/L1/libs/LibEthDepositing.sol new file mode 100644 index 00000000000..5eed33594f2 --- /dev/null +++ b/packages/protocol/contracts/L1/libs/LibEthDepositing.sol @@ -0,0 +1,130 @@ +// SPDX-License-Identifier: MIT +// _____ _ _ _ _ +// |_ _|_ _(_) |_____ | | __ _| |__ ___ +// | |/ _` | | / / _ \ | |__/ _` | '_ (_-< +// |_|\__,_|_|_\_\___/ |____\__,_|_.__/__/ + +pragma solidity ^0.8.18; + +import {LibAddress} from "../../libs/LibAddress.sol"; +import {LibMath} from "../../libs/LibMath.sol"; +import {AddressResolver} from "../../common/AddressResolver.sol"; +import { + SafeCastUpgradeable +} from "@openzeppelin/contracts-upgradeable/utils/math/SafeCastUpgradeable.sol"; +import {TaikoData} from "../TaikoData.sol"; + +library LibEthDepositing { + using LibAddress for address; + using LibMath for uint256; + using SafeCastUpgradeable for uint256; + + // When maxEthDepositsPerBlock is 32, the average gas cost per + // EthDeposit is about 2700 gas. We use 21000 so the proposer may + // earn a small profit if there are 32 deposits included + // in the block; if there are less EthDeposit to process, the + // proposer may suffer a loss so the proposer should simply wait + // for more EthDeposit be become available. + uint256 public constant GAS_PER_ETH_DEPOSIT = 21000; + uint256 public constant MAX_FEE_PER_ETH_DEPOSIT = 1 ether / 10; // 0.1 Ether. + + error L1_INVALID_ETH_DEPOSIT(); + + event EthDeposited(TaikoData.EthDeposit deposit); + + function depositEtherToL2( + TaikoData.State storage state, + TaikoData.Config memory config, + AddressResolver resolver + ) public { + if ( + msg.value < config.minEthDepositAmount || + msg.value > config.maxEthDepositAmount + ) revert L1_INVALID_ETH_DEPOSIT(); + + TaikoData.EthDeposit memory deposit = TaikoData.EthDeposit({ + recipient: msg.sender, + amount: uint96(msg.value) + }); + + address to = resolver.resolve("ether_vault", true); + if (to == address(0)) { + to = resolver.resolve("bridge", false); + } + to.sendEther(msg.value); + + state.ethDeposits.push(deposit); + emit EthDeposited(deposit); + } + + function processDeposits( + TaikoData.State storage state, + TaikoData.Config memory config, + address beneficiary + ) + internal + returns ( + bytes32 depositsRoot, + TaikoData.EthDeposit[] memory depositsProcessed + ) + { + // Allocate one extra slot for collecting fees on L2 + depositsProcessed = new TaikoData.EthDeposit[]( + config.maxEthDepositsPerBlock + 1 + ); + + uint256 j; // number of deposits to process on L2 + if ( + state.ethDeposits.length >= + state.nextEthDepositToProcess + config.minEthDepositsPerBlock + ) { + unchecked { + uint96 feePerDeposit = uint96( + MAX_FEE_PER_ETH_DEPOSIT.min( + block.basefee * GAS_PER_ETH_DEPOSIT + ) + ); + uint96 totalFee; + uint64 i = state.nextEthDepositToProcess; + while ( + i < state.ethDeposits.length && + i < + state.nextEthDepositToProcess + + config.maxEthDepositsPerBlock + ) { + TaikoData.EthDeposit storage deposit = state.ethDeposits[i]; + if (deposit.amount > feePerDeposit) { + totalFee += feePerDeposit; + depositsProcessed[j].recipient = deposit.recipient; + depositsProcessed[j].amount = + deposit.amount - + feePerDeposit; + ++j; + } else { + totalFee += deposit.amount; + } + + // delete the deposit + deposit.recipient = address(0); + deposit.amount = 0; + ++i; + } + + // Fee collecting deposit + if (totalFee > 0) { + depositsProcessed[j].recipient = beneficiary; + depositsProcessed[j].amount = totalFee; + ++j; + } + // Advance cursor + state.nextEthDepositToProcess = i; + } + } + + // resize the length of depositsProcessed to j. + assembly { + mstore(depositsProcessed, j) + depositsRoot := keccak256(depositsProcessed, mul(j, 32)) + } + } +} diff --git a/packages/protocol/contracts/L1/libs/LibProposing.sol b/packages/protocol/contracts/L1/libs/LibProposing.sol index 265e6c0729d..060f70df549 100644 --- a/packages/protocol/contracts/L1/libs/LibProposing.sol +++ b/packages/protocol/contracts/L1/libs/LibProposing.sol @@ -8,6 +8,7 @@ pragma solidity ^0.8.18; import {AddressResolver} from "../../common/AddressResolver.sol"; import {LibAddress} from "../../libs/LibAddress.sol"; +import {LibEthDepositing} from "./LibEthDepositing.sol"; import {LibTokenomics} from "./LibTokenomics.sol"; import {LibUtils} from "./LibUtils.sol"; import { @@ -40,7 +41,7 @@ library LibProposing { AddressResolver resolver, TaikoData.BlockMetadataInput memory input, bytes calldata txList - ) internal { + ) internal returns (TaikoData.BlockMetadata memory meta) { uint8 cacheTxListInfo = _validateBlock({ state: state, config: config, @@ -60,22 +61,24 @@ library LibProposing { // from the beacon chain. Since multiple Taiko blocks // can be proposed in one Ethereum block, we need to // add salt to this random number as L2 mixHash - TaikoData.BlockMetadata memory meta; + + meta.id = state.numBlocks; + meta.txListHash = input.txListHash; + meta.txListByteStart = input.txListByteStart; + meta.txListByteEnd = input.txListByteEnd; + meta.gasLimit = input.gasLimit; + meta.beneficiary = input.beneficiary; + meta.treasure = resolver.resolve(config.chainId, "treasure", false); + meta.cacheTxListInfo = cacheTxListInfo; + + (meta.depositsRoot, meta.depositsProcessed) = LibEthDepositing + .processDeposits(state, config, input.beneficiary); + unchecked { - meta = TaikoData.BlockMetadata({ - id: state.numBlocks, - timestamp: uint64(block.timestamp), - l1Height: uint64(block.number - 1), - l1Hash: blockhash(block.number - 1), - mixHash: bytes32(block.prevrandao * state.numBlocks), - txListHash: input.txListHash, - txListByteStart: input.txListByteStart, - txListByteEnd: input.txListByteEnd, - gasLimit: input.gasLimit, - beneficiary: input.beneficiary, - treasure: resolver.resolve(config.chainId, "treasure", false), - cacheTxListInfo: cacheTxListInfo - }); + meta.timestamp = uint64(block.timestamp); + meta.l1Height = uint64(block.number - 1); + meta.l1Hash = blockhash(block.number - 1); + meta.mixHash = bytes32(block.prevrandao * state.numBlocks); } TaikoData.Block storage blk = state.blocks[ @@ -90,11 +93,11 @@ library LibProposing { blk.metaHash = LibUtils.hashMetadata(meta); blk.proposer = msg.sender; - if (state.balances[msg.sender] < state.basefee) + if (state.taikoTokenBalances[msg.sender] < state.basefee) revert L1_INSUFFICIENT_TOKEN(); unchecked { - state.balances[msg.sender] -= state.basefee; + state.taikoTokenBalances[msg.sender] -= state.basefee; state.accBlockFees += state.basefee; state.accProposedAt += meta.timestamp; } @@ -103,7 +106,6 @@ library LibProposing { unchecked { ++state.numBlocks; } - state.lastProposedAt = meta.timestamp; } function getBlock( diff --git a/packages/protocol/contracts/L1/libs/LibProving.sol b/packages/protocol/contracts/L1/libs/LibProving.sol index 086ce3ca84a..2b4e12652bd 100644 --- a/packages/protocol/contracts/L1/libs/LibProving.sol +++ b/packages/protocol/contracts/L1/libs/LibProving.sol @@ -57,7 +57,7 @@ library LibProving { bytes32 parentHash = oracles.parentHash; uint32 parentGasUsed = oracles.parentGasUsed; - for (uint i = 0; i < oracles.blks.length; ) { + for (uint256 i = 0; i < oracles.blks.length; ) { uint256 id = blockId + i; if (id <= state.lastVerifiedBlockId || id >= state.numBlocks) diff --git a/packages/protocol/contracts/L1/libs/LibTokenomics.sol b/packages/protocol/contracts/L1/libs/LibTokenomics.sol index 8ec38cfd1a2..b1c6c3a495a 100644 --- a/packages/protocol/contracts/L1/libs/LibTokenomics.sol +++ b/packages/protocol/contracts/L1/libs/LibTokenomics.sol @@ -23,16 +23,16 @@ library LibTokenomics { error L1_INSUFFICIENT_TOKEN(); error L1_INVALID_PARAM(); - function withdraw( + function withdrawTaikoToken( TaikoData.State storage state, AddressResolver resolver, uint256 amount ) internal { - uint256 balance = state.balances[msg.sender]; + uint256 balance = state.taikoTokenBalances[msg.sender]; if (balance < amount) revert L1_INSUFFICIENT_TOKEN(); unchecked { - state.balances[msg.sender] -= amount; + state.taikoTokenBalances[msg.sender] -= amount; } TaikoToken(resolver.resolve("taiko_token", false)).mint( @@ -41,7 +41,7 @@ library LibTokenomics { ); } - function deposit( + function depositTaikoToken( TaikoData.State storage state, AddressResolver resolver, uint256 amount @@ -51,7 +51,7 @@ library LibTokenomics { msg.sender, amount ); - state.balances[msg.sender] += amount; + state.taikoTokenBalances[msg.sender] += amount; } } @@ -124,4 +124,31 @@ library LibTokenomics { newBasefee = uint64(result.min(type(uint64).max)); } + + /** + * Calculating the exponential smoothened with (target/quotient) + * + * @param value Result of cumulativeProofTime + * @param target Target proof time + * @param quotient Quotient + * @return uint64 Calculated new basefee + */ + function _calcBasefee( + uint256 value, + uint256 target, + uint256 quotient + ) private pure returns (uint64) { + uint256 x = (value * Math.SCALING_FACTOR_1E18) / (target * quotient); + + if (Math.MAX_EXP_INPUT <= x) { + x = Math.MAX_EXP_INPUT; + } + + uint256 result = (uint256(Math.exp(int256(x))) / + Math.SCALING_FACTOR_1E18) / (target * quotient); + + if (result > type(uint64).max) return type(uint64).max; + + return uint64(result); + } } diff --git a/packages/protocol/contracts/L1/libs/LibUtils.sol b/packages/protocol/contracts/L1/libs/LibUtils.sol index b88ad8bf95b..17c91348840 100644 --- a/packages/protocol/contracts/L1/libs/LibUtils.sol +++ b/packages/protocol/contracts/L1/libs/LibUtils.sol @@ -61,7 +61,8 @@ library LibUtils { proofTimeIssued: state.proofTimeIssued, lastVerifiedBlockId: state.lastVerifiedBlockId, accProposedAt: state.accProposedAt, - lastProposedAt: state.lastProposedAt + nextEthDepositToProcess: state.nextEthDepositToProcess, + numEthDeposits: uint64(state.ethDeposits.length) }); } @@ -95,7 +96,7 @@ library LibUtils { function hashMetadata( TaikoData.BlockMetadata memory meta ) internal pure returns (bytes32 hash) { - uint256[6] memory inputs; + uint256[7] memory inputs; inputs[0] = (uint256(meta.id) << 192) | @@ -104,19 +105,23 @@ library LibUtils { inputs[1] = uint256(meta.l1Hash); inputs[2] = uint256(meta.mixHash); - inputs[3] = uint256(meta.txListHash); + inputs[3] = uint256(meta.depositsRoot); + inputs[4] = uint256(meta.txListHash); - inputs[4] = + inputs[5] = (uint256(meta.txListByteStart) << 232) | (uint256(meta.txListByteEnd) << 208) | (uint256(meta.gasLimit) << 176) | (uint256(uint160(meta.beneficiary)) << 16) | (uint256(meta.cacheTxListInfo) << 8); - inputs[5] = (uint256(uint160(meta.treasure)) << 96); + inputs[6] = (uint256(uint160(meta.treasure)) << 96); + + // Ignoring `meta.depositsProcessed` as `meta.depositsRoot` + // is a hash of it. assembly { - hash := keccak256(inputs, mul(6, 32)) + hash := keccak256(inputs, mul(7, 32)) } } diff --git a/packages/protocol/contracts/L1/libs/LibVerifying.sol b/packages/protocol/contracts/L1/libs/LibVerifying.sol index 457e88e166f..09be4c3fdec 100644 --- a/packages/protocol/contracts/L1/libs/LibVerifying.sol +++ b/packages/protocol/contracts/L1/libs/LibVerifying.sol @@ -129,24 +129,30 @@ library LibVerifying { TaikoData.ForkChoice storage fc, uint24 fcId ) private { - if (config.proofTimeTarget != 0) { - uint64 proofTime; - unchecked { - proofTime = uint64(fc.provenAt - blk.proposedAt); - } + uint64 proofTime; + unchecked { + proofTime = uint64(fc.provenAt - blk.proposedAt); + } - uint64 reward = LibTokenomics.getProofReward(state, proofTime); + uint64 reward = LibTokenomics.getProofReward(state, proofTime); - (state.proofTimeIssued, state.basefee) = LibTokenomics - .getNewBaseFeeandProofTimeIssued(state, config, proofTime); + (state.proofTimeIssued, state.basefee) = LibTokenomics + .getNewBaseFeeandProofTimeIssued(state, config, proofTime); - unchecked { - state.accBlockFees -= reward; - state.accProposedAt -= blk.proposedAt; - } + unchecked { + state.accBlockFees -= reward; + state.accProposedAt -= blk.proposedAt; + } - // reward the prover - _addToBalance(state, fc.prover, reward); + // reward the prover + if (reward != 0) { + if (state.taikoTokenBalances[fc.prover] == 0) { + // Reduce refund to 1 wei as a penalty if the proposer + // has 0 TKO outstanding balance. + state.taikoTokenBalances[fc.prover] = 1; + } else { + state.taikoTokenBalances[fc.prover] += reward; + } } blk.nextForkChoiceId = 1; @@ -155,21 +161,6 @@ library LibVerifying { emit BlockVerified(blk.blockId, fc.blockHash); } - function _addToBalance( - TaikoData.State storage state, - address account, - uint256 amount - ) private { - if (amount == 0) return; - if (state.balances[account] == 0) { - // Reduce refund to 1 wei as a penalty if the proposer - // has 0 TKO outstanding balance. - state.balances[account] = 1; - } else { - state.balances[account] += amount; - } - } - function _checkConfig(TaikoData.Config memory config) private pure { if ( config.chainId <= 1 || @@ -182,6 +173,8 @@ library LibVerifying { // EIP-4844 blob size up to 128K config.maxBytesPerTxList > 128 * 1024 || config.minTxGasLimit == 0 || + config.maxEthDepositsPerBlock == 0 || + config.maxEthDepositsPerBlock < config.minEthDepositsPerBlock || // EIP-4844 blob deleted after 30 days config.txListCacheExpiry > 30 * 24 hours || config.proofTimeTarget == 0 || diff --git a/packages/protocol/contracts/thirdparty/LibFixedPointMath.sol b/packages/protocol/contracts/thirdparty/LibFixedPointMath.sol index a056e09f44f..57931c6e889 100644 --- a/packages/protocol/contracts/thirdparty/LibFixedPointMath.sol +++ b/packages/protocol/contracts/thirdparty/LibFixedPointMath.sol @@ -65,8 +65,9 @@ library LibFixedPointMath { // * the 1e18 / 2**96 factor for base converison. // We do all of this at once, with an intermediate result in 2**213 basis // so the final right shift is always by a positive amount. - r = int( - (uint(r) * 3822833074963236453042738258902158003155416615667) >> + r = int256( + (uint256(r) * + 3822833074963236453042738258902158003155416615667) >> uint256(195 - k) ); } diff --git a/packages/protocol/foundry.toml b/packages/protocol/foundry.toml index 376e95994b9..dae7b3f78c7 100644 --- a/packages/protocol/foundry.toml +++ b/packages/protocol/foundry.toml @@ -5,6 +5,7 @@ src = 'contracts' out = 'out' test = 'test2' libs = ['lib'] +gas_price = 10000000000 # gas price is 10 Gwei optimizer = true optimizer_runs = 200 ffi = true diff --git a/packages/protocol/test/tokenomics/proofReward.test.ts b/packages/protocol/test/tokenomics/proofReward.test.ts index 0c63740b205..e8c6e6b2be3 100644 --- a/packages/protocol/test/tokenomics/proofReward.test.ts +++ b/packages/protocol/test/tokenomics/proofReward.test.ts @@ -88,7 +88,7 @@ describe("tokenomics: proofReward", function () { // proof reward can be 0. make sure there is a proof reward first if (proofReward.gt(0)) { - const rewardBalance = await taikoL1.getBalance( + const rewardBalance = await taikoL1.getTaikoTokenBalance( await prover.getSigner().getAddress() ); diff --git a/packages/protocol/test2/GasComparison.t.sol b/packages/protocol/test2/GasComparison.t.sol index 41eaaf869ac..7e1cadb675c 100644 --- a/packages/protocol/test2/GasComparison.t.sol +++ b/packages/protocol/test2/GasComparison.t.sol @@ -87,8 +87,10 @@ contract FooBar { txListByteEnd: 1000, gasLimit: 1, mixHash: bytes32(uint256(1)), + depositsRoot: 0, timestamp: 1, - cacheTxListInfo: 0 + cacheTxListInfo: 0, + depositsProcessed: new TaikoData.EthDeposit[](0) }); } @@ -104,8 +106,10 @@ contract FooBar { txListByteEnd: 1000, gasLimit: 1, mixHash: bytes32(uint256(1)), + depositsRoot: 0, timestamp: 1, - cacheTxListInfo: 0 + cacheTxListInfo: 0, + depositsProcessed: new TaikoData.EthDeposit[](0) }); } diff --git a/packages/protocol/test2/LibFixedPointMath.t.sol b/packages/protocol/test2/LibFixedPointMath.t.sol index 8846efaeaf7..1563a196a3b 100644 --- a/packages/protocol/test2/LibFixedPointMath.t.sol +++ b/packages/protocol/test2/LibFixedPointMath.t.sol @@ -13,7 +13,7 @@ contract LibFixedPointMathTest is Test { } function testExpSmallest() public view { - int y = LibFixedPointMath.exp(-42139678854452767550); + int256 y = LibFixedPointMath.exp(-42139678854452767550); console2.log( "LibFixedPointMath.exp(-42139678854452767550)=", @@ -22,8 +22,8 @@ contract LibFixedPointMathTest is Test { } function testExpLargest() public view { - int y = LibFixedPointMath.exp( - int(uint256(LibFixedPointMath.MAX_EXP_INPUT)) + int256 y = LibFixedPointMath.exp( + int256(uint256(LibFixedPointMath.MAX_EXP_INPUT)) ); console2.log( "LibFixedPointMath.exp(135305999368893231588)=", @@ -32,7 +32,7 @@ contract LibFixedPointMathTest is Test { } function testExpSome() public view { - int y = LibFixedPointMath.exp(5e18); + int256 y = LibFixedPointMath.exp(5e18); console2.log("LibFixedPointMath.exp(5e18)=", uint256(y)); } diff --git a/packages/protocol/test2/LibLn.sol b/packages/protocol/test2/LibLn.sol index bcb8ff552d8..c5dc856867c 100644 --- a/packages/protocol/test2/LibLn.sol +++ b/packages/protocol/test2/LibLn.sol @@ -201,8 +201,9 @@ library LibLn { // * the 1e18 / 2**96 factor for base converison. // We do all of this at once, with an intermediate result in 2**213 basis // so the final right shift is always by a positive amount. - r = int( - (uint(r) * 3822833074963236453042738258902158003155416615667) >> + r = int256( + (uint256(r) * + 3822833074963236453042738258902158003155416615667) >> uint256(195 - k) ); } diff --git a/packages/protocol/test2/TaikoL1.sim.sol b/packages/protocol/test2/TaikoL1.sim.sol index 4861f9887c3..4a5a388fd09 100644 --- a/packages/protocol/test2/TaikoL1.sim.sol +++ b/packages/protocol/test2/TaikoL1.sim.sol @@ -132,8 +132,7 @@ contract TaikoL1Simulation is TaikoL1TestBase, FoundryRandom { "lastVerifiedBlockId,", "numBlocks,", "baseFee,", - "accProposedAt,", - "lastProposedAt" + "accProposedAt" ); console2.log(str); } @@ -152,9 +151,7 @@ contract TaikoL1Simulation is TaikoL1TestBase, FoundryRandom { ",", Strings.toString(vars.basefee), ",", - Strings.toString(vars.accProposedAt), - ",", - Strings.toString(vars.lastProposedAt) + Strings.toString(vars.accProposedAt) ); console2.log(str); } diff --git a/packages/protocol/test2/TaikoL1LibTokenomicsMainnet.t.sol b/packages/protocol/test2/TaikoL1LibTokenomicsMainnet.t.sol index f866ff488d8..56c9f8ffa17 100644 --- a/packages/protocol/test2/TaikoL1LibTokenomicsMainnet.t.sol +++ b/packages/protocol/test2/TaikoL1LibTokenomicsMainnet.t.sol @@ -63,8 +63,8 @@ contract TaikoL1LibTokenomicsMainnet is TaikoL1TestBase, FoundryRandom { depositTaikoToken(Bob, 1E8 * 1E8, 100 ether); depositTaikoToken(Carol, 1E8 * 1E8, 100 ether); - Alice_start_balance = L1.getBalance(Alice); - Bob_start_balance = L1.getBalance(Bob); + Alice_start_balance = L1.getTaikoTokenBalance(Alice); + Bob_start_balance = L1.getTaikoTokenBalance(Bob); } /// @dev A possible (close to) mainnet scenarios is the following: @@ -82,8 +82,8 @@ contract TaikoL1LibTokenomicsMainnet is TaikoL1TestBase, FoundryRandom { depositTaikoToken(Carol, 1E8 * 1E8, 1000 ether); // Check balances - Alice_start_balance = L1.getBalance(Alice); - Bob_start_balance = L1.getBalance(Bob); + Alice_start_balance = L1.getTaikoTokenBalance(Alice); + Bob_start_balance = L1.getTaikoTokenBalance(Bob); // Can play to adjust proofTime = 179; // When proofs are coming, 179 means 1790 sec @@ -134,12 +134,12 @@ contract TaikoL1LibTokenomicsMainnet is TaikoL1TestBase, FoundryRandom { } //Check end balances - uint256 deposits = Alice_start_balance - L1.getBalance(Alice); - uint256 withdrawals = L1.getBalance(Bob) - Bob_start_balance; + uint256 deposits = Alice_start_balance - L1.getTaikoTokenBalance(Alice); + uint256 withdrawals = L1.getTaikoTokenBalance(Bob) - Bob_start_balance; //Check end balances - deposits = Alice_start_balance - L1.getBalance(Alice); - withdrawals = L1.getBalance(Bob) - Bob_start_balance; + deposits = Alice_start_balance - L1.getTaikoTokenBalance(Alice); + withdrawals = L1.getTaikoTokenBalance(Bob) - Bob_start_balance; console2.log("Deposits:", deposits); console2.log("withdrawals:", withdrawals); @@ -204,12 +204,12 @@ contract TaikoL1LibTokenomicsMainnet is TaikoL1TestBase, FoundryRandom { } } //Check end balances - uint256 deposits = Alice_start_balance - L1.getBalance(Alice); - uint256 withdrawals = L1.getBalance(Bob) - Bob_start_balance; + uint256 deposits = Alice_start_balance - L1.getTaikoTokenBalance(Alice); + uint256 withdrawals = L1.getTaikoTokenBalance(Bob) - Bob_start_balance; //Check end balances - deposits = Alice_start_balance - L1.getBalance(Alice); - withdrawals = L1.getBalance(Bob) - Bob_start_balance; + deposits = Alice_start_balance - L1.getTaikoTokenBalance(Alice); + withdrawals = L1.getTaikoTokenBalance(Bob) - Bob_start_balance; console2.log("Deposits:", deposits); console2.log("withdrawals:", withdrawals); @@ -274,12 +274,12 @@ contract TaikoL1LibTokenomicsMainnet is TaikoL1TestBase, FoundryRandom { } //Check end balances - uint256 deposits = Alice_start_balance - L1.getBalance(Alice); - uint256 withdrawals = L1.getBalance(Bob) - Bob_start_balance; + uint256 deposits = Alice_start_balance - L1.getTaikoTokenBalance(Alice); + uint256 withdrawals = L1.getTaikoTokenBalance(Bob) - Bob_start_balance; //Check end balances - deposits = Alice_start_balance - L1.getBalance(Alice); - withdrawals = L1.getBalance(Bob) - Bob_start_balance; + deposits = Alice_start_balance - L1.getTaikoTokenBalance(Alice); + withdrawals = L1.getTaikoTokenBalance(Bob) - Bob_start_balance; console2.log("Deposits:", deposits); console2.log("withdrawals:", withdrawals); diff --git a/packages/protocol/test2/TaikoL1LibTokenomicsTestnet.t.sol b/packages/protocol/test2/TaikoL1LibTokenomicsTestnet.t.sol index 6399411a295..5bed56f0aa2 100644 --- a/packages/protocol/test2/TaikoL1LibTokenomicsTestnet.t.sol +++ b/packages/protocol/test2/TaikoL1LibTokenomicsTestnet.t.sol @@ -61,6 +61,7 @@ contract TaikoL1LibTokenomicsTestnet is TaikoL1TestBase { external { mine(1); + depositTaikoToken(Alice, 1E6 * 1E8, 100 ether); depositTaikoToken(Bob, 1E6 * 1E8, 100 ether); depositTaikoToken(Carol, 1E6 * 1E8, 100 ether); @@ -68,8 +69,8 @@ contract TaikoL1LibTokenomicsTestnet is TaikoL1TestBase { bytes32 parentHash = GENESIS_BLOCK_HASH; // Check balances - uint256 Alice_start_balance = L1.getBalance(Alice); - uint256 Bob_start_balance = L1.getBalance(Bob); + uint256 Alice_start_balance = L1.getTaikoTokenBalance(Alice); + uint256 Bob_start_balance = L1.getTaikoTokenBalance(Bob); console2.log("Alice balance:", Alice_start_balance); console2.log("Bob balance:", Bob_start_balance); @@ -107,8 +108,8 @@ contract TaikoL1LibTokenomicsTestnet is TaikoL1TestBase { } //Check end balances - uint256 deposits = Alice_start_balance - L1.getBalance(Alice); - uint256 withdrawals = L1.getBalance(Bob) - Bob_start_balance; + uint256 deposits = Alice_start_balance - L1.getTaikoTokenBalance(Alice); + uint256 withdrawals = L1.getTaikoTokenBalance(Bob) - Bob_start_balance; console2.log("Deposits:", deposits); console2.log("withdrawals:", withdrawals); @@ -150,8 +151,8 @@ contract TaikoL1LibTokenomicsTestnet is TaikoL1TestBase { } //Check end balances - deposits = Alice_start_balance - L1.getBalance(Alice); - withdrawals = L1.getBalance(Bob) - Bob_start_balance; + deposits = Alice_start_balance - L1.getTaikoTokenBalance(Alice); + withdrawals = L1.getTaikoTokenBalance(Bob) - Bob_start_balance; assertEq(deposits, withdrawals); } @@ -174,8 +175,8 @@ contract TaikoL1LibTokenomicsTestnet is TaikoL1TestBase { bytes32 parentHash = GENESIS_BLOCK_HASH; // Check balances - uint256 Alice_start_balance = L1.getBalance(Alice); - uint256 Bob_start_balance = L1.getBalance(Bob); + uint256 Alice_start_balance = L1.getTaikoTokenBalance(Alice); + uint256 Bob_start_balance = L1.getTaikoTokenBalance(Bob); console2.log("Alice balance:", Alice_start_balance); console2.log("Bob balance:", Bob_start_balance); @@ -218,8 +219,8 @@ contract TaikoL1LibTokenomicsTestnet is TaikoL1TestBase { } //Check end balances - uint256 deposits = Alice_start_balance - L1.getBalance(Alice); - uint256 withdrawals = L1.getBalance(Bob) - Bob_start_balance; + uint256 deposits = Alice_start_balance - L1.getTaikoTokenBalance(Alice); + uint256 withdrawals = L1.getTaikoTokenBalance(Bob) - Bob_start_balance; // Run another iteration for (uint256 blockId = 1; blockId < 10; blockId++) { @@ -255,8 +256,8 @@ contract TaikoL1LibTokenomicsTestnet is TaikoL1TestBase { } //Check end balances - deposits = Alice_start_balance - L1.getBalance(Alice); - withdrawals = L1.getBalance(Bob) - Bob_start_balance; + deposits = Alice_start_balance - L1.getTaikoTokenBalance(Alice); + withdrawals = L1.getTaikoTokenBalance(Bob) - Bob_start_balance; console2.log("Deposits:", deposits); console2.log("withdrawals:", withdrawals); @@ -268,6 +269,7 @@ contract TaikoL1LibTokenomicsTestnet is TaikoL1TestBase { external { mine(1); + depositTaikoToken(Alice, 1E6 * 1E8, 100 ether); depositTaikoToken(Bob, 1E6 * 1E8, 100 ether); depositTaikoToken(Carol, 1E6 * 1E8, 100 ether); @@ -275,8 +277,8 @@ contract TaikoL1LibTokenomicsTestnet is TaikoL1TestBase { bytes32 parentHash = GENESIS_BLOCK_HASH; // Check balances - uint256 Alice_start_balance = L1.getBalance(Alice); - uint256 Bob_start_balance = L1.getBalance(Bob); + uint256 Alice_start_balance = L1.getTaikoTokenBalance(Alice); + uint256 Bob_start_balance = L1.getTaikoTokenBalance(Bob); console2.log("Alice balance:", Alice_start_balance); console2.log("Bob balance:", Bob_start_balance); @@ -315,8 +317,8 @@ contract TaikoL1LibTokenomicsTestnet is TaikoL1TestBase { } //Check end balances - uint256 deposits = Alice_start_balance - L1.getBalance(Alice); - uint256 withdrawals = L1.getBalance(Bob) - Bob_start_balance; + uint256 deposits = Alice_start_balance - L1.getTaikoTokenBalance(Alice); + uint256 withdrawals = L1.getTaikoTokenBalance(Bob) - Bob_start_balance; console2.log("Deposits:", deposits); console2.log("withdrawals:", withdrawals); @@ -329,6 +331,7 @@ contract TaikoL1LibTokenomicsTestnet is TaikoL1TestBase { external { mine(1); + depositTaikoToken(Alice, 1E6 * 1E8, 100 ether); depositTaikoToken(Bob, 1E6 * 1E8, 100 ether); depositTaikoToken(Carol, 1E6 * 1E8, 100 ether); @@ -341,8 +344,8 @@ contract TaikoL1LibTokenomicsTestnet is TaikoL1TestBase { bytes32 parentHash = GENESIS_BLOCK_HASH; // Check balances - uint256 Alice_start_balance = L1.getBalance(Alice); - uint256 Bob_start_balance = L1.getBalance(Bob); + uint256 Alice_start_balance = L1.getTaikoTokenBalance(Alice); + uint256 Bob_start_balance = L1.getTaikoTokenBalance(Bob); console2.log("Alice balance:", Alice_start_balance); console2.log("Bob balance:", Bob_start_balance); @@ -385,8 +388,8 @@ contract TaikoL1LibTokenomicsTestnet is TaikoL1TestBase { } //Check end balances - uint256 deposits = Alice_start_balance - L1.getBalance(Alice); - uint256 withdrawals = L1.getBalance(Bob) - Bob_start_balance; + uint256 deposits = Alice_start_balance - L1.getTaikoTokenBalance(Alice); + uint256 withdrawals = L1.getTaikoTokenBalance(Bob) - Bob_start_balance; console2.log("Deposits:", deposits); console2.log("withdrawals:", withdrawals); @@ -399,6 +402,7 @@ contract TaikoL1LibTokenomicsTestnet is TaikoL1TestBase { external { mine(1); + depositTaikoToken(Alice, 1E6 * 1E8, 100 ether); depositTaikoToken(Bob, 1E6 * 1E8, 100 ether); depositTaikoToken(Carol, 1E6 * 1E8, 100 ether); @@ -411,8 +415,8 @@ contract TaikoL1LibTokenomicsTestnet is TaikoL1TestBase { bytes32 parentHash = GENESIS_BLOCK_HASH; // Check balances - uint256 Alice_start_balance = L1.getBalance(Alice); - uint256 Bob_start_balance = L1.getBalance(Bob); + uint256 Alice_start_balance = L1.getTaikoTokenBalance(Alice); + uint256 Bob_start_balance = L1.getTaikoTokenBalance(Bob); console2.log("Alice balance:", Alice_start_balance); console2.log("Bob balance:", Bob_start_balance); @@ -453,8 +457,8 @@ contract TaikoL1LibTokenomicsTestnet is TaikoL1TestBase { } //Check end balances - uint256 deposits = Alice_start_balance - L1.getBalance(Alice); - uint256 withdrawals = L1.getBalance(Bob) - Bob_start_balance; + uint256 deposits = Alice_start_balance - L1.getTaikoTokenBalance(Alice); + uint256 withdrawals = L1.getTaikoTokenBalance(Bob) - Bob_start_balance; // console2.log("Deposits:", deposits); // console2.log("withdrawals:", withdrawals); assertEq(deposits, withdrawals); @@ -465,6 +469,7 @@ contract TaikoL1LibTokenomicsTestnet is TaikoL1TestBase { external { mine(1); + depositTaikoToken(Alice, 1E6 * 1E8, 100 ether); depositTaikoToken(Bob, 1E6 * 1E8, 100 ether); depositTaikoToken(Carol, 1E6 * 1E8, 100 ether); @@ -472,8 +477,8 @@ contract TaikoL1LibTokenomicsTestnet is TaikoL1TestBase { bytes32 parentHash = GENESIS_BLOCK_HASH; // Check balances - uint256 Alice_start_balance = L1.getBalance(Alice); - uint256 Bob_start_balance = L1.getBalance(Bob); + uint256 Alice_start_balance = L1.getTaikoTokenBalance(Alice); + uint256 Bob_start_balance = L1.getTaikoTokenBalance(Bob); console2.log("Alice balance:", Alice_start_balance); console2.log("Bob balance:", Bob_start_balance); @@ -512,8 +517,8 @@ contract TaikoL1LibTokenomicsTestnet is TaikoL1TestBase { } //Check end balances - uint256 deposits = Alice_start_balance - L1.getBalance(Alice); - uint256 withdrawals = L1.getBalance(Bob) - Bob_start_balance; + uint256 deposits = Alice_start_balance - L1.getTaikoTokenBalance(Alice); + uint256 withdrawals = L1.getTaikoTokenBalance(Bob) - Bob_start_balance; console2.log("Deposits:", deposits); console2.log("withdrawals:", withdrawals); @@ -526,6 +531,7 @@ contract TaikoL1LibTokenomicsTestnet is TaikoL1TestBase { external { mine(1); + depositTaikoToken(Alice, 1E6 * 1E8, 100 ether); depositTaikoToken(Bob, 1E6 * 1E8, 100 ether); depositTaikoToken(Carol, 1E6 * 1E8, 100 ether); @@ -538,8 +544,8 @@ contract TaikoL1LibTokenomicsTestnet is TaikoL1TestBase { bytes32 parentHash = GENESIS_BLOCK_HASH; // Check balances - uint256 Alice_start_balance = L1.getBalance(Alice); - uint256 Bob_start_balance = L1.getBalance(Bob); + uint256 Alice_start_balance = L1.getTaikoTokenBalance(Alice); + uint256 Bob_start_balance = L1.getTaikoTokenBalance(Bob); console2.log("Alice balance:", Alice_start_balance); console2.log("Bob balance:", Bob_start_balance); @@ -581,8 +587,8 @@ contract TaikoL1LibTokenomicsTestnet is TaikoL1TestBase { } //Check end balances - uint256 deposits = Alice_start_balance - L1.getBalance(Alice); - uint256 withdrawals = L1.getBalance(Bob) - Bob_start_balance; + uint256 deposits = Alice_start_balance - L1.getTaikoTokenBalance(Alice); + uint256 withdrawals = L1.getTaikoTokenBalance(Bob) - Bob_start_balance; console2.log("Deposits:", deposits); console2.log("withdrawals:", withdrawals); @@ -595,6 +601,7 @@ contract TaikoL1LibTokenomicsTestnet is TaikoL1TestBase { external { mine(1); + depositTaikoToken(Alice, 1E6 * 1E8, 100 ether); depositTaikoToken(Bob, 1E6 * 1E8, 100 ether); depositTaikoToken(Carol, 1E6 * 1E8, 100 ether); @@ -602,8 +609,8 @@ contract TaikoL1LibTokenomicsTestnet is TaikoL1TestBase { bytes32 parentHash = GENESIS_BLOCK_HASH; // Check balances - uint256 Alice_start_balance = L1.getBalance(Alice); - uint256 Bob_start_balance = L1.getBalance(Bob); + uint256 Alice_start_balance = L1.getTaikoTokenBalance(Alice); + uint256 Bob_start_balance = L1.getTaikoTokenBalance(Bob); console2.log("Alice balance:", Alice_start_balance); console2.log("Bob balance:", Bob_start_balance); @@ -641,8 +648,8 @@ contract TaikoL1LibTokenomicsTestnet is TaikoL1TestBase { } //Check end balances - uint256 deposits = Alice_start_balance - L1.getBalance(Alice); - uint256 withdrawals = L1.getBalance(Bob) - Bob_start_balance; + uint256 deposits = Alice_start_balance - L1.getTaikoTokenBalance(Alice); + uint256 withdrawals = L1.getTaikoTokenBalance(Bob) - Bob_start_balance; console2.log("Deposits:", deposits); console2.log("withdrawals:", withdrawals); @@ -683,8 +690,8 @@ contract TaikoL1LibTokenomicsTestnet is TaikoL1TestBase { } //Check end balances - deposits = Alice_start_balance - L1.getBalance(Alice); - withdrawals = L1.getBalance(Bob) - Bob_start_balance; + deposits = Alice_start_balance - L1.getTaikoTokenBalance(Alice); + withdrawals = L1.getTaikoTokenBalance(Bob) - Bob_start_balance; assertEq(deposits, withdrawals); } @@ -695,6 +702,7 @@ contract TaikoL1LibTokenomicsTestnet is TaikoL1TestBase { { mine(1); // Requires a bit more tokens + depositTaikoToken(Alice, 1E8 * 1E8, 100 ether); depositTaikoToken(Bob, 1E8 * 1E8, 100 ether); depositTaikoToken(Carol, 1E8 * 1E8, 100 ether); @@ -706,8 +714,8 @@ contract TaikoL1LibTokenomicsTestnet is TaikoL1TestBase { bytes32 parentHash = GENESIS_BLOCK_HASH; // Check balances - uint256 Alice_start_balance = L1.getBalance(Alice); - uint256 Bob_start_balance = L1.getBalance(Bob); + uint256 Alice_start_balance = L1.getTaikoTokenBalance(Alice); + uint256 Bob_start_balance = L1.getTaikoTokenBalance(Bob); console2.log("Alice balance:", Alice_start_balance); console2.log("Bob balance:", Bob_start_balance); @@ -748,8 +756,8 @@ contract TaikoL1LibTokenomicsTestnet is TaikoL1TestBase { } //Check end balances - uint256 deposits = Alice_start_balance - L1.getBalance(Alice); - uint256 withdrawals = L1.getBalance(Bob) - Bob_start_balance; + uint256 deposits = Alice_start_balance - L1.getTaikoTokenBalance(Alice); + uint256 withdrawals = L1.getTaikoTokenBalance(Bob) - Bob_start_balance; console2.log("Deposits:", deposits); console2.log("withdrawals:", withdrawals); @@ -790,8 +798,8 @@ contract TaikoL1LibTokenomicsTestnet is TaikoL1TestBase { } //Check end balances - deposits = Alice_start_balance - L1.getBalance(Alice); - withdrawals = L1.getBalance(Bob) - Bob_start_balance; + deposits = Alice_start_balance - L1.getTaikoTokenBalance(Alice); + withdrawals = L1.getTaikoTokenBalance(Bob) - Bob_start_balance; // console2.log("Deposits:", deposits); // console2.log("withdrawals:", withdrawals); @@ -803,6 +811,7 @@ contract TaikoL1LibTokenomicsTestnet is TaikoL1TestBase { external { mine(1); + depositTaikoToken(Alice, 1E6 * 1E8, 100 ether); depositTaikoToken(Bob, 1E6 * 1E8, 100 ether); depositTaikoToken(Carol, 1E6 * 1E8, 100 ether); @@ -810,8 +819,8 @@ contract TaikoL1LibTokenomicsTestnet is TaikoL1TestBase { bytes32 parentHash = GENESIS_BLOCK_HASH; // Check balances - uint256 Alice_start_balance = L1.getBalance(Alice); - uint256 Bob_start_balance = L1.getBalance(Bob); + uint256 Alice_start_balance = L1.getTaikoTokenBalance(Alice); + uint256 Bob_start_balance = L1.getTaikoTokenBalance(Bob); console2.log("Alice balance:", Alice_start_balance); console2.log("Bob balance:", Bob_start_balance); @@ -850,8 +859,8 @@ contract TaikoL1LibTokenomicsTestnet is TaikoL1TestBase { } //Check end balances - uint256 deposits = Alice_start_balance - L1.getBalance(Alice); - uint256 withdrawals = L1.getBalance(Bob) - Bob_start_balance; + uint256 deposits = Alice_start_balance - L1.getTaikoTokenBalance(Alice); + uint256 withdrawals = L1.getTaikoTokenBalance(Bob) - Bob_start_balance; console2.log("Deposits:", deposits); console2.log("withdrawals:", withdrawals); @@ -863,8 +872,8 @@ contract TaikoL1LibTokenomicsTestnet is TaikoL1TestBase { function test_balanced_state_reward_and_fee_if_proof_time_stable_non_consecutive() external { - uint256 Alice_start_balance = L1.getBalance(Alice); - uint256 Bob_start_balance = L1.getBalance(Bob); + uint256 Alice_start_balance = L1.getTaikoTokenBalance(Alice); + uint256 Bob_start_balance = L1.getTaikoTokenBalance(Bob); // Need constants here and in loop counter to avoid stack too deep error TaikoData.BlockMetadata[] memory meta = new TaikoData.BlockMetadata[]( @@ -919,12 +928,12 @@ contract TaikoL1LibTokenomicsTestnet is TaikoL1TestBase { } } //Check end balances - uint256 deposits = Alice_start_balance - L1.getBalance(Alice); - uint256 withdrawals = L1.getBalance(Bob) - Bob_start_balance; + uint256 deposits = Alice_start_balance - L1.getTaikoTokenBalance(Alice); + uint256 withdrawals = L1.getTaikoTokenBalance(Bob) - Bob_start_balance; //Check end balances - deposits = Alice_start_balance - L1.getBalance(Alice); - withdrawals = L1.getBalance(Bob) - Bob_start_balance; + deposits = Alice_start_balance - L1.getTaikoTokenBalance(Alice); + withdrawals = L1.getTaikoTokenBalance(Bob) - Bob_start_balance; console2.log("Deposits:", deposits); console2.log("withdrawals:", withdrawals); diff --git a/packages/protocol/test2/TaikoL1OracleProver.t.sol b/packages/protocol/test2/TaikoL1OracleProver.t.sol index 3b0634f060e..8c9614e5c42 100644 --- a/packages/protocol/test2/TaikoL1OracleProver.t.sol +++ b/packages/protocol/test2/TaikoL1OracleProver.t.sol @@ -45,7 +45,6 @@ contract TaikoL1Test is TaikoL1TestBase { function setUp() public override { TaikoL1TestBase.setUp(); registerAddress(L1.getVerifierName(100), address(new Verifier())); - registerAddress("oracle_prover", Alice); } diff --git a/packages/protocol/test2/TaikoL1TestBase.t.sol b/packages/protocol/test2/TaikoL1TestBase.t.sol index 21be8dd66c2..b8227e5ea54 100644 --- a/packages/protocol/test2/TaikoL1TestBase.t.sol +++ b/packages/protocol/test2/TaikoL1TestBase.t.sol @@ -35,6 +35,8 @@ abstract contract TaikoL1TestBase is Test { address public constant L2SS = 0xa008AE5Ba00656a3Cc384de589579e3E52aC030C; address public constant L2TaikoL2 = 0x0082D90249342980d011C58105a03b35cCb4A315; + address public constant L1EthVault = + 0xDAFEA492D9c6733ae3d56b7Ed1ADB60692c98Bc5; address public constant Alice = 0x10020FCb72e27650651B05eD2CEcA493bC807Ba4; address public constant Bob = 0x200708D76eB1B69761c23821809d53F65049939e; @@ -128,7 +130,7 @@ abstract contract TaikoL1TestBase is Test { meta.treasure = L2Treasure; vm.prank(proposer, proposer); - L1.proposeBlock(abi.encode(input), txList); + meta = L1.proposeBlock(abi.encode(input), txList); } function oracleProveBlock( @@ -211,7 +213,7 @@ abstract contract TaikoL1TestBase is Test { vm.deal(who, amountEth); tko.transfer(who, amountTko); vm.prank(who, who); - L1.deposit(amountTko); + L1.depositTaikoToken(amountTko); } function printVariables(string memory comment) internal { @@ -227,9 +229,15 @@ abstract contract TaikoL1TestBase is Test { Strings.toString(vars.numBlocks), "]", " fee:", - Strings.toString(fee), - " lastProposedAt:", - Strings.toString(vars.lastProposedAt), + Strings.toString(fee) + ); + + str = string.concat( + str, + " nextEthDepositToProcess:", + Strings.toString(vars.nextEthDepositToProcess), + " numEthDeposits:", + Strings.toString(vars.numEthDeposits), " // ", comment ); diff --git a/packages/website/pages/docs/reference/contract-documentation/L1/TaikoData.md b/packages/website/pages/docs/reference/contract-documentation/L1/TaikoData.md index a2e613033bd..5c5541c41fa 100644 --- a/packages/website/pages/docs/reference/contract-documentation/L1/TaikoData.md +++ b/packages/website/pages/docs/reference/contract-documentation/L1/TaikoData.md @@ -14,8 +14,13 @@ struct Config { uint256 maxBytesPerTxList; uint256 minTxGasLimit; uint256 txListCacheExpiry; + uint64 minEthDepositsPerBlock; + uint64 maxEthDepositsPerBlock; + uint96 maxEthDepositAmount; + uint96 minEthDepositAmount; uint64 proofTimeTarget; uint8 adjustmentQuotient; + bool relaySignalRoot; bool enableSoloProposer; bool enableOracleProver; bool enableTokenomics; @@ -32,8 +37,11 @@ struct StateVariables { uint64 genesisHeight; uint64 genesisTimestamp; uint64 numBlocks; + uint64 proofTimeIssued; uint64 lastVerifiedBlockId; - uint64 lastProposedAt; + uint64 accProposedAt; + uint64 nextEthDepositToProcess; + uint64 numEthDeposits; } ``` @@ -59,6 +67,7 @@ struct BlockMetadata { uint64 l1Height; bytes32 l1Hash; bytes32 mixHash; + bytes32 depositsRoot; bytes32 txListHash; uint24 txListByteStart; uint24 txListByteEnd; @@ -66,6 +75,7 @@ struct BlockMetadata { address beneficiary; uint8 cacheTxListInfo; address treasure; + struct TaikoData.EthDeposit[] depositsProcessed; } ``` @@ -122,7 +132,6 @@ struct ForkChoice { bytes32 blockHash; bytes32 signalRoot; uint64 provenAt; - uint32 gasUsed; address prover; uint32 gasUsed; } @@ -152,26 +161,36 @@ struct TxListInfo { } ``` +### EthDeposit + +```solidity +struct EthDeposit { + address recipient; + uint96 amount; +} +``` + ### State ```solidity struct State { mapping(uint256 => struct TaikoData.Block) blocks; mapping(uint256 => mapping(bytes32 => mapping(uint32 => uint256))) forkChoiceIds; - mapping(address => uint256) balances; + mapping(address => uint256) taikoTokenBalances; mapping(bytes32 => struct TaikoData.TxListInfo) txListInfo; + struct TaikoData.EthDeposit[] ethDeposits; uint64 genesisHeight; uint64 genesisTimestamp; - uint64 __reserved51; - uint64 __reserved52; - uint64 lastProposedAt; - uint64 numBlocks; + uint64 __reserved61; + uint64 __reserved62; uint64 accProposedAt; uint64 accBlockFees; + uint64 numBlocks; + uint64 nextEthDepositToProcess; uint64 basefee; uint64 proofTimeIssued; uint64 lastVerifiedBlockId; uint64 __reserved81; - uint256[43] __gap; + uint256[42] __gap; } ``` diff --git a/packages/website/pages/docs/reference/contract-documentation/L1/TaikoErrors.md b/packages/website/pages/docs/reference/contract-documentation/L1/TaikoErrors.md index dab3865104e..98a3d509369 100644 --- a/packages/website/pages/docs/reference/contract-documentation/L1/TaikoErrors.md +++ b/packages/website/pages/docs/reference/contract-documentation/L1/TaikoErrors.md @@ -60,6 +60,12 @@ error L1_INSUFFICIENT_TOKEN() error L1_INVALID_CONFIG() ``` +### L1_INVALID_ETH_DEPOSIT + +```solidity +error L1_INVALID_ETH_DEPOSIT() +``` + ### L1_INVALID_EVIDENCE ```solidity diff --git a/packages/website/pages/docs/reference/contract-documentation/L1/TaikoEvents.md b/packages/website/pages/docs/reference/contract-documentation/L1/TaikoEvents.md index a9ab66d65e0..6fe4b5418d1 100644 --- a/packages/website/pages/docs/reference/contract-documentation/L1/TaikoEvents.md +++ b/packages/website/pages/docs/reference/contract-documentation/L1/TaikoEvents.md @@ -17,3 +17,9 @@ event BlockProven(uint256 id, bytes32 parentHash, bytes32 blockHash, bytes32 sig ```solidity event BlockVerified(uint256 id, bytes32 blockHash) ``` + +### EthDeposited + +```solidity +event EthDeposited(struct TaikoData.EthDeposit deposit) +``` diff --git a/packages/website/pages/docs/reference/contract-documentation/L1/TaikoL1.md b/packages/website/pages/docs/reference/contract-documentation/L1/TaikoL1.md index ea1cf5aff58..31b091dbee3 100644 --- a/packages/website/pages/docs/reference/contract-documentation/L1/TaikoL1.md +++ b/packages/website/pages/docs/reference/contract-documentation/L1/TaikoL1.md @@ -6,28 +6,33 @@ struct TaikoData.State state ``` -### init +### receive ```solidity -function init(address _addressManager, uint64 _feeBase, bytes32 _genesisBlockHash) external +receive() external payable +``` + +### init +```solidity +function init(address _addressManager, bytes32 _genesisBlockHash, uint64 _initBasefee, uint64 _initProofTimeIssued) external ``` Initialize the rollup. #### Parameters -| Name | Type | Description | -| ------------------ | ------- | ------------------------------------------------------------ | -| \_addressManager | address | The AddressManager address. | -| \_feeBase | uint64 | The initial value of the proposer-fee/prover-reward feeBase. | -| \_genesisBlockHash | bytes32 | The block hash of the genesis block. | - +| Name | Type | Description | +| --------------------- | ------- | ------------------------------------------------------------ | +| \_addressManager | address | The AddressManager address. | +| \_genesisBlockHash | bytes32 | The block hash of the genesis block. | +| \_initBasefee | uint64 | Initial (reasonable) basefee value. | +| \_initProofTimeIssued | uint64 | Initial proof time which keeps the inflow/outflow in balance | ### proposeBlock ```solidity -function proposeBlock(bytes input, bytes txList) external payable +function proposeBlock(bytes input, bytes txList) external returns (struct TaikoData.BlockMetadata meta) ``` Propose a Taiko L2 block. @@ -84,34 +89,40 @@ Verify up to N blocks. | --------- | ------- | ------------------------------- | | maxBlocks | uint256 | Max number of blocks to verify. | -### deposit +### depositTaikoToken + +```solidity +function depositTaikoToken(uint256 amount) external +``` + +### withdrawTaikoToken ```solidity -function deposit(uint256 amount) external +function withdrawTaikoToken(uint256 amount) external ``` -### withdraw +### depositEtherToL2 ```solidity -function withdraw(uint256 amount) external +function depositEtherToL2() public payable ``` -### getBalance +### getTaikoTokenBalance ```solidity -function getBalance(address addr) public view returns (uint256) +function getTaikoTokenBalance(address addr) public view returns (uint256) ``` ### getBlockFee ```solidity -function getBlockFee() public view returns (uint64 feeAmount) +function getBlockFee() public view returns (uint64) ``` ### getProofReward ```solidity -function getProofReward(uint64 provenAt, uint64 proposedAt, uint32 gasUsed) public view returns (uint256 reward) +function getProofReward(uint64 provenAt, uint64 proposedAt) public view returns (uint64) ``` ### getBlock @@ -149,3 +160,9 @@ function getStateVariables() public view returns (struct TaikoData.StateVariable ```solidity function getConfig() public pure virtual returns (struct TaikoData.Config) ``` + +### getVerifierName + +```solidity +function getVerifierName(uint16 id) public pure returns (string) +``` diff --git a/packages/website/pages/docs/reference/contract-documentation/L2/LibL2Consts.md b/packages/website/pages/docs/reference/contract-documentation/L2/LibL2Consts.md index ee2f11323a4..bc1878d609a 100644 --- a/packages/website/pages/docs/reference/contract-documentation/L2/LibL2Consts.md +++ b/packages/website/pages/docs/reference/contract-documentation/L2/LibL2Consts.md @@ -1,10 +1,7 @@ ---- -title: LibL2Consts ---- ## LibL2Consts ### ANCHOR_GAS_COST ```solidity -uint32 ANCHOR_GAS_COST +uint64 ANCHOR_GAS_COST ``` diff --git a/packages/website/pages/docs/reference/contract-documentation/L2/TaikoL2.md b/packages/website/pages/docs/reference/contract-documentation/L2/TaikoL2.md index 423660edf2d..382b00c1f33 100644 --- a/packages/website/pages/docs/reference/contract-documentation/L2/TaikoL2.md +++ b/packages/website/pages/docs/reference/contract-documentation/L2/TaikoL2.md @@ -67,7 +67,6 @@ uint64 gasExcess ```solidity uint64 __reserved1 - ``` ### Anchored @@ -84,18 +83,6 @@ error L2_BASEFEE_MISMATCH(uint64 expected, uint64 actual) ### L2_INVALID_1559_PARAMS -```solidity -event BlockVars(uint64 number, uint64 basefee, uint64 gaslimit, uint64 timestamp, bytes32 parentHash, uint256 prevrandao, address coinbase, uint32 chainid) -``` - -### L2_BASEFEE_MISMATCH - -```solidity -error L2_BASEFEE_MISMATCH(uint64 expected, uint64 actual) -``` - -### L2_INVALID_1559_PARAMS - ```solidity error L2_INVALID_1559_PARAMS() ``` @@ -163,16 +150,17 @@ This transaction shall be the first transaction in every L2 block. #### Parameters -| Name | Type | Description | -| ------------ | ------- | --------------------------------------------------------- | -| l1Height | uint64 | The latest L1 block height when this block was proposed. | -| l1Hash | bytes32 | The latest L1 block hash when this block was proposed. | -| l1SignalRoot | bytes32 | The latest value of the L1 "signal service storage root". | +| Name | Type | Description | +| ------------- | ------- | --------------------------------------------------------- | +| l1Hash | bytes32 | The latest L1 block hash when this block was proposed. | +| l1SignalRoot | bytes32 | The latest value of the L1 "signal service storage root". | +| l1Height | uint64 | The latest L1 block height when this block was proposed. | +| parentGasUsed | uint64 | the gas used in the parent block. | ### getBasefee ```solidity -function getBasefee(uint32 timeSinceNow, uint64 gasLimit) public view returns (uint64 _basefee) +function getBasefee(uint32 timeSinceParent, uint64 gasLimit, uint64 parentGasUsed) public view returns (uint256 _basefee) ``` ### getXchainBlockHash diff --git a/packages/website/pages/docs/reference/contract-documentation/bridge/TokenVault.md b/packages/website/pages/docs/reference/contract-documentation/bridge/TokenVault.md index e842bce45b7..093bd68a7a0 100644 --- a/packages/website/pages/docs/reference/contract-documentation/bridge/TokenVault.md +++ b/packages/website/pages/docs/reference/contract-documentation/bridge/TokenVault.md @@ -142,29 +142,6 @@ error TOKENVAULT_INVALID_SENDER() function init(address addressManager) external ``` -### sendEther - -```solidity -function sendEther(uint256 destChainId, address to, uint256 gasLimit, uint256 processingFee, address refundAddress, string memo) external payable -``` - -Receives Ether and constructs a Bridge message. Sends the Ether and -message along to the Bridge. - -_This function doesn't' seem to belong here as it has nothing to -do with ERC20 tokens. It's added here only for convenience._ - -#### Parameters - -| Name | Type | Description | -| ------------- | ------- | --------------------------- | -| destChainId | uint256 | @custom:see IBridge.Message | -| to | address | @custom:see IBridge.Message | -| gasLimit | uint256 | @custom:see IBridge.Message | -| processingFee | uint256 | @custom:see IBridge.Message | -| refundAddress | address | @custom:see IBridge.Message | -| memo | string | @custom:see IBridge.Message | - ### sendERC20 ```solidity From c627df898f28fcfb32a8348e38883111d6669359 Mon Sep 17 00:00:00 2001 From: jeff <113397187+cyberhorsey@users.noreply.github.com> Date: Sat, 22 Apr 2023 07:28:12 -0700 Subject: [PATCH 43/47] test(protocol): Bridge foundry tests (#13634) --- .../test/bridge/libs/TestBadReceiver.sol | 22 - .../test/bridge/Bridge.integration.test.ts | 659 ------------------ packages/protocol/test/bridge/Bridge.test.ts | 303 -------- .../test/bridge/libs/LibBridgeInvoke.test.ts | 121 ---- .../test/bridge/libs/LibBridgeProcess.test.ts | 153 ---- .../test/bridge/libs/LibBridgeRetry.test.ts | 371 ---------- .../test/bridge/libs/LibBridgeSend.test.ts | 186 ----- packages/protocol/test/utils/bridge.ts | 3 + packages/protocol/test2/Bridge.t.sol | 443 ++++++++++++ 9 files changed, 446 insertions(+), 1815 deletions(-) delete mode 100644 packages/protocol/contracts/test/bridge/libs/TestBadReceiver.sol delete mode 100644 packages/protocol/test/bridge/Bridge.integration.test.ts delete mode 100644 packages/protocol/test/bridge/Bridge.test.ts delete mode 100644 packages/protocol/test/bridge/libs/LibBridgeInvoke.test.ts delete mode 100644 packages/protocol/test/bridge/libs/LibBridgeProcess.test.ts delete mode 100644 packages/protocol/test/bridge/libs/LibBridgeRetry.test.ts delete mode 100644 packages/protocol/test/bridge/libs/LibBridgeSend.test.ts create mode 100644 packages/protocol/test2/Bridge.t.sol diff --git a/packages/protocol/contracts/test/bridge/libs/TestBadReceiver.sol b/packages/protocol/contracts/test/bridge/libs/TestBadReceiver.sol deleted file mode 100644 index 3deadd43611..00000000000 --- a/packages/protocol/contracts/test/bridge/libs/TestBadReceiver.sol +++ /dev/null @@ -1,22 +0,0 @@ -// SPDX-License-Identifier: MIT -// _____ _ _ _ _ -// |_ _|_ _(_) |_____ | | __ _| |__ ___ -// | |/ _` | | / / _ \ | |__/ _` | '_ (_-< -// |_|\__,_|_|_\_\___/ |____\__,_|_.__/__/ - -pragma solidity ^0.8.18; - -// TODO(roger): Merge this file into TestReceiver.sol. -contract TestBadReceiver { - receive() external payable { - revert("can not send to this contract"); - } - - fallback() external payable { - revert("can not send to this contract"); - } - - function transfer() public pure { - revert("this fails"); - } -} diff --git a/packages/protocol/test/bridge/Bridge.integration.test.ts b/packages/protocol/test/bridge/Bridge.integration.test.ts deleted file mode 100644 index c4f0a0d2cd1..00000000000 --- a/packages/protocol/test/bridge/Bridge.integration.test.ts +++ /dev/null @@ -1,659 +0,0 @@ -import { SignerWithAddress } from "@nomiclabs/hardhat-ethers/signers"; -import { expect } from "chai"; -import { ethers as ethersLib } from "ethers"; -import hre, { ethers } from "hardhat"; -import { - AddressManager, - Bridge, - SignalService, - TestBadReceiver, - TestXchainSync, -} from "../../typechain"; -import deployAddressManager from "../utils/addressManager"; -import { - deployBridge, - processMessage, - sendAndProcessMessage, - sendMessage, -} from "../utils/bridge"; -import { txShouldRevertWithCustomError } from "../utils/errors"; -// import { randomBytes32 } from "../utils/bytes"; -import { Message } from "../utils/message"; -import { - getDefaultL2Signer, - getL1Provider, - getL2Provider, -} from "../utils/provider"; -import { Block, getBlockHeader } from "../utils/rpc"; -import { - deploySignalService, - getSignalProof, - getSignalProofWithAccountProof, -} from "../utils/signal"; - -describe("integrationbridge:Bridge", function () { - let owner: SignerWithAddress; - let l1Provider: ethersLib.providers.JsonRpcProvider; - let l2Provider: ethersLib.providers.JsonRpcProvider; - let l2Signer: ethersLib.Signer; - let srcChainId: number; - let enabledDestChainId: number; - let l2NonOwner: ethersLib.Signer; - let l1SignalService: SignalService; - let l2SignalService: SignalService; - let l1Bridge: Bridge; - let l2Bridge: Bridge; - let m: Message; - let l1XchainSync: TestXchainSync; - let l2XchainSync: TestXchainSync; - - beforeEach(async () => { - [owner] = await ethers.getSigners(); - - const { chainId } = await ethers.provider.getNetwork(); - - srcChainId = chainId; - - l1Provider = getL1Provider(); - - // seondary node to deploy L2 on - l2Provider = getL2Provider(); - - l2Signer = await getDefaultL2Signer(); - - l2NonOwner = await l2Provider.getSigner( - await ethers.Wallet.createRandom().getAddress() - ); - - const l2Network = await l2Provider.getNetwork(); - - enabledDestChainId = l2Network.chainId; - - const addressManager: AddressManager = await deployAddressManager( - owner - ); - - const l2AddressManager: AddressManager = await deployAddressManager( - l2Signer - ); - - ({ signalService: l1SignalService } = await deploySignalService( - owner, - addressManager, - srcChainId - )); - - ({ signalService: l2SignalService } = await deploySignalService( - l2Signer, - l2AddressManager, - enabledDestChainId - )); - - // TODO(): {ethers.utils.solidityPack(chainId, 'dao_vault') - await addressManager.setAddress( - `${enabledDestChainId}.signal_service`, - l2SignalService.address - ); - - await l2AddressManager.setAddress( - `${srcChainId}.signal_service`, - l1SignalService.address - ); - - ({ bridge: l1Bridge } = await deployBridge( - owner, - addressManager, - srcChainId - )); - - ({ bridge: l2Bridge } = await deployBridge( - l2Signer, - l2AddressManager, - enabledDestChainId - )); - - await addressManager.setAddress( - `${enabledDestChainId}.bridge`, - l2Bridge.address - ); - - await l2AddressManager - .connect(l2Signer) - .setAddress(`${srcChainId}.bridge`, l1Bridge.address); - - l1XchainSync = await (await ethers.getContractFactory("TestXchainSync")) - .connect(owner) - .deploy(); - - await addressManager - .connect(owner) - .setAddress(`${srcChainId}.taiko`, l1XchainSync.address); - - l2XchainSync = await (await ethers.getContractFactory("TestXchainSync")) - .connect(l2Signer) - .deploy(); - - await l2AddressManager - .connect(l2Signer) - .setAddress(`${enabledDestChainId}.taiko`, l2XchainSync.address); - - m = { - id: 1, - sender: owner.address, - srcChainId: srcChainId, - destChainId: enabledDestChainId, - owner: owner.address, - to: owner.address, - refundAddress: owner.address, - depositValue: 1000, - callValue: 1000, - processingFee: 1000, - gasLimit: 10000, - data: "0x", - memo: "", - }; - }); - - describe("processMessage()", function () { - it("should throw if message.gasLimit == 0 & msg.sender is not message.owner", async function () { - const m: Message = { - id: 1, - sender: await l2NonOwner.getAddress(), - srcChainId: srcChainId, - destChainId: enabledDestChainId, - owner: await l2NonOwner.getAddress(), - to: await l2Signer.getAddress(), - refundAddress: await l2NonOwner.getAddress(), - depositValue: 1000, - callValue: 1000, - processingFee: 1000, - gasLimit: 0, - data: "0x", - memo: "", - }; - - const { msgHash } = await sendMessage(l1Bridge, m); - - expect(msgHash).not.to.be.eq(ethers.constants.HashZero); - - txShouldRevertWithCustomError( - ( - await l2Bridge - .connect(l2Signer) - .processMessage(m, ethers.constants.HashZero, { - gasLimit: 1000000, - }) - ).wait(1), - l2Provider, - "B_FORBIDDEN()" - ); - }); - - it("should throw if message.destChainId is not equal to current block.chainId", async function () { - const m: Message = { - id: 1, - sender: owner.address, - srcChainId: srcChainId, - destChainId: enabledDestChainId + 1, - owner: owner.address, - to: owner.address, - refundAddress: owner.address, - depositValue: 1000, - callValue: 1000, - processingFee: 1000, - gasLimit: 10000, - data: "0x", - memo: "", - }; - - txShouldRevertWithCustomError( - ( - await l2Bridge - .connect(l2Signer) - .processMessage(m, ethers.constants.HashZero, { - gasLimit: 1000000, - }) - ).wait(1), - l2Provider, - "B_WRONG_CHAIN_ID()" - ); - }); - - it("should throw if messageStatus of message is != NEW", async function () { - const { message, signalProof } = await sendAndProcessMessage( - hre.ethers.provider, - l2XchainSync, - m, - l1SignalService, - l1Bridge, - l2Bridge - ); - - // recalling this process should be prevented as it's status is no longer NEW - txShouldRevertWithCustomError( - ( - await l2Bridge - .connect(l2Signer) - .processMessage(message, signalProof, { - gasLimit: 1000000, - }) - ).wait(1), - l2Provider, - "B_STATUS_MISMATCH()" - ); - }); - - it("should throw if message signalproof is not valid", async function () { - const msgHash = await l1Bridge.hashMessage(m); - const { block, blockHeader } = await getBlockHeader( - hre.ethers.provider - ); - - await l2XchainSync.setXchainBlockHeader(ethers.constants.HashZero); - - const signalProof = await getSignalProofWithAccountProof( - hre.ethers.provider, - l1SignalService.address, - await l1SignalService.getSignalSlot(l1Bridge.address, msgHash), - block.number, - blockHeader - ); - - txShouldRevertWithCustomError( - ( - await l2Bridge - .connect(l2Signer) - .processMessage(m, signalProof, { - gasLimit: 1000000, - }) - ).wait(1), - l2Provider, - "B_SIGNAL_NOT_RECEIVED()" - ); - }); - - it("should throw if message has not been received", async function () { - const { msgHash, message } = await sendMessage(l1Bridge, m); - - expect(msgHash).not.to.be.eq(ethers.constants.HashZero); - - const messageStatus = await l1Bridge.getMessageStatus(msgHash); - - expect(messageStatus).to.be.eq(0); - - const sender = l1Bridge.address; - - const { block, blockHeader } = await getBlockHeader( - hre.ethers.provider - ); - - await l2XchainSync.setXchainBlockHeader(ethers.constants.HashZero); - - const slot = await l1SignalService.getSignalSlot(sender, msgHash); - - // get storageValue for the key - const storageValue = await ethers.provider.getStorageAt( - l1SignalService.address, - slot, - block.number - ); - // make sure it equals 1 so our proof will pass - expect(storageValue).to.be.eq( - "0x0000000000000000000000000000000000000000000000000000000000000001" - ); - - const signalProof = await getSignalProofWithAccountProof( - hre.ethers.provider, - l1SignalService.address, - slot, - block.number, - blockHeader - ); - - txShouldRevertWithCustomError( - ( - await l2Bridge - .connect(l2Signer) - .processMessage(message, signalProof, { - gasLimit: 1000000, - }) - ).wait(1), - l2Provider, - "B_SIGNAL_NOT_RECEIVED()" - ); - }); - - it("processes a message when the signal has been verified from the sending chain", async () => { - const { msgHash, message } = await sendMessage(l1Bridge, m); - - expect(msgHash).not.to.be.eq(ethers.constants.HashZero); - - const messageStatus = await l1Bridge.getMessageStatus(msgHash); - - expect(messageStatus).to.be.eq(0); - let block: Block; - expect( - ({ block } = await processMessage( - l1SignalService, - l1Bridge, - l2Bridge, - msgHash, - hre.ethers.provider, - l2XchainSync, - message - )) - ).to.emit(l2Bridge, "MessageStatusChanged"); - - // get storageValue for the key - const storageValue = await ethers.provider.getStorageAt( - l1SignalService.address, - await l1SignalService.getSignalSlot(l1Bridge.address, msgHash), - block.number - ); - // make sure it equals 1 so our proof will pass - expect(storageValue).to.be.eq( - "0x0000000000000000000000000000000000000000000000000000000000000001" - ); - - txShouldRevertWithCustomError( - ( - await l2Bridge - .connect(l2Signer) - .processMessage(m, ethers.constants.HashZero, { - gasLimit: 1000000, - }) - ).wait(1), - l2Provider, - "B_WRONG_CHAIN_ID()" - ); - }); - }); - - describe("isMessageSent()", function () { - it("should return false, since no message was sent", async function () { - const msgHash = await l1Bridge.hashMessage(m); - - expect(await l1Bridge.isMessageSent(msgHash)).to.be.false; - }); - - it("should return true if message was sent properly", async function () { - const { msgHash } = await sendMessage(l1Bridge, m); - - expect(msgHash).not.to.be.eq(ethers.constants.HashZero); - - expect(await l1Bridge.isMessageSent(msgHash)).to.be.true; - }); - }); - - describe("isMessageReceived()", function () { - it("should throw if signal is not a bridge message; proof is invalid since sender != bridge.", async function () { - const msgHash = ethers.utils.hexlify(ethers.utils.randomBytes(32)); - - const tx = await l1SignalService.connect(owner).sendSignal(msgHash); - - await tx.wait(); - - const sender = owner.address; - - const slot = await l1SignalService.getSignalSlot(sender, msgHash); - - const { block, blockHeader } = await getBlockHeader( - hre.ethers.provider - ); - - await l2XchainSync.setXchainBlockHeader(block.hash); - - // get storageValue for the key - const storageValue = await ethers.provider.getStorageAt( - l1SignalService.address, - slot, - block.number - ); - // make sure it equals 1 so we know sendSignal worked - expect(storageValue).to.be.eq( - "0x0000000000000000000000000000000000000000000000000000000000000001" - ); - - const { signalProof, signalRoot } = await getSignalProof( - hre.ethers.provider, - l1SignalService.address, - slot, - block.number, - blockHeader - ); - - await l2XchainSync.setXchainSignalRoot(signalRoot); - - await expect( - l2Bridge.isMessageReceived(msgHash, srcChainId, signalProof) - ).to.be.reverted; - }); - - it("if message is valid and sent by the bridge it should return true", async function () { - const { msgHash } = await sendMessage(l1Bridge, m); - const slot = await l1SignalService.getSignalSlot( - l1Bridge.address, - msgHash - ); - - const { block, blockHeader } = await getBlockHeader( - hre.ethers.provider - ); - - await l2XchainSync.setXchainBlockHeader(block.hash); - - // get storageValue for the key - const storageValue = await ethers.provider.getStorageAt( - l1SignalService.address, - slot, - block.number - ); - // make sure it equals 1 so we know sendMessage worked - expect(storageValue).to.be.eq( - "0x0000000000000000000000000000000000000000000000000000000000000001" - ); - - const { signalProof, signalRoot } = await getSignalProof( - hre.ethers.provider, - l1SignalService.address, - slot, - block.number, - blockHeader - ); - await l2XchainSync.setXchainSignalRoot(signalRoot); - - expect( - await l2Bridge.isMessageReceived( - msgHash, - srcChainId, - signalProof - ) - ).to.be.true; - }); - }); - - describe("isMessageFailed()", function () { - it("should revert if destChainId == block.chainid", async function () { - const testBadReceiver: TestBadReceiver = await ( - await ethers.getContractFactory("TestBadReceiver") - ) - .connect(owner) - .deploy(); - await testBadReceiver.deployed(); - - const m: Message = { - id: 1, - sender: owner.address, - srcChainId: enabledDestChainId, - destChainId: srcChainId, - owner: owner.address, - to: testBadReceiver.address, - refundAddress: owner.address, - depositValue: 1, - callValue: 10, - processingFee: 1, - gasLimit: 300000, - data: ethers.utils.hexlify(ethers.utils.randomBytes(32)), - memo: "", - }; - const { msgHash } = await sendMessage(l2Bridge, m); - - await expect( - l2Bridge.isMessageFailed( - msgHash, - enabledDestChainId, - ethers.constants.HashZero - ) - ).to.be.revertedWith("B_WRONG_CHAIN_ID()"); - }); - - it("should revert if msgHash == 0", async function () { - await expect( - l2Bridge.isMessageFailed( - ethers.constants.HashZero, - srcChainId, - ethers.constants.HashZero - ) - ).to.be.revertedWith("B_MSG_HASH_NULL()"); - }); - - it("should return false if headerHash hasn't been synced", async function () { - const testBadReceiver: TestBadReceiver = await ( - await ethers.getContractFactory("TestBadReceiver") - ) - .connect(owner) - .deploy(); - await testBadReceiver.deployed(); - - const m: Message = { - id: 1, - sender: owner.address, - srcChainId: enabledDestChainId, - destChainId: srcChainId, - owner: owner.address, - to: testBadReceiver.address, - refundAddress: owner.address, - depositValue: 1, - callValue: 10, - processingFee: 1, - gasLimit: 300000, - data: ethers.utils.hexlify(ethers.utils.randomBytes(32)), - memo: "", - }; - - const { msgHash, message } = await sendMessage(l2Bridge, m); - - const messageStatus = await l1Bridge.getMessageStatus(msgHash); - expect(messageStatus).to.be.eq(0); - - const { messageStatusChangedEvent } = await processMessage( - l2SignalService, - l2Bridge, - l1Bridge, - msgHash, - l2Provider, - l1XchainSync, - message - ); - expect(messageStatusChangedEvent.args.msgHash).to.be.eq(msgHash); - expect(messageStatusChangedEvent.args.status).to.be.eq(1); - - const tx = await l1Bridge - .connect(owner) - .retryMessage(message, true); - const receipt = await tx.wait(); - expect(receipt.status).to.be.eq(1); - - const messageStatus2 = await l1Bridge.getMessageStatus(msgHash); - expect(messageStatus2).to.be.eq(3); - // message status is FAILED on l1Bridge now. - - const { block, blockHeader } = await getBlockHeader(l1Provider); - - const slot = await l1Bridge.getMessageStatusSlot(msgHash); - - const signalProof = await getSignalProofWithAccountProof( - l1Provider, - l1Bridge.address, - slot, - block.number, - blockHeader - ); - - expect( - await l2Bridge.isMessageFailed(msgHash, srcChainId, signalProof) - ).to.be.false; - }); - - it("should return true if message has been sent, processed, retried and failed", async function () { - // L2 -> L1 message - const testBadReceiver: TestBadReceiver = await ( - await ethers.getContractFactory("TestBadReceiver") - ) - .connect(owner) - .deploy(); - await testBadReceiver.deployed(); - - const m: Message = { - id: 1, - sender: owner.address, - srcChainId: enabledDestChainId, - destChainId: srcChainId, - owner: owner.address, - to: testBadReceiver.address, - refundAddress: owner.address, - depositValue: 1, - callValue: 10, - processingFee: 1, - gasLimit: 300000, - data: ethers.utils.hexlify(ethers.utils.randomBytes(32)), - memo: "", - }; - - const { msgHash, message } = await sendMessage(l2Bridge, m); - - const messageStatus = await l1Bridge.getMessageStatus(msgHash); - expect(messageStatus).to.be.eq(0); - - const { messageStatusChangedEvent } = await processMessage( - l2SignalService, - l2Bridge, - l1Bridge, - msgHash, - l2Provider, - l1XchainSync, - message - ); - expect(messageStatusChangedEvent.args.msgHash).to.be.eq(msgHash); - expect(messageStatusChangedEvent.args.status).to.be.eq(1); - - const tx = await l1Bridge - .connect(owner) - .retryMessage(message, true); - const receipt = await tx.wait(); - expect(receipt.status).to.be.eq(1); - - const messageStatus2 = await l1Bridge.getMessageStatus(msgHash); - expect(messageStatus2).to.be.eq(3); - // message status is FAILED on l1Bridge now. - - const { block, blockHeader } = await getBlockHeader(l1Provider); - - await l2XchainSync.setXchainBlockHeader(block.hash); - - const slot = await l1Bridge.getMessageStatusSlot(msgHash); - - const signalProof = await getSignalProofWithAccountProof( - l1Provider, - l1Bridge.address, - slot, - block.number, - blockHeader - ); - - expect( - await l2Bridge.isMessageFailed(msgHash, srcChainId, signalProof) - ).to.be.true; - }); - }); -}); diff --git a/packages/protocol/test/bridge/Bridge.test.ts b/packages/protocol/test/bridge/Bridge.test.ts deleted file mode 100644 index a3f6287553f..00000000000 --- a/packages/protocol/test/bridge/Bridge.test.ts +++ /dev/null @@ -1,303 +0,0 @@ -import { expect } from "chai"; -import { BigNumber } from "ethers"; -import { ethers } from "hardhat"; -import { AddressManager, Bridge, EtherVault } from "../../typechain"; -import { deployBridge, sendMessage } from "../utils/bridge"; -import { deploySignalService } from "../utils/signal"; -import { Message } from "../utils/message"; - -describe("Bridge", function () { - let owner: any; - let nonOwner: any; - let srcChainId: number; - let enabledDestChainId: number; - let l1Bridge: Bridge; - let l1EtherVault: EtherVault; - - beforeEach(async () => { - [owner, nonOwner] = await ethers.getSigners(); - - const { chainId } = await ethers.provider.getNetwork(); - - srcChainId = chainId; - - enabledDestChainId = srcChainId + 1; - - const addressManager: AddressManager = await ( - await ethers.getContractFactory("AddressManager") - ).deploy(); - await addressManager.init(); - - await deploySignalService(owner, addressManager, srcChainId); - - ({ bridge: l1Bridge, etherVault: l1EtherVault } = await deployBridge( - owner, - addressManager, - srcChainId - )); - - await addressManager.setAddress( - `${enabledDestChainId}.bridge`, - "0x0000000000000000000000000000000000000001" // dummy address so chain is "enabled" - ); - }); - - describe("sendMessage()", function () { - it("throws when owner is the zero address", async () => { - const message: Message = { - id: 1, - sender: owner.address, - srcChainId: 1, - destChainId: 5, - owner: ethers.constants.AddressZero, - to: nonOwner.address, - refundAddress: owner.address, - depositValue: 1, - callValue: 1, - processingFee: 1, - gasLimit: 100, - data: ethers.constants.HashZero, - memo: "", - }; - - await expect(l1Bridge.sendMessage(message)).to.be.revertedWith( - "B_OWNER_IS_NULL()" - ); - }); - - it("throws when dest chain id is same as block.chainid", async () => { - const network = await ethers.provider.getNetwork(); - const message: Message = { - id: 1, - sender: owner.address, - srcChainId: 1, - destChainId: network.chainId, - owner: owner.address, - to: nonOwner.address, - refundAddress: owner.address, - depositValue: 1, - callValue: 1, - processingFee: 1, - gasLimit: 100, - data: ethers.constants.HashZero, - memo: "", - }; - - await expect(l1Bridge.sendMessage(message)).to.be.revertedWith( - "B_WRONG_CHAIN_ID()" - ); - }); - - it("throws when dest chain id is not enabled", async () => { - const message: Message = { - id: 1, - sender: owner.address, - srcChainId: 1, - destChainId: 5, - owner: owner.address, - to: nonOwner.address, - refundAddress: owner.address, - depositValue: 1, - callValue: 1, - processingFee: 1, - gasLimit: 100, - data: ethers.constants.HashZero, - memo: "", - }; - - await expect(l1Bridge.sendMessage(message)).to.be.revertedWith( - "B_WRONG_CHAIN_ID()" - ); - }); - - it("throws when msg.value is not the same as expected amount", async () => { - const message: Message = { - id: 1, - sender: owner.address, - srcChainId: 1, - destChainId: enabledDestChainId, - owner: owner.address, - to: nonOwner.address, - refundAddress: owner.address, - depositValue: 1, - callValue: 1, - processingFee: 1, - gasLimit: 100, - data: ethers.constants.HashZero, - memo: "", - }; - - await expect(l1Bridge.sendMessage(message)).to.be.revertedWith( - "B_INCORRECT_VALUE()" - ); - }); - - it("emits event and is successful when message is valid, ether_vault receives the expectedAmount", async () => { - const etherVaultOriginalBalance = await ethers.provider.getBalance( - l1EtherVault.address - ); - - const message: Message = { - id: 1, - sender: owner.address, - srcChainId: 1, - destChainId: enabledDestChainId, - owner: owner.address, - to: nonOwner.address, - refundAddress: owner.address, - depositValue: 1, - callValue: 1, - processingFee: 1, - gasLimit: 100, - data: ethers.constants.HashZero, - memo: "", - }; - - const expectedAmount = - message.depositValue + - message.callValue + - message.processingFee; - - await sendMessage(l1Bridge, message); - - const etherVaultUpdatedBalance = await ethers.provider.getBalance( - l1EtherVault.address - ); - - expect(etherVaultUpdatedBalance).to.be.eq( - etherVaultOriginalBalance.add(expectedAmount) - ); - }); - }); - - // TODO(roger): move tests to SignalService's test file. - // describe("sendSignal()", async function () { - // it("throws when signal is empty", async function () { - // await expect( - // l1Bridge.connect(owner).sendSignal(ethers.constants.HashZero) - // ).to.be.revertedWith("B:signal"); - // }); - - // it("sends signal, confirms it was sent", async function () { - // const hash = - // "0xf2e08f6b93d8cf4f37a3b38f91a8c37198095dde8697463ca3789e25218a8e9d"; - // await expect(l1Bridge.connect(owner).sendSignal(hash)) - // .to.emit(l1Bridge, "SignalSent") - // .withArgs(owner.address, hash); - - // const isSignalSent = await l1Bridge.isSignalSent( - // owner.address, - // hash - // ); - // expect(isSignalSent).to.be.true; - // }); - // }); - - describe("isDestChainEnabled()", function () { - it("is disabled for unabled chainIds", async () => { - const enabled = await l1Bridge.isDestChainEnabled(68); - expect(enabled).to.be.false; - }); - - it("is enabled for enabled chainId", async () => { - const enabled = await l1Bridge.isDestChainEnabled( - enabledDestChainId - ); - expect(enabled).to.be.true; - }); - }); - - describe("context()", function () { - it("returns uninitialized context", async () => { - const ctx = await l1Bridge.context(); - expect(ctx[0]).to.be.eq(ethers.constants.HashZero); - expect(ctx[1]).to.be.eq(ethers.constants.AddressZero); - expect(ctx[2]).to.be.eq(BigNumber.from(0)); - }); - }); - - describe("getMessageStatus()", function () { - it("returns new for uninitialized signal", async () => { - const messageStatus = await l1Bridge.getMessageStatus( - ethers.constants.HashZero - ); - - expect(messageStatus).to.be.eq(0); - }); - - // TODO(jeff/roger): the following test is incorrect - getMessageStatus() - // shall be tested on the destination chain, not the source chain. - // - // it("returns for initiaized signal", async () => { - // const message: Message = { - // id: 1, - // sender: owner.address, - // srcChainId: 1, - // destChainId: enabledDestChainId, - // owner: owner.address, - // to: nonOwner.address, - // refundAddress: owner.address, - // depositValue: 1, - // callValue: 1, - // processingFee: 1, - // gasLimit: 100, - // data: ethers.constants.HashZero, - // memo: "", - // }; - - // const { signal } = await sendMessage(l1Bridge, message); - - // expect(signal).not.to.be.eq(ethers.constants.HashZero); - - // const messageStatus = await l1Bridge.getMessageStatus(signal); - - // expect(messageStatus).to.be.eq(0); - // }); - }); - - describe("processMessage()", async function () { - it("throws when message.gasLimit is 0 and msg.sender is not the message.owner", async () => { - const message: Message = { - id: 1, - sender: owner.address, - srcChainId: 1, - destChainId: enabledDestChainId, - owner: nonOwner.address, - to: owner.address, - refundAddress: owner.address, - depositValue: 1, - callValue: 1, - processingFee: 1, - gasLimit: 0, - data: ethers.constants.HashZero, - memo: "", - }; - - await expect( - l1Bridge.processMessage(message, ethers.constants.HashZero) - ).to.be.revertedWith("B_FORBIDDEN()"); - }); - - it("throws message.destChainId is not block.chainId", async () => { - const message: Message = { - id: 1, - sender: nonOwner.address, - srcChainId: 1, - destChainId: 5, - owner: owner.address, - to: nonOwner.address, - refundAddress: owner.address, - depositValue: 1, - callValue: 1, - processingFee: 1, - gasLimit: 0, - data: ethers.constants.HashZero, - memo: "", - }; - - await expect( - l1Bridge.processMessage(message, ethers.constants.HashZero) - ).to.be.revertedWith("B_WRONG_CHAIN_ID()"); - }); - }); -}); diff --git a/packages/protocol/test/bridge/libs/LibBridgeInvoke.test.ts b/packages/protocol/test/bridge/libs/LibBridgeInvoke.test.ts deleted file mode 100644 index 3df2d1fb783..00000000000 --- a/packages/protocol/test/bridge/libs/LibBridgeInvoke.test.ts +++ /dev/null @@ -1,121 +0,0 @@ -import { expect } from "chai"; -import { ethers } from "hardhat"; -import { Message } from "../../utils/message"; -import { - TestLibBridgeData, - TestLibBridgeInvoke, - TestReceiver, -} from "../../../typechain"; - -// TODO(roger): we should deprecate these test and test Bridge.sol -// as a whole. -describe("LibBridgeInvoke", function () { - let owner: any; - let nonOwner: any; - let libInvoke: TestLibBridgeInvoke; - let libData: TestLibBridgeData; - - before(async function () { - [owner, nonOwner] = await ethers.getSigners(); - }); - - beforeEach(async function () { - libInvoke = await ( - await ethers.getContractFactory("TestLibBridgeInvoke") - ).deploy(); - - libData = await ( - await ethers.getContractFactory("TestLibBridgeData") - ).deploy(); - }); - - describe("invokeMessageCall()", async function () { - it("should throw when gasLimit <= 0", async function () { - const message: Message = { - id: 1, - sender: owner.address, - srcChainId: 1, - destChainId: 5, - owner: owner.address, - to: nonOwner.address, - refundAddress: owner.address, - depositValue: 1, - callValue: 1, - processingFee: 1, - gasLimit: 0, - data: ethers.constants.HashZero, - memo: "", - }; - - const signal = await libData.hashMessage(message); - - await expect( - libInvoke.invokeMessageCall(message, signal, message.gasLimit) - ).to.be.revertedWith("B_GAS_LIMIT()"); - }); - - it("should emit event with success false if message does not actually invoke", async function () { - const message: Message = { - id: 1, - sender: owner.address, - srcChainId: 1, - destChainId: 5, - owner: owner.address, - to: nonOwner.address, - refundAddress: owner.address, - depositValue: 1, - callValue: 1, - processingFee: 1, - gasLimit: 100, - data: ethers.constants.HashZero, - memo: "", - }; - - const signal = await libData.hashMessage(message); - - await expect( - libInvoke.invokeMessageCall(message, signal, message.gasLimit) - ) - .to.emit(libInvoke, "MessageInvoked") - .withArgs(signal, false); - }); - - it("should emit event with success true if message invokes successfully", async function () { - const testReceiver: TestReceiver = await ( - await ethers.getContractFactory("TestReceiver") - ).deploy(); - - await testReceiver.deployed(); - - const ABI = ["function receiveTokens(uint256) payable"]; - const iface = new ethers.utils.Interface(ABI); - const data = iface.encodeFunctionData("receiveTokens", [1]); - - const message: Message = { - id: 1, - sender: owner.address, - srcChainId: 1, - destChainId: 5, - owner: owner.address, - to: testReceiver.address, - refundAddress: owner.address, - depositValue: 1, - callValue: 1, - processingFee: 1, - gasLimit: 300000, - data: data, - memo: "", - }; - - const signal = await libData.hashMessage(message); - - await expect( - libInvoke.invokeMessageCall(message, signal, message.gasLimit, { - value: message.callValue, - }) - ) - .to.emit(libInvoke, "MessageInvoked") - .withArgs(signal, true); - }); - }); -}); diff --git a/packages/protocol/test/bridge/libs/LibBridgeProcess.test.ts b/packages/protocol/test/bridge/libs/LibBridgeProcess.test.ts deleted file mode 100644 index a4abc696464..00000000000 --- a/packages/protocol/test/bridge/libs/LibBridgeProcess.test.ts +++ /dev/null @@ -1,153 +0,0 @@ -import * as helpers from "@nomicfoundation/hardhat-network-helpers"; -import { expect } from "chai"; -import hre, { ethers } from "hardhat"; -import { - getMessageStatusSlot, - Message, - MessageStatus, -} from "../../utils/message"; -import { - AddressManager, - EtherVault, - TestLibBridgeData, - TestLibBridgeProcess, -} from "../../../typechain"; - -// TODO(roger): we should deprecate these test and test Bridge.sol -// as a whole. -describe("LibBridgeProcess", async function () { - let owner: any; - let nonOwner: any; - let etherVaultOwner: any; - let addressManager: AddressManager; - let etherVault: EtherVault; - let libProcess: TestLibBridgeProcess; - let testTaikoData: TestLibBridgeData; - const srcChainId = 1; - const blockChainId = hre.network.config.chainId ?? 0; - - before(async function () { - [owner, nonOwner, etherVaultOwner] = await ethers.getSigners(); - }); - - beforeEach(async function () { - addressManager = await ( - await ethers.getContractFactory("AddressManager") - ).deploy(); - await addressManager.init(); - - etherVault = await (await ethers.getContractFactory("TestEtherVault")) - .connect(etherVaultOwner) - .deploy(); - - await etherVault.deployed(); - - await etherVault.init(addressManager.address); - - await etherVault - .connect(etherVaultOwner) - .authorize(owner.address, true); - const blockChainId = hre.network.config.chainId ?? 0; - await addressManager.setAddress( - `${blockChainId}.ether_vault`, - etherVault.address - ); - // Sends initial value of 10 ether to EtherVault for releaseEther calls - await owner.sendTransaction({ - to: etherVault.address, - value: ethers.utils.parseEther("10.0"), - }); - - libProcess = await ( - await ethers.getContractFactory("TestLibBridgeProcess") - ) - .connect(owner) - .deploy(); - - await libProcess.init(addressManager.address); - - testTaikoData = await ( - await ethers.getContractFactory("TestLibBridgeData") - ).deploy(); - - await etherVault - .connect(etherVaultOwner) - .authorize(libProcess.address, true); - }); - - describe("processMessage()", async function () { - it("should throw if gaslimit == 0 & msg.sender != message.owner", async function () { - const message: Message = { - id: 1, - sender: nonOwner.address, - srcChainId: srcChainId, - destChainId: blockChainId, - owner: nonOwner.address, - to: owner.address, - refundAddress: nonOwner.address, - depositValue: 1, - callValue: 1, - processingFee: 1, - gasLimit: 0, - data: ethers.constants.HashZero, - memo: "", - }; - await expect( - libProcess.processMessage(message, ethers.constants.HashZero) - ).to.be.revertedWith("B_FORBIDDEN()"); - }); - - it("should throw if message.destChain != block.chainId", async function () { - const badBlockChainId = blockChainId + 1; - const message: Message = { - id: 1, - sender: nonOwner.address, - srcChainId: srcChainId, - destChainId: badBlockChainId, - owner: nonOwner.address, - to: owner.address, - refundAddress: nonOwner.address, - depositValue: 1, - callValue: 1, - processingFee: 1, - gasLimit: 100000000, - data: ethers.constants.HashZero, - memo: "", - }; - await expect( - libProcess.processMessage(message, ethers.constants.HashZero) - ).to.be.revertedWith("B_WRONG_CHAIN_ID()"); - }); - - it("should throw if message's status is not NEW", async function () { - const message: Message = { - id: 1, - sender: owner.address, - srcChainId: srcChainId, - destChainId: blockChainId, - owner: owner.address, - to: nonOwner.address, - refundAddress: owner.address, - depositValue: 1, - callValue: 1, - processingFee: 1, - gasLimit: 100000000, - data: ethers.constants.HashZero, - memo: "", - }; - - const signal = await testTaikoData.hashMessage(message); - - await helpers.setStorageAt( - libProcess.address, - await getMessageStatusSlot(hre, signal), - MessageStatus.RETRIABLE - ); - - await expect( - libProcess.processMessage(message, ethers.constants.HashZero) - ).to.be.revertedWith("B_STATUS_MISMTACH()"); - }); - // Remaining test cases require integration, will be covered in Bridge.test.ts - }); -}); diff --git a/packages/protocol/test/bridge/libs/LibBridgeRetry.test.ts b/packages/protocol/test/bridge/libs/LibBridgeRetry.test.ts deleted file mode 100644 index b090ae0451f..00000000000 --- a/packages/protocol/test/bridge/libs/LibBridgeRetry.test.ts +++ /dev/null @@ -1,371 +0,0 @@ -import * as helpers from "@nomicfoundation/hardhat-network-helpers"; -import { expect } from "chai"; -import hre, { ethers } from "hardhat"; -import { - AddressManager, - EtherVault, - TestBadReceiver, - TestLibBridgeData, - TestLibBridgeRetry, - TestReceiver, -} from "../../../typechain"; -import deployAddressManager from "../../utils/addressManager"; -import { - getMessageStatusSlot, - Message, - MessageStatus, -} from "../../utils/message"; - -// TODO(roger): we should deprecate these test and test Bridge.sol -// as a whole. -describe("LibBridgeRetry", function () { - let owner: any; - let nonOwner: any; - let refundAddress: any; - let etherVaultOwner: any; - let etherVault: EtherVault; - let libRetry: TestLibBridgeRetry; - let badLibRetry: TestLibBridgeRetry; - let testTaikoData: TestLibBridgeData; - - before(async function () { - [owner, nonOwner, refundAddress, etherVaultOwner] = - await ethers.getSigners(); - }); - - beforeEach(async function () { - const addressManager: AddressManager = await deployAddressManager( - owner - ); - - const badAddressManager: AddressManager = await deployAddressManager( - owner - ); - - etherVault = await (await ethers.getContractFactory("TestEtherVault")) - .connect(etherVaultOwner) - .deploy(); - - await etherVault.deployed(); - - await etherVault.init(addressManager.address); - - await etherVault - .connect(etherVaultOwner) - .authorize(owner.address, true); - const blockChainId = hre.network.config.chainId ?? 0; - await addressManager.setAddress( - `${blockChainId}.ether_vault`, - etherVault.address - ); - - await badAddressManager.setAddress( - `${blockChainId}.ether_vault`, - ethers.constants.AddressZero - ); - - await owner.sendTransaction({ - to: etherVault.address, - value: ethers.utils.parseEther("10.0"), - }); - - const libRetryFactory = await ( - await ethers.getContractFactory("TestLibBridgeRetry") - ).connect(owner); - - libRetry = await libRetryFactory.deploy(); - await libRetry.init(addressManager.address); - await libRetry.deployed(); - - badLibRetry = await libRetryFactory.deploy(); - await badLibRetry.init(badAddressManager.address); - await badLibRetry.deployed(); - - await etherVault - .connect(etherVaultOwner) - .authorize(libRetry.address, true); - - testTaikoData = await ( - await ethers.getContractFactory("TestLibBridgeData") - ).deploy(); - }); - - describe("retryMessage()", async function () { - it("should throw if message.gaslimit == 0 && msg.sender != message.owner", async function () { - const message: Message = { - id: 1, - sender: owner.address, - srcChainId: 1, - destChainId: 5, - owner: nonOwner.address, - to: nonOwner.address, - refundAddress: owner.address, - depositValue: 1, - callValue: 1, - processingFee: 1, - gasLimit: 0, - data: ethers.constants.HashZero, - memo: "", - }; - - await expect( - libRetry.retryMessage(message, false) - ).to.be.revertedWith("B_DENIED()"); - }); - - it("should throw if lastAttempt == true && msg.sender != message.owner", async function () { - const message: Message = { - id: 1, - sender: owner.address, - srcChainId: 1, - destChainId: 5, - owner: nonOwner.address, - to: nonOwner.address, - refundAddress: owner.address, - depositValue: 1, - callValue: 1, - processingFee: 1, - gasLimit: 1000000, - data: ethers.constants.HashZero, - memo: "", - }; - - await expect( - libRetry.retryMessage(message, true) - ).to.be.revertedWith("B_DENIED()"); - }); - - it("should throw if message status is not RETRIABLE", async function () { - const message: Message = { - id: 1, - sender: owner.address, - srcChainId: 1, - destChainId: 5, - owner: owner.address, - to: nonOwner.address, - refundAddress: owner.address, - depositValue: 1, - callValue: 1, - processingFee: 1, - gasLimit: 300000, - data: ethers.constants.HashZero, - memo: "", - }; - - await expect( - libRetry.retryMessage(message, false) - ).to.be.revertedWith("B_MSG_NON_RETRIABLE()"); - }); - - it("if etherVault resolves to address(0), retry should fail and messageStatus should not change if not lastAttempt since no ether received", async function () { - const testReceiver: TestReceiver = await ( - await ethers.getContractFactory("TestReceiver") - ).deploy(); - - await testReceiver.deployed(); - - const destChainId = 5; - const message: Message = { - id: 1, - sender: owner.address, - srcChainId: 1, - destChainId: destChainId, - owner: owner.address, - to: testReceiver.address, - refundAddress: refundAddress.address, - depositValue: 1, - callValue: 1, - processingFee: 1, - gasLimit: 1, - data: ethers.constants.HashZero, - memo: "", - }; - - const signal = await testTaikoData.hashMessage(message); - - await helpers.setStorageAt( - badLibRetry.address, - await getMessageStatusSlot(hre, signal), - MessageStatus.RETRIABLE - ); - - const originalToBalance = await testReceiver.getBalance(); - await badLibRetry.retryMessage(message, false); - const newToBalance = await testReceiver.getBalance(); - expect( - decode( - hre, - "uint256", - await ethers.provider.getStorageAt( - badLibRetry.address, - getMessageStatusSlot(hre, signal) - ) - ) - ).to.equal(MessageStatus.RETRIABLE.toString()); - - expect(newToBalance).to.be.equal(originalToBalance); - }); - - it("should fail, but since lastAttempt == true messageStatus should be set to DONE", async function () { - const testBadReceiver: TestBadReceiver = await ( - await ethers.getContractFactory("TestBadReceiver") - ).deploy(); - - await testBadReceiver.deployed(); - - const destChainId = 5; - const message: Message = { - id: 1, - sender: owner.address, - srcChainId: 1, - destChainId: destChainId, - owner: owner.address, - to: testBadReceiver.address, - refundAddress: refundAddress.address, - depositValue: 1, - callValue: 1, - processingFee: 1, - gasLimit: 300000, - data: ethers.constants.HashZero, - memo: "", - }; - - const signal = await testTaikoData.hashMessage(message); - - await helpers.setStorageAt( - libRetry.address, - await getMessageStatusSlot(hre, signal), - MessageStatus.RETRIABLE - ); - - const originalBalance = await refundAddress.getBalance(); - await libRetry.retryMessage(message, true); - const balancePlusRefund = await refundAddress.getBalance(); - - expect( - decode( - hre, - "uint256", - await ethers.provider.getStorageAt( - libRetry.address, - getMessageStatusSlot(hre, signal) - ) - ) - ).to.equal(MessageStatus.FAILED.toString()); - - expect(balancePlusRefund).to.be.equal( - originalBalance.add(message.callValue) - ); - }); - - it("should fail, messageStatus is still RETRIABLE and balance is returned to etherVault", async function () { - const testBadReceiver: TestBadReceiver = await ( - await ethers.getContractFactory("TestBadReceiver") - ).deploy(); - - await testBadReceiver.deployed(); - - const destChainId = 5; - const message: Message = { - id: 1, - sender: owner.address, - srcChainId: 1, - destChainId: destChainId, - owner: owner.address, - to: testBadReceiver.address, - refundAddress: ethers.constants.AddressZero, - depositValue: 0, - callValue: 1, - processingFee: 1, - gasLimit: 300000, - data: ethers.constants.HashZero, - memo: "", - }; - - const signal = await testTaikoData.hashMessage(message); - - await helpers.setStorageAt( - libRetry.address, - await getMessageStatusSlot(hre, signal), - MessageStatus.RETRIABLE - ); - - const originalBalance = await ethers.provider.getBalance( - etherVault.address - ); - await libRetry.retryMessage(message, false); - const balancePlusRefund = await ethers.provider.getBalance( - etherVault.address - ); - - expect( - decode( - hre, - "uint256", - await ethers.provider.getStorageAt( - libRetry.address, - getMessageStatusSlot(hre, signal) - ) - ) - ).to.equal(MessageStatus.RETRIABLE.toString()); - - expect(balancePlusRefund).to.be.equal(originalBalance); - }); - - it("should succeed, set message status to done, invoke message succesfsully", async function () { - const testReceiver: TestReceiver = await ( - await ethers.getContractFactory("TestReceiver") - ).deploy(); - - await testReceiver.deployed(); - - const destChainId = 5; - const message: Message = { - id: 1, - sender: owner.address, - srcChainId: 1, - destChainId: destChainId, - owner: owner.address, - to: testReceiver.address, - refundAddress: refundAddress.address, - depositValue: 1, - callValue: 1, - processingFee: 1, - gasLimit: 1, - data: ethers.constants.HashZero, - memo: "", - }; - - const signal = await testTaikoData.hashMessage(message); - - await helpers.setStorageAt( - libRetry.address, - await getMessageStatusSlot(hre, signal), - MessageStatus.RETRIABLE - ); - - const originalToBalance = await testReceiver.getBalance(); - await libRetry.retryMessage(message, true); - const newToBalance = await testReceiver.getBalance(); - - expect( - decode( - hre, - "uint256", - await ethers.provider.getStorageAt( - libRetry.address, - getMessageStatusSlot(hre, signal) - ) - ) - ).to.equal(MessageStatus.DONE.toString()); - - expect(newToBalance).to.be.equal( - originalToBalance.add(message.callValue) - ); - }); - }); -}); - -function decode(hre: any, type: any, data: any) { - return hre.ethers.utils.defaultAbiCoder.decode([type], data).toString(); -} diff --git a/packages/protocol/test/bridge/libs/LibBridgeSend.test.ts b/packages/protocol/test/bridge/libs/LibBridgeSend.test.ts deleted file mode 100644 index 221e2e44505..00000000000 --- a/packages/protocol/test/bridge/libs/LibBridgeSend.test.ts +++ /dev/null @@ -1,186 +0,0 @@ -import { expect } from "chai"; -import hre, { ethers } from "hardhat"; -import { - AddressManager, - TestLibBridgeSend, - EtherVault, -} from "../../../typechain"; -import { Message } from "../../utils/message"; -import { deploySignalService } from "../../utils/signal"; - -// TODO(roger): we should deprecate these test and test Bridge.sol -// as a whole. -describe("LibBridgeSend", function () { - let owner: any; - let nonOwner: any; - let etherVaultOwner: any; - let libSend: TestLibBridgeSend; - let blockChainId: number; - const enabledDestChainId = 100; - const srcChainId = 1; - - before(async function () { - [owner, nonOwner, etherVaultOwner] = await ethers.getSigners(); - blockChainId = hre.network.config.chainId ?? 0; - }); - - beforeEach(async function () { - const addressManager: AddressManager = await ( - await ethers.getContractFactory("AddressManager") - ).deploy(); - await addressManager.init(); - - await deploySignalService(owner, addressManager, blockChainId); - - await addressManager.setAddress( - `${enabledDestChainId}.bridge`, - "0x0000000000000000000000000000000000000001" // dummy address so chain is "enabled" - ); - - const etherVault: EtherVault = await ( - await ethers.getContractFactory("TestEtherVault") - ) - .connect(etherVaultOwner) - .deploy(); - - await etherVault.deployed(); - await etherVault.init(addressManager.address); - - await addressManager.setAddress( - `${blockChainId}.ether_vault`, - etherVault.address - ); - - libSend = await (await ethers.getContractFactory("TestLibBridgeSend")) - .connect(owner) - .deploy(); - - await libSend.init(addressManager.address); - await etherVault - .connect(etherVaultOwner) - .authorize(libSend.address, true); - }); - - describe("sendMessage()", async function () { - it("should throw when message.owner == address(0)", async function () { - const nonEnabledDestChain = 2; - - const message: Message = { - id: 1, - sender: owner.address, - srcChainId: srcChainId, - destChainId: nonEnabledDestChain, - owner: ethers.constants.AddressZero, - to: nonOwner.address, - refundAddress: owner.address, - depositValue: 1, - callValue: 1, - processingFee: 1, - gasLimit: 100, - data: ethers.constants.HashZero, - memo: "", - }; - - await expect(libSend.sendMessage(message)).to.be.revertedWith( - "B_OWNER_IS_NULL()" - ); - }); - - it("should throw when destchainId == block.chainId", async function () { - const message: Message = { - id: 1, - sender: owner.address, - srcChainId: srcChainId, - destChainId: blockChainId, - owner: owner.address, - to: nonOwner.address, - refundAddress: owner.address, - depositValue: 1, - callValue: 1, - processingFee: 1, - gasLimit: 100, - data: ethers.constants.HashZero, - memo: "", - }; - - await expect(libSend.sendMessage(message)).to.be.revertedWith( - "B_WRONG_CHAIN_ID()" - ); - }); - - it("should throw when destChainId has not yet been enabled", async function () { - const nonEnabledDestChain = 2; - - const message: Message = { - id: 1, - sender: owner.address, - srcChainId: srcChainId, - destChainId: nonEnabledDestChain, - owner: owner.address, - to: nonOwner.address, - refundAddress: owner.address, - depositValue: 1, - callValue: 1, - processingFee: 1, - gasLimit: 100, - data: ethers.constants.HashZero, - memo: "", - }; - - await expect(libSend.sendMessage(message)).to.be.revertedWith( - "B_WRONG_CHAIN_ID()" - ); - }); - - it("should throw when expectedAmount != msg.value", async function () { - const message: Message = { - id: 1, - sender: owner.address, - srcChainId: srcChainId, - destChainId: enabledDestChainId, - owner: owner.address, - to: nonOwner.address, - refundAddress: owner.address, - depositValue: 1, - callValue: 1, - processingFee: 1, - gasLimit: 100, - data: ethers.constants.HashZero, - memo: "", - }; - - await expect(libSend.sendMessage(message)).to.be.revertedWith( - "B_INCORRECT_VALUE()" - ); - }); - - it("should emit MessageSent() event and signal should be hashed correctly", async function () { - const message: Message = { - id: 1, - sender: owner.address, - srcChainId: srcChainId, - destChainId: enabledDestChainId, - owner: owner.address, - to: nonOwner.address, - refundAddress: owner.address, - depositValue: 1, - callValue: 1, - processingFee: 1, - gasLimit: 100, - data: ethers.constants.HashZero, - memo: "", - }; - - const expectedAmount = - message.depositValue + - message.callValue + - message.processingFee; - - expect( - await libSend.sendMessage(message, { - value: expectedAmount, - }) - ).to.emit(libSend, "MessageSent"); - }); - }); -}); diff --git a/packages/protocol/test/utils/bridge.ts b/packages/protocol/test/utils/bridge.ts index a303935f57d..6bd3ed8c5d8 100644 --- a/packages/protocol/test/utils/bridge.ts +++ b/packages/protocol/test/utils/bridge.ts @@ -74,6 +74,9 @@ async function sendMessage( }> { const expectedAmount = m.depositValue + m.callValue + m.processingFee; + m.refundAddress = "0x10020FCb72e27650651B05eD2CEcA493bC807Ba4"; + m.to = "0x200708D76eB1B69761c23821809d53F65049939e"; + m.gasLimit = 1000000; const tx = await bridge.sendMessage(m, { value: expectedAmount, }); diff --git a/packages/protocol/test2/Bridge.t.sol b/packages/protocol/test2/Bridge.t.sol new file mode 100644 index 00000000000..94d59a6b7c9 --- /dev/null +++ b/packages/protocol/test2/Bridge.t.sol @@ -0,0 +1,443 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.18; + +import {AddressManager} from "../contracts/thirdparty/AddressManager.sol"; +import {IBridge, Bridge} from "../contracts/bridge/Bridge.sol"; +import {BridgeErrors} from "../contracts/bridge/BridgeErrors.sol"; +import {EtherVault} from "../contracts/bridge/EtherVault.sol"; +import {console2} from "forge-std/console2.sol"; +import {LibBridgeStatus} from "../contracts/bridge/libs/LibBridgeStatus.sol"; +import {SignalService} from "../contracts/signal/SignalService.sol"; +import {Test} from "forge-std/Test.sol"; +import {IXchainSync} from "../contracts/common/IXchainSync.sol"; + +contract BadReceiver { + receive() external payable { + revert("can not send to this contract"); + } + + fallback() external payable { + revert("can not send to this contract"); + } + + function transfer() public pure { + revert("this fails"); + } +} + +contract PrankXchainSync is IXchainSync { + bytes32 private _blockHash; + bytes32 private _signalRoot; + + function setXchainBlockHeader(bytes32 blockHash) external { + _blockHash = blockHash; + } + + function setXchainSignalRoot(bytes32 signalRoot) external { + _signalRoot = signalRoot; + } + + function getXchainBlockHash(uint256) external view returns (bytes32) { + return _blockHash; + } + + function getXchainSignalRoot(uint256) external view returns (bytes32) { + return _signalRoot; + } +} + +contract BridgeTest is Test { + AddressManager addressManager; + BadReceiver badReceiver; + Bridge bridge; + Bridge destChainBridge; + EtherVault etherVault; + SignalService signalService; + PrankXchainSync xChainSync; + uint256 destChainId = 19389; + + address public constant Alice = 0x10020FCb72e27650651B05eD2CEcA493bC807Ba4; + + address public constant Bob = 0x50081b12838240B1bA02b3177153Bca678a86078; + + function setUp() public { + vm.startPrank(Alice); + vm.deal(Alice, 100 ether); + addressManager = new AddressManager(); + addressManager.init(); + + bridge = new Bridge(); + bridge.init(address(addressManager)); + + destChainBridge = new Bridge(); + destChainBridge.init(address(addressManager)); + + signalService = new SignalService(); + signalService.init(address(addressManager)); + + etherVault = new EtherVault(); + etherVault.init(address(addressManager)); + + xChainSync = new PrankXchainSync(); + + addressManager.setAddress( + string( + bytes.concat(bytes32(block.chainid), bytes("signal_service")) + ), + address(signalService) + ); + + addressManager.setAddress( + string(bytes.concat(bytes32(destChainId), bytes("bridge"))), + address(destChainBridge) + ); + + vm.stopPrank(); + } + + function test_send_message_ether_reverts_if_value_doesnt_match_expected() + public + { + uint256 amount = 1 wei; + IBridge.Message memory message = newMessage({ + owner: Alice, + to: Alice, + depositValue: amount, + callValue: 0, + gasLimit: 0, + processingFee: 0, + destChain: destChainId + }); + + vm.expectRevert(BridgeErrors.B_INCORRECT_VALUE.selector); + bridge.sendMessage(message); + } + + function test_send_message_ether_reverts_when_owner_is_zero_address() + public + { + uint256 amount = 1 wei; + IBridge.Message memory message = newMessage({ + owner: address(0), + to: Alice, + depositValue: amount, + callValue: 0, + gasLimit: 0, + processingFee: 0, + destChain: destChainId + }); + + vm.expectRevert(BridgeErrors.B_OWNER_IS_NULL.selector); + bridge.sendMessage{value: amount}(message); + } + + function test_send_message_ether_reverts_when_dest_chain_is_not_enabled() + public + { + uint256 amount = 1 wei; + IBridge.Message memory message = newMessage({ + owner: Alice, + to: Alice, + depositValue: amount, + callValue: 0, + gasLimit: 0, + processingFee: 0, + destChain: destChainId + 1 + }); + + vm.expectRevert(BridgeErrors.B_WRONG_CHAIN_ID.selector); + bridge.sendMessage{value: amount}(message); + } + + function test_send_message_ether_reverts_when_dest_chain_same_as_block_chainid() + public + { + uint256 amount = 1 wei; + IBridge.Message memory message = newMessage({ + owner: Alice, + to: Alice, + depositValue: amount, + callValue: 0, + gasLimit: 0, + processingFee: 0, + destChain: block.chainid + }); + + vm.expectRevert(BridgeErrors.B_WRONG_CHAIN_ID.selector); + bridge.sendMessage{value: amount}(message); + } + + function test_send_message_ether_reverts_when_to_is_zero_address() public { + uint256 amount = 1 wei; + IBridge.Message memory message = newMessage({ + owner: Alice, + to: address(0), + depositValue: amount, + callValue: 0, + gasLimit: 0, + processingFee: 0, + destChain: destChainId + }); + + vm.expectRevert(BridgeErrors.B_WRONG_TO_ADDRESS.selector); + bridge.sendMessage{value: amount}(message); + } + + function test_send_message_ether_with_no_processing_fee() public { + uint256 amount = 1 wei; + IBridge.Message memory message = newMessage({ + owner: Alice, + to: Alice, + depositValue: amount, + callValue: 0, + gasLimit: 0, + processingFee: 0, + destChain: destChainId + }); + + bytes32 msgHash = bridge.sendMessage{value: amount}(message); + + bool isMessageSent = bridge.isMessageSent(msgHash); + assertEq(isMessageSent, true); + } + + function test_send_message_ether_with_processing_fee() public { + uint256 amount = 1 wei; + uint256 processingFee = 1 wei; + IBridge.Message memory message = newMessage({ + owner: Alice, + to: Alice, + depositValue: amount, + callValue: 0, + gasLimit: 0, + processingFee: processingFee, + destChain: destChainId + }); + + bytes32 msgHash = bridge.sendMessage{value: amount + processingFee}( + message + ); + + bool isMessageSent = bridge.isMessageSent(msgHash); + assertEq(isMessageSent, true); + } + + function test_send_message_ether_with_processing_fee_invalid_amount() + public + { + uint256 amount = 1 wei; + uint256 processingFee = 1 wei; + IBridge.Message memory message = newMessage({ + owner: Alice, + to: Alice, + depositValue: amount, + callValue: 0, + gasLimit: 0, + processingFee: processingFee, + destChain: destChainId + }); + + vm.expectRevert(BridgeErrors.B_INCORRECT_VALUE.selector); + bridge.sendMessage{value: amount}(message); + } + + // test with a known good merkle proof / message since we cant generate proofs via rpc + // in foundry + function test_process_message() public { + vm.startPrank(Alice); + ( + IBridge.Message memory message, + bytes memory proof + ) = setUpPredefinedSuccessfulProcessMessageCall(); + + bytes32 msgHash = destChainBridge.hashMessage(message); + + bool isMessageReceived = destChainBridge.isMessageReceived( + msgHash, + 1336, + proof + ); + + assertEq(isMessageReceived, true); + + destChainBridge.processMessage(message, proof); + + LibBridgeStatus.MessageStatus status = destChainBridge.getMessageStatus( + msgHash + ); + + assertEq(status == LibBridgeStatus.MessageStatus.DONE, true); + } + + // test with a known good merkle proof / message since we cant generate proofs via rpc + // in foundry + function test_retry_message_and_end_up_in_failed_status() public { + vm.startPrank(Alice); + ( + IBridge.Message memory message, + bytes memory proof + ) = setUpPredefinedSuccessfulProcessMessageCall(); + + // etch bad receiver at the to address, so it fails. + vm.etch(message.to, address(badReceiver).code); + + bytes32 msgHash = destChainBridge.hashMessage(message); + + bool isMessageReceived = destChainBridge.isMessageReceived( + msgHash, + 1336, + proof + ); + + assertEq(isMessageReceived, true); + + destChainBridge.processMessage(message, proof); + + LibBridgeStatus.MessageStatus status = destChainBridge.getMessageStatus( + msgHash + ); + + assertEq(status == LibBridgeStatus.MessageStatus.RETRIABLE, true); + + vm.stopPrank(); + vm.prank(message.owner); + + destChainBridge.retryMessage(message, true); + + LibBridgeStatus.MessageStatus postRetryStatus = destChainBridge + .getMessageStatus(msgHash); + + assertEq(postRetryStatus == LibBridgeStatus.MessageStatus.FAILED, true); + } + + function retry_message_reverts_when_status_non_retriable() public { + IBridge.Message memory message = newMessage({ + owner: Alice, + to: Alice, + depositValue: 1, + callValue: 0, + gasLimit: 10000, + processingFee: 1, + destChain: destChainId + }); + + vm.expectRevert(BridgeErrors.B_MSG_NON_RETRIABLE.selector); + destChainBridge.retryMessage(message, true); + } + + function retry_message_reverts_when_last_attempt_and_message_is_not_owner() + public + { + vm.startPrank(Alice); + IBridge.Message memory message = newMessage({ + owner: Bob, + to: Alice, + depositValue: 1, + callValue: 0, + gasLimit: 10000, + processingFee: 1, + destChain: destChainId + }); + + vm.expectRevert(BridgeErrors.B_DENIED.selector); + destChainBridge.retryMessage(message, true); + } + + function setUpPredefinedSuccessfulProcessMessageCall() + internal + returns (IBridge.Message memory, bytes memory) + { + badReceiver = new BadReceiver(); + + uint256 dest = 1337; + addressManager.setAddress( + string(bytes.concat(bytes32(dest), bytes("taiko"))), + address(xChainSync) + ); + + addressManager.setAddress( + string(bytes.concat(bytes32(uint256(1336)), bytes("bridge"))), + 0x564540a26Fb667306b3aBdCB4ead35BEb88698ab + ); + + addressManager.setAddress( + string(bytes.concat(bytes32(dest), bytes("bridge"))), + address(destChainBridge) + ); + + addressManager.setAddress( + string(bytes.concat(bytes32(dest), bytes("ether_vault"))), + address(etherVault) + ); + + etherVault.authorize(address(destChainBridge), true); + + vm.deal(address(etherVault), 100 ether); + + addressManager.setAddress( + string(bytes.concat(bytes32(dest), bytes("signal_service"))), + address(signalService) + ); + + xChainSync.setXchainBlockHeader( + 0xd5f5d8ac6bc37139c97389b00e9cf53e89c153ad8a5fc765ffe9f44ea9f3d31e + ); + + xChainSync.setXchainSignalRoot( + 0x631b214fb030d82847224f0b3d3b906a6764dded176ad3c7262630204867ba85 + ); + + vm.deal(address(destChainBridge), 1 ether); + + vm.chainId(dest); + + // known message that corresponds with below proof. + IBridge.Message memory message = IBridge.Message({ + id: 0, + sender: 0xDf08F82De32B8d460adbE8D72043E3a7e25A3B39, + srcChainId: 1336, + destChainId: dest, + owner: 0xDf08F82De32B8d460adbE8D72043E3a7e25A3B39, + to: 0x200708D76eB1B69761c23821809d53F65049939e, + refundAddress: 0x10020FCb72e27650651B05eD2CEcA493bC807Ba4, + depositValue: 1000, + callValue: 1000, + processingFee: 1000, + gasLimit: 1000000, + data: "", + memo: "" + }); + + bytes + memory proof = hex"0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000003e0f7ff3b519ec113138509a5b1b6f54761cebc6891bc0ba4f904b89688b1ef8e051dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d493470000000000000000000000000000000000000000000000000000000000000000a85358ff57974db8c9ce2ecabe743d44133f9d11e5da97e386111073f1a2f92c345bd00c2ef9db5726d84c184af67fdbad0be00921eb1dcbca674c427abb5c3ebda7d1e94e5b2b3d5e6a54c9a42423b1746afa4b264e7139877c0523c3397ec4000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000002000800002000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000001000040000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000001500000000000000000000000000000000000000000000000000000000009bbf55000000000000000000000000000000000000000000000000000000000001d4fb0000000000000000000000000000000000000000000000000000000064435d130000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004d2e85500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000061d883010a1a846765746888676f312e31382e38856c696e75780000000000000015b1ca61fbe1aa968ab60a461913aa40046b5357162466a4134d195647c14dd7488dd438abb39d6574e7d9d752fa2381bbd9dc780efc3fcc66af5285ebcb117b010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000dbf8d9b8b3f8b18080a04fc5f13ab2f9ba0c2da88b0151ab0e7cf4d85d08cca45ccd923c6ab76323eb28a02b70a98baa2507beffe8c266006cae52064dccf4fd1998af774ab3399029b38380808080a07394a09684ef3b2c87e9e2a753eb4ac78e2047b980e16d2e2133aee78946370d8080a0f4984a11f61a2921456141df88de6e1a710d28681b91af794c5a721e47839cd78080a09248167635e6f0eb40f782a6bbd237174104259b6af88b3c52086214098f0e2c8080a3e2a03ecd5e1f251bf1676a367f6b16e92ffe6b2638b4a27b3d31870d25442bd59ef4010000000000"; + + return (message, proof); + } + + function newMessage( + address owner, + address to, + uint256 depositValue, + uint256 callValue, + uint256 gasLimit, + uint256 processingFee, + uint256 destChain + ) internal view returns (IBridge.Message memory) { + return + IBridge.Message({ + owner: owner, + destChainId: destChain, + to: to, + depositValue: depositValue, + callValue: callValue, + processingFee: processingFee, + id: 0, // placeholder, will be overwritten + sender: owner, // placeholder, will be overwritten + srcChainId: block.chainid, // will be overwritten + refundAddress: owner, + gasLimit: gasLimit, + data: "", + memo: "" + }); + } +} From f55bd27447d1a887d318b994d1929b6c2d252e3a Mon Sep 17 00:00:00 2001 From: Daniel Wang <99078276+dantaik@users.noreply.github.com> Date: Sun, 23 Apr 2023 09:22:55 +0800 Subject: [PATCH 44/47] feat(protocol): allow proof cooldown period [2] (#13597) Co-authored-by: adaki2004 Co-authored-by: David Co-authored-by: Dani <51912515+adaki2004@users.noreply.github.com> --- .../protocol/contracts/L1/TaikoConfig.sol | 7 +- packages/protocol/contracts/L1/TaikoData.sol | 21 +- .../protocol/contracts/L1/TaikoErrors.sol | 15 +- packages/protocol/contracts/L1/TaikoL1.sol | 24 +- .../protocol/contracts/L1/libs/LibProving.sol | 253 ++++------- .../protocol/contracts/L1/libs/LibUtils.sol | 18 +- .../contracts/L1/libs/LibVerifying.sol | 13 +- .../contracts/test/L1/TestTaikoL1.sol | 3 - .../test/L1/TestTaikoL1EnableTokenomics.sol | 3 - packages/protocol/test/utils/fixture.ts | 6 +- packages/protocol/test/utils/onNewL2Block.ts | 8 +- packages/protocol/test/utils/taikoL1.ts | 3 +- packages/protocol/test2/TaikoL1.sim.sol | 7 +- packages/protocol/test2/TaikoL1.t.sol | 81 +++- .../test2/TaikoL1LibTokenomicsMainnet.t.sol | 12 +- .../test2/TaikoL1LibTokenomicsTestnet.t.sol | 71 +++- .../protocol/test2/TaikoL1OracleProver.t.sol | 249 ----------- packages/protocol/test2/TaikoL1TestBase.t.sol | 36 +- packages/protocol/test2/TaikoL1_Oracle.sol | 300 +++++++++++++ packages/tokenomics/main.py | 395 ++++++++++++++++++ .../contract-documentation/L1/TaikoData.md | 24 +- .../contract-documentation/L1/TaikoErrors.md | 24 -- .../contract-documentation/L1/TaikoL1.md | 15 - 23 files changed, 957 insertions(+), 631 deletions(-) delete mode 100644 packages/protocol/test2/TaikoL1OracleProver.t.sol create mode 100644 packages/protocol/test2/TaikoL1_Oracle.sol create mode 100644 packages/tokenomics/main.py diff --git a/packages/protocol/contracts/L1/TaikoConfig.sol b/packages/protocol/contracts/L1/TaikoConfig.sol index 0d03fe029e7..f8708b832b8 100644 --- a/packages/protocol/contracts/L1/TaikoConfig.sol +++ b/packages/protocol/contracts/L1/TaikoConfig.sol @@ -35,15 +35,12 @@ library TaikoConfig { // transactions list calldata, 8K for the remaining tx fields. maxBytesPerTxList: 120000, minTxGasLimit: 21000, - // Moving average factors + proofCooldownPeriod: 5 minutes, txListCacheExpiry: 0, proofTimeTarget: 1800, // 85s based on A2 testnet status, or set to 1800 for 30mins (mainnet mock) adjustmentQuotient: 16, relaySignalRoot: false, - enableSoloProposer: false, - enableOracleProver: true, - enableTokenomics: true, - skipZKPVerification: false + enableSoloProposer: false }); } } diff --git a/packages/protocol/contracts/L1/TaikoData.sol b/packages/protocol/contracts/L1/TaikoData.sol index 0a27db5c5e6..c0939462ad9 100644 --- a/packages/protocol/contracts/L1/TaikoData.sol +++ b/packages/protocol/contracts/L1/TaikoData.sol @@ -20,6 +20,7 @@ library TaikoData { uint256 maxBytesPerTxList; uint256 minTxGasLimit; uint256 txListCacheExpiry; + uint256 proofCooldownPeriod; uint64 minEthDepositsPerBlock; uint64 maxEthDepositsPerBlock; uint96 maxEthDepositAmount; @@ -28,9 +29,6 @@ library TaikoData { uint8 adjustmentQuotient; bool relaySignalRoot; bool enableSoloProposer; - bool enableOracleProver; - bool enableTokenomics; - bool skipZKPVerification; } struct StateVariables { @@ -91,25 +89,14 @@ library TaikoData { uint32 gasUsed; } - struct BlockOracle { - bytes32 blockHash; - uint32 gasUsed; - bytes32 signalRoot; - } - - struct BlockOracles { - bytes32 parentHash; - uint32 parentGasUsed; - BlockOracle[] blks; - } - // 4 slots struct ForkChoice { - bytes32 key; // only written/read for the 1st fork choice. + // Key is only written/read for the 1st fork choice. + bytes32 key; bytes32 blockHash; bytes32 signalRoot; uint64 provenAt; - address prover; + address prover; // 0x0 to mark as 'oracle proof' uint32 gasUsed; } diff --git a/packages/protocol/contracts/L1/TaikoErrors.sol b/packages/protocol/contracts/L1/TaikoErrors.sol index 88a2a6631c7..32bc0d06e86 100644 --- a/packages/protocol/contracts/L1/TaikoErrors.sol +++ b/packages/protocol/contracts/L1/TaikoErrors.sol @@ -22,10 +22,10 @@ abstract contract TaikoErrors { error L1_INVALID_EVIDENCE(); error L1_INVALID_L21559_PARAMS(); error L1_INVALID_METADATA(); - error L1_INVALID_ORACLE(); + error L1_INVALID_PARAM(); error L1_INVALID_PROOF(); - error L1_NOT_ORACLE_PROVEN(); + error L1_NOT_ORACLE_PROVER(); error L1_NOT_SOLO_PROPOSER(); error L1_ORACLE_DISABLED(); @@ -34,15 +34,4 @@ abstract contract TaikoErrors { error L1_TX_LIST_HASH(); error L1_TX_LIST_RANGE(); error L1_TX_LIST(); - error L1_UNEXPECTED_FORK_CHOICE_ID(); - - error L1_CONFLICTING_PROOF( - uint64 id, - uint32 parentGasUsed, - bytes32 parentHash, - bytes32 conflictingBlockHash, - bytes32 conflictingSignalRoot, - bytes32 blockHash, - bytes32 signalRoot - ); } diff --git a/packages/protocol/contracts/L1/TaikoL1.sol b/packages/protocol/contracts/L1/TaikoL1.sol index 7d8260b8a49..7689ae0571f 100644 --- a/packages/protocol/contracts/L1/TaikoL1.sol +++ b/packages/protocol/contracts/L1/TaikoL1.sol @@ -87,26 +87,6 @@ contract TaikoL1 is EssentialContract, IXchainSync, TaikoEvents, TaikoErrors { } } - /** - * Oracle prove mutliple blocks in a row. - * - * @param blockId The index of the first block to prove. This is also used - * to select the right implementation version. - * @param input An abi-encoded TaikoData.BlockOracle[] object. - */ - function oracleProveBlocks( - uint256 blockId, - bytes calldata input - ) external nonReentrant { - LibProving.oracleProveBlocks({ - state: state, - config: getConfig(), - blockId: blockId, - resolver: AddressResolver(this), - oracles: abi.decode(input, (TaikoData.BlockOracles)) - }); - } - /** * Prove a block is valid with a zero-knowledge proof, a transaction * merkel proof, and a receipt merkel proof. @@ -171,7 +151,9 @@ contract TaikoL1 is EssentialContract, IXchainSync, TaikoEvents, TaikoErrors { return state.taikoTokenBalances[addr]; } - function getBlockFee() public view returns (uint64) {} + function getBlockFee() public view returns (uint64) { + return state.basefee; + } function getProofReward( uint64 provenAt, diff --git a/packages/protocol/contracts/L1/libs/LibProving.sol b/packages/protocol/contracts/L1/libs/LibProving.sol index 2b4e12652bd..6deae404ef1 100644 --- a/packages/protocol/contracts/L1/libs/LibProving.sol +++ b/packages/protocol/contracts/L1/libs/LibProving.sol @@ -28,97 +28,51 @@ library LibProving { error L1_FORK_CHOICE_NOT_FOUND(); error L1_INVALID_PROOF(); error L1_INVALID_EVIDENCE(); - error L1_INVALID_ORACLE(); error L1_ORACLE_DISABLED(); - error L1_NOT_ORACLE_PROVEN(); error L1_NOT_ORACLE_PROVER(); - error L1_UNEXPECTED_FORK_CHOICE_ID(); - error L1_CONFLICTING_PROOF( - uint64 id, - uint32 parentGasUsed, - bytes32 parentHash, - bytes32 conflictingBlockHash, - bytes32 conflictingSignalRoot, - bytes32 blockHash, - bytes32 signalRoot - ); - function oracleProveBlocks( + function proveBlock( TaikoData.State storage state, TaikoData.Config memory config, AddressResolver resolver, uint256 blockId, - TaikoData.BlockOracles memory oracles + TaikoData.BlockEvidence memory evidence ) internal { - if (!config.enableOracleProver) revert L1_ORACLE_DISABLED(); - if (msg.sender != resolver.resolve("oracle_prover", false)) - revert L1_NOT_ORACLE_PROVER(); - - bytes32 parentHash = oracles.parentHash; - uint32 parentGasUsed = oracles.parentGasUsed; - - for (uint256 i = 0; i < oracles.blks.length; ) { - uint256 id = blockId + i; - - if (id <= state.lastVerifiedBlockId || id >= state.numBlocks) - revert L1_BLOCK_ID(); - - TaikoData.BlockOracle memory oracle = oracles.blks[i]; - if ( - oracle.blockHash == 0 || - oracle.blockHash == parentHash || - oracle.signalRoot == 0 || - oracle.gasUsed == 0 - ) revert L1_INVALID_ORACLE(); - - TaikoData.Block storage blk = state.blocks[ - id % config.ringBufferSize - ]; - - uint256 fcId = LibUtils.getForkChoiceId( - state, - blk, - parentHash, - parentGasUsed - ); - - if (fcId == 0) { - fcId = _getNextForkChoiceId(blk); - } - - _saveForkChoice({ - state: state, - config: config, - blk: blk, - fcId: fcId, - parentHash: parentHash, - parentGasUsed: parentGasUsed, - blockHash: oracle.blockHash, - signalRoot: oracle.signalRoot, - gasUsed: oracle.gasUsed, - prover: address(0) - }); - - unchecked { - ++i; - parentHash = oracle.blockHash; - parentGasUsed = oracle.gasUsed; + bool isOracleProof = evidence.prover == address(0); + + if (isOracleProof) { + address oracleProver = resolver.resolve("oracle_prover", true); + if (oracleProver == address(0)) revert L1_ORACLE_DISABLED(); + + if (msg.sender != oracleProver) { + if (evidence.zkproof.data.length == 64) { + uint8 v = uint8(evidence.zkproof.verifierId); + bytes32 r; + bytes32 s; + bytes memory data = evidence.zkproof.data; + assembly { + r := mload(add(data, 32)) + s := mload(add(data, 64)) + } + + // clear the proof before hasing evidence + evidence.zkproof.data = new bytes(0); + evidence.zkproof.verifierId = 0; + + if ( + oracleProver != + ecrecover(keccak256(abi.encode(evidence)), v, r, s) + ) revert L1_NOT_ORACLE_PROVER(); + } else { + revert L1_NOT_ORACLE_PROVER(); + } } } - } - function proveBlock( - TaikoData.State storage state, - TaikoData.Config memory config, - AddressResolver resolver, - uint256 blockId, - TaikoData.BlockEvidence memory evidence - ) internal { - TaikoData.BlockMetadata memory meta = evidence.meta; if ( - meta.id != blockId || - meta.id <= state.lastVerifiedBlockId || - meta.id >= state.numBlocks + evidence.meta.id != blockId || + evidence.meta.id <= state.lastVerifiedBlockId || + evidence.meta.id >= state.numBlocks ) revert L1_BLOCK_ID(); if ( @@ -126,18 +80,22 @@ library LibProving { evidence.blockHash == 0 || evidence.blockHash == evidence.parentHash || evidence.signalRoot == 0 || - // prover must not be zero - evidence.prover == address(0) || evidence.gasUsed == 0 ) revert L1_INVALID_EVIDENCE(); TaikoData.Block storage blk = state.blocks[ - meta.id % config.ringBufferSize + evidence.meta.id % config.ringBufferSize ]; - bytes32 _metaHash = LibUtils.hashMetadata(meta); - if (blk.metaHash != _metaHash) - revert L1_EVIDENCE_MISMATCH(blk.metaHash, _metaHash); + { + // Check the metadata matches the block's metadata. This is very + // necessary even for the oracle-proof to handle chain reorgs. + bytes32 _metaHash = LibUtils.hashMetadata(evidence.meta); + if (blk.metaHash != _metaHash) + revert L1_EVIDENCE_MISMATCH(blk.metaHash, _metaHash); + } + + TaikoData.ForkChoice storage fc; uint256 fcId = LibUtils.getForkChoiceId( state, @@ -147,23 +105,38 @@ library LibProving { ); if (fcId == 0) { - if (config.enableOracleProver) revert L1_NOT_ORACLE_PROVEN(); - fcId = _getNextForkChoiceId(blk); + fcId = blk.nextForkChoiceId; + + unchecked { + ++blk.nextForkChoiceId; + } + + fc = blk.forkChoices[fcId]; + + if (fcId == 1) { + // We only write the key when fcId is 1. + fc.key = LibUtils.keyForForkChoice( + evidence.parentHash, + evidence.parentGasUsed + ); + } else { + state.forkChoiceIds[blk.blockId][evidence.parentHash][ + evidence.parentGasUsed + ] = fcId; + } + } else if (isOracleProof) { + fc = blk.forkChoices[fcId]; + } else { + revert L1_ALREADY_PROVEN(); } - _saveForkChoice({ - state: state, - config: config, - blk: blk, - fcId: fcId, - parentHash: evidence.parentHash, - parentGasUsed: evidence.parentGasUsed, - blockHash: evidence.blockHash, - signalRoot: evidence.signalRoot, - gasUsed: evidence.gasUsed, - prover: evidence.prover - }); - if (!config.skipZKPVerification) { + fc.blockHash = evidence.blockHash; + fc.signalRoot = evidence.signalRoot; + fc.gasUsed = evidence.gasUsed; + fc.provenAt = uint64(block.timestamp); + fc.prover = evidence.prover; + + if (!isOracleProof) { bytes32 instance; { // otherwise: stack too deep @@ -214,6 +187,14 @@ library LibProving { bytes32(ret) != keccak256("taiko") ) revert L1_INVALID_PROOF(); } + + emit BlockProven({ + id: blk.blockId, + parentHash: evidence.parentHash, + blockHash: evidence.blockHash, + signalRoot: evidence.signalRoot, + prover: evidence.prover + }); } function getForkChoice( @@ -222,7 +203,7 @@ library LibProving { uint256 blockId, bytes32 parentHash, uint32 parentGasUsed - ) internal view returns (TaikoData.ForkChoice storage) { + ) internal view returns (TaikoData.ForkChoice storage fc) { TaikoData.Block storage blk = state.blocks[ blockId % config.ringBufferSize ]; @@ -235,74 +216,6 @@ library LibProving { parentGasUsed ); if (fcId == 0) revert L1_FORK_CHOICE_NOT_FOUND(); - - return blk.forkChoices[fcId]; - } - - function _saveForkChoice( - TaikoData.State storage state, - TaikoData.Config memory config, - TaikoData.Block storage blk, - uint256 fcId, - bytes32 parentHash, - uint32 parentGasUsed, - bytes32 blockHash, - bytes32 signalRoot, - uint32 gasUsed, - address prover - ) private { - TaikoData.ForkChoice storage fc = blk.forkChoices[fcId]; - if (fcId == 1) { - // We only write the key when fcId is 1. - fc.key = LibUtils.keyForForkChoice(parentHash, parentGasUsed); - state.forkChoiceIds[blk.blockId][parentHash][parentGasUsed] = 0; - } else { - state.forkChoiceIds[blk.blockId][parentHash][parentGasUsed] = fcId; - } - - if (prover != address(0) && config.enableOracleProver) { - // This is a regular proof after the oracle proof - if (fc.prover != address(0)) revert L1_ALREADY_PROVEN(); - - if ( - fc.blockHash != blockHash || - fc.signalRoot != signalRoot || - fc.gasUsed != gasUsed - ) - revert L1_CONFLICTING_PROOF({ - id: blk.blockId, - parentGasUsed: parentGasUsed, - parentHash: parentHash, - conflictingBlockHash: blockHash, - conflictingSignalRoot: signalRoot, - blockHash: fc.blockHash, - signalRoot: fc.signalRoot - }); - } else { - // oracle proof or enableOracleProver is disabled - fc.blockHash = blockHash; - fc.signalRoot = signalRoot; - fc.gasUsed = gasUsed; - } - - fc.provenAt = uint64(block.timestamp); - fc.prover = prover; - - emit BlockProven({ - id: blk.blockId, - parentHash: parentHash, - blockHash: blockHash, - signalRoot: signalRoot, - prover: prover - }); - } - - function _getNextForkChoiceId( - TaikoData.Block storage blk - ) private returns (uint256 fcId) { - fcId = blk.nextForkChoiceId; - unchecked { - ++blk.nextForkChoiceId; - } + fc = blk.forkChoices[fcId]; } } diff --git a/packages/protocol/contracts/L1/libs/LibUtils.sol b/packages/protocol/contracts/L1/libs/LibUtils.sol index 17c91348840..08499ae1ec5 100644 --- a/packages/protocol/contracts/L1/libs/LibUtils.sol +++ b/packages/protocol/contracts/L1/libs/LibUtils.sol @@ -33,19 +33,19 @@ library LibUtils { TaikoData.Block storage blk, bytes32 parentHash, uint32 parentGasUsed - ) internal view returns (uint256) { + ) internal view returns (uint256 fcId) { if ( blk.forkChoices[1].key == keyForForkChoice(parentHash, parentGasUsed) - ) return 1; - - uint256 fcId = state.forkChoiceIds[blk.blockId][parentHash][ - parentGasUsed - ]; - - if (fcId >= blk.nextForkChoiceId) return 0; + ) { + fcId = 1; + } else { + fcId = state.forkChoiceIds[blk.blockId][parentHash][parentGasUsed]; + } - return fcId; + if (fcId >= blk.nextForkChoiceId) { + fcId = 0; + } } function getStateVariables( diff --git a/packages/protocol/contracts/L1/libs/LibVerifying.sol b/packages/protocol/contracts/L1/libs/LibVerifying.sol index 09be4c3fdec..0fe877d8eee 100644 --- a/packages/protocol/contracts/L1/libs/LibVerifying.sol +++ b/packages/protocol/contracts/L1/libs/LibVerifying.sol @@ -87,7 +87,15 @@ library LibVerifying { if (fcId == 0) break; TaikoData.ForkChoice storage fc = blk.forkChoices[fcId]; - if (fc.prover == address(0)) break; + + if ( + fc.prover == address(0) || // oracle proof + block.timestamp < fc.provenAt + config.proofCooldownPeriod // too young + ) break; + + blockHash = fc.blockHash; + gasUsed = fc.gasUsed; + signalRoot = fc.signalRoot; _markBlockVerified({ state: state, @@ -96,9 +104,6 @@ library LibVerifying { fcId: uint24(fcId), fc: fc }); - blockHash = fc.blockHash; - gasUsed = fc.gasUsed; - signalRoot = fc.signalRoot; unchecked { ++i; diff --git a/packages/protocol/contracts/test/L1/TestTaikoL1.sol b/packages/protocol/contracts/test/L1/TestTaikoL1.sol index 5c1111b1c65..78f0e969e3a 100644 --- a/packages/protocol/contracts/test/L1/TestTaikoL1.sol +++ b/packages/protocol/contracts/test/L1/TestTaikoL1.sol @@ -28,9 +28,6 @@ contract TestTaikoL1 is TaikoL1 { config.maxTransactionsPerBlock = 20; config.maxBytesPerTxList = 120000; config.minTxGasLimit = 21000; - - config.enableTokenomics = false; - config.skipZKPVerification = true; } // The old implementation that is also used in hardhat tests. diff --git a/packages/protocol/contracts/test/L1/TestTaikoL1EnableTokenomics.sol b/packages/protocol/contracts/test/L1/TestTaikoL1EnableTokenomics.sol index 0ef3f7343aa..44379c9a917 100644 --- a/packages/protocol/contracts/test/L1/TestTaikoL1EnableTokenomics.sol +++ b/packages/protocol/contracts/test/L1/TestTaikoL1EnableTokenomics.sol @@ -28,9 +28,6 @@ contract TestTaikoL1EnableTokenomics is TaikoL1 { config.maxTransactionsPerBlock = 20; config.maxBytesPerTxList = 120000; config.minTxGasLimit = 21000; - - config.enableTokenomics = true; - config.skipZKPVerification = true; } // The old implementation that is also used in hardhat tests. diff --git a/packages/protocol/test/utils/fixture.ts b/packages/protocol/test/utils/fixture.ts index 2b924eec910..97158786d42 100644 --- a/packages/protocol/test/utils/fixture.ts +++ b/packages/protocol/test/utils/fixture.ts @@ -14,10 +14,7 @@ import { defaultBasefee, deployTaikoL1 } from "./taikoL1"; import { deployTaikoL2 } from "./taikoL2"; import deployTaikoToken from "./taikoToken"; -async function initIntegrationFixture( - mintTkoToProposer: boolean, - enableTokenomics: boolean = true -) { +async function initIntegrationFixture(mintTkoToProposer: boolean) { const l1Provider = getL1Provider(); l1Provider.pollingInterval = 100; @@ -50,7 +47,6 @@ async function initIntegrationFixture( const taikoL1 = await deployTaikoL1( l1AddressManager, genesisHash, - enableTokenomics, defaultBasefee ); const { chainId } = await l1Provider.getNetwork(); diff --git a/packages/protocol/test/utils/onNewL2Block.ts b/packages/protocol/test/utils/onNewL2Block.ts index a9a969e206e..386f728cf8f 100644 --- a/packages/protocol/test/utils/onNewL2Block.ts +++ b/packages/protocol/test/utils/onNewL2Block.ts @@ -27,16 +27,14 @@ async function onNewL2Block( const { proposedEvent } = await proposer.proposeBlock(block); const { id, meta } = proposedEvent.args; - const { enableTokenomics } = await taikoL1.getConfig(); - const newProofReward = await taikoL1.getProofReward( new Date().getTime(), meta.timestamp ); - const newProposerBalance = enableTokenomics - ? await taikoTokenL1.balanceOf(await proposerSigner.getAddress()) - : BigNumber.from(0); + const newProposerBalance = await taikoTokenL1.balanceOf( + await proposerSigner.getAddress() + ); const newBlockFee = await taikoL1.getBlockFee(); diff --git a/packages/protocol/test/utils/taikoL1.ts b/packages/protocol/test/utils/taikoL1.ts index 3d205800320..5a099588bb5 100644 --- a/packages/protocol/test/utils/taikoL1.ts +++ b/packages/protocol/test/utils/taikoL1.ts @@ -7,7 +7,6 @@ const defaultBasefee = BigNumber.from(10).pow(18); async function deployTaikoL1( addressManager: AddressManager, genesisHash: string, - enableTokenomics: boolean, basefee?: BigNumber ): Promise { // const libProposing = await ( @@ -24,7 +23,7 @@ async function deployTaikoL1( const taikoL1 = await ( await ethers.getContractFactory( - enableTokenomics ? "TestTaikoL1EnableTokenomics" : "TestTaikoL1" + "TestTaikoL1EnableTokenomics" // { // libraries: { // LibVerifying: libVerifying.address, diff --git a/packages/protocol/test2/TaikoL1.sim.sol b/packages/protocol/test2/TaikoL1.sim.sol index 4a5a388fd09..19dfaf6b825 100644 --- a/packages/protocol/test2/TaikoL1.sim.sol +++ b/packages/protocol/test2/TaikoL1.sim.sol @@ -22,12 +22,12 @@ contract TaikoL1_b is TaikoL1 { { config = TaikoConfig.getConfig(); - config.enableTokenomics = true; config.txListCacheExpiry = 0; config.enableSoloProposer = false; - config.enableOracleProver = false; config.maxNumProposedBlocks = 36; config.ringBufferSize = 40; + config.maxVerificationsPerTx = 5; + config.proofCooldownPeriod = 1 minutes; config.proofTimeTarget = 200; } } @@ -113,7 +113,8 @@ contract TaikoL1Simulation is TaikoL1TestBase, FoundryRandom { parentGasUsed, gasUsed, blockHash, - signalRoot + signalRoot, + false ); printVariables(); diff --git a/packages/protocol/test2/TaikoL1.t.sol b/packages/protocol/test2/TaikoL1.t.sol index 48b1cbc790b..01520c581f0 100644 --- a/packages/protocol/test2/TaikoL1.t.sol +++ b/packages/protocol/test2/TaikoL1.t.sol @@ -12,7 +12,7 @@ import {SignalService} from "../contracts/signal/SignalService.sol"; import {Strings} from "@openzeppelin/contracts/utils/Strings.sol"; import {TaikoL1TestBase} from "./TaikoL1TestBase.t.sol"; -contract TaikoL1_a is TaikoL1 { +contract TaikoL1_NoCooldown is TaikoL1 { function getConfig() public pure @@ -21,20 +21,18 @@ contract TaikoL1_a is TaikoL1 { { config = TaikoConfig.getConfig(); - config.enableTokenomics = true; config.txListCacheExpiry = 5 minutes; config.maxVerificationsPerTx = 0; config.enableSoloProposer = false; - config.enableOracleProver = false; config.maxNumProposedBlocks = 10; config.ringBufferSize = 12; - // this value must be changed if `maxNumProposedBlocks` is changed. + config.proofCooldownPeriod = 0; } } contract TaikoL1Test is TaikoL1TestBase { function deployTaikoL1() internal override returns (TaikoL1 taikoL1) { - taikoL1 = new TaikoL1_a(); + taikoL1 = new TaikoL1_NoCooldown(); } function setUp() public override { @@ -74,7 +72,8 @@ contract TaikoL1Test is TaikoL1TestBase { parentGasUsed, gasUsed, blockHash, - signalRoot + signalRoot, + false ); verifyBlock(Carol, 1); @@ -111,7 +110,8 @@ contract TaikoL1Test is TaikoL1TestBase { parentGasUsed, gasUsed, blockHash, - signalRoot + signalRoot, + false ); verifyBlock(Alice, 2); parentHash = blockHash; @@ -150,7 +150,8 @@ contract TaikoL1Test is TaikoL1TestBase { parentGasUsed, gasUsed, blockHash, - signalRoot + signalRoot, + false ); parentHash = blockHash; parentGasUsed = gasUsed; @@ -161,4 +162,68 @@ contract TaikoL1Test is TaikoL1TestBase { verifyBlock(Alice, conf.maxNumProposedBlocks); printVariables("after verify"); } + + function testEthDepositsToL2Reverts() external { + uint96 minAmount = conf.minEthDepositAmount; + uint96 maxAmount = conf.maxEthDepositAmount; + + depositTaikoToken(Alice, 0, maxAmount + 1 ether); + + vm.prank(Alice, Alice); + vm.expectRevert(); + L1.depositEtherToL2{value: minAmount - 1}(); + + vm.prank(Alice, Alice); + vm.expectRevert(); + L1.depositEtherToL2{value: maxAmount + 1}(); + + assertEq(L1.getStateVariables().nextEthDepositToProcess, 0); + assertEq(L1.getStateVariables().numEthDeposits, 0); + } + + function testEthDepositsToL2Gas() external { + vm.fee(25 gwei); + + bytes32 emptyDepositsRoot = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470; + depositTaikoToken(Alice, 1E6 * 1E8, 100000 ether); + + proposeBlock(Alice, 1000000, 1024); + TaikoData.BlockMetadata memory meta = proposeBlock( + Alice, + 1000000, + 1024 + ); + assertEq(meta.depositsRoot, emptyDepositsRoot); + assertEq(meta.depositsProcessed.length, 0); + + uint256 count = conf.maxEthDepositsPerBlock; + + printVariables("before sending ethers"); + for (uint256 i; i < count; ++i) { + vm.prank(Alice, Alice); + L1.depositEtherToL2{value: (i + 1) * 1 ether}(); + } + printVariables("after sending ethers"); + + uint gas = gasleft(); + meta = proposeBlock(Alice, 1000000, 1024); + uint gasUsedWithDeposits = gas - gasleft(); + console2.log("gas used with eth deposits:", gasUsedWithDeposits); + + printVariables("after processing send-ethers"); + assertTrue(meta.depositsRoot != emptyDepositsRoot); + assertEq(meta.depositsProcessed.length, count + 1); + + gas = gasleft(); + meta = proposeBlock(Alice, 1000000, 1024); + uint gasUsedWithoutDeposits = gas - gasleft(); + + console2.log("gas used without eth deposits:", gasUsedWithoutDeposits); + + uint gasPerEthDeposit = (gasUsedWithDeposits - gasUsedWithoutDeposits) / + count; + + console2.log("gas per eth deposit:", gasPerEthDeposit); + console2.log("maxEthDepositsPerBlock:", count); + } } diff --git a/packages/protocol/test2/TaikoL1LibTokenomicsMainnet.t.sol b/packages/protocol/test2/TaikoL1LibTokenomicsMainnet.t.sol index 56c9f8ffa17..741fd3bd2da 100644 --- a/packages/protocol/test2/TaikoL1LibTokenomicsMainnet.t.sol +++ b/packages/protocol/test2/TaikoL1LibTokenomicsMainnet.t.sol @@ -27,9 +27,9 @@ contract TaikoL1MainnetMockConfig is TaikoL1 { config.txListCacheExpiry = 5 minutes; config.maxVerificationsPerTx = 1; config.enableSoloProposer = false; - config.enableOracleProver = false; config.maxNumProposedBlocks = 200; config.ringBufferSize = 240; + config.proofCooldownPeriod = 0; config.proofTimeTarget = 2160; } } @@ -116,7 +116,8 @@ contract TaikoL1LibTokenomicsMainnet is TaikoL1TestBase, FoundryRandom { (blockId - proofTime == 1) ? 0 : 1000000, // Genesis block has 0 gas used 1000000, blockHashes[blockId - proofTime], - signalRoots[blockId - proofTime] + signalRoots[blockId - proofTime], + false ); uint64 provenAt = uint64(block.timestamp); @@ -184,7 +185,8 @@ contract TaikoL1LibTokenomicsMainnet is TaikoL1TestBase, FoundryRandom { (blockId - proofTime == 1) ? 0 : 1000000, 1000000, blockHashes[blockId - proofTime], - signalRoots[blockId - proofTime] + signalRoots[blockId - proofTime], + false ); uint64 provenAt = uint64(block.timestamp); @@ -256,7 +258,8 @@ contract TaikoL1LibTokenomicsMainnet is TaikoL1TestBase, FoundryRandom { (blockId - proofTime == 1) ? 0 : 1000000, 1000000, blockHashes[blockId - proofTime], - signalRoots[blockId - proofTime] + signalRoots[blockId - proofTime], + false ); uint64 provenAt = uint64(block.timestamp); @@ -273,6 +276,7 @@ contract TaikoL1LibTokenomicsMainnet is TaikoL1TestBase, FoundryRandom { parentHash = blockHashes[blockId]; } + //Check end balances //Check end balances uint256 deposits = Alice_start_balance - L1.getTaikoTokenBalance(Alice); uint256 withdrawals = L1.getTaikoTokenBalance(Bob) - Bob_start_balance; diff --git a/packages/protocol/test2/TaikoL1LibTokenomicsTestnet.t.sol b/packages/protocol/test2/TaikoL1LibTokenomicsTestnet.t.sol index 5bed56f0aa2..f9a8fd22121 100644 --- a/packages/protocol/test2/TaikoL1LibTokenomicsTestnet.t.sol +++ b/packages/protocol/test2/TaikoL1LibTokenomicsTestnet.t.sol @@ -26,7 +26,7 @@ contract TaikoL1WithTestnetConfig is TaikoL1 { config.txListCacheExpiry = 5 minutes; config.maxVerificationsPerTx = 0; config.enableSoloProposer = false; - config.enableOracleProver = false; + config.proofCooldownPeriod = 0; config.maxNumProposedBlocks = 40; config.ringBufferSize = 48; config.proofTimeTarget = 120; // Testnet example @@ -69,6 +69,7 @@ contract TaikoL1LibTokenomicsTestnet is TaikoL1TestBase { bytes32 parentHash = GENESIS_BLOCK_HASH; // Check balances + uint256 Alice_start_balance = L1.getTaikoTokenBalance(Alice); uint256 Bob_start_balance = L1.getTaikoTokenBalance(Bob); console2.log("Alice balance:", Alice_start_balance); @@ -92,7 +93,8 @@ contract TaikoL1LibTokenomicsTestnet is TaikoL1TestBase { blockId == 1 ? 0 : 1000000, 1000000, blockHash, - signalRoot + signalRoot, + false ); uint64 provenAt = uint64(block.timestamp); console2.log( @@ -108,6 +110,7 @@ contract TaikoL1LibTokenomicsTestnet is TaikoL1TestBase { } //Check end balances + uint256 deposits = Alice_start_balance - L1.getTaikoTokenBalance(Alice); uint256 withdrawals = L1.getTaikoTokenBalance(Bob) - Bob_start_balance; @@ -136,7 +139,8 @@ contract TaikoL1LibTokenomicsTestnet is TaikoL1TestBase { 1000000, 1000000, blockHash, - signalRoot + signalRoot, + false ); uint64 provenAt = uint64(block.timestamp); console2.log( @@ -163,6 +167,7 @@ contract TaikoL1LibTokenomicsTestnet is TaikoL1TestBase { { mine(1); //Needs lot of token here - because there is lots of time elapsed between 2 'propose' blocks, which will raise the fee + depositTaikoToken(Alice, 1E8 * 1E8, 100 ether); depositTaikoToken(Bob, 1E8 * 1E8, 100 ether); depositTaikoToken(Carol, 1E8 * 1E8, 100 ether); @@ -175,6 +180,7 @@ contract TaikoL1LibTokenomicsTestnet is TaikoL1TestBase { bytes32 parentHash = GENESIS_BLOCK_HASH; // Check balances + uint256 Alice_start_balance = L1.getTaikoTokenBalance(Alice); uint256 Bob_start_balance = L1.getTaikoTokenBalance(Bob); console2.log("Alice balance:", Alice_start_balance); @@ -203,7 +209,8 @@ contract TaikoL1LibTokenomicsTestnet is TaikoL1TestBase { blockId == 1 ? 0 : 1000000, 1000000, blockHash, - signalRoot + signalRoot, + false ); uint64 provenAt = uint64(block.timestamp); console2.log( @@ -219,6 +226,7 @@ contract TaikoL1LibTokenomicsTestnet is TaikoL1TestBase { } //Check end balances + uint256 deposits = Alice_start_balance - L1.getTaikoTokenBalance(Alice); uint256 withdrawals = L1.getTaikoTokenBalance(Bob) - Bob_start_balance; @@ -243,7 +251,8 @@ contract TaikoL1LibTokenomicsTestnet is TaikoL1TestBase { 1000000, 1000000, blockHash, - signalRoot + signalRoot, + false ); uint64 provenAt = uint64(block.timestamp); console2.log( @@ -256,6 +265,7 @@ contract TaikoL1LibTokenomicsTestnet is TaikoL1TestBase { } //Check end balances + deposits = Alice_start_balance - L1.getTaikoTokenBalance(Alice); withdrawals = L1.getTaikoTokenBalance(Bob) - Bob_start_balance; @@ -277,6 +287,7 @@ contract TaikoL1LibTokenomicsTestnet is TaikoL1TestBase { bytes32 parentHash = GENESIS_BLOCK_HASH; // Check balances + uint256 Alice_start_balance = L1.getTaikoTokenBalance(Alice); uint256 Bob_start_balance = L1.getTaikoTokenBalance(Bob); console2.log("Alice balance:", Alice_start_balance); @@ -303,7 +314,8 @@ contract TaikoL1LibTokenomicsTestnet is TaikoL1TestBase { blockId == 1 ? 0 : 1000000, 1000000, blockHash, - signalRoot + signalRoot, + false ); uint64 provenAt = uint64(block.timestamp); console2.log( @@ -317,6 +329,7 @@ contract TaikoL1LibTokenomicsTestnet is TaikoL1TestBase { } //Check end balances + uint256 deposits = Alice_start_balance - L1.getTaikoTokenBalance(Alice); uint256 withdrawals = L1.getTaikoTokenBalance(Bob) - Bob_start_balance; @@ -372,7 +385,8 @@ contract TaikoL1LibTokenomicsTestnet is TaikoL1TestBase { blockId == 1 ? 0 : 1000000, 1000000, blockHash, - signalRoot + signalRoot, + false ); uint64 provenAt = uint64(block.timestamp); @@ -388,6 +402,7 @@ contract TaikoL1LibTokenomicsTestnet is TaikoL1TestBase { } //Check end balances + uint256 deposits = Alice_start_balance - L1.getTaikoTokenBalance(Alice); uint256 withdrawals = L1.getTaikoTokenBalance(Bob) - Bob_start_balance; @@ -415,6 +430,7 @@ contract TaikoL1LibTokenomicsTestnet is TaikoL1TestBase { bytes32 parentHash = GENESIS_BLOCK_HASH; // Check balances + uint256 Alice_start_balance = L1.getTaikoTokenBalance(Alice); uint256 Bob_start_balance = L1.getTaikoTokenBalance(Bob); console2.log("Alice balance:", Alice_start_balance); @@ -442,7 +458,8 @@ contract TaikoL1LibTokenomicsTestnet is TaikoL1TestBase { blockId == 1 ? 0 : 1000000, 1000000, blockHash, - signalRoot + signalRoot, + false ); uint64 provenAt = uint64(block.timestamp); @@ -457,6 +474,7 @@ contract TaikoL1LibTokenomicsTestnet is TaikoL1TestBase { } //Check end balances + uint256 deposits = Alice_start_balance - L1.getTaikoTokenBalance(Alice); uint256 withdrawals = L1.getTaikoTokenBalance(Bob) - Bob_start_balance; // console2.log("Deposits:", deposits); @@ -477,6 +495,7 @@ contract TaikoL1LibTokenomicsTestnet is TaikoL1TestBase { bytes32 parentHash = GENESIS_BLOCK_HASH; // Check balances + uint256 Alice_start_balance = L1.getTaikoTokenBalance(Alice); uint256 Bob_start_balance = L1.getTaikoTokenBalance(Bob); console2.log("Alice balance:", Alice_start_balance); @@ -503,7 +522,8 @@ contract TaikoL1LibTokenomicsTestnet is TaikoL1TestBase { blockId == 1 ? 0 : 1000000, 1000000, blockHash, - signalRoot + signalRoot, + false ); uint64 provenAt = uint64(block.timestamp); console2.log( @@ -517,6 +537,7 @@ contract TaikoL1LibTokenomicsTestnet is TaikoL1TestBase { } //Check end balances + uint256 deposits = Alice_start_balance - L1.getTaikoTokenBalance(Alice); uint256 withdrawals = L1.getTaikoTokenBalance(Bob) - Bob_start_balance; @@ -531,7 +552,6 @@ contract TaikoL1LibTokenomicsTestnet is TaikoL1TestBase { external { mine(1); - depositTaikoToken(Alice, 1E6 * 1E8, 100 ether); depositTaikoToken(Bob, 1E6 * 1E8, 100 ether); depositTaikoToken(Carol, 1E6 * 1E8, 100 ether); @@ -544,6 +564,7 @@ contract TaikoL1LibTokenomicsTestnet is TaikoL1TestBase { bytes32 parentHash = GENESIS_BLOCK_HASH; // Check balances + uint256 Alice_start_balance = L1.getTaikoTokenBalance(Alice); uint256 Bob_start_balance = L1.getTaikoTokenBalance(Bob); console2.log("Alice balance:", Alice_start_balance); @@ -572,7 +593,8 @@ contract TaikoL1LibTokenomicsTestnet is TaikoL1TestBase { blockId == 1 ? 0 : 1000000, 1000000, blockHash, - signalRoot + signalRoot, + false ); uint64 provenAt = uint64(block.timestamp); @@ -587,6 +609,7 @@ contract TaikoL1LibTokenomicsTestnet is TaikoL1TestBase { } //Check end balances + uint256 deposits = Alice_start_balance - L1.getTaikoTokenBalance(Alice); uint256 withdrawals = L1.getTaikoTokenBalance(Bob) - Bob_start_balance; @@ -609,6 +632,7 @@ contract TaikoL1LibTokenomicsTestnet is TaikoL1TestBase { bytes32 parentHash = GENESIS_BLOCK_HASH; // Check balances + uint256 Alice_start_balance = L1.getTaikoTokenBalance(Alice); uint256 Bob_start_balance = L1.getTaikoTokenBalance(Bob); console2.log("Alice balance:", Alice_start_balance); @@ -634,7 +658,8 @@ contract TaikoL1LibTokenomicsTestnet is TaikoL1TestBase { blockId == 1 ? 0 : 1000000, 1000000, blockHash, - signalRoot + signalRoot, + false ); uint64 provenAt = uint64(block.timestamp); console2.log( @@ -648,6 +673,7 @@ contract TaikoL1LibTokenomicsTestnet is TaikoL1TestBase { } //Check end balances + uint256 deposits = Alice_start_balance - L1.getTaikoTokenBalance(Alice); uint256 withdrawals = L1.getTaikoTokenBalance(Bob) - Bob_start_balance; @@ -677,7 +703,8 @@ contract TaikoL1LibTokenomicsTestnet is TaikoL1TestBase { 1000000, 1000000, blockHash, - signalRoot + signalRoot, + false ); uint64 provenAt = uint64(block.timestamp); console2.log( @@ -702,7 +729,6 @@ contract TaikoL1LibTokenomicsTestnet is TaikoL1TestBase { { mine(1); // Requires a bit more tokens - depositTaikoToken(Alice, 1E8 * 1E8, 100 ether); depositTaikoToken(Bob, 1E8 * 1E8, 100 ether); depositTaikoToken(Carol, 1E8 * 1E8, 100 ether); @@ -741,7 +767,8 @@ contract TaikoL1LibTokenomicsTestnet is TaikoL1TestBase { (blockId == 1 ? 0 : 1000000), 1000000, blockHash, - signalRoot + signalRoot, + false ); uint64 provenAt = uint64(block.timestamp); @@ -785,7 +812,8 @@ contract TaikoL1LibTokenomicsTestnet is TaikoL1TestBase { 1000000, 1000000, blockHash, - signalRoot + signalRoot, + false ); uint64 provenAt = uint64(block.timestamp); console2.log( @@ -811,14 +839,13 @@ contract TaikoL1LibTokenomicsTestnet is TaikoL1TestBase { external { mine(1); - depositTaikoToken(Alice, 1E6 * 1E8, 100 ether); depositTaikoToken(Bob, 1E6 * 1E8, 100 ether); depositTaikoToken(Carol, 1E6 * 1E8, 100 ether); - bytes32 parentHash = GENESIS_BLOCK_HASH; // Check balances + uint256 Alice_start_balance = L1.getTaikoTokenBalance(Alice); uint256 Bob_start_balance = L1.getTaikoTokenBalance(Bob); console2.log("Alice balance:", Alice_start_balance); @@ -845,7 +872,8 @@ contract TaikoL1LibTokenomicsTestnet is TaikoL1TestBase { blockId == 1 ? 0 : 1000000, 1000000, blockHash, - signalRoot + signalRoot, + false ); uint64 provenAt = uint64(block.timestamp); console2.log( @@ -859,6 +887,7 @@ contract TaikoL1LibTokenomicsTestnet is TaikoL1TestBase { } //Check end balances + uint256 deposits = Alice_start_balance - L1.getTaikoTokenBalance(Alice); uint256 withdrawals = L1.getTaikoTokenBalance(Bob) - Bob_start_balance; @@ -907,7 +936,8 @@ contract TaikoL1LibTokenomicsTestnet is TaikoL1TestBase { (blockId - proofTime == 1) ? 0 : 1000000, 1000000, blockHashes[blockId - proofTime], - signalRoots[blockId - proofTime] + signalRoots[blockId - proofTime], + false ); uint64 provenAt = uint64(block.timestamp); @@ -928,6 +958,7 @@ contract TaikoL1LibTokenomicsTestnet is TaikoL1TestBase { } } //Check end balances + uint256 deposits = Alice_start_balance - L1.getTaikoTokenBalance(Alice); uint256 withdrawals = L1.getTaikoTokenBalance(Bob) - Bob_start_balance; diff --git a/packages/protocol/test2/TaikoL1OracleProver.t.sol b/packages/protocol/test2/TaikoL1OracleProver.t.sol deleted file mode 100644 index 8c9614e5c42..00000000000 --- a/packages/protocol/test2/TaikoL1OracleProver.t.sol +++ /dev/null @@ -1,249 +0,0 @@ -// SPDX-License-Identifier: UNLICENSED -pragma solidity ^0.8.18; - -import {Test} from "forge-std/Test.sol"; -import {console2} from "forge-std/console2.sol"; -import {AddressManager} from "../contracts/thirdparty/AddressManager.sol"; -import {TaikoConfig} from "../contracts/L1/TaikoConfig.sol"; -import {TaikoData} from "../contracts/L1/TaikoData.sol"; -import {TaikoL1} from "../contracts/L1/TaikoL1.sol"; -import {TaikoToken} from "../contracts/L1/TaikoToken.sol"; -import {SignalService} from "../contracts/signal/SignalService.sol"; -import {Strings} from "@openzeppelin/contracts/utils/Strings.sol"; -import {TaikoL1TestBase} from "./TaikoL1TestBase.t.sol"; - -contract TaikoL1_withOracleProver is TaikoL1 { - function getConfig() - public - pure - override - returns (TaikoData.Config memory config) - { - config = TaikoConfig.getConfig(); - - config.enableTokenomics = true; - config.txListCacheExpiry = 5 minutes; - config.maxVerificationsPerTx = 0; - config.enableSoloProposer = false; - config.enableOracleProver = true; - config.maxNumProposedBlocks = 10; - config.ringBufferSize = 12; - } -} - -contract Verifier { - fallback(bytes calldata) external returns (bytes memory) { - return bytes.concat(keccak256("taiko")); - } -} - -contract TaikoL1Test is TaikoL1TestBase { - function deployTaikoL1() internal override returns (TaikoL1 taikoL1) { - taikoL1 = new TaikoL1_withOracleProver(); - } - - function setUp() public override { - TaikoL1TestBase.setUp(); - registerAddress(L1.getVerifierName(100), address(new Verifier())); - registerAddress("oracle_prover", Alice); - } - - // Test a block can be oracle-proven multiple times by the - // oracle prover - function testOracleProver() external { - depositTaikoToken(Alice, 1000 * 1E8, 1000 ether); - depositTaikoToken(Bob, 1000 * 1E8, 1000 ether); - depositTaikoToken(Carol, 1000 * 1E8, 1000 ether); - - bytes32 parentHash = GENESIS_BLOCK_HASH; - - TaikoData.BlockMetadata memory meta = proposeBlock(Bob, 1000000, 1024); - - // No forkchoice can be found - vm.expectRevert(); - TaikoData.ForkChoice memory fc = L1.getForkChoice({ - blockId: 1, - parentHash: parentHash, - parentGasUsed: 123 - }); - - // Alice cannot prove the forkchoice - vm.expectRevert(); - proveBlock( - Alice, - meta, - parentHash, - 123, - 456, - bytes32(uint256(0x100)), - bytes32(uint256(0x101)) - ); - - // Bob also cannot prove the forkchoice - vm.expectRevert(); - proveBlock( - Bob, - meta, - parentHash, - 123, - 456, - bytes32(uint256(0x100)), - bytes32(uint256(0x101)) - ); - - // Bob cannot oracle-prove the forkchoice - vm.expectRevert(); - oracleProveBlock( - Bob, - 1, - parentHash, - 123, - 456, - bytes32(uint256(0x100)), - bytes32(uint256(0x101)) - ); - - // Alice can oracle-prove the forkchoice - oracleProveBlock( - Alice, - 1, - parentHash, - 123, - 456, - bytes32(uint256(0x100)), - bytes32(uint256(0x101)) - ); - - fc = L1.getForkChoice({ - blockId: 1, - parentHash: parentHash, - parentGasUsed: 123 - }); - assertEq(fc.blockHash, bytes32(uint256(0x100))); - assertEq(fc.signalRoot, bytes32(uint256(0x101))); - assertEq(uint256(fc.provenAt), block.timestamp); - assertEq(fc.prover, address(0)); - assertEq(fc.gasUsed, 456); - - // Alice can oracle-prove the forkchoice more than once - for (uint i = 0; i < 2; ++i) { - mine(1); - oracleProveBlock({ - prover: Alice, - blockId: 1, - parentHash: parentHash, - parentGasUsed: 123, - gasUsed: 789, - blockHash: bytes32(uint256(0x103)), - signalRoot: bytes32(uint256(0x104)) - }); - } - - fc = L1.getForkChoice({ - blockId: 1, - parentHash: parentHash, - parentGasUsed: 123 - }); - - assertEq(fc.blockHash, bytes32(uint256(0x103))); - assertEq(fc.signalRoot, bytes32(uint256(0x104))); - assertEq(uint256(fc.provenAt), block.timestamp); - assertEq(fc.prover, address(0)); - assertEq(fc.gasUsed, 789); - - // Bob cannot prove the forkchoice with conflicting proof - vm.expectRevert(); - proveBlock({ - prover: Bob, - meta: meta, - parentHash: parentHash, - parentGasUsed: 123, - gasUsed: 789, - blockHash: bytes32(uint256(0x100)), - signalRoot: bytes32(uint256(0x101)) - }); - - vm.expectRevert(); - proveBlock({ - prover: Bob, - meta: meta, - parentHash: parentHash, - parentGasUsed: 123, - gasUsed: 456, - blockHash: bytes32(uint256(0x103)), - signalRoot: bytes32(uint256(0x104)) - }); - - // Bob can prove the forkchoice with a matching proof - mine(1); - proveBlock({ - prover: Bob, - meta: meta, - parentHash: parentHash, - parentGasUsed: 123, - gasUsed: 789, - blockHash: bytes32(uint256(0x103)), - signalRoot: bytes32(uint256(0x104)) - }); - - fc = L1.getForkChoice({ - blockId: 1, - parentHash: parentHash, - parentGasUsed: 123 - }); - - assertEq(fc.blockHash, bytes32(uint256(0x103))); - assertEq(fc.signalRoot, bytes32(uint256(0x104))); - assertEq(uint256(fc.provenAt), block.timestamp); - assertEq(fc.prover, Bob); - assertEq(fc.gasUsed, 789); - - // Nobody can prove the forkchoice again - vm.expectRevert(); - proveBlock({ - prover: Carol, - meta: meta, - parentHash: parentHash, - parentGasUsed: 123, - gasUsed: 789, - blockHash: bytes32(uint256(0x103)), - signalRoot: bytes32(uint256(0x104)) - }); - - // Including Alice - vm.expectRevert(); - proveBlock({ - prover: Alice, - meta: meta, - parentHash: parentHash, - parentGasUsed: 123, - gasUsed: 789, - blockHash: bytes32(uint256(0x103)), - signalRoot: bytes32(uint256(0x104)) - }); - - // But Alice can still oracle-proof the block again - mine(1); - oracleProveBlock({ - prover: Alice, - blockId: 1, - parentHash: parentHash, - parentGasUsed: 123, - gasUsed: 987, - blockHash: bytes32(uint256(0x105)), - signalRoot: bytes32(uint256(0x106)) - }); - - fc = L1.getForkChoice({ - blockId: 1, - parentHash: parentHash, - parentGasUsed: 123 - }); - - assertEq(fc.blockHash, bytes32(uint256(0x105))); - assertEq(fc.signalRoot, bytes32(uint256(0x106))); - assertEq(uint256(fc.provenAt), block.timestamp); - assertEq(fc.prover, address(0)); - assertEq(fc.gasUsed, 987); - } -} diff --git a/packages/protocol/test2/TaikoL1TestBase.t.sol b/packages/protocol/test2/TaikoL1TestBase.t.sol index b8227e5ea54..9eb3bf2b3db 100644 --- a/packages/protocol/test2/TaikoL1TestBase.t.sol +++ b/packages/protocol/test2/TaikoL1TestBase.t.sol @@ -38,7 +38,10 @@ abstract contract TaikoL1TestBase is Test { address public constant L1EthVault = 0xDAFEA492D9c6733ae3d56b7Ed1ADB60692c98Bc5; - address public constant Alice = 0x10020FCb72e27650651B05eD2CEcA493bC807Ba4; + address public constant Alice = 0xa9bcF99f5eb19277f48b71F9b14f5960AEA58a89; + uint256 public constant AlicePK = + 0x8fb342c39a93ad26e674cbcdc65dc45795107e1b51776aac15f9776c0e9d2cea; + address public constant Bob = 0x200708D76eB1B69761c23821809d53F65049939e; address public constant Carol = 0x300C9b60E19634e12FC6D68B7FEa7bFB26c2E419; address public constant Dave = 0x400147C0Eb43D8D71b2B03037bB7B31f8f78EF5F; @@ -86,6 +89,7 @@ abstract contract TaikoL1TestBase is Test { registerAddress("taiko_token", address(tko)); registerAddress("proto_broker", address(L1)); registerAddress("signal_service", address(ss)); + registerAddress("ether_vault", address(L1EthVault)); registerL2Address("treasure", L2Treasure); registerL2Address("signal_service", address(L2SS)); registerL2Address("taiko_l2", address(L2TaikoL2)); @@ -133,31 +137,6 @@ abstract contract TaikoL1TestBase is Test { meta = L1.proposeBlock(abi.encode(input), txList); } - function oracleProveBlock( - address prover, - uint256 blockId, - bytes32 parentHash, - uint32 parentGasUsed, - uint32 gasUsed, - bytes32 blockHash, - bytes32 signalRoot - ) internal { - TaikoData.BlockOracle[] memory blks = new TaikoData.BlockOracle[](1); - - blks[0].blockHash = blockHash; - blks[0].signalRoot = signalRoot; - blks[0].gasUsed = gasUsed; - - TaikoData.BlockOracles memory oracles = TaikoData.BlockOracles( - parentHash, - parentGasUsed, - blks - ); - - vm.prank(prover, prover); - L1.oracleProveBlocks(blockId, abi.encode(oracles)); - } - function proveBlock( address prover, TaikoData.BlockMetadata memory meta, @@ -165,7 +144,8 @@ abstract contract TaikoL1TestBase is Test { uint32 parentGasUsed, uint32 gasUsed, bytes32 blockHash, - bytes32 signalRoot + bytes32 signalRoot, + bool oracle ) internal { TaikoData.ZKProof memory zkproof = TaikoData.ZKProof({ data: new bytes(100), @@ -179,7 +159,7 @@ abstract contract TaikoL1TestBase is Test { blockHash: blockHash, signalRoot: signalRoot, graffiti: 0x0, - prover: prover, + prover: oracle ? address(0) : prover, parentGasUsed: parentGasUsed, gasUsed: gasUsed }); diff --git a/packages/protocol/test2/TaikoL1_Oracle.sol b/packages/protocol/test2/TaikoL1_Oracle.sol new file mode 100644 index 00000000000..986a75e5199 --- /dev/null +++ b/packages/protocol/test2/TaikoL1_Oracle.sol @@ -0,0 +1,300 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.18; + +import {Test} from "forge-std/Test.sol"; +import {console2} from "forge-std/console2.sol"; +import {AddressManager} from "../contracts/thirdparty/AddressManager.sol"; +import {TaikoConfig} from "../contracts/L1/TaikoConfig.sol"; +import {TaikoData} from "../contracts/L1/TaikoData.sol"; +import {TaikoL1} from "../contracts/L1/TaikoL1.sol"; +import {TaikoToken} from "../contracts/L1/TaikoToken.sol"; +import {SignalService} from "../contracts/signal/SignalService.sol"; +import {Strings} from "@openzeppelin/contracts/utils/Strings.sol"; +import {TaikoL1TestBase} from "./TaikoL1TestBase.t.sol"; + +contract TaikoL1_Oracle is TaikoL1 { + function getConfig() + public + pure + override + returns (TaikoData.Config memory config) + { + config = TaikoConfig.getConfig(); + + config.txListCacheExpiry = 5 minutes; + config.maxVerificationsPerTx = 0; + config.enableSoloProposer = false; + config.maxNumProposedBlocks = 10; + config.ringBufferSize = 12; + config.proofCooldownPeriod = 5 minutes; + } +} + +contract Verifier { + fallback(bytes calldata) external returns (bytes memory) { + return bytes.concat(keccak256("taiko")); + } +} + +contract TaikoL1_OracleTest is TaikoL1TestBase { + function deployTaikoL1() internal override returns (TaikoL1 taikoL1) { + taikoL1 = new TaikoL1_Oracle(); + } + + function setUp() public override { + TaikoL1TestBase.setUp(); + registerAddress( + string(abi.encodePacked("verifier_", uint16(100))), + address(new Verifier()) + ); + registerAddress("oracle_prover", Alice); + } + + function testOracleProverWithSignature() external { + depositTaikoToken(Bob, 1E6 * 1E8, 100 ether); + depositTaikoToken(Carol, 1E6 * 1E8, 100 ether); + + TaikoData.BlockMetadata memory meta = proposeBlock(Bob, 1000000, 1024); + proveBlock( + Bob, + meta, + GENESIS_BLOCK_HASH, + 10000, + 10001, + bytes32(uint256(0x11)), + bytes32(uint256(0x12)), + false + ); + + TaikoData.ZKProof memory zkproof = TaikoData.ZKProof({ + data: new bytes(0), + verifierId: 0 + }); + + TaikoData.BlockEvidence memory evidence = TaikoData.BlockEvidence({ + meta: meta, + zkproof: zkproof, + parentHash: GENESIS_BLOCK_HASH, + blockHash: bytes32(uint256(0x11)), + signalRoot: bytes32(uint256(0x12)), + graffiti: 0x0, + prover: address(0), + parentGasUsed: 10000, + gasUsed: 40000 + }); + + (uint8 v, bytes32 r, bytes32 s) = vm.sign( + AlicePK, + keccak256(abi.encode(evidence)) + ); + + zkproof.verifierId = v; + zkproof.data = bytes.concat(r, s); + + vm.prank(Carol, Carol); + L1.proveBlock(meta.id, abi.encode(evidence)); + + TaikoData.ForkChoice memory fc = L1.getForkChoice( + 1, + GENESIS_BLOCK_HASH, + 10000 + ); + + assertEq(fc.blockHash, bytes32(uint256(0x11))); + assertEq(fc.signalRoot, bytes32(uint256(0x12))); + assertEq(fc.provenAt, block.timestamp); + assertEq(fc.prover, address(0)); + assertEq(fc.gasUsed, 40000); + } + + function testOracleProverCanAlwaysOverwrite() external { + depositTaikoToken(Alice, 1E6 * 1E8, 100 ether); + depositTaikoToken(Bob, 1E6 * 1E8, 100 ether); + depositTaikoToken(Carol, 1E6 * 1E8, 100 ether); + + bytes32 parentHash = GENESIS_BLOCK_HASH; + uint256 blockId = 1; + TaikoData.BlockMetadata memory meta = proposeBlock( + Alice, + 1000000, + 1024 + ); + + for (uint i = 0; i < 5; ++i) { + uint32 parentGasUsed = uint32(10000 + i); + + // Bob proves the block + proveBlock( + Bob, + meta, + parentHash, + parentGasUsed, + 10001, + bytes32(uint256(0x11)), + bytes32(uint256(0x12)), + false + ); + + TaikoData.ForkChoice memory fc = L1.getForkChoice( + blockId, + parentHash, + parentGasUsed + ); + + if (i == 0) { + assertFalse(fc.key == 0); + } else { + assertEq(fc.key, 0); + } + assertEq(fc.blockHash, bytes32(uint256(0x11))); + assertEq(fc.signalRoot, bytes32(uint256(0x12))); + assertEq(fc.provenAt, block.timestamp); + assertEq(fc.prover, Bob); + assertEq(fc.gasUsed, 10001); + + // Carol cannot prove the fork choice again + vm.warp(block.timestamp + 10 seconds); + vm.expectRevert(); + proveBlock( + Carol, + meta, + parentHash, + parentGasUsed, + 10002, + bytes32(uint256(0x21)), + bytes32(uint256(0x22)), + false + ); + + // Alice, the oracle prover, cannot prove the fork choice again + // as a normal prover. + vm.warp(block.timestamp + 10 seconds); + vm.expectRevert(); + proveBlock( + Alice, + meta, + parentHash, + parentGasUsed, + 10003, + bytes32(uint256(0x31)), + bytes32(uint256(0x32)), + false + ); + + // Alice, the oracle prover, cannot oracle-prove the fork choice + vm.warp(block.timestamp + 10 seconds); + proveBlock( + Alice, + meta, + parentHash, + parentGasUsed, + 10003, + bytes32(uint256(0x31)), + bytes32(uint256(0x32)), + true + ); + + fc = L1.getForkChoice(blockId, parentHash, parentGasUsed); + + if (i == 0) { + assertFalse(fc.key == 0); + } else { + assertEq(fc.key, 0); + } + assertEq(fc.blockHash, bytes32(uint256(0x31))); + assertEq(fc.signalRoot, bytes32(uint256(0x32))); + assertEq(fc.provenAt, block.timestamp); + assertEq(fc.prover, address(0)); + assertEq(fc.gasUsed, 10003); + + // Alice, the oracle prover, cannot oracle-prove the fork choice multiple times + vm.warp(block.timestamp + 10 seconds); + + proveBlock( + Alice, + meta, + parentHash, + parentGasUsed, + 10004, + bytes32(uint256(0x41)), + bytes32(uint256(0x42)), + true + ); + + fc = L1.getForkChoice(blockId, parentHash, parentGasUsed); + + if (i == 0) { + assertFalse(fc.key == 0); + } else { + assertEq(fc.key, 0); + } + assertEq(fc.blockHash, bytes32(uint256(0x41))); + assertEq(fc.signalRoot, bytes32(uint256(0x42))); + assertEq(fc.provenAt, block.timestamp); + assertEq(fc.prover, address(0)); + assertEq(fc.gasUsed, 10004); + } + } + + /// @dev Test we can propose, prove, then verify more blocks than 'maxNumProposedBlocks' + function test_cooldown_more_blocks_than_ring_buffer_size() external { + depositTaikoToken(Alice, 1E6 * 1E8, 100 ether); + depositTaikoToken(Bob, 1E6 * 1E8, 100 ether); + depositTaikoToken(Carol, 1E6 * 1E8, 100 ether); + + bytes32 parentHash = GENESIS_BLOCK_HASH; + uint32 parentGasUsed = 0; + uint32 gasUsed = 1000000; + + for ( + uint256 blockId = 1; + blockId < conf.maxNumProposedBlocks * 10; + blockId++ + ) { + printVariables("before propose"); + TaikoData.BlockMetadata memory meta = proposeBlock( + Alice, + 1000000, + 1024 + ); + printVariables("after propose"); + mine(1); + + bytes32 blockHash = bytes32(1E10 + blockId); + bytes32 signalRoot = bytes32(1E9 + blockId); + proveBlock( + Bob, + meta, + parentHash, + parentGasUsed, + gasUsed, + blockHash, + signalRoot, + false + ); + + uint256 lastVerifiedBlockId = L1 + .getStateVariables() + .lastVerifiedBlockId; + + vm.warp(block.timestamp + 4 minutes + 59 seconds); + verifyBlock(Carol, 1); + + assertEq( + lastVerifiedBlockId, + L1.getStateVariables().lastVerifiedBlockId + ); + + vm.warp(block.timestamp + 1 seconds); + verifyBlock(Carol, 1); + assertFalse( + lastVerifiedBlockId == + L1.getStateVariables().lastVerifiedBlockId + ); + + parentHash = blockHash; + parentGasUsed = gasUsed; + } + printVariables(""); + } +} diff --git a/packages/tokenomics/main.py b/packages/tokenomics/main.py new file mode 100644 index 00000000000..4715352c779 --- /dev/null +++ b/packages/tokenomics/main.py @@ -0,0 +1,395 @@ +import salabim as sim +import matplotlib.pyplot as plt +import streamlit as st +from enum import Enum +from typing import NamedTuple +from plots import plot +from present import Config, Present +from presents.p0 import present as p0 +from presents.cbvp1 import present as cbvp1 +from presents.cbvp2 import present as cbvp2 +from presents.vbcp1 import present as vbcp1 +from presents.vbcp2 import present as vbcp2 +from presents.vbvps1 import present as vbvps1 +from presents.vbvps2 import present as vbvps2 + +# from presents.p7 import present as p7 +# from presents.p8 import present as p8 +# from presents.p9 import present as p9 +# from presents.p10 import present as p10 +# from presents.p11 import present as p11 + +DAY = 24 * 3600 +K_FEE_GRACE_PERIOD = 125 +K_FEE_MAX_PERIOD = 375 +K_BLOCK_TIME_CAP = 48 # 48 seconds +K_PROOF_TIME_CAP = 3600 * 1.5 # 1.5 hour + + +class Status(Enum): + PENDING = 1 + PROVEN = 2 + VERIFIED = 3 + + +class Block(NamedTuple): + status: Status + fee: int + proposed_at: int + proven_at: int + + +def get_day(config): + day = int(env.now() / DAY) + if day >= len(config.timing): + day = len(config.timing) - 1 + return day + + +def get_block_time_avg_second(config): + return config.timing[get_day(config)].block_time_avg_second + + +def get_proof_time_avg_second(config): + return config.timing[get_day(config)].proof_time_avg_minute * 60 + + +def moving_average(ma, v, maf): + if ma == 0: + return v + else: + _ma = (ma * (maf - 1) + v) * 1.0 / maf + if _ma > 0: + return _ma + else: + return ma + + +class Protocol(sim.Component): + def setup(self, config): + self.config = config + self.fee_base = config.fee_base + self.last_proposed_at = env.now() + self.last_VERIFIED_id = 0 + self.tko_supply = 0 + self.avg_block_time = 0 + self.avg_proof_time = 0 + + genesis = Block( + status=Status.VERIFIED, + fee=0, + proposed_at=env.now(), + proven_at=env.now(), + ) + self.blocks = [genesis] + + # monitors + self.m_pending_count = sim.Monitor("m_pending_count", level=True) + self.m_fee_base = sim.Monitor( + "m_fee_base", level=True, initial_tally=self.fee_base + ) + self.m_block_fee = sim.Monitor("m_block_fee", level=True) + self.m_proof_reward = sim.Monitor("m_proof_reward", level=True) + self.m_tko_supply = sim.Monitor("m_tko_supply", level=True) + self.m_block_time = sim.Monitor("m_block_time", level=True) + self.m_proof_time = sim.Monitor("m_proof_time", level=True) + + def get_time_adjusted_fee(self, is_proposal, t_now, t_last, t_avg, t_cap): + # if (tAvg == 0) { + # return s.basefee; + # } + # uint256 _tAvg = tAvg > tCap ? tCap : tAvg; + # uint256 tGrace = (LibConstants.K_FEE_GRACE_PERIOD * _tAvg) / 100; + # uint256 tMax = (LibConstants.K_FEE_MAX_PERIOD * _tAvg) / 100; + # uint256 a = tLast + tGrace; + # uint256 b = tNow > a ? tNow - a : 0; + # uint256 tRel = (b.min(tMax) * 10000) / tMax; // [0 - 10000] + # uint256 alpha = 10000 + + # ((LibConstants.K_REWARD_MULTIPLIER - 100) * tRel) / + # 100; + # if (isProposal) { + # return (s.basefee * 10000) / alpha; // fee + # } else { + # return (s.basefee * alpha) / 10000; // reward + # } + + if t_avg == 0: + return self.fee_base + + if t_avg > t_cap: + _avg = t_cap + else: + _avg = t_avg + + t_grace = K_FEE_GRACE_PERIOD * _avg / 100.0 + t_max = K_FEE_MAX_PERIOD * _avg / 100.0 + a = t_last + t_grace + + if t_now > a: + b = t_now - a + else: + b = 0 + + if b > t_max: + b = t_max + + t_rel = 10000 * b / t_max + + alpha = 10000 + (self.config.reward_multiplier - 1) * t_rel + + if is_proposal: + return self.fee_base * 10000 / alpha + else: + return self.fee_base * alpha / 10000 + + def get_slots_adjusted_fee(self, is_proposal, fee): + # uint256 m = LibConstants.K_MAX_NUM_BLOCKS - + # 1 + + # LibConstants.K_FEE_PREMIUM_LAMDA; + # uint256 n = s.nextBlockId - s.latestVERIFIEDId - 1; + # uint256 k = isProposal ? m - n - 1 : m - n + 1; + # return (fee * (m - 1) * m) / (m - n) / k; + + m = self.config.max_blocks - 1 + self.config.lamda + n = self.num_pending() + if is_proposal: # fee + k = m - n - 1 + else: # reward + k = m - n + 1 + return fee * (m - 1) * m / (m - n) / k + + def get_block_fee(self): + fee = self.get_time_adjusted_fee( + True, + env.now(), + self.last_proposed_at, + self.avg_block_time, + K_BLOCK_TIME_CAP, + ) + + premium_fee = self.get_slots_adjusted_fee(True, fee) + # bootstrap discount not simulated + return (fee, premium_fee) + + def get_proof_reward(self, proven_at, proposed_at): + reward = self.get_time_adjusted_fee( + False, proven_at, proposed_at, self.avg_proof_time, K_PROOF_TIME_CAP + ) + premium_reward = self.get_slots_adjusted_fee(False, reward) + return (reward, premium_reward) + + def print_me(self, st): + st.markdown("-----") + st.markdown("##### Protocol state") + st.write("last_VERIFIED_id = {}".format(self.last_VERIFIED_id)) + st.write("num_blocks = {}".format(self.num_pending())) + st.write("fee_base = {}".format(self.fee_base)) + st.write("tko_supply = {}".format(self.tko_supply)) + + def num_pending(self): + return len(self.blocks) - self.last_VERIFIED_id - 1 + + def can_propose(self): + return self.num_pending() < self.config.max_blocks + + def propose_block(self): + if env.now() == 0 or not self.can_propose(): + return + + block_time = env.now() - self.last_proposed_at + + (fee, premium_fee) = self.get_block_fee() + + self.fee_base = moving_average(self.fee_base, fee, self.config.fee_maf) + self.avg_block_time = moving_average( + self.avg_block_time, + block_time, + self.config.time_avg_maf, + ) + self.last_proposed_at = env.now() + self.tko_supply -= premium_fee + + block = Block( + status=Status.PENDING, + fee=premium_fee, + proposed_at=env.now(), + proven_at=0, + ) + self.blocks.append(block) + + Prover(protocol=self, config=self.config, blockId=len(self.blocks) - 1) + self.verify_block() + + self.m_fee_base.tally(self.fee_base) + self.m_block_fee.tally(premium_fee) + self.m_tko_supply.tally(self.tko_supply) + self.m_block_time.tally(block_time) + self.m_pending_count.tally(self.num_pending()) + + def can_prove(self, id): + return ( + id > self.last_VERIFIED_id + and len(self.blocks) > id + and self.blocks[id].status == Status.PENDING + ) + + def prove_block(self, id): + if self.can_prove(id): + self.blocks[id] = self.blocks[id]._replace( + status=Status.PROVEN, proven_at=env.now() + ) + self.verify_block() + + def can_verify(self): + return ( + len(self.blocks) > self.last_VERIFIED_id + 1 + and self.blocks[self.last_VERIFIED_id + 1].status == Status.PROVEN + and env.now() + > self.blocks[self.last_VERIFIED_id + 1].proven_at + self.avg_proof_time + ) + + def verify_block(self): + for i in range(0, 5): + if self.can_verify(): + + k = self.last_VERIFIED_id + 1 + + self.blocks[k] = self.blocks[k]._replace(status=Status.VERIFIED) + + proof_time = self.blocks[k].proven_at - self.blocks[k].proposed_at + + (reward, premium_reward) = self.get_proof_reward( + self.blocks[k].proven_at, self.blocks[k].proposed_at + ) + + self.fee_base = moving_average( + self.fee_base, + reward, + self.config.fee_maf, + ) + + self.avg_proof_time = moving_average( + self.avg_proof_time, + proof_time, + self.config.time_avg_maf, + ) + + self.tko_supply += premium_reward + self.m_fee_base.tally(self.fee_base) + self.m_proof_reward.tally(premium_reward) + self.m_tko_supply.tally(self.tko_supply) + self.m_proof_time.tally(proof_time) + + self.last_VERIFIED_id = k + else: + break + + self.m_pending_count.tally(self.num_pending()) + + +class Prover(sim.Component): + def setup(self, protocol, config, blockId): + self.protocol = protocol + self.config = config + self.blockId = blockId + + def process(self): + _proof_time_avg_second = get_proof_time_avg_second(self.config) + yield self.hold( + sim.Bounded( + sim.Normal( + _proof_time_avg_second, + _proof_time_avg_second * self.config.proof_time_sd_pctg / 100, + ), + lowerbound=1, + ).sample() + ) + self.protocol.prove_block(self.blockId) + + +class Proposer(sim.Component): + def setup(self, protocol): + self.protocol = protocol + self.config = protocol.config + + def process(self): + while True: + if not self.protocol.can_propose(): + yield self.hold(1) + else: + self.protocol.propose_block() + _block_time_avg_second = get_block_time_avg_second(self.config) + yield self.hold( + sim.Bounded( + sim.Normal( + _block_time_avg_second, + _block_time_avg_second + * self.config.block_time_sd_pctg + / 100, + ), + lowerbound=1, + ).sample() + ) + + +def simulate(config, days): + st.markdown("-----") + st.markdown("##### Block & proof time and deviation settings") + st.caption("[block_time (seconds), proof_time (minutes)]") + time_str = "" + for t in config.timing: + time_str += str(t._asdict().values()) + st.write(time_str.replace("dict_values", " ☀️").replace("(", "").replace(")", "")) + + st.markdown("-----") + st.markdown("##### You can change these settings") + cols = st.columns([1, 1, 1, 1]) + inputs = {} + i = 0 + for (k, v) in config._asdict().items(): + if k != "timing": + inputs[k] = cols[i % 4].number_input(k, value=v) + i += 1 + + st.markdown("-----") + if st.button("Simulate {} days".format(days), key="run"): + actual_config = Config(timing=config.timing, **inputs) + + protocol = Protocol(config=actual_config) + proposer = Proposer(protocol=protocol) + + env.run(till=days * DAY) + + st.markdown("-----") + st.markdown("##### Block/Proof Time") + plot(days, [(protocol.m_block_time, "block time")], color="tab:blue") + plot(days, [(protocol.m_proof_time, "proof time")], color="tab:blue") + + st.markdown("-----") + st.markdown("##### Result") + plot(days, [(protocol.m_pending_count, "num pending blocks")]) + plot(days, [(protocol.m_fee_base, "fee_base")]) + plot(days, [(protocol.m_block_fee, "block fee")], color="tab:green") + plot(days, [(protocol.m_proof_reward, "proof reward")]) + + plot(days, [(protocol.m_tko_supply, "tko supply")], color="tab:red") + + protocol.print_me(st) + + +if __name__ == "__main__": + env = sim.Environment(trace=False) + st.title("Taiko Block Fee/Reward Simulation") + + presents = [p0, cbvp1, cbvp2, vbcp1, vbcp2, vbvps1, vbvps2] + st.markdown("## Configs") + selected = st.radio( + "Please choose one of the following predefined configs:", + range(0, len(presents)), + format_func=lambda x: presents[x].title, + ) + present = presents[selected] + st.markdown("-----") + st.markdown("##### Description") + st.markdown(present.desc) + simulate(present.config, present.days) diff --git a/packages/website/pages/docs/reference/contract-documentation/L1/TaikoData.md b/packages/website/pages/docs/reference/contract-documentation/L1/TaikoData.md index 5c5541c41fa..6c00e20a691 100644 --- a/packages/website/pages/docs/reference/contract-documentation/L1/TaikoData.md +++ b/packages/website/pages/docs/reference/contract-documentation/L1/TaikoData.md @@ -14,6 +14,7 @@ struct Config { uint256 maxBytesPerTxList; uint256 minTxGasLimit; uint256 txListCacheExpiry; + uint256 proofCooldownPeriod; uint64 minEthDepositsPerBlock; uint64 maxEthDepositsPerBlock; uint96 maxEthDepositAmount; @@ -22,9 +23,6 @@ struct Config { uint8 adjustmentQuotient; bool relaySignalRoot; bool enableSoloProposer; - bool enableOracleProver; - bool enableTokenomics; - bool skipZKPVerification; } ``` @@ -104,26 +102,6 @@ struct BlockEvidence { } ``` -### BlockOracle - -```solidity -struct BlockOracle { - bytes32 blockHash; - uint32 gasUsed; - bytes32 signalRoot; -} -``` - -### BlockOracles - -```solidity -struct BlockOracles { - bytes32 parentHash; - uint32 parentGasUsed; - struct TaikoData.BlockOracle[] blks; -} -``` - ### ForkChoice ```solidity diff --git a/packages/website/pages/docs/reference/contract-documentation/L1/TaikoErrors.md b/packages/website/pages/docs/reference/contract-documentation/L1/TaikoErrors.md index 98a3d509369..24582eac189 100644 --- a/packages/website/pages/docs/reference/contract-documentation/L1/TaikoErrors.md +++ b/packages/website/pages/docs/reference/contract-documentation/L1/TaikoErrors.md @@ -84,12 +84,6 @@ error L1_INVALID_L21559_PARAMS() error L1_INVALID_METADATA() ``` -### L1_INVALID_ORACLE - -```solidity -error L1_INVALID_ORACLE() -``` - ### L1_INVALID_PARAM ```solidity @@ -102,12 +96,6 @@ error L1_INVALID_PARAM() error L1_INVALID_PROOF() ``` -### L1_NOT_ORACLE_PROVEN - -```solidity -error L1_NOT_ORACLE_PROVEN() -``` - ### L1_NOT_ORACLE_PROVER ```solidity @@ -155,15 +143,3 @@ error L1_TX_LIST_RANGE() ```solidity error L1_TX_LIST() ``` - -### L1_UNEXPECTED_FORK_CHOICE_ID - -```solidity -error L1_UNEXPECTED_FORK_CHOICE_ID() -``` - -### L1_CONFLICTING_PROOF - -```solidity -error L1_CONFLICTING_PROOF(uint64 id, uint32 parentGasUsed, bytes32 parentHash, bytes32 conflictingBlockHash, bytes32 conflictingSignalRoot, bytes32 blockHash, bytes32 signalRoot) -``` diff --git a/packages/website/pages/docs/reference/contract-documentation/L1/TaikoL1.md b/packages/website/pages/docs/reference/contract-documentation/L1/TaikoL1.md index 31b091dbee3..866d6ee7fce 100644 --- a/packages/website/pages/docs/reference/contract-documentation/L1/TaikoL1.md +++ b/packages/website/pages/docs/reference/contract-documentation/L1/TaikoL1.md @@ -44,21 +44,6 @@ Propose a Taiko L2 block. | input | bytes | An abi-encoded BlockMetadataInput that the actual L2 block header must satisfy. | | txList | bytes | A list of transactions in this block, encoded with RLP. Note, in the corresponding L2 block an _anchor transaction_ will be the first transaction in the block -- if there are `n` transactions in `txList`, then there will be up to `n + 1` transactions in the L2 block. | -### oracleProveBlocks - -```solidity -function oracleProveBlocks(uint256 blockId, bytes input) external -``` - -Oracle prove mutliple blocks in a row. - -#### Parameters - -| Name | Type | Description | -| ------- | ------- | ---------------------------------------------------------------------------------------------------- | -| blockId | uint256 | The index of the first block to prove. This is also used to select the right implementation version. | -| input | bytes | An abi-encoded TaikoData.BlockOracle[] object. | - ### proveBlock ```solidity From 796ddc43106e13f71f26fc88efc0e2b3f3db7627 Mon Sep 17 00:00:00 2001 From: Daniel Wang <99078276+dantaik@users.noreply.github.com> Date: Sun, 23 Apr 2023 18:31:15 +0800 Subject: [PATCH 45/47] refactor(protocol): optimize proving logics [3] (#13611) Co-authored-by: adaki2004 Co-authored-by: David Co-authored-by: Dani <51912515+adaki2004@users.noreply.github.com> --- packages/protocol/.solhintignore | 4 +- packages/protocol/contracts/L1/TaikoData.sol | 26 ++-- .../protocol/contracts/L1/libs/LibProving.sol | 122 ++++++++---------- .../contracts/common/AddressManager.sol | 89 +++++++++++++ .../contracts/common/AddressResolver.sol | 17 +-- .../contracts/common/IAddressManager.sol | 29 ----- .../contracts/test/L1/TestTaikoL1.sol | 8 -- .../test/L1/TestTaikoL1EnableTokenomics.sol | 8 -- .../protocol/contracts/test/TestContracts.sol | 52 +------- .../contracts/thirdparty/AddressManager.sol | 93 ------------- packages/protocol/foundry.toml | 8 +- packages/protocol/package.json | 8 +- packages/protocol/script/DeployOnL1.s.sol | 35 ++--- .../{deploy_on_l1.sh => test_deploy_on_l1.sh} | 6 +- .../protocol/{test2 => test}/Bridge.t.sol | 31 ++--- .../protocol/{test2 => test}/EtherVault.t.sol | 2 +- .../{test2 => test}/GasComparison.t.sol | 0 .../protocol/{test2 => test}/Lib1559Math.sol | 0 .../{test2 => test}/LibFixedPointMath.t.sol | 0 packages/protocol/{test2 => test}/LibLn.sol | 0 .../{test2 => test}/SignalServiceCalc.sol | 0 .../{test2 => test}/Taiko1559Params.t.sol | 0 .../protocol/{test2 => test}/TaikoL1.sim.sol | 0 .../protocol/{test2 => test}/TaikoL1.t.sol | 10 +- .../TaikoL1LibTokenomicsMainnet.t.sol | 2 +- .../TaikoL1LibTokenomicsTestnet.t.sol | 2 +- .../{test2 => test}/TaikoL1TestBase.t.sol | 71 +++++----- .../{test2 => test}/TaikoL1_Oracle.sol | 24 ++-- .../protocol/{test2 => test}/TaikoL2.t.sol | 0 .../protocol/{test2 => test}/TokenVault.t.sol | 21 ++- .../protocol/test/bridge/BridgedERC20.test.ts | 3 +- .../genesis/GenerateGenesis.g.sol | 13 +- .../genesis/generate_genesis.test.sh | 2 +- .../{test2 => test}/genesis/test_config.json | 0 .../genesis/testnet/docker-compose.yml | 0 .../genesis/testnet/init_geth.sh | 0 .../protocol/test/libs/LibTrieProof.test.ts | 6 +- .../signal/SignalService.integration.test.ts | 9 +- packages/protocol/test/utils/bridge.ts | 7 +- packages/protocol/test/utils/fixture.ts | 8 +- packages/protocol/test/utils/signal.ts | 3 +- packages/protocol/test/utils/taikoToken.ts | 3 +- .../utils/generate_genesis/taikoL2.ts | 67 +++------- .../contract-documentation/L1/TaikoData.md | 23 ++-- .../common/AddressManager.md | 93 +++++++++++++ .../common/AddressResolver.md | 6 - .../common/IAddressManager.md | 41 ------ 47 files changed, 423 insertions(+), 529 deletions(-) create mode 100644 packages/protocol/contracts/common/AddressManager.sol delete mode 100644 packages/protocol/contracts/common/IAddressManager.sol delete mode 100644 packages/protocol/contracts/thirdparty/AddressManager.sol rename packages/protocol/script/{deploy_on_l1.sh => test_deploy_on_l1.sh} (80%) rename packages/protocol/{test2 => test}/Bridge.t.sol (94%) rename packages/protocol/{test2 => test}/EtherVault.t.sol (98%) rename packages/protocol/{test2 => test}/GasComparison.t.sol (100%) rename packages/protocol/{test2 => test}/Lib1559Math.sol (100%) rename packages/protocol/{test2 => test}/LibFixedPointMath.t.sol (100%) rename packages/protocol/{test2 => test}/LibLn.sol (100%) rename packages/protocol/{test2 => test}/SignalServiceCalc.sol (100%) rename packages/protocol/{test2 => test}/Taiko1559Params.t.sol (100%) rename packages/protocol/{test2 => test}/TaikoL1.sim.sol (100%) rename packages/protocol/{test2 => test}/TaikoL1.t.sol (96%) rename packages/protocol/{test2 => test}/TaikoL1LibTokenomicsMainnet.t.sol (99%) rename packages/protocol/{test2 => test}/TaikoL1LibTokenomicsTestnet.t.sol (99%) rename packages/protocol/{test2 => test}/TaikoL1TestBase.t.sol (89%) rename packages/protocol/{test2 => test}/TaikoL1_Oracle.sol (94%) rename packages/protocol/{test2 => test}/TaikoL2.t.sol (100%) rename packages/protocol/{test2 => test}/TokenVault.t.sol (94%) rename packages/protocol/{test2 => test}/genesis/GenerateGenesis.g.sol (93%) rename packages/protocol/{test2 => test}/genesis/generate_genesis.test.sh (98%) rename packages/protocol/{test2 => test}/genesis/test_config.json (100%) rename packages/protocol/{test2 => test}/genesis/testnet/docker-compose.yml (100%) rename packages/protocol/{test2 => test}/genesis/testnet/init_geth.sh (100%) create mode 100644 packages/website/pages/docs/reference/contract-documentation/common/AddressManager.md delete mode 100644 packages/website/pages/docs/reference/contract-documentation/common/IAddressManager.md diff --git a/packages/protocol/.solhintignore b/packages/protocol/.solhintignore index 7b6a5611295..ef1c8c9a147 100644 --- a/packages/protocol/.solhintignore +++ b/packages/protocol/.solhintignore @@ -3,5 +3,5 @@ lib/ contracts/test/TestLibRLPReader.sol contracts/test/TestLibRLPWriter.sol **/contracts/thirdparty/**/*.sol -test2/GasComparison.t.sol -test2/TestLn.sol \ No newline at end of file +test/GasComparison.t.sol +test/TestLn.sol \ No newline at end of file diff --git a/packages/protocol/contracts/L1/TaikoData.sol b/packages/protocol/contracts/L1/TaikoData.sol index c0939462ad9..c490728e9e4 100644 --- a/packages/protocol/contracts/L1/TaikoData.sol +++ b/packages/protocol/contracts/L1/TaikoData.sol @@ -72,14 +72,8 @@ library TaikoData { TaikoData.EthDeposit[] depositsProcessed; } - struct ZKProof { - bytes data; - uint16 verifierId; - } - struct BlockEvidence { - TaikoData.BlockMetadata meta; - ZKProof zkproof; + bytes32 metaHash; bytes32 parentHash; bytes32 blockHash; bytes32 signalRoot; @@ -87,6 +81,8 @@ library TaikoData { address prover; uint32 parentGasUsed; uint32 gasUsed; + uint16 verifierId; + bytes proof; } // 4 slots @@ -133,22 +129,24 @@ library TaikoData { mapping(address account => uint256 balance) taikoTokenBalances; mapping(bytes32 txListHash => TxListInfo) txListInfo; EthDeposit[] ethDeposits; - // Slot 6: never or rarely changed + bytes32 staticRefs; + // Never or rarely changed + // Slot 7: never or rarely changed uint64 genesisHeight; uint64 genesisTimestamp; - uint64 __reserved61; - uint64 __reserved62; - // Slot 7 + uint64 __reserved71; + uint64 __reserved72; + // Slot 8 uint64 accProposedAt; uint64 accBlockFees; uint64 numBlocks; uint64 nextEthDepositToProcess; - // Slot 8 + // Slot 9 uint64 basefee; uint64 proofTimeIssued; uint64 lastVerifiedBlockId; - uint64 __reserved81; + uint64 __reserved91; // Reserved - uint256[42] __gap; + uint256[41] __gap; } } diff --git a/packages/protocol/contracts/L1/libs/LibProving.sol b/packages/protocol/contracts/L1/libs/LibProving.sol index 6deae404ef1..fc5115ddd0d 100644 --- a/packages/protocol/contracts/L1/libs/LibProving.sol +++ b/packages/protocol/contracts/L1/libs/LibProving.sol @@ -38,63 +38,56 @@ library LibProving { uint256 blockId, TaikoData.BlockEvidence memory evidence ) internal { + if ( + evidence.parentHash == 0 || + evidence.blockHash == 0 || + evidence.blockHash == evidence.parentHash || + evidence.signalRoot == 0 || + evidence.gasUsed == 0 + ) revert L1_INVALID_EVIDENCE(); + + if (blockId <= state.lastVerifiedBlockId || blockId >= state.numBlocks) + revert L1_BLOCK_ID(); + + TaikoData.Block storage blk = state.blocks[ + blockId % config.ringBufferSize + ]; + + // Check the metadata hash matches the proposed block's. This is + // necessary to handle chain reorgs. + if (blk.metaHash != evidence.metaHash) + revert L1_EVIDENCE_MISMATCH(blk.metaHash, evidence.metaHash); + bool isOracleProof = evidence.prover == address(0); if (isOracleProof) { address oracleProver = resolver.resolve("oracle_prover", true); if (oracleProver == address(0)) revert L1_ORACLE_DISABLED(); - if (msg.sender != oracleProver) { - if (evidence.zkproof.data.length == 64) { - uint8 v = uint8(evidence.zkproof.verifierId); + if (evidence.proof.length == 64) { + uint8 v = uint8(evidence.verifierId); bytes32 r; bytes32 s; - bytes memory data = evidence.zkproof.data; + bytes memory data = evidence.proof; assembly { r := mload(add(data, 32)) s := mload(add(data, 64)) } // clear the proof before hasing evidence - evidence.zkproof.data = new bytes(0); - evidence.zkproof.verifierId = 0; + evidence.verifierId = 0; + evidence.proof = new bytes(0); if ( oracleProver != ecrecover(keccak256(abi.encode(evidence)), v, r, s) ) revert L1_NOT_ORACLE_PROVER(); - } else { - revert L1_NOT_ORACLE_PROVER(); } + } else { + revert L1_NOT_ORACLE_PROVER(); } } - if ( - evidence.meta.id != blockId || - evidence.meta.id <= state.lastVerifiedBlockId || - evidence.meta.id >= state.numBlocks - ) revert L1_BLOCK_ID(); - - if ( - evidence.parentHash == 0 || - evidence.blockHash == 0 || - evidence.blockHash == evidence.parentHash || - evidence.signalRoot == 0 || - evidence.gasUsed == 0 - ) revert L1_INVALID_EVIDENCE(); - - TaikoData.Block storage blk = state.blocks[ - evidence.meta.id % config.ringBufferSize - ]; - - { - // Check the metadata matches the block's metadata. This is very - // necessary even for the oracle-proof to handle chain reorgs. - bytes32 _metaHash = LibUtils.hashMetadata(evidence.meta); - if (blk.metaHash != _metaHash) - revert L1_EVIDENCE_MISMATCH(blk.metaHash, _metaHash); - } - TaikoData.ForkChoice storage fc; uint256 fcId = LibUtils.getForkChoiceId( @@ -138,48 +131,43 @@ library LibProving { if (!isOracleProof) { bytes32 instance; - { - // otherwise: stack too deep - address l1SignalService = resolver.resolve( - "signal_service", - false - ); - address l2SignalService = resolver.resolve( + + // Set state.staticRefs + if (state.staticRefs == 0) { + address[3] memory addresses; + addresses[0] = resolver.resolve("signal_service", false); + addresses[1] = resolver.resolve( config.chainId, "signal_service", false ); - address taikoL2 = resolver.resolve( - config.chainId, - "taiko_l2", - false - ); - - uint256[9] memory inputs; - inputs[0] = uint160(l1SignalService); - inputs[1] = uint160(l2SignalService); - inputs[2] = uint160(taikoL2); - inputs[3] = uint256(evidence.parentHash); - inputs[4] = uint256(evidence.blockHash); - inputs[5] = uint256(evidence.signalRoot); - inputs[6] = uint256(evidence.graffiti); - inputs[7] = - (uint256(uint160(evidence.prover)) << 96) | - (uint256(evidence.parentGasUsed) << 64) | - (uint256(evidence.gasUsed) << 32); - inputs[8] = uint256(blk.metaHash); - + addresses[2] = resolver.resolve(config.chainId, "taiko", false); + bytes32 staticRefs; assembly { - instance := keccak256(inputs, mul(32, 9)) + staticRefs := keccak256(addresses, mul(32, 3)) } + state.staticRefs = staticRefs; + } + + uint256[7] memory inputs; + inputs[0] = uint256(state.staticRefs); + inputs[1] = uint256(blk.metaHash); + inputs[2] = uint256(evidence.parentHash); + inputs[3] = uint256(evidence.blockHash); + inputs[4] = uint256(evidence.signalRoot); + inputs[5] = uint256(evidence.graffiti); + inputs[6] = + (uint256(uint160(evidence.prover)) << 96) | + (uint256(evidence.parentGasUsed) << 64) | + (uint256(evidence.gasUsed) << 32); + + assembly { + instance := keccak256(inputs, mul(32, 7)) } (bool verified, bytes memory ret) = resolver - .resolve( - LibUtils.getVerifierName(evidence.zkproof.verifierId), - false - ) - .staticcall(bytes.concat(instance, evidence.zkproof.data)); + .resolve(LibUtils.getVerifierName(evidence.verifierId), false) + .staticcall(bytes.concat(instance, evidence.proof)); if ( !verified || diff --git a/packages/protocol/contracts/common/AddressManager.sol b/packages/protocol/contracts/common/AddressManager.sol new file mode 100644 index 00000000000..fc37b76dd4d --- /dev/null +++ b/packages/protocol/contracts/common/AddressManager.sol @@ -0,0 +1,89 @@ +// SPDX-License-Identifier: MIT +// _____ _ _ _ _ +// |_ _|_ _(_) |_____ | | __ _| |__ ___ +// | |/ _` | | / / _ \ | |__/ _` | '_ (_-< +// |_|\__,_|_|_\_\___/ |____\__,_|_.__/__/ + +pragma solidity ^0.8.18; + +/* External Imports */ +import { + OwnableUpgradeable +} from "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol"; + +/** + * @notice Interface to set and get an address for a name. + */ +interface IAddressManager { + /** + * Changes the address associated with a particular name. + * @param domain Uint256 domain to assiciate an address with. + * @param name String name to associate an address with. + * @param newAddress Address to associate with the name. + */ + function setAddress( + uint256 domain, + string memory name, + address newAddress + ) external; + + /** + * Retrieves the address associated with a given name. + * @param domain Class to retrieve an address for. + * @param name Name to retrieve an address for. + * @return Address associated with the given name. + */ + function getAddress( + uint256 domain, + string memory name + ) external view returns (address); +} + +/** + * @title AddressManager + */ +contract AddressManager is OwnableUpgradeable, IAddressManager { + mapping(uint256 domain => mapping(bytes32 nameHash => address addr)) + private addresses; + + event AddressSet( + uint256 indexed _domain, + string indexed _name, + address _newAddress, + address _oldAddress + ); + + /// @dev Initializer to be called after being deployed behind a proxy. + function init() external initializer { + OwnableUpgradeable.__Ownable_init(); + } + + function setAddress( + uint256 domain, + string memory name, + address newAddress + ) external onlyOwner { + address oldAddress = addresses[domain][_stringToBytes32(name)]; + addresses[domain][_stringToBytes32(name)] = newAddress; + emit AddressSet(domain, name, newAddress, oldAddress); + } + + function getAddress( + uint256 domain, + string memory name + ) external view returns (address addr) { + addr = addresses[domain][_stringToBytes32(name)]; + } + + function _stringToBytes32( + string memory source + ) private pure returns (bytes32 result) { + if (bytes(source).length == 0) { + return 0x0; + } + + assembly { + result := mload(add(source, 32)) + } + } +} diff --git a/packages/protocol/contracts/common/AddressResolver.sol b/packages/protocol/contracts/common/AddressResolver.sol index ad3d304810c..668429f0ea0 100644 --- a/packages/protocol/contracts/common/AddressResolver.sol +++ b/packages/protocol/contracts/common/AddressResolver.sol @@ -6,7 +6,7 @@ pragma solidity ^0.8.18; -import {IAddressManager} from "./IAddressManager.sol"; +import {IAddressManager} from "./AddressManager.sol"; import {Strings} from "@openzeppelin/contracts/utils/Strings.sol"; /** @@ -69,13 +69,6 @@ abstract contract AddressResolver { return address(_addressManager); } - function keyForName( - uint256 chainId, - string memory name - ) public pure virtual returns (string memory) { - return string(bytes.concat(bytes32(chainId), bytes(name))); - } - function _init(address addressManager_) internal virtual { if (addressManager_ == address(0)) revert RESOLVER_INVALID_ADDR(); _addressManager = IAddressManager(addressManager_); @@ -86,13 +79,15 @@ abstract contract AddressResolver { string memory name, bool allowZeroAddress ) private view returns (address payable addr) { - string memory key = keyForName(chainId, name); + addr = payable(_addressManager.getAddress(chainId, name)); - addr = payable(_addressManager.getAddress(key)); if (!allowZeroAddress) { // We do not use custom error so this string-based // error message is more helpful for diagnosis. - require(addr != address(0), string.concat("AR:zeroAddr:", key)); + require( + addr != address(0), + string(abi.encode("AR:zeroAddr:", chainId, ".", name)) + ); } } } diff --git a/packages/protocol/contracts/common/IAddressManager.sol b/packages/protocol/contracts/common/IAddressManager.sol deleted file mode 100644 index 6f90c7c757e..00000000000 --- a/packages/protocol/contracts/common/IAddressManager.sol +++ /dev/null @@ -1,29 +0,0 @@ -// SPDX-License-Identifier: MIT -// _____ _ _ _ _ -// |_ _|_ _(_) |_____ | | __ _| |__ ___ -// | |/ _` | | / / _ \ | |__/ _` | '_ (_-< -// |_|\__,_|_|_\_\___/ |____\__,_|_.__/__/ - -pragma solidity ^0.8.18; - -/** - * @notice Interface to set and get an address for a name. - */ -interface IAddressManager { - /** - * @notice Associate an address to a name. - * @dev The original address associated with the name, if exists, will be - * replaced. - * @param name The name which an address will be associated with. - * @param addr The address to be associated with the given name. - */ - function setAddress(string memory name, address addr) external; - - /** - * @notice Returns the address associated with the given name. - * @param name The name for which an address will be returned. - * @return The address associated with the given name. If no address is - * found, `address(0)` will be returned. - */ - function getAddress(string memory name) external view returns (address); -} diff --git a/packages/protocol/contracts/test/L1/TestTaikoL1.sol b/packages/protocol/contracts/test/L1/TestTaikoL1.sol index 78f0e969e3a..dc587b86a73 100644 --- a/packages/protocol/contracts/test/L1/TestTaikoL1.sol +++ b/packages/protocol/contracts/test/L1/TestTaikoL1.sol @@ -29,12 +29,4 @@ contract TestTaikoL1 is TaikoL1 { config.maxBytesPerTxList = 120000; config.minTxGasLimit = 21000; } - - // The old implementation that is also used in hardhat tests. - function keyForName( - uint256 chainId, - string memory name - ) public pure override returns (string memory key) { - key = string.concat(Strings.toString(chainId), ".", name); - } } diff --git a/packages/protocol/contracts/test/L1/TestTaikoL1EnableTokenomics.sol b/packages/protocol/contracts/test/L1/TestTaikoL1EnableTokenomics.sol index 44379c9a917..40fd9147328 100644 --- a/packages/protocol/contracts/test/L1/TestTaikoL1EnableTokenomics.sol +++ b/packages/protocol/contracts/test/L1/TestTaikoL1EnableTokenomics.sol @@ -29,12 +29,4 @@ contract TestTaikoL1EnableTokenomics is TaikoL1 { config.maxBytesPerTxList = 120000; config.minTxGasLimit = 21000; } - - // The old implementation that is also used in hardhat tests. - function keyForName( - uint256 chainId, - string memory name - ) public pure override returns (string memory key) { - key = string.concat(Strings.toString(chainId), ".", name); - } } diff --git a/packages/protocol/contracts/test/TestContracts.sol b/packages/protocol/contracts/test/TestContracts.sol index 2cd17597158..106daa05dae 100644 --- a/packages/protocol/contracts/test/TestContracts.sol +++ b/packages/protocol/contracts/test/TestContracts.sol @@ -23,60 +23,18 @@ contract TestERC20 is ERC20 { } } -contract TestSignalService is SignalService { - function keyForName( - uint256 chainId, - string memory name - ) public pure override returns (string memory key) { - key = string.concat(Strings.toString(chainId), ".", name); - } -} +contract TestSignalService is SignalService {} -contract TestTokenVault is TokenVault { - function keyForName( - uint256 chainId, - string memory name - ) public pure override returns (string memory key) { - key = string.concat(Strings.toString(chainId), ".", name); - } -} +contract TestTokenVault is TokenVault {} -contract TestEtherVault is EtherVault { - function keyForName( - uint256 chainId, - string memory name - ) public pure override returns (string memory key) { - key = string.concat(Strings.toString(chainId), ".", name); - } -} +contract TestEtherVault is EtherVault {} -contract TestBridgedERC20 is BridgedERC20 { - function keyForName( - uint256 chainId, - string memory name - ) public pure override returns (string memory key) { - key = string.concat(Strings.toString(chainId), ".", name); - } -} +contract TestBridgedERC20 is BridgedERC20 {} -contract TestBridge is Bridge { - function keyForName( - uint256 chainId, - string memory name - ) public pure override returns (string memory key) { - key = string.concat(Strings.toString(chainId), ".", name); - } -} +contract TestBridge is Bridge {} contract TestTaikoToken is TaikoToken { function mintAnyone(address account, uint256 amount) public { _mint(account, amount); } - - function keyForName( - uint256 chainId, - string memory name - ) public pure override returns (string memory key) { - key = string.concat(Strings.toString(chainId), ".", name); - } } diff --git a/packages/protocol/contracts/thirdparty/AddressManager.sol b/packages/protocol/contracts/thirdparty/AddressManager.sol deleted file mode 100644 index 6662d2ffb73..00000000000 --- a/packages/protocol/contracts/thirdparty/AddressManager.sol +++ /dev/null @@ -1,93 +0,0 @@ -// SPDX-License-Identifier: MIT -// Taken from https://github.com/ethereum-optimism/optimism/blob/develop/packages/contracts/contracts/libraries/resolver/LibAddressManager.sol -// Modified: -// - contract name `LibAddressManager` modified to `AddressManager` to obey `lint:sol` -// - `Ownable.sol` modified to `OwnableUpgradeable.sol` -// - `init()` added to initialize -// - `setAddress` modified to `addAddress` to conform to ABI of `IAddressManager.sol` -// (The MIT License) -// -// Copyright 2020-2021 Optimism -// Copyright 2022-2023 Taiko Labs -// -// Permission is hereby granted, free of charge, to any person obtaining -// a copy of this software and associated documentation files (the -// "Software"), to deal in the Software without restriction, including -// without limitation the rights to use, copy, modify, merge, publish, -// distribute, sublicense, and/or sell copies of the Software, and to -// permit persons to whom the Software is furnished to do so, subject to -// the following conditions: -// -// The above copyright notice and this permission notice shall be -// included in all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -// CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -// TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -// SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -pragma solidity ^0.8.18; - -/* External Imports */ -import "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol"; - -/** - * @title AddressManager - */ -contract AddressManager is OwnableUpgradeable { - /************* - * Variables * - *************/ - - mapping(bytes32 nameHash => address addr) private addresses; - - /********** - * Events * - **********/ - - event AddressSet( - string indexed _name, - address _newAddress, - address _oldAddress - ); - - /******************** - * External Functions* - ********************/ - - /// @dev Initializer to be called after being deployed behind a proxy. - function init() external initializer { - OwnableUpgradeable.__Ownable_init(); - } - - /** - * Changes the address associated with a particular name. - * @param name String name to associate an address with. - * @param newAddress Address to associate with the name. - */ - function setAddress( - string memory name, - address newAddress - ) external onlyOwner { - bytes32 nameHash = keccak256(bytes(name)); - address oldAddress = addresses[nameHash]; - addresses[nameHash] = newAddress; - emit AddressSet(name, newAddress, oldAddress); - } - - /******************** - * Public Functions * - ********************/ - - /** - * Retrieves the address associated with a given name. - * @param name Name to retrieve an address for. - * @return Address associated with the given name. - */ - function getAddress(string memory name) external view returns (address) { - return addresses[keccak256(bytes(name))]; - } -} diff --git a/packages/protocol/foundry.toml b/packages/protocol/foundry.toml index dae7b3f78c7..fdf3fa04279 100644 --- a/packages/protocol/foundry.toml +++ b/packages/protocol/foundry.toml @@ -3,7 +3,7 @@ solc-version = "0.8.18" src = 'contracts' out = 'out' -test = 'test2' +test = 'test' libs = ['lib'] gas_price = 10000000000 # gas price is 10 Gwei optimizer = true @@ -13,15 +13,15 @@ gas_limit = '18446744073709551615' # Do not change the block_gas_limit value, TaikoL2.t.sol depends on it. block_gas_limit = 30000000 #30M -# For mainnet_mock tokenomics test we need a huge value to run lots of iterations. +# For mainnet_mock tokenomics test we need a huge value to run lots of iterations. # Use the above 30M for TaikoL2.t.sol related tests, only use this number with mainnet simulation. #block_gas_limit = 3000000000 #3000M fs_permissions = [ { access = "read", path = "./out"}, - { access = "read", path = "./deployments"}, - { access = "read", path = "./test2"} + { access = "read-write", path = "./deployments"}, + { access = "read", path = "./test"}, ] fuzz = { runs = 256 } diff --git a/packages/protocol/package.json b/packages/protocol/package.json index 3b380fe740e..35f55eea158 100644 --- a/packages/protocol/package.json +++ b/packages/protocol/package.json @@ -14,15 +14,15 @@ "test": "./script/download_solc.sh && pnpm hardhat test --grep '^[^integration]'", "coverage": "pnpm hardhat coverage --solcoverjs ./.solcover.js --show-stack-traces", "test:coverage": "pnpm coverage", - "test:foundry": "forge test -vvv --gas-report --fuzz-seed $(date +%s) --match-path test2/**/*.t.sol", - "test:sim": "forge test -vvv --gas-report --fuzz-seed $(date +%s) --match-path test2/**/*.sim.sol --block-gas-limit 30000000000 --memory-limit 1073741824", + "test:foundry": "forge test -vvv --gas-report --fuzz-seed $(date +%s) --match-path test/**/*.t.sol", + "test:sim": "forge test -vvv --gas-report --fuzz-seed $(date +%s) --match-path test/**/*.sim.sol --block-gas-limit 30000000000 --memory-limit 1073741824", "generate:genesis": "ts-node ./utils/generate_genesis/main.ts", - "test:genesis": "./test2/genesis/generate_genesis.test.sh", + "test:genesis": "./test/genesis/generate_genesis.test.sh", "test:bridge": "TEST_TYPE=integrationbridge ./test/test_integration.sh", "test:integration": "TEST_TYPE=integration ./test/test_integration.sh", "test:tokenomics": "TEST_TYPE=tokenomics ./test/test_integration.sh", "test:all": "pnpm run test && pnpm run test:integration && pnpm run test:tokenomics && pnpm run test:genesis", - "deploy:foundry": "./script/download_solc.sh && ./script/deploy_on_l1.sh", + "deploy:foundry": "./script/download_solc.sh && ./script/test_deploy_on_l1.sh", "lint-staged": "lint-staged --allow-empty", "sizer": "pnpm hardhat size-contracts" }, diff --git a/packages/protocol/script/DeployOnL1.s.sol b/packages/protocol/script/DeployOnL1.s.sol index 9609502dba0..407e9ff3599 100644 --- a/packages/protocol/script/DeployOnL1.s.sol +++ b/packages/protocol/script/DeployOnL1.s.sol @@ -10,28 +10,27 @@ import "forge-std/Script.sol"; import "forge-std/console2.sol"; import "@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol"; import "@openzeppelin/contracts-upgradeable/utils/math/SafeCastUpgradeable.sol"; -import "../contracts/common/AddressResolver.sol"; import "../contracts/L1/TaikoToken.sol"; import "../contracts/L1/TaikoL1.sol"; import "../contracts/bridge/Bridge.sol"; import "../contracts/bridge/TokenVault.sol"; import "../contracts/signal/SignalService.sol"; -import "../contracts/thirdparty/AddressManager.sol"; +import "../contracts/common/AddressManager.sol"; import "../contracts/test/erc20/FreeMintERC20.sol"; import "../contracts/test/erc20/MayFailFreeMintERC20.sol"; -import "../test2/LibLn.sol"; +import "../test/LibLn.sol"; -contract DeployOnL1 is Script, AddressResolver { +contract DeployOnL1 is Script { using SafeCastUpgradeable for uint256; - uint256 public l2ChainId = vm.envUint("L2_CHAIN_ID"); - bytes32 public genesisHash = vm.envBytes32("L2_GENESIS_HASH"); uint256 public deployerPrivateKey = vm.envUint("PRIVATE_KEY"); address public taikoL2Address = vm.envAddress("TAIKO_L2_ADDRESS"); + address public l2SignalService = vm.envAddress("L2_SIGNAL_SERVICE"); + address public owner = vm.envAddress("OWNER"); address public oracleProver = vm.envAddress("ORACLE_PROVER"); @@ -58,9 +57,9 @@ contract DeployOnL1 is Script, AddressResolver { error FAILED_TO_DEPLOY_PLONK_VERIFIER(string contractPath); function run() external { - require(l2ChainId != block.chainid, "same chainid"); require(owner != address(0), "owner is zero"); require(taikoL2Address != address(0), "taikoL2Address is zero"); + require(l2SignalService != address(0), "l2SignalService is zero"); require(treasure != address(0), "treasure is zero"); require( taikoTokenPremintRecipient != address(0), @@ -81,7 +80,13 @@ contract DeployOnL1 is Script, AddressResolver { bytes.concat(addressManager.init.selector) ); + // TaikoL1 + taikoL1 = new TaikoL1(); + uint256 l2ChainId = taikoL1.getConfig().chainId; + require(l2ChainId != block.chainid, "same chainid"); + setAddress(l2ChainId, "taiko", taikoL2Address); + setAddress(l2ChainId, "signal_service", l2SignalService); setAddress("oracle_prover", oracleProver); setAddress("solo_proposer", soloProposer); setAddress(l2ChainId, "treasure", treasure); @@ -118,9 +123,6 @@ contract DeployOnL1 is Script, AddressResolver { ); console.log("BullToken", bullToken); - // TaikoL1 - taikoL1 = new TaikoL1(); - uint64 feeBase = 1 ** 8; // Taiko Token's decimals is 8, not 18 // Calculating it for our needs based on testnet/mainnet. We need it in @@ -247,10 +249,16 @@ contract DeployOnL1 is Script, AddressResolver { if (addressManagerProxy != address(0)) { AddressManager(addressManagerProxy).setAddress( - keyForName(block.chainid, name), + block.chainid, + name, proxy ); } + + vm.writeJson( + vm.serializeAddress("deployment", name, proxy), + string.concat(vm.projectRoot(), "/deployments/deploy_l1.json") + ); } function setAddress(string memory name, address addr) private { @@ -264,10 +272,7 @@ contract DeployOnL1 is Script, AddressResolver { ) private { console.log(chainId, name, "--->", addr); if (addr != address(0)) { - AddressManager(addressManagerProxy).setAddress( - keyForName(chainId, name), - addr - ); + AddressManager(addressManagerProxy).setAddress(chainId, name, addr); } } } diff --git a/packages/protocol/script/deploy_on_l1.sh b/packages/protocol/script/test_deploy_on_l1.sh similarity index 80% rename from packages/protocol/script/deploy_on_l1.sh rename to packages/protocol/script/test_deploy_on_l1.sh index b7b5f871b73..0fd8981c688 100755 --- a/packages/protocol/script/deploy_on_l1.sh +++ b/packages/protocol/script/test_deploy_on_l1.sh @@ -1,6 +1,6 @@ #!/bin/sh -# Please reference Lib1559Math.t.sol for L2 EIP-1559 related variables. +# This script is only used by `pnpm deploy:foundry`. set -e PRIVATE_KEY=ac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80 \ @@ -8,12 +8,12 @@ SHARED_SIGNAL_SERVICE=0x0000000000000000000000000000000000000000 \ ORACLE_PROVER=0xa0Ee7A142d267C1f36714E4a8F75612F20a79720 \ SOLO_PROPOSER=0xa0Ee7A142d267C1f36714E4a8F75612F20a79720 \ OWNER=0x70997970C51812dc3A010C7d01b50e0d17dc79C8 \ -TAIKO_L2_ADDRESS=0xa0Ee7A142d267C1f36714E4a8F75612F20a79720 \ +TAIKO_L2_ADDRESS=0x0000777700000000000000000000000000000001 \ +L2_SIGNAL_SERVICE=0x0000777700000000000000000000000000000007 \ TAIKO_TOKEN_PREMINT_RECIPIENT=0xa0Ee7A142d267C1f36714E4a8F75612F20a79720 \ TAIKO_TOKEN_PREMINT_AMOUNT=0xffff \ TREASURE=0xa0Ee7A142d267C1f36714E4a8F75612F20a79720 \ L2_GENESIS_HASH=0xee1950562d42f0da28bd4550d88886bc90894c77c9c9eaefef775d4c8223f259 \ -L2_CHAIN_ID=167001 \ forge script script/DeployOnL1.s.sol:DeployOnL1 \ --fork-url http://localhost:8545 \ --broadcast \ diff --git a/packages/protocol/test2/Bridge.t.sol b/packages/protocol/test/Bridge.t.sol similarity index 94% rename from packages/protocol/test2/Bridge.t.sol rename to packages/protocol/test/Bridge.t.sol index 94d59a6b7c9..8c8d10c8a4c 100644 --- a/packages/protocol/test2/Bridge.t.sol +++ b/packages/protocol/test/Bridge.t.sol @@ -1,7 +1,7 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.18; -import {AddressManager} from "../contracts/thirdparty/AddressManager.sol"; +import {AddressManager} from "../contracts/common/AddressManager.sol"; import {IBridge, Bridge} from "../contracts/bridge/Bridge.sol"; import {BridgeErrors} from "../contracts/bridge/BridgeErrors.sol"; import {EtherVault} from "../contracts/bridge/EtherVault.sol"; @@ -81,14 +81,14 @@ contract BridgeTest is Test { xChainSync = new PrankXchainSync(); addressManager.setAddress( - string( - bytes.concat(bytes32(block.chainid), bytes("signal_service")) - ), + block.chainid, + "signal_service", address(signalService) ); addressManager.setAddress( - string(bytes.concat(bytes32(destChainId), bytes("bridge"))), + destChainId, + "bridge", address(destChainBridge) ); @@ -350,32 +350,25 @@ contract BridgeTest is Test { badReceiver = new BadReceiver(); uint256 dest = 1337; - addressManager.setAddress( - string(bytes.concat(bytes32(dest), bytes("taiko"))), - address(xChainSync) - ); + addressManager.setAddress(dest, "taiko", address(xChainSync)); addressManager.setAddress( - string(bytes.concat(bytes32(uint256(1336)), bytes("bridge"))), + 1336, + "bridge", 0x564540a26Fb667306b3aBdCB4ead35BEb88698ab ); - addressManager.setAddress( - string(bytes.concat(bytes32(dest), bytes("bridge"))), - address(destChainBridge) - ); + addressManager.setAddress(dest, "bridge", address(destChainBridge)); - addressManager.setAddress( - string(bytes.concat(bytes32(dest), bytes("ether_vault"))), - address(etherVault) - ); + addressManager.setAddress(dest, "ether_vault", address(etherVault)); etherVault.authorize(address(destChainBridge), true); vm.deal(address(etherVault), 100 ether); addressManager.setAddress( - string(bytes.concat(bytes32(dest), bytes("signal_service"))), + dest, + "signal_service", address(signalService) ); diff --git a/packages/protocol/test2/EtherVault.t.sol b/packages/protocol/test/EtherVault.t.sol similarity index 98% rename from packages/protocol/test2/EtherVault.t.sol rename to packages/protocol/test/EtherVault.t.sol index c94428e2026..edbeb5ca0e6 100644 --- a/packages/protocol/test2/EtherVault.t.sol +++ b/packages/protocol/test/EtherVault.t.sol @@ -2,7 +2,7 @@ pragma solidity ^0.8.18; import {Test} from "forge-std/Test.sol"; -import {AddressManager} from "../contracts/thirdparty/AddressManager.sol"; +import {AddressManager} from "../contracts/common/AddressManager.sol"; import {EtherVault} from "../contracts/bridge/EtherVault.sol"; import {BridgeErrors} from "../contracts/bridge/BridgeErrors.sol"; diff --git a/packages/protocol/test2/GasComparison.t.sol b/packages/protocol/test/GasComparison.t.sol similarity index 100% rename from packages/protocol/test2/GasComparison.t.sol rename to packages/protocol/test/GasComparison.t.sol diff --git a/packages/protocol/test2/Lib1559Math.sol b/packages/protocol/test/Lib1559Math.sol similarity index 100% rename from packages/protocol/test2/Lib1559Math.sol rename to packages/protocol/test/Lib1559Math.sol diff --git a/packages/protocol/test2/LibFixedPointMath.t.sol b/packages/protocol/test/LibFixedPointMath.t.sol similarity index 100% rename from packages/protocol/test2/LibFixedPointMath.t.sol rename to packages/protocol/test/LibFixedPointMath.t.sol diff --git a/packages/protocol/test2/LibLn.sol b/packages/protocol/test/LibLn.sol similarity index 100% rename from packages/protocol/test2/LibLn.sol rename to packages/protocol/test/LibLn.sol diff --git a/packages/protocol/test2/SignalServiceCalc.sol b/packages/protocol/test/SignalServiceCalc.sol similarity index 100% rename from packages/protocol/test2/SignalServiceCalc.sol rename to packages/protocol/test/SignalServiceCalc.sol diff --git a/packages/protocol/test2/Taiko1559Params.t.sol b/packages/protocol/test/Taiko1559Params.t.sol similarity index 100% rename from packages/protocol/test2/Taiko1559Params.t.sol rename to packages/protocol/test/Taiko1559Params.t.sol diff --git a/packages/protocol/test2/TaikoL1.sim.sol b/packages/protocol/test/TaikoL1.sim.sol similarity index 100% rename from packages/protocol/test2/TaikoL1.sim.sol rename to packages/protocol/test/TaikoL1.sim.sol diff --git a/packages/protocol/test2/TaikoL1.t.sol b/packages/protocol/test/TaikoL1.t.sol similarity index 96% rename from packages/protocol/test2/TaikoL1.t.sol rename to packages/protocol/test/TaikoL1.t.sol index 01520c581f0..880eb74bcdc 100644 --- a/packages/protocol/test2/TaikoL1.t.sol +++ b/packages/protocol/test/TaikoL1.t.sol @@ -3,7 +3,7 @@ pragma solidity ^0.8.18; import {Test} from "forge-std/Test.sol"; import {console2} from "forge-std/console2.sol"; -import {AddressManager} from "../contracts/thirdparty/AddressManager.sol"; +import {AddressManager} from "../contracts/common/AddressManager.sol"; import {TaikoConfig} from "../contracts/L1/TaikoConfig.sol"; import {TaikoData} from "../contracts/L1/TaikoData.sol"; import {TaikoL1} from "../contracts/L1/TaikoL1.sol"; @@ -30,6 +30,12 @@ contract TaikoL1_NoCooldown is TaikoL1 { } } +contract Verifier { + fallback(bytes calldata) external returns (bytes memory) { + return bytes.concat(keccak256("taiko")); + } +} + contract TaikoL1Test is TaikoL1TestBase { function deployTaikoL1() internal override returns (TaikoL1 taikoL1) { taikoL1 = new TaikoL1_NoCooldown(); @@ -37,6 +43,8 @@ contract TaikoL1Test is TaikoL1TestBase { function setUp() public override { TaikoL1TestBase.setUp(); + + registerAddress(L1.getVerifierName(100), address(new Verifier())); } /// @dev Test we can propose, prove, then verify more blocks than 'maxNumProposedBlocks' diff --git a/packages/protocol/test2/TaikoL1LibTokenomicsMainnet.t.sol b/packages/protocol/test/TaikoL1LibTokenomicsMainnet.t.sol similarity index 99% rename from packages/protocol/test2/TaikoL1LibTokenomicsMainnet.t.sol rename to packages/protocol/test/TaikoL1LibTokenomicsMainnet.t.sol index 741fd3bd2da..a31c4d0235b 100644 --- a/packages/protocol/test2/TaikoL1LibTokenomicsMainnet.t.sol +++ b/packages/protocol/test/TaikoL1LibTokenomicsMainnet.t.sol @@ -5,7 +5,7 @@ pragma solidity ^0.8.18; import {Test} from "forge-std/Test.sol"; import {console2} from "forge-std/console2.sol"; import {FoundryRandom} from "foundry-random/FoundryRandom.sol"; -import {AddressManager} from "../contracts/thirdparty/AddressManager.sol"; +import {AddressManager} from "../contracts/common/AddressManager.sol"; import {TaikoConfig} from "../contracts/L1/TaikoConfig.sol"; import {TaikoData} from "../contracts/L1/TaikoData.sol"; import {TaikoL1} from "../contracts/L1/TaikoL1.sol"; diff --git a/packages/protocol/test2/TaikoL1LibTokenomicsTestnet.t.sol b/packages/protocol/test/TaikoL1LibTokenomicsTestnet.t.sol similarity index 99% rename from packages/protocol/test2/TaikoL1LibTokenomicsTestnet.t.sol rename to packages/protocol/test/TaikoL1LibTokenomicsTestnet.t.sol index f9a8fd22121..5ced9c71d93 100644 --- a/packages/protocol/test2/TaikoL1LibTokenomicsTestnet.t.sol +++ b/packages/protocol/test/TaikoL1LibTokenomicsTestnet.t.sol @@ -4,7 +4,7 @@ pragma solidity ^0.8.18; // Uncomment if you want to compare fee/vs reward import {Test} from "forge-std/Test.sol"; import {console2} from "forge-std/console2.sol"; -import {AddressManager} from "../contracts/thirdparty/AddressManager.sol"; +import {AddressManager} from "../contracts/common/AddressManager.sol"; import {TaikoConfig} from "../contracts/L1/TaikoConfig.sol"; import {TaikoData} from "../contracts/L1/TaikoData.sol"; import {TaikoL1} from "../contracts/L1/TaikoL1.sol"; diff --git a/packages/protocol/test2/TaikoL1TestBase.t.sol b/packages/protocol/test/TaikoL1TestBase.t.sol similarity index 89% rename from packages/protocol/test2/TaikoL1TestBase.t.sol rename to packages/protocol/test/TaikoL1TestBase.t.sol index 9eb3bf2b3db..54c025de115 100644 --- a/packages/protocol/test2/TaikoL1TestBase.t.sol +++ b/packages/protocol/test/TaikoL1TestBase.t.sol @@ -3,7 +3,8 @@ pragma solidity ^0.8.18; import {Test} from "forge-std/Test.sol"; import {console2} from "forge-std/console2.sol"; -import {AddressManager} from "../contracts/thirdparty/AddressManager.sol"; +import {AddressManager} from "../contracts/common/AddressManager.sol"; +import {LibUtils} from "../contracts/L1/libs/LibUtils.sol"; import {TaikoConfig} from "../contracts/L1/TaikoConfig.sol"; import {TaikoData} from "../contracts/L1/TaikoData.sol"; import {TaikoL1} from "../contracts/L1/TaikoL1.sol"; @@ -33,7 +34,7 @@ abstract contract TaikoL1TestBase is Test { address public constant L2Treasure = 0x859d74b52762d9ed07D1b2B8d7F93d26B1EA78Bb; address public constant L2SS = 0xa008AE5Ba00656a3Cc384de589579e3E52aC030C; - address public constant L2TaikoL2 = + address public constant TaikoL2 = 0x0082D90249342980d011C58105a03b35cCb4A315; address public constant L1EthVault = 0xDAFEA492D9c6733ae3d56b7Ed1ADB60692c98Bc5; @@ -54,20 +55,25 @@ abstract contract TaikoL1TestBase is Test { function deployTaikoL1() internal virtual returns (TaikoL1 taikoL1); function setUp() public virtual { - // vm.warp(1000000); + L1 = deployTaikoL1(); + conf = L1.getConfig(); + addressManager = new AddressManager(); addressManager.init(); - L1 = deployTaikoL1(); - L1.init( - address(addressManager), - GENESIS_BLOCK_HASH, - feeBase, - initProofTimeIssued - ); - conf = L1.getConfig(); + ss = new SignalService(); + ss.init(address(addressManager)); + + registerAddress("signal_service", address(ss)); + registerAddress("ether_vault", address(L1EthVault)); + registerL2Address("treasure", L2Treasure); + registerL2Address("taiko", address(TaikoL2)); + registerL2Address("signal_service", address(L2SS)); + registerL2Address("taiko_l2", address(TaikoL2)); + registerAddress(L1.getVerifierName(100), address(new Verifier())); tko = new TaikoToken(); + registerAddress("taiko_token", address(tko)); address[] memory premintRecipients; uint256[] memory premintAmounts; tko.init( @@ -78,23 +84,18 @@ abstract contract TaikoL1TestBase is Test { premintAmounts ); - ss = new SignalService(); - ss.init(address(addressManager)); - - // set proto_broker to this address to mint some TKO + // Set protocol broker registerAddress("proto_broker", address(this)); tko.mint(address(this), 1E9 * 1E8); - - // register all addresses - registerAddress("taiko_token", address(tko)); registerAddress("proto_broker", address(L1)); - registerAddress("signal_service", address(ss)); - registerAddress("ether_vault", address(L1EthVault)); - registerL2Address("treasure", L2Treasure); - registerL2Address("signal_service", address(L2SS)); - registerL2Address("taiko_l2", address(L2TaikoL2)); - registerAddress(L1.getVerifierName(100), address(new Verifier())); + // Lastly, init L1 + L1.init( + address(addressManager), + GENESIS_BLOCK_HASH, + feeBase, + initProofTimeIssued + ); printVariables("init "); } @@ -147,21 +148,17 @@ abstract contract TaikoL1TestBase is Test { bytes32 signalRoot, bool oracle ) internal { - TaikoData.ZKProof memory zkproof = TaikoData.ZKProof({ - data: new bytes(100), - verifierId: 100 - }); - TaikoData.BlockEvidence memory evidence = TaikoData.BlockEvidence({ - meta: meta, - zkproof: zkproof, + metaHash: LibUtils.hashMetadata(meta), parentHash: parentHash, blockHash: blockHash, signalRoot: signalRoot, graffiti: 0x0, prover: oracle ? address(0) : prover, parentGasUsed: parentGasUsed, - gasUsed: gasUsed + gasUsed: gasUsed, + verifierId: 100, + proof: new bytes(100) }); vm.prank(prover, prover); @@ -174,15 +171,13 @@ abstract contract TaikoL1TestBase is Test { } function registerAddress(string memory name, address addr) internal { - string memory key = L1.keyForName(block.chainid, name); - addressManager.setAddress(key, addr); - console2.log(key, unicode"→", addr); + addressManager.setAddress(block.chainid, name, addr); + console2.log(block.chainid, name, unicode"→", addr); } function registerL2Address(string memory name, address addr) internal { - string memory key = L1.keyForName(conf.chainId, name); - addressManager.setAddress(key, addr); - console2.log(key, unicode"→", addr); + addressManager.setAddress(conf.chainId, name, addr); + console2.log(conf.chainId, name, unicode"→", addr); } function depositTaikoToken( diff --git a/packages/protocol/test2/TaikoL1_Oracle.sol b/packages/protocol/test/TaikoL1_Oracle.sol similarity index 94% rename from packages/protocol/test2/TaikoL1_Oracle.sol rename to packages/protocol/test/TaikoL1_Oracle.sol index 986a75e5199..cabc4b96619 100644 --- a/packages/protocol/test2/TaikoL1_Oracle.sol +++ b/packages/protocol/test/TaikoL1_Oracle.sol @@ -3,7 +3,8 @@ pragma solidity ^0.8.18; import {Test} from "forge-std/Test.sol"; import {console2} from "forge-std/console2.sol"; -import {AddressManager} from "../contracts/thirdparty/AddressManager.sol"; +import {AddressManager} from "../contracts/common/AddressManager.sol"; +import {LibUtils} from "../contracts/L1/libs/LibUtils.sol"; import {TaikoConfig} from "../contracts/L1/TaikoConfig.sol"; import {TaikoData} from "../contracts/L1/TaikoData.sol"; import {TaikoL1} from "../contracts/L1/TaikoL1.sol"; @@ -43,10 +44,7 @@ contract TaikoL1_OracleTest is TaikoL1TestBase { function setUp() public override { TaikoL1TestBase.setUp(); - registerAddress( - string(abi.encodePacked("verifier_", uint16(100))), - address(new Verifier()) - ); + registerAddress(L1.getVerifierName(100), address(new Verifier())); registerAddress("oracle_prover", Alice); } @@ -66,21 +64,17 @@ contract TaikoL1_OracleTest is TaikoL1TestBase { false ); - TaikoData.ZKProof memory zkproof = TaikoData.ZKProof({ - data: new bytes(0), - verifierId: 0 - }); - TaikoData.BlockEvidence memory evidence = TaikoData.BlockEvidence({ - meta: meta, - zkproof: zkproof, + metaHash: LibUtils.hashMetadata(meta), parentHash: GENESIS_BLOCK_HASH, blockHash: bytes32(uint256(0x11)), signalRoot: bytes32(uint256(0x12)), graffiti: 0x0, prover: address(0), parentGasUsed: 10000, - gasUsed: 40000 + gasUsed: 40000, + verifierId: 0, + proof: new bytes(0) }); (uint8 v, bytes32 r, bytes32 s) = vm.sign( @@ -88,8 +82,8 @@ contract TaikoL1_OracleTest is TaikoL1TestBase { keccak256(abi.encode(evidence)) ); - zkproof.verifierId = v; - zkproof.data = bytes.concat(r, s); + evidence.verifierId = v; + evidence.proof = bytes.concat(r, s); vm.prank(Carol, Carol); L1.proveBlock(meta.id, abi.encode(evidence)); diff --git a/packages/protocol/test2/TaikoL2.t.sol b/packages/protocol/test/TaikoL2.t.sol similarity index 100% rename from packages/protocol/test2/TaikoL2.t.sol rename to packages/protocol/test/TaikoL2.t.sol diff --git a/packages/protocol/test2/TokenVault.t.sol b/packages/protocol/test/TokenVault.t.sol similarity index 94% rename from packages/protocol/test2/TokenVault.t.sol rename to packages/protocol/test/TokenVault.t.sol index 18f3497275c..db0c10575ad 100644 --- a/packages/protocol/test2/TokenVault.t.sol +++ b/packages/protocol/test/TokenVault.t.sol @@ -1,7 +1,7 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.18; -import {AddressManager} from "../contracts/thirdparty/AddressManager.sol"; +import {AddressManager} from "../contracts/common/AddressManager.sol"; import {AddressResolver} from "../contracts/common/AddressResolver.sol"; import {Bridge} from "../contracts/bridge/Bridge.sol"; import {BridgedERC20} from "../contracts/bridge/BridgedERC20.sol"; @@ -94,30 +94,29 @@ contract TestTokenVault is Test { signalService = new SignalService(); signalService.init(address(addressManager)); - addressManager.setAddress( - string(bytes.concat(bytes32(block.chainid), bytes("bridge"))), - address(bridge) - ); + addressManager.setAddress(block.chainid, "bridge", address(bridge)); addressManager.setAddress( - string( - bytes.concat(bytes32(block.chainid), bytes("signal_service")) - ), + block.chainid, + "signal_service", address(signalService) ); addressManager.setAddress( - string(bytes.concat(bytes32(block.chainid), bytes("token_vault"))), + block.chainid, + "token_vault", address(tokenVault) ); addressManager.setAddress( - string(bytes.concat(bytes32(destChainId), bytes("token_vault"))), + destChainId, + "token_vault", address(destChainIdTokenVault) ); addressManager.setAddress( - string(bytes.concat(bytes32(destChainId), bytes("bridge"))), + destChainId, + "bridge", address(destChainIdBridge) ); diff --git a/packages/protocol/test/bridge/BridgedERC20.test.ts b/packages/protocol/test/bridge/BridgedERC20.test.ts index 626108b6b8e..0f7076e2d94 100644 --- a/packages/protocol/test/bridge/BridgedERC20.test.ts +++ b/packages/protocol/test/bridge/BridgedERC20.test.ts @@ -40,7 +40,8 @@ describe("BridgedERC20", function () { const network = await ethers.provider.getNetwork(); await addressManager.setAddress( - `${network.chainId}.token_vault`, + network.chainId, + `token_vault`, tokenVault.address ); diff --git a/packages/protocol/test2/genesis/GenerateGenesis.g.sol b/packages/protocol/test/genesis/GenerateGenesis.g.sol similarity index 93% rename from packages/protocol/test2/genesis/GenerateGenesis.g.sol rename to packages/protocol/test/genesis/GenerateGenesis.g.sol index 4ee7edaa24b..800432ef98d 100644 --- a/packages/protocol/test2/genesis/GenerateGenesis.g.sol +++ b/packages/protocol/test/genesis/GenerateGenesis.g.sol @@ -8,7 +8,7 @@ import "../../contracts/common/AddressResolver.sol"; import {Test} from "forge-std/Test.sol"; import {console2} from "forge-std/console2.sol"; import {TaikoL2} from "../../contracts/L2/TaikoL2.sol"; -import {AddressManager} from "../../contracts/thirdparty/AddressManager.sol"; +import {AddressManager} from "../../contracts/common/AddressManager.sol"; import {Bridge} from "../../contracts/bridge/Bridge.sol"; import {TokenVault} from "../../contracts/bridge/TokenVault.sol"; import {EtherVault} from "../../contracts/bridge/EtherVault.sol"; @@ -22,7 +22,7 @@ contract TestGenerateGenesis is Test, AddressResolver { string private configJSON = vm.readFile( - string.concat(vm.projectRoot(), "/test2/genesis/test_config.json") + string.concat(vm.projectRoot(), "/test/genesis/test_config.json") ); string private genesisAllocJSON = vm.readFile( @@ -147,11 +147,8 @@ contract TestGenerateGenesis is Test, AddressResolver { assertEq(owner, tokenVault.owner()); vm.startPrank(addressManager.owner()); - addressManager.setAddress(keyForName(1, "bridge"), bridgeAddress); - addressManager.setAddress( - keyForName(1, "token_vault"), - tokenVaultAddress - ); + addressManager.setAddress(1, "bridge", bridgeAddress); + addressManager.setAddress(1, "token_vault", tokenVaultAddress); vm.stopPrank(); } @@ -199,7 +196,7 @@ contract TestGenerateGenesis is Test, AddressResolver { ) private { assertEq( getPredeployedContractAddress(contractName), - addressManager.getAddress(keyForName(block.chainid, key)) + addressManager.getAddress(block.chainid, key) ); } } diff --git a/packages/protocol/test2/genesis/generate_genesis.test.sh b/packages/protocol/test/genesis/generate_genesis.test.sh similarity index 98% rename from packages/protocol/test2/genesis/generate_genesis.test.sh rename to packages/protocol/test/genesis/generate_genesis.test.sh index 2211715f96d..a1cadc9d244 100755 --- a/packages/protocol/test2/genesis/generate_genesis.test.sh +++ b/packages/protocol/test/genesis/generate_genesis.test.sh @@ -101,5 +101,5 @@ forge test \ --fork-url http://localhost:18545 \ --fork-retry-backoff 120 \ --no-storage-caching \ - --match-path test2/genesis/*.g.sol \ + --match-path test/genesis/*.g.sol \ --block-gas-limit 1000000000 diff --git a/packages/protocol/test2/genesis/test_config.json b/packages/protocol/test/genesis/test_config.json similarity index 100% rename from packages/protocol/test2/genesis/test_config.json rename to packages/protocol/test/genesis/test_config.json diff --git a/packages/protocol/test2/genesis/testnet/docker-compose.yml b/packages/protocol/test/genesis/testnet/docker-compose.yml similarity index 100% rename from packages/protocol/test2/genesis/testnet/docker-compose.yml rename to packages/protocol/test/genesis/testnet/docker-compose.yml diff --git a/packages/protocol/test2/genesis/testnet/init_geth.sh b/packages/protocol/test/genesis/testnet/init_geth.sh similarity index 100% rename from packages/protocol/test2/genesis/testnet/init_geth.sh rename to packages/protocol/test/genesis/testnet/init_geth.sh diff --git a/packages/protocol/test/libs/LibTrieProof.test.ts b/packages/protocol/test/libs/LibTrieProof.test.ts index a20db118aad..c63e56755ec 100644 --- a/packages/protocol/test/libs/LibTrieProof.test.ts +++ b/packages/protocol/test/libs/LibTrieProof.test.ts @@ -33,12 +33,14 @@ describe("integration:LibTrieProof", function () { const enabledDestChainId = chainId + 1; await addressManager.setAddress( - `${chainId}.ether_vault`, + chainId, + `ether_vault`, "0xEA3dD11036f668F08940E13e3bcB097C93b09E07" ); await addressManager.setAddress( - `${enabledDestChainId}.bridge`, + enabledDestChainId, + `bridge`, "0x0000000000000000000000000000000000000001" // dummy address so chain is "enabled" ); diff --git a/packages/protocol/test/signal/SignalService.integration.test.ts b/packages/protocol/test/signal/SignalService.integration.test.ts index 9a01fdad528..318de05493b 100644 --- a/packages/protocol/test/signal/SignalService.integration.test.ts +++ b/packages/protocol/test/signal/SignalService.integration.test.ts @@ -45,12 +45,14 @@ describe("integration:SignalService", function () { ); await addressManager.setAddress( - `${enabledDestChainId}.signal_service`, + enabledDestChainId, + `signal_service`, l2SignalService.address ); await l2AddressManager.setAddress( - `${srcChainId}.signal_service`, + srcChainId, + `signal_service`, l1SignalService.address ); @@ -61,7 +63,8 @@ describe("integration:SignalService", function () { .deploy(); await l2AddressManager.setAddress( - `${enabledDestChainId}.taiko`, + enabledDestChainId, + `taiko`, xchainSync.address ); diff --git a/packages/protocol/test/utils/bridge.ts b/packages/protocol/test/utils/bridge.ts index 6bd3ed8c5d8..21adafedf56 100644 --- a/packages/protocol/test/utils/bridge.ts +++ b/packages/protocol/test/utils/bridge.ts @@ -46,10 +46,7 @@ async function deployBridge( await etherVault.connect(signer).authorize(await signer.getAddress(), true); - await addressManager.setAddress( - `${chainId}.ether_vault`, - etherVault.address - ); + await addressManager.setAddress(chainId, `ether_vault`, etherVault.address); await signer.sendTransaction({ to: etherVault.address, @@ -57,7 +54,7 @@ async function deployBridge( gasLimit: 1000000, }); - await addressManager.setAddress(`${chainId}.bridge`, bridge.address); + await addressManager.setAddress(chainId, `bridge`, bridge.address); return { bridge, etherVault }; } diff --git a/packages/protocol/test/utils/fixture.ts b/packages/protocol/test/utils/fixture.ts index 97158786d42..ca57573fa75 100644 --- a/packages/protocol/test/utils/fixture.ts +++ b/packages/protocol/test/utils/fixture.ts @@ -64,7 +64,8 @@ async function initIntegrationFixture(mintTkoToProposer: boolean) { await ( await l1AddressManager.setAddress( - `${chainId}.taiko_token`, + chainId, + `taiko_token`, taikoTokenL1.address ) ).wait(1); @@ -72,12 +73,13 @@ async function initIntegrationFixture(mintTkoToProposer: boolean) { const { chainId: l2ChainId } = await l2Provider.getNetwork(); await ( - await l1AddressManager.setAddress(`${l2ChainId}.taiko`, taikoL2.address) + await l1AddressManager.setAddress(l2ChainId, `taiko`, taikoL2.address) ).wait(1); await ( await l1AddressManager.setAddress( - `${chainId}.proof_verifier`, + chainId, + `proof_verifier`, taikoL1.address ) ).wait(1); diff --git a/packages/protocol/test/utils/signal.ts b/packages/protocol/test/utils/signal.ts index 7a830eb005e..b96a5a05dd5 100644 --- a/packages/protocol/test/utils/signal.ts +++ b/packages/protocol/test/utils/signal.ts @@ -20,7 +20,8 @@ async function deploySignalService( await signalService.connect(signer).init(addressManager.address); await addressManager.setAddress( - `${srcChain}.signal_service`, + srcChain, + `signal_service`, signalService.address ); return { signalService }; diff --git a/packages/protocol/test/utils/taikoToken.ts b/packages/protocol/test/utils/taikoToken.ts index e9740fd4eb9..6b0a572b7b4 100644 --- a/packages/protocol/test/utils/taikoToken.ts +++ b/packages/protocol/test/utils/taikoToken.ts @@ -17,7 +17,8 @@ const deployTaikoToken = async ( const network = await signer.provider?.getNetwork(); await addressManager.setAddress( - `${network?.chainId}.proto_broker`, + network?.chainId, + `proto_broker`, protoBroker ); diff --git a/packages/protocol/utils/generate_genesis/taikoL2.ts b/packages/protocol/utils/generate_genesis/taikoL2.ts index d861f3e9344..7ee7b4a9f75 100644 --- a/packages/protocol/utils/generate_genesis/taikoL2.ts +++ b/packages/protocol/utils/generate_genesis/taikoL2.ts @@ -136,10 +136,6 @@ async function generateContractConfigs( }; const addressMap: any = {}; - const chianIdBytes32 = ethers.utils.hexZeroPad( - ethers.utils.hexlify(chainId), - 32 - ); for (const [contractName, artifact] of Object.entries(contractArtifacts)) { let bytecode = (artifact as any).bytecode; @@ -244,52 +240,23 @@ async function generateContractConfigs( _owner: contractOwner, // AddressManager addresses: { - // bytes.concat(bytes32(chainId), bytes(name)); - [`${ethers.utils.solidityKeccak256( - ["bytes"], - [ - ethers.utils.concat([ - chianIdBytes32, - ethers.utils.toUtf8Bytes("taiko"), - ]), - ] - )}`]: addressMap.TaikoL2, - [`${ethers.utils.solidityKeccak256( - ["bytes"], - [ - ethers.utils.concat([ - chianIdBytes32, - ethers.utils.toUtf8Bytes("bridge"), - ]), - ] - )}`]: addressMap.Bridge, - [`${ethers.utils.solidityKeccak256( - ["bytes"], - [ - ethers.utils.concat([ - chianIdBytes32, - ethers.utils.toUtf8Bytes("token_vault"), - ]), - ] - )}`]: addressMap.TokenVault, - [`${ethers.utils.solidityKeccak256( - ["bytes"], - [ - ethers.utils.concat([ - chianIdBytes32, - ethers.utils.toUtf8Bytes("ether_vault"), - ]), - ] - )}`]: addressMap.EtherVault, - [`${ethers.utils.solidityKeccak256( - ["bytes"], - [ - ethers.utils.concat([ - chianIdBytes32, - ethers.utils.toUtf8Bytes("signal_service"), - ]), - ] - )}`]: addressMap.SignalService, + [chainId]: { + [ethers.utils.hexlify( + ethers.utils.toUtf8Bytes("taiko") + )]: addressMap.TaikoL2, + [ethers.utils.hexlify( + ethers.utils.toUtf8Bytes("bridge") + )]: addressMap.Bridge, + [ethers.utils.hexlify( + ethers.utils.toUtf8Bytes("token_vault") + )]: addressMap.TokenVault, + [ethers.utils.hexlify( + ethers.utils.toUtf8Bytes("ether_vault") + )]: addressMap.EtherVault, + [ethers.utils.hexlify( + ethers.utils.toUtf8Bytes("signal_service") + )]: addressMap.SignalService, + }, }, }, }, diff --git a/packages/website/pages/docs/reference/contract-documentation/L1/TaikoData.md b/packages/website/pages/docs/reference/contract-documentation/L1/TaikoData.md index 6c00e20a691..6f6deac5bc0 100644 --- a/packages/website/pages/docs/reference/contract-documentation/L1/TaikoData.md +++ b/packages/website/pages/docs/reference/contract-documentation/L1/TaikoData.md @@ -77,21 +77,11 @@ struct BlockMetadata { } ``` -### ZKProof - -```solidity -struct ZKProof { - bytes data; - uint16 verifierId; -} -``` - ### BlockEvidence ```solidity struct BlockEvidence { - struct TaikoData.BlockMetadata meta; - struct TaikoData.ZKProof zkproof; + bytes32 metaHash; bytes32 parentHash; bytes32 blockHash; bytes32 signalRoot; @@ -99,6 +89,8 @@ struct BlockEvidence { address prover; uint32 parentGasUsed; uint32 gasUsed; + uint16 verifierId; + bytes proof; } ``` @@ -157,10 +149,11 @@ struct State { mapping(address => uint256) taikoTokenBalances; mapping(bytes32 => struct TaikoData.TxListInfo) txListInfo; struct TaikoData.EthDeposit[] ethDeposits; + bytes32 staticRefs; uint64 genesisHeight; uint64 genesisTimestamp; - uint64 __reserved61; - uint64 __reserved62; + uint64 __reserved71; + uint64 __reserved72; uint64 accProposedAt; uint64 accBlockFees; uint64 numBlocks; @@ -168,7 +161,7 @@ struct State { uint64 basefee; uint64 proofTimeIssued; uint64 lastVerifiedBlockId; - uint64 __reserved81; - uint256[42] __gap; + uint64 __reserved91; + uint256[41] __gap; } ``` diff --git a/packages/website/pages/docs/reference/contract-documentation/common/AddressManager.md b/packages/website/pages/docs/reference/contract-documentation/common/AddressManager.md new file mode 100644 index 00000000000..2f4acb7cd11 --- /dev/null +++ b/packages/website/pages/docs/reference/contract-documentation/common/AddressManager.md @@ -0,0 +1,93 @@ +## IAddressManager + +Interface to set and get an address for a name. + +### setAddress + +```solidity +function setAddress(uint256 domain, string name, address newAddress) external +``` + +Changes the address associated with a particular name. + +#### Parameters + +| Name | Type | Description | +| ---------- | ------- | -------------------------------------------- | +| domain | uint256 | Uint256 domain to assiciate an address with. | +| name | string | String name to associate an address with. | +| newAddress | address | Address to associate with the name. | + +### getAddress + +```solidity +function getAddress(uint256 domain, string name) external view returns (address) +``` + +Retrieves the address associated with a given name. + +#### Parameters + +| Name | Type | Description | +| ------ | ------- | --------------------------------- | +| domain | uint256 | Class to retrieve an address for. | +| name | string | Name to retrieve an address for. | + +#### Return Values + +| Name | Type | Description | +| ---- | ------- | --------------------------------------- | +| [0] | address | Address associated with the given name. | + +## AddressManager + +### AddressSet + +```solidity +event AddressSet(uint256 _domain, string _name, address _newAddress, address _oldAddress) +``` + +### init + +```solidity +function init() external +``` + +_Initializer to be called after being deployed behind a proxy._ + +### setAddress + +```solidity +function setAddress(uint256 domain, string name, address newAddress) external +``` + +Changes the address associated with a particular name. + +#### Parameters + +| Name | Type | Description | +| ---------- | ------- | -------------------------------------------- | +| domain | uint256 | Uint256 domain to assiciate an address with. | +| name | string | String name to associate an address with. | +| newAddress | address | Address to associate with the name. | + +### getAddress + +```solidity +function getAddress(uint256 domain, string name) external view returns (address addr) +``` + +Retrieves the address associated with a given name. + +#### Parameters + +| Name | Type | Description | +| ------ | ------- | --------------------------------- | +| domain | uint256 | Class to retrieve an address for. | +| name | string | Name to retrieve an address for. | + +#### Return Values + +| Name | Type | Description | +| ---- | ------- | --------------------------------------- | +| addr | address | Address associated with the given name. | diff --git a/packages/website/pages/docs/reference/contract-documentation/common/AddressResolver.md b/packages/website/pages/docs/reference/contract-documentation/common/AddressResolver.md index cb0fe62bc5a..85c90638fdb 100644 --- a/packages/website/pages/docs/reference/contract-documentation/common/AddressResolver.md +++ b/packages/website/pages/docs/reference/contract-documentation/common/AddressResolver.md @@ -88,12 +88,6 @@ Returns the AddressManager's address. | ---- | ------- | ----------------------------- | | [0] | address | The AddressManager's address. | -### keyForName - -```solidity -function keyForName(uint256 chainId, string name) public pure virtual returns (string) -``` - ### \_init ```solidity diff --git a/packages/website/pages/docs/reference/contract-documentation/common/IAddressManager.md b/packages/website/pages/docs/reference/contract-documentation/common/IAddressManager.md deleted file mode 100644 index 7b3385956e6..00000000000 --- a/packages/website/pages/docs/reference/contract-documentation/common/IAddressManager.md +++ /dev/null @@ -1,41 +0,0 @@ -## IAddressManager - -Interface to set and get an address for a name. - -### setAddress - -```solidity -function setAddress(string name, address addr) external -``` - -Associate an address to a name. - -_The original address associated with the name, if exists, will be -replaced._ - -#### Parameters - -| Name | Type | Description | -| ---- | ------- | -------------------------------------------------- | -| name | string | The name which an address will be associated with. | -| addr | address | The address to be associated with the given name. | - -### getAddress - -```solidity -function getAddress(string name) external view returns (address) -``` - -Returns the address associated with the given name. - -#### Parameters - -| Name | Type | Description | -| ---- | ------ | ----------------------------------------------- | -| name | string | The name for which an address will be returned. | - -#### Return Values - -| Name | Type | Description | -| ---- | ------- | -------------------------------------------------------------------------------------------------- | -| [0] | address | The address associated with the given name. If no address is found, `address(0)` will be returned. | From 7e2e1ad3395dbfe6af517f7c663e6500409bb412 Mon Sep 17 00:00:00 2001 From: jeff <113397187+cyberhorsey@users.noreply.github.com> Date: Sun, 23 Apr 2023 06:34:54 -0700 Subject: [PATCH 46/47] test(protocol): Signal service foundry tests (#13632) Co-authored-by: Daniel Wang Co-authored-by: Daniel Wang <99078276+dantaik@users.noreply.github.com> --- .github/workflows/protocol.yml | 45 +- packages/protocol/.gitignore | 4 + packages/protocol/README.md | 2 +- packages/protocol/package.json | 31 +- .../test/L1/TaikoL1.integration.test.ts | 304 -- packages/protocol/test/L1/TaikoL1.test.ts | 38 - packages/protocol/test/L1/TaikoToken.test.ts | 122 - packages/protocol/test/SignalService.t.sol | 189 ++ .../protocol/test/bridge/BridgedERC20.test.ts | 293 -- packages/protocol/test/constants/errors.ts | 3 - packages/protocol/test/data/test_proof.json | 37 - .../test/genesis/generate_genesis.test.sh | 2 +- .../protocol/test/libs/Lib1559Math.test.ts | 118 - .../protocol/test/libs/LibBlockHeader.test.ts | 189 -- .../protocol/test/libs/LibTrieProof.test.ts | 153 - .../signal/SignalService.integration.test.ts | 241 -- .../test/signal/SignalService.test.ts | 72 - packages/protocol/test/test_integration.sh | 92 - .../test/thirdparty/AddressManager.test.ts | 48 - .../test/thirdparty/LibMerkleTrie.test.ts | 74 - .../thirdparty/LibSecureMerkleTrie.test.ts | 74 - .../protocol/test/tokenomics/blockFee.test.ts | 110 - .../test/tokenomics/proofReward.test.ts | 121 - .../protocol/test/utils/addressManager.ts | 15 - packages/protocol/test/utils/array.ts | 5 - packages/protocol/test/utils/blockListener.ts | 34 - .../protocol/test/utils/block_metadata.ts | 32 - packages/protocol/test/utils/bridge.ts | 158 - packages/protocol/test/utils/bytes.ts | 7 - packages/protocol/test/utils/commit.ts | 26 - packages/protocol/test/utils/encoding.ts | 23 - packages/protocol/test/utils/errors.ts | 58 - packages/protocol/test/utils/evidence.ts | 12 - packages/protocol/test/utils/fixture.ts | 150 - packages/protocol/test/utils/message.ts | 31 - packages/protocol/test/utils/onNewL2Block.ts | 51 - packages/protocol/test/utils/propose.ts | 44 - packages/protocol/test/utils/proposer.ts | 58 - packages/protocol/test/utils/prove.ts | 66 - packages/protocol/test/utils/prover.ts | 59 - packages/protocol/test/utils/provider.ts | 16 - packages/protocol/test/utils/rpc.ts | 108 - packages/protocol/test/utils/seed.ts | 49 - packages/protocol/test/utils/signal.ts | 88 - packages/protocol/test/utils/sleep.ts | 7 - packages/protocol/test/utils/taikoL1.ts | 48 - packages/protocol/test/utils/taikoL2.ts | 18 - packages/protocol/test/utils/taikoToken.ts | 28 - packages/protocol/test/utils/tokenomics.ts | 0 packages/protocol/test/utils/trie.ts | 75 - packages/protocol/test/utils/verify.ts | 135 - pnpm-lock.yaml | 2542 ++++++++++------- 52 files changed, 1764 insertions(+), 4541 deletions(-) delete mode 100644 packages/protocol/test/L1/TaikoL1.integration.test.ts delete mode 100644 packages/protocol/test/L1/TaikoL1.test.ts delete mode 100644 packages/protocol/test/L1/TaikoToken.test.ts create mode 100644 packages/protocol/test/SignalService.t.sol delete mode 100644 packages/protocol/test/bridge/BridgedERC20.test.ts delete mode 100644 packages/protocol/test/constants/errors.ts delete mode 100644 packages/protocol/test/data/test_proof.json delete mode 100644 packages/protocol/test/libs/Lib1559Math.test.ts delete mode 100644 packages/protocol/test/libs/LibBlockHeader.test.ts delete mode 100644 packages/protocol/test/libs/LibTrieProof.test.ts delete mode 100644 packages/protocol/test/signal/SignalService.integration.test.ts delete mode 100644 packages/protocol/test/signal/SignalService.test.ts delete mode 100755 packages/protocol/test/test_integration.sh delete mode 100644 packages/protocol/test/thirdparty/AddressManager.test.ts delete mode 100644 packages/protocol/test/thirdparty/LibMerkleTrie.test.ts delete mode 100644 packages/protocol/test/thirdparty/LibSecureMerkleTrie.test.ts delete mode 100644 packages/protocol/test/tokenomics/blockFee.test.ts delete mode 100644 packages/protocol/test/tokenomics/proofReward.test.ts delete mode 100644 packages/protocol/test/utils/addressManager.ts delete mode 100644 packages/protocol/test/utils/array.ts delete mode 100644 packages/protocol/test/utils/blockListener.ts delete mode 100644 packages/protocol/test/utils/block_metadata.ts delete mode 100644 packages/protocol/test/utils/bridge.ts delete mode 100644 packages/protocol/test/utils/bytes.ts delete mode 100644 packages/protocol/test/utils/commit.ts delete mode 100644 packages/protocol/test/utils/encoding.ts delete mode 100644 packages/protocol/test/utils/errors.ts delete mode 100644 packages/protocol/test/utils/evidence.ts delete mode 100644 packages/protocol/test/utils/fixture.ts delete mode 100644 packages/protocol/test/utils/message.ts delete mode 100644 packages/protocol/test/utils/onNewL2Block.ts delete mode 100644 packages/protocol/test/utils/propose.ts delete mode 100644 packages/protocol/test/utils/proposer.ts delete mode 100644 packages/protocol/test/utils/prove.ts delete mode 100644 packages/protocol/test/utils/prover.ts delete mode 100644 packages/protocol/test/utils/provider.ts delete mode 100644 packages/protocol/test/utils/rpc.ts delete mode 100644 packages/protocol/test/utils/seed.ts delete mode 100644 packages/protocol/test/utils/signal.ts delete mode 100644 packages/protocol/test/utils/sleep.ts delete mode 100644 packages/protocol/test/utils/taikoL1.ts delete mode 100644 packages/protocol/test/utils/taikoL2.ts delete mode 100644 packages/protocol/test/utils/taikoToken.ts delete mode 100644 packages/protocol/test/utils/tokenomics.ts delete mode 100644 packages/protocol/test/utils/trie.ts delete mode 100644 packages/protocol/test/utils/verify.ts diff --git a/.github/workflows/protocol.yml b/.github/workflows/protocol.yml index 39c967903fb..839ec7f8942 100644 --- a/.github/workflows/protocol.yml +++ b/.github/workflows/protocol.yml @@ -26,42 +26,25 @@ jobs: - name: Install Foundry uses: foundry-rs/foundry-toolchain@v1 - - name: protocol - Unit Tests (foundry) - run: forge test -vvv - - - name: protocol - Run snapshot (foundry) - run: forge snapshot - - name: Install pnpm dependencies uses: ./.github/actions/install-pnpm-dependencies - - name: protocol - Unit Tests (hardhat) + - name: protocol - Unit Tests working-directory: ./packages/protocol - run: pnpm clean && pnpm test + run: pnpm clean && pnpm compile:hardhat && pnpm test - - name: protocol - Integration Tests (hardhat) + - name: protocol - Generate Genesis working-directory: ./packages/protocol - run: pnpm test:integration + run: pnpm test:genesis - # - name: protocol - Tokenomics Tests (hardhat) + # TODO: CompilerError: Stack too deep + # - name: protocol - Test Coverage # working-directory: ./packages/protocol - # run: pnpm test:tokenomics + # run: pnpm test:coverage - - name: protocol - Bridge Tests (hardhat) - working-directory: ./packages/protocol - run: pnpm test:bridge - - - name: protocol - Test Coverage (hardhat) - working-directory: ./packages/protocol - run: pnpm test:coverage - - - name: protocol - Generate Genesis (foundry) + - name: protocol - Run snapshot (foundry) working-directory: ./packages/protocol - run: pnpm test:genesis - - # - name: protocol - Export ABIs - # working-directory: ./packages/protocol - # run: pnpm export:abi + run: pnpm snapshot - name: protocol - Deploy L1 Contracts working-directory: ./packages/protocol @@ -72,11 +55,11 @@ jobs: done pnpm deploy:foundry - - name: protocol - Upload coverage to Codecov - uses: codecov/codecov-action@v3 - with: - directory: ./packages/protocol/coverage - flags: protocol + # - name: protocol - Upload coverage to Codecov + # uses: codecov/codecov-action@v3 + # with: + # directory: ./packages/protocol/coverage + # flags: protocol post-merge: if: github.event.pull_request.merged == true diff --git a/packages/protocol/.gitignore b/packages/protocol/.gitignore index 9761ac497fa..968e3fd962d 100644 --- a/packages/protocol/.gitignore +++ b/packages/protocol/.gitignore @@ -2,6 +2,7 @@ node_modules .env coverage coverage.json +.gas-snapshot typechain abis abi @@ -26,3 +27,6 @@ broadcast # Editors .vscode + +#coverage +lcov.info \ No newline at end of file diff --git a/packages/protocol/README.md b/packages/protocol/README.md index d987a33b91c..8ccc9a135f9 100644 --- a/packages/protocol/README.md +++ b/packages/protocol/README.md @@ -66,7 +66,7 @@ The script will output two JSON files under `./deployments`: This project also integrates with Foundry for building and testing contracts. -- To compile using foundry: `forge build` or `pnpm compile:foundry` +- To compile using foundry: `forge build` or `pnpm compile` - To run foundry tests: `forge test --gas-report -vvv` or `pnpm test:foundry` Note that compiling with foundry uses dependencies inside the `lib` dir (instead of `node_modules`). diff --git a/packages/protocol/package.json b/packages/protocol/package.json index 35f55eea158..1ea33466ca5 100644 --- a/packages/protocol/package.json +++ b/packages/protocol/package.json @@ -3,25 +3,20 @@ "version": "0.6.0", "private": true, "scripts": { - "compile": "pnpm hardhat compile", - "compile:foundry": "forge build", + "clean": "rm -rf abis cache && pnpm hardhat clean", + "compile": "forge build", + "compile:hardhat": "pnpm hardhat compile", "export:abi": "pnpm hardhat clear-abi && pnpm hardhat export-abi", "export:docs": "pnpm hardhat docgen && pnpm prettier --write ../website/pages/docs/reference/contract-documentation/**/*.md", - "clean": "rm -rf abis cache && pnpm hardhat clean", "lint:sol": "pnpm prettier '**/*.sol' --write && pnpm solhint 'contracts/**/*.sol' --fix", "eslint": "pnpm exec eslint --ignore-path .eslintignore --ext .js,.ts .", "eslint:fix": "pnpm exec eslint --ignore-path .eslintignore --ext .js,.ts . --fix", - "test": "./script/download_solc.sh && pnpm hardhat test --grep '^[^integration]'", - "coverage": "pnpm hardhat coverage --solcoverjs ./.solcover.js --show-stack-traces", - "test:coverage": "pnpm coverage", - "test:foundry": "forge test -vvv --gas-report --fuzz-seed $(date +%s) --match-path test/**/*.t.sol", + "test": "forge test -vvv --gas-report --fuzz-seed $(date +%s) --match-path test/**/*.t.sol", + "snapshot": "forge snapshot --match-path test/**/*.t.sol", + "test:coverage": "forge coverage --report lcov", "test:sim": "forge test -vvv --gas-report --fuzz-seed $(date +%s) --match-path test/**/*.sim.sol --block-gas-limit 30000000000 --memory-limit 1073741824", "generate:genesis": "ts-node ./utils/generate_genesis/main.ts", "test:genesis": "./test/genesis/generate_genesis.test.sh", - "test:bridge": "TEST_TYPE=integrationbridge ./test/test_integration.sh", - "test:integration": "TEST_TYPE=integration ./test/test_integration.sh", - "test:tokenomics": "TEST_TYPE=tokenomics ./test/test_integration.sh", - "test:all": "pnpm run test && pnpm run test:integration && pnpm run test:tokenomics && pnpm run test:genesis", "deploy:foundry": "./script/download_solc.sh && ./script/test_deploy_on_l1.sh", "lint-staged": "lint-staged --allow-empty", "sizer": "pnpm hardhat size-contracts" @@ -44,7 +39,7 @@ "@defi-wonderland/smock": "^2.3.4", "@foundry-rs/hardhat-forge": "^0.1.17", "@nomicfoundation/hardhat-network-helpers": "^1.0.8", - "@nomiclabs/hardhat-ethers": "^2.2.2", + "@nomiclabs/hardhat-ethers": "^2.2.3", "@nomiclabs/hardhat-etherscan": "^3.1.7", "@nomiclabs/hardhat-waffle": "^2.0.5", "@openzeppelin/hardhat-upgrades": "^1.22.1", @@ -60,7 +55,7 @@ "chalk": "4.1.2", "dotenv": "^10.0.0", "eslint": "^7.32.0", - "eslint-config-prettier": "^8.6.0", + "eslint-config-prettier": "^8.8.0", "eslint-config-standard": "^16.0.3", "eslint-plugin-import": "^2.27.5", "eslint-plugin-node": "^11.1.0", @@ -69,17 +64,17 @@ "ethereum-waffle": "^3.4.4", "ethers": "^5.7.2", "glob": "^8.1.0", - "hardhat": "^2.13.0", + "hardhat": "^2.14.0", "hardhat-abi-exporter": "^2.10.1", "hardhat-contract-sizer": "^2.8.0", "hardhat-docgen": "^1.3.0", "hardhat-gas-reporter": "^1.0.9", "lint-staged": "^12.5.0", "merkle-patricia-tree": "^4.2.4", - "prettier": "^2.8.4", + "prettier": "^2.8.8", "prettier-plugin-solidity": "^1.1.3", "rlp": "^3.0.0", - "solhint": "^3.4.0", + "solhint": "^3.4.1", "solidity-coverage": "github:taikoxyz/solidity-coverage", "solidity-docgen": "0.6.0-beta.35", "ts-node": "^10.9.1", @@ -88,8 +83,8 @@ }, "dependencies": { "@gnosis.pm/zodiac": "^1.1.9", - "@openzeppelin/contracts": "^4.8.2", - "@openzeppelin/contracts-upgradeable": "^4.8.2", + "@openzeppelin/contracts": "^4.8.3", + "@openzeppelin/contracts-upgradeable": "^4.8.3", "channel-ts": "^0.1.2" } } diff --git a/packages/protocol/test/L1/TaikoL1.integration.test.ts b/packages/protocol/test/L1/TaikoL1.integration.test.ts deleted file mode 100644 index 63115fd59a7..00000000000 --- a/packages/protocol/test/L1/TaikoL1.integration.test.ts +++ /dev/null @@ -1,304 +0,0 @@ -import { expect } from "chai"; -import { SimpleChannel } from "channel-ts"; -import { ethers as ethersLib } from "ethers"; -import { ethers } from "hardhat"; -import { TaikoL1, TestTaikoToken } from "../../typechain"; -import blockListener from "../utils/blockListener"; -import { BlockMetadata } from "../utils/block_metadata"; -import { proposeLatestBlock } from "../utils/commit"; -import { encodeEvidence } from "../utils/encoding"; -import { - readShouldRevertWithCustomError, - txShouldRevertWithCustomError, -} from "../utils/errors"; -import Evidence from "../utils/evidence"; -import { initIntegrationFixture } from "../utils/fixture"; -import Proposer from "../utils/proposer"; -import { buildProveBlockInputs, proveBlock } from "../utils/prove"; -import Prover from "../utils/prover"; -import { getBlockHeader } from "../utils/rpc"; -import { seedTko } from "../utils/seed"; -import { proposeProveAndVerify, verifyBlocks } from "../utils/verify"; - -describe("integ-----disabled-----ration:TaikoL1", function () { - let taikoL1: TaikoL1; - let l1Provider: ethersLib.providers.JsonRpcProvider; - let l2Provider: ethersLib.providers.JsonRpcProvider; - let l1Signer: any; - let proposerSigner: any; - let genesisHeight: number; - let taikoTokenL1: TestTaikoToken; - let chan: SimpleChannel; - let interval: any; - let proverSigner: any; - let proposer: Proposer; - let prover: Prover; - /* eslint-disable-next-line */ - let config: Awaited>; - - beforeEach(async function () { - ({ - l1Provider, - taikoL1, - l2Provider, - l1Signer, - genesisHeight, - proposerSigner, - proverSigner, - interval, - chan, - config, - taikoTokenL1, - } = await initIntegrationFixture(false, false)); - proposer = new Proposer( - taikoL1.connect(proposerSigner), - l2Provider, - config.maxNumProposedBlocks.toNumber(), - 0, - proposerSigner - ); - - prover = new Prover(taikoL1, l2Provider, proverSigner); - }); - - afterEach(() => { - clearInterval(interval); - l2Provider.off("block"); - chan.close(); - }); - - describe("getBlock()", function () { - it("should revert if block is out of range and not a valid proposed block", async function () { - await readShouldRevertWithCustomError( - taikoL1.getBlock(123), - "L1_BLOCK_ID()" - ); - }); - - it("should return valid block if it's been commmited and proposed", async function () { - const { proposedEvent } = await proposeLatestBlock( - taikoL1, - l1Signer, - l2Provider - ); - expect(proposedEvent).not.to.be.undefined; - - const proposedBlock = await taikoL1.getBlock( - proposedEvent.args.meta.id - ); - expect(proposedBlock).not.to.be.undefined; - expect(proposedBlock.proposer).to.be.eq( - await l1Signer.getAddress() - ); - }); - }); - - describe("getForkChoice", function () { - it("returns no empty fork choice for un-proposed, un-proven and un-verified block", async function () { - const forkChoice = await taikoL1.getForkChoice( - 1, - ethers.constants.HashZero - ); - expect(forkChoice.blockHash).to.be.eq(ethers.constants.HashZero); - expect(forkChoice.provenAt).to.be.eq(0); - }); - - it("returns populated data for submitted fork choice", async function () { - const { proposedEvent, block } = await proposeLatestBlock( - taikoL1, - l1Signer, - l2Provider, - 0 - ); - - expect(proposedEvent).not.to.be.undefined; - const proveEvent = await proveBlock( - taikoL1, - l2Provider, - await l1Signer.getAddress(), - proposedEvent.args.id.toNumber(), - block.number, - proposedEvent.args.meta as any as BlockMetadata - ); - expect(proveEvent).not.to.be.undefined; - - const forkChoice = await taikoL1.getForkChoice( - proposedEvent.args.id.toNumber(), - block.parentHash - ); - expect(forkChoice.blockHash).to.be.eq(block.hash); - expect(forkChoice.prover).to.be.eq(await l1Signer.getAddress()); - }); - - it("returns empty after a block is verified", async function () { - await seedTko([prover], taikoTokenL1.connect(l1Signer)); - - const blockNumber = genesisHeight + 1; - /* eslint-disable-next-line */ - const block = await l2Provider.getBlock(blockNumber); - - // propose block, so our provers can prove it. - const { proposedEvent } = await proposer.proposeBlock(block); - - await prover.prove( - proposedEvent.args.id.toNumber(), - blockNumber, - proposedEvent.args.meta as any as BlockMetadata - ); - - let forkChoice = await taikoL1.getForkChoice( - proposedEvent.args.id.toNumber(), - block.parentHash - ); - expect(forkChoice).not.to.be.undefined; - expect(forkChoice.prover).to.be.not.eq( - ethers.constants.AddressZero - ); - - const verifiedEvent = await verifyBlocks(taikoL1, 1); - expect(verifiedEvent).not.to.be.undefined; - - forkChoice = await taikoL1.getForkChoice( - proposedEvent.args.id.toNumber(), - block.parentHash - ); - expect(forkChoice.prover).to.be.eq(ethers.constants.AddressZero); - }); - }); - - describe("getXchainBlockHash(0)", function () { - it("iterates through maxNumVerifiedBlocks length and asserts getXchainBlockHash(0) returns correct value", async function () { - l2Provider.on("block", blockListener(chan, genesisHeight)); - - let blocks: number = 0; - // iterate through maxNumVerifiedBlocks twice and try to get latest synced header each time. - // we modulo the header height by maxNumVerifiedBlocks in the protocol, so - // this test ensures that logic is sound. - /* eslint-disable-next-line */ - for await (const blockNumber of chan) { - if (blocks > config.maxNumVerifiedBlocks.toNumber() * 2 + 1) { - chan.close(); - return; - } - - const { verifyEvent } = await proposeProveAndVerify( - taikoL1, - l2Provider, - blockNumber, - proposer, - taikoTokenL1, - prover - ); - - expect(verifyEvent).not.to.be.undefined; - - const header = await taikoL1.getXchainBlockHash(0); - expect(header).to.be.eq(verifyEvent.args.blockHash); - blocks++; - } - }); - }); - - describe("proveBlock", function () { - it("reverts when evidence meta id is not the same as the blockId", async function () { - l2Provider.on("block", blockListener(chan, genesisHeight)); - - const config = await taikoL1.getConfig(); - /* eslint-disable-next-line */ - for await (const blockNumber of chan) { - if ( - blockNumber > - genesisHeight + config.maxNumProposedBlocks.toNumber() - 1 - ) { - break; - } - - const block = await l2Provider.getBlock(blockNumber); - - // propose block, so our provers can prove it. - const { proposedEvent } = await proposer.proposeBlock(block); - - const header = await getBlockHeader(l2Provider, blockNumber); - const inputs = buildProveBlockInputs( - proposedEvent.args.meta as any as BlockMetadata, - header.blockHeader, - await prover.getSigner().getAddress() - // "0x", - // "0x" - ); - - const txPromise = ( - await taikoL1.proveBlock( - proposedEvent.args.meta.id.toNumber() + 1, // id different than meta - inputs, - { - gasLimit: 2000000, - } - ) - ).wait(1); - - await txShouldRevertWithCustomError( - txPromise, - l1Provider, - "L1_BLOCK_ID()" - ); - } - }); - - it("reverts when prover is the zero address", async function () { - l2Provider.on("block", blockListener(chan, genesisHeight)); - - const config = await taikoL1.getConfig(); - /* eslint-disable-next-line */ - for await (const blockNumber of chan) { - if ( - blockNumber > - genesisHeight + config.maxNumProposedBlocks.toNumber() - 1 - ) { - break; - } - - const block = await l2Provider.getBlock(blockNumber); - - // propose block, so our provers can prove it. - const { proposedEvent } = await proposer.proposeBlock(block); - - const header = await getBlockHeader(l2Provider, blockNumber); - const inputs = []; - const evidence: Evidence = { - meta: proposedEvent.args.meta as any as BlockMetadata, - header: header.blockHeader, - prover: ethers.constants.AddressZero, - proofs: [], - circuits: [], - }; - - evidence.circuits.push(1); - - for (let i = 0; i < 3; i++) { - evidence.proofs.push("0xff"); - } - - inputs[0] = encodeEvidence(evidence); - // inputs[1] = "0x"; - // inputs[2] = "0x"; - - const txPromise = ( - await taikoL1.proveBlock( - proposedEvent.args.meta.id.toNumber(), // id different than meta - inputs, - { - gasLimit: 2000000, - } - ) - ).wait(1); - - await txShouldRevertWithCustomError( - txPromise, - l1Provider, - "L1_PROVER()" - ); - } - }); - }); -}); diff --git a/packages/protocol/test/L1/TaikoL1.test.ts b/packages/protocol/test/L1/TaikoL1.test.ts deleted file mode 100644 index 9027b5fac66..00000000000 --- a/packages/protocol/test/L1/TaikoL1.test.ts +++ /dev/null @@ -1,38 +0,0 @@ -import { expect } from "chai"; -import { ethers } from "hardhat"; -import { TaikoL1 } from "../../typechain"; -import deployAddressManager from "../utils/addressManager"; -import { randomBytes32 } from "../utils/bytes"; -import { deployTaikoL1 } from "../utils/taikoL1"; - -describe("TaikoL1", function () { - let taikoL1: TaikoL1; - let genesisHash: string; - - beforeEach(async function () { - const l1Signer = (await ethers.getSigners())[0]; - const addressManager = await deployAddressManager(l1Signer); - genesisHash = randomBytes32(); - taikoL1 = await deployTaikoL1(addressManager, genesisHash, false); - }); - - describe("getXchainBlockHash(0)", async function () { - it("should be genesisHash because no headers have been synced", async function () { - const hash = await taikoL1.getXchainBlockHash(0); - expect(hash).to.be.eq(genesisHash); - }); - }); - - describe("getXchainBlockHash()", async function () { - it("should revert because header number has not been synced", async function () { - await expect(taikoL1.getXchainBlockHash(1)).to.be.revertedWith( - "L1_BLOCK_ID()" - ); - }); - - it("should return appropraite hash for header", async function () { - const hash = await taikoL1.getXchainBlockHash(0); - expect(hash).to.be.eq(genesisHash); - }); - }); -}); diff --git a/packages/protocol/test/L1/TaikoToken.test.ts b/packages/protocol/test/L1/TaikoToken.test.ts deleted file mode 100644 index 003cc032eae..00000000000 --- a/packages/protocol/test/L1/TaikoToken.test.ts +++ /dev/null @@ -1,122 +0,0 @@ -import { expect } from "chai"; -import { ethers } from "hardhat"; -import { - ERC20_BURN_AMOUNT_EXCEEDED, - ERC20_TRANSFER_AMOUNT_EXCEEDED, -} from "../constants/errors"; -import { BigNumber } from "ethers"; -import deployTaikoToken from "../utils/taikoToken"; -import { TaikoToken } from "../../typechain/TaikoToken"; -import deployAddressManager from "../utils/addressManager"; - -describe("TaikoToken", function () { - let owner: any; - let nonOwner: any; - let protoBroker: any; - let token: TaikoToken; - let amountMinted: BigNumber; - - before(async function () { - [owner, nonOwner, protoBroker] = await ethers.getSigners(); - }); - - beforeEach(async function () { - const addressManager = await deployAddressManager(owner); - token = await deployTaikoToken( - owner, - addressManager, - protoBroker.address - ); - amountMinted = ethers.utils.parseEther("100"); - await token.connect(protoBroker).mint(owner.address, amountMinted); - - const ownerBalance = await token.balanceOf(owner.address); - expect(ownerBalance).to.be.eq(amountMinted); - }); - - describe("mint()", async () => { - it("throws when to is equal to the zero address", async () => { - await expect( - token.connect(protoBroker).mint(ethers.constants.AddressZero, 1) - ).to.be.revertedWith("TKO_INVALID_ADDR()"); - }); - - it("throws when minter is not the protoBroker", async () => { - await expect( - token.connect(owner).mint(nonOwner.address, amountMinted.add(1)) - ).to.be.revertedWith("RESOLVER_DENIED()"); - }); - - it("succeeds", async () => { - const originalBalance = await token.balanceOf(nonOwner.address); - - await token - .connect(protoBroker) - .mint(nonOwner.address, amountMinted); - - const postTransferBalance = await token.balanceOf(nonOwner.address); - expect(postTransferBalance).to.be.eq( - originalBalance.add(amountMinted) - ); - }); - }); - - describe("burn()", async () => { - it("throws when to is equal to the zero address", async () => { - await expect( - token.connect(protoBroker).burn(ethers.constants.AddressZero, 1) - ).to.be.revertedWith("TKO_INVALID_ADDR()"); - }); - - it("throws when burner is not the protoBroker", async () => { - await expect( - token.connect(owner).burn(nonOwner.address, amountMinted.add(1)) - ).to.be.revertedWith("RESOLVER_DENIED()"); - }); - - it("throws when account balance is < amount requested to burn", async () => { - await expect( - token - .connect(protoBroker) - .burn(owner.address, amountMinted.add(1)) - ).to.be.revertedWith(ERC20_BURN_AMOUNT_EXCEEDED); - }); - - it("succeeds", async () => { - const originalBalance = await token.balanceOf(owner.address); - - await token.connect(protoBroker).burn(owner.address, amountMinted); - - const postTransferBalance = await token.balanceOf(owner.address); - expect(postTransferBalance).to.be.eq( - originalBalance.sub(amountMinted) - ); - }); - }); - - describe("transfer()", async () => { - it("throws when to is equal to the contract address", async () => { - await expect( - token.connect(owner).transfer(token.address, 1) - ).to.be.revertedWith("TKO_INVALID_ADDR()"); - }); - - it("throws when transfer is > user's amount", async () => { - await expect( - token - .connect(owner) - .transfer(nonOwner.address, amountMinted.add(1)) - ).to.be.revertedWith(ERC20_TRANSFER_AMOUNT_EXCEEDED); - }); - - it("succeeds", async () => { - const originalBalance = await token.balanceOf(nonOwner.address); - - await token.connect(owner).transfer(nonOwner.address, amountMinted); - const postTransferBalance = await token.balanceOf(nonOwner.address); - expect(postTransferBalance).to.be.eq( - originalBalance.add(amountMinted) - ); - }); - }); -}); diff --git a/packages/protocol/test/SignalService.t.sol b/packages/protocol/test/SignalService.t.sol new file mode 100644 index 00000000000..026e3ab538c --- /dev/null +++ b/packages/protocol/test/SignalService.t.sol @@ -0,0 +1,189 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.18; + +import {AddressManager} from "../contracts/common/AddressManager.sol"; +import {AddressResolver} from "../contracts/common/AddressResolver.sol"; +import {Bridge} from "../contracts/bridge/Bridge.sol"; +import {BridgedERC20} from "../contracts/bridge/BridgedERC20.sol"; +import {BridgeErrors} from "../contracts/bridge/BridgeErrors.sol"; +import {console2} from "forge-std/console2.sol"; +import {FreeMintERC20} from "../contracts/test/erc20/FreeMintERC20.sol"; +import {SignalService} from "../contracts/signal/SignalService.sol"; +import {Test} from "forge-std/Test.sol"; +import {IXchainSync} from "../contracts/common/IXchainSync.sol"; + +contract PrankXchainSync is IXchainSync { + bytes32 private _blockHash; + bytes32 private _signalRoot; + + function setXchainBlockHeader(bytes32 blockHash) external { + _blockHash = blockHash; + } + + function setXchainSignalRoot(bytes32 signalRoot) external { + _signalRoot = signalRoot; + } + + function getXchainBlockHash(uint256) external view returns (bytes32) { + return _blockHash; + } + + function getXchainSignalRoot(uint256) external view returns (bytes32) { + return _signalRoot; + } +} + +contract TestSignalService is Test { + AddressManager addressManager; + + SignalService signalService; + SignalService destSignalService; + PrankXchainSync xChainSync; + uint256 destChainId = 7; + + address public constant Alice = 0x10020FCb72e27650651B05eD2CEcA493bC807Ba4; + address public constant Bob = 0x200708D76eB1B69761c23821809d53F65049939e; + address public Carol = 0xDf08F82De32B8d460adbE8D72043E3a7e25A3B39; + + function setUp() public { + vm.startPrank(Alice); + vm.deal(Alice, 1 ether); + vm.deal(Bob, 1 ether); + + addressManager = new AddressManager(); + addressManager.init(); + + signalService = new SignalService(); + signalService.init(address(addressManager)); + + destSignalService = new SignalService(); + destSignalService.init(address(addressManager)); + + xChainSync = new PrankXchainSync(); + + addressManager.setAddress( + block.chainid, + "signal_service", + address(signalService) + ); + + addressManager.setAddress( + destChainId, + "signal_service", + address(destSignalService) + ); + + addressManager.setAddress( + block.chainid, + "signal_service", + address(signalService) + ); + + addressManager.setAddress(destChainId, "taiko", address(xChainSync)); + + vm.stopPrank(); + } + + function test_send_signal_reverts_if_signal_is_zero() public { + vm.expectRevert(SignalService.B_ZERO_SIGNAL.selector); + signalService.sendSignal(0); + } + + function test_is_signal_sent_reverts_if_address_is_zero() public { + bytes32 signal = bytes32(uint256(1)); + vm.expectRevert(SignalService.B_NULL_APP_ADDR.selector); + signalService.isSignalSent(address(0), signal); + } + + function test_is_signal_sent_reverts_if_signal_is_zero() public { + bytes32 signal = bytes32(uint256(0)); + vm.expectRevert(SignalService.B_ZERO_SIGNAL.selector); + signalService.isSignalSent(Alice, signal); + } + + function test_send_signal_and_signal_is_sent_correctly() public { + vm.startPrank(Alice); + bytes32 signal = bytes32(uint256(1)); + signalService.sendSignal(signal); + + bool isSent = signalService.isSignalSent(Alice, signal); + assertEq(isSent, true); + } + + function test_get_signal_slot_returns_expected_slot_for_app_and_signal() + public + { + vm.startPrank(Alice); + for (uint8 i = 1; i < 100; i++) { + bytes32 signal = bytes32(block.prevrandao + i); + signalService.sendSignal(signal); + + bool isSent = signalService.isSignalSent(Alice, signal); + assertEq(isSent, true); + + bytes32 slot = signalService.getSignalSlot(Alice, signal); + + // confirm our assembly gives same output as expected native solidity hash/packing + bytes32 expectedSlot = keccak256(abi.encodePacked(Alice, signal)); + assertEq(slot, expectedSlot); + } + } + + function test_is_signal_received_reverts_if_src_chain_id_is_same_as_block_chain_id() + public + { + bytes32 signal = bytes32(uint256(1)); + bytes memory proof = new bytes(1); + vm.expectRevert(SignalService.B_WRONG_CHAIN_ID.selector); + signalService.isSignalReceived(block.chainid, Alice, signal, proof); + } + + function test_is_signal_received_reverts_if_app_is_zero_address() public { + bytes32 signal = bytes32(uint256(1)); + bytes memory proof = new bytes(1); + vm.expectRevert(SignalService.B_NULL_APP_ADDR.selector); + signalService.isSignalReceived(destChainId, address(0), signal, proof); + } + + function test_is_signal_received_reverts_if_signal_is_zero() public { + bytes32 signal = bytes32(uint256(0)); + bytes memory proof = new bytes(1); + vm.expectRevert(SignalService.B_ZERO_SIGNAL.selector); + signalService.isSignalReceived(destChainId, Alice, signal, proof); + } + + function test_is_signal_received_reverts_if_proof_is_invalid() public { + bytes32 signal = bytes32(uint256(1)); + bytes memory proof = new bytes(1); + vm.expectRevert(); + signalService.isSignalReceived(destChainId, Alice, signal, proof); + } + + function test_is_signal_received() public { + // known signal with known proof for known block header/signalRoot from a known chain ID + // of 1336, since we cant generate merkle proofs with foundry. + bytes32 signal = bytes32( + 0xa99d658793daba4d352c77378e2d0f3b12ff47503518b3ec9ad61bb33ee7031d + ); + bytes + memory proof = hex"0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000003e0d5c45a5c0fabac05a887ad983965a225214df2cecd77adc216d3b1172866b1e91dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d493470000000000000000000000000000000000000000000000000000000000000000cba38a70215ae3eeba2e97f9b6c3c804541484202953760c1cfe734df6dfce7cf7f7ed1e57a053e1c79765d6b76305193cae04261538400724837787437e621c9e6a8ea258a11278cf2e54d0e4845843837a1da42483ebe1dddf3eed1d33088b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000099c8ac000000000000000000000000000000000000000000000000000000000000ac7500000000000000000000000000000000000000000000000000000000644311c100000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000164c61e700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000061d883010a1a846765746888676f312e31382e38856c696e757800000000000000def5020e30ddc20e32151adb608a5d8367d817a707ae8d520c98ac13de04bce35f95ef795a9c4fd13d3e5daf713525521043125bde66aa71eed7ca715f05c720000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000dbf8d9b8b3f8b18080a04fc5f13ab2f9ba0c2da88b0151ab0e7cf4d85d08cca45ccd923c6ab76323eb28a02b70a98baa2507beffe8c266006cae52064dccf4fd1998af774ab3399029b38380808080a07394a09684ef3b2c87e9e2a753eb4ac78e2047b980e16d2e2133aee78946370d8080a0f4984a11f61a2921456141df88de6e1a710d28681b91af794c5a721e47839cd7a00f6329feca1549bd3bf7ab9a2e474bde37cb4f81366fca1dfdd9257c7305b5b880808080a3e2a037a8317247f2d3e645fa68570a9ae97a73b5568fe0578b90197316c654138997010000000000"; + + xChainSync.setXchainBlockHeader( + 0x986278442ae7469dbd55f478348b4547c399004c93325b18ed995d2bc008f98d + ); + xChainSync.setXchainSignalRoot( + 0x58900f5366437923bb250887d359d828a1a89e1837f9369f75c3e1bb238b854f + ); + + vm.chainId(destChainId); + + bool isReceived = destSignalService.isSignalReceived( + 1336, + Carol, + signal, + proof + ); + + assertEq(isReceived, true); + } +} diff --git a/packages/protocol/test/bridge/BridgedERC20.test.ts b/packages/protocol/test/bridge/BridgedERC20.test.ts deleted file mode 100644 index 0f7076e2d94..00000000000 --- a/packages/protocol/test/bridge/BridgedERC20.test.ts +++ /dev/null @@ -1,293 +0,0 @@ -import { expect } from "chai"; -import { AddressManager, BridgedERC20 } from "../../typechain"; -import { ethers } from "hardhat"; -import { BigNumber } from "ethers"; -import { - ERC20_BURN_AMOUNT_EXCEEDED, - ERC20_TRANSFER_AMOUNT_EXCEEDED, -} from "../constants/errors"; -import deployAddressManager from "../utils/addressManager"; - -const WETH_GOERLI = "0xB4FBF271143F4FBf7B91A5ded31805e42b2208d6"; -const CHAIN_ID_GOERLI = 5; -describe("BridgedERC20", function () { - let owner: any; - let tokenVault: any; - let accountWithTokens: any; - - // uninitialized BridgedERC20 for testing - let unInitAddressManager: AddressManager; - let unInitERC20: BridgedERC20; - - // properly initialized BridgedERC20 for testing - let addressManager: AddressManager; - let erc20: BridgedERC20; - - before(async function () { - [owner, tokenVault, accountWithTokens] = await ethers.getSigners(); - }); - - beforeEach(async function () { - unInitAddressManager = await deployAddressManager(owner); - unInitERC20 = await ( - await ethers.getContractFactory("TestBridgedERC20") - ) - .connect(owner) - .deploy(); - - addressManager = await deployAddressManager(owner); - - const network = await ethers.provider.getNetwork(); - - await addressManager.setAddress( - network.chainId, - `token_vault`, - tokenVault.address - ); - - erc20 = await (await ethers.getContractFactory("TestBridgedERC20")) - .connect(owner) - .deploy(); - - await erc20 - .connect(owner) - .init( - addressManager.address, - WETH_GOERLI, - CHAIN_ID_GOERLI, - 18, - "SYMB", - "Name" - ); - - await erc20 - .connect(tokenVault) - .bridgeMintTo( - accountWithTokens.address, - ethers.utils.parseEther("1.0") - ); - }); - - describe("init()", function () { - it("inits when srctoken is not 0, srcChainId is not 0, srcChainId is not the current blocks chain id, symbol is not 0 length, name is not 0 length", async () => { - await expect( - unInitERC20 - .connect(owner) - .init( - unInitAddressManager.address, - WETH_GOERLI, - CHAIN_ID_GOERLI, - 18, - "SYMB", - "Name" - ) - ).not.to.be.revertedWith("BRIDGE_INIT_PARAM_ERROR()"); - }); - - it("throws when _srcToken is address 0 ", async () => { - await expect( - unInitERC20 - .connect(owner) - .init( - unInitAddressManager.address, - ethers.constants.AddressZero, - CHAIN_ID_GOERLI, - 18, - "SYMB", - "Name" - ) - ).to.be.revertedWith("B_INIT_PARAM_ERROR()"); - }); - - it("throws when _srcChainId is 0", async () => { - await expect( - unInitERC20 - .connect(owner) - .init( - unInitAddressManager.address, - WETH_GOERLI, - 0, - 18, - "SYMB", - "Name" - ) - ).to.be.revertedWith("B_INIT_PARAM_ERROR()"); - }); - - it("throws when _symbol is 0 length", async () => { - await expect( - unInitERC20 - .connect(owner) - .init( - unInitAddressManager.address, - WETH_GOERLI, - CHAIN_ID_GOERLI, - 18, - "", - "Name" - ) - ).to.be.revertedWith("B_INIT_PARAM_ERROR()"); - }); - - it("throws when _name is 0 length", async () => { - await expect( - unInitERC20 - .connect(owner) - .init( - unInitAddressManager.address, - WETH_GOERLI, - CHAIN_ID_GOERLI, - 18, - "SYMB", - "" - ) - ).to.be.revertedWith("B_INIT_PARAM_ERROR()"); - }); - - it("throws when _srcChainId is equal to block.chainid", async () => { - const network = await ethers.provider.getNetwork(); - await expect( - unInitERC20 - .connect(owner) - .init( - unInitAddressManager.address, - WETH_GOERLI, - network.chainId, - 18, - "SYMB", - "name" - ) - ).to.be.revertedWith("B_INIT_PARAM_ERROR()"); - }); - }); - - describe("source()", function () { - it("returns srcToken and srcChainId", async () => { - const [srcToken, srcChainId] = await erc20.source(); - - expect(srcToken).to.be.eq(WETH_GOERLI); - expect(srcChainId).to.be.eq(CHAIN_ID_GOERLI); - }); - }); - - describe("bridgeMintTo()", function () { - it("throws when not called by token_vault", async () => { - const amount = BigNumber.from(1); - await expect( - erc20.bridgeMintTo(owner.address, amount) - ).to.be.revertedWith("RESOLVER_DENIED()"); - }); - - it("successfully mintes and emits BridgeMint when called by token_vault, balance inceases for account specified, burns and emits BridgeBurn", async () => { - const amount = BigNumber.from(150); - - const initialBalance = await erc20.balanceOf(owner.address); - expect(initialBalance).to.be.eq(BigNumber.from(0)); - - expect( - await erc20 - .connect(tokenVault) - .bridgeMintTo(owner.address, amount) - ) - .to.emit(erc20, "BridgeMint") - .withArgs(owner.address, amount); - const newBalance = await erc20.balanceOf(owner.address); - expect(newBalance).to.be.eq(initialBalance.add(amount)); - - expect( - await erc20 - .connect(tokenVault) - .bridgeBurnFrom(owner.address, amount) - ) - .to.emit(erc20, "BridgeBurn") - .withArgs(owner.address, amount); - - const afterBurnBalance = await erc20.balanceOf(owner.address); - expect(afterBurnBalance).to.be.eq(newBalance.sub(amount)); - }); - }); - - describe("bridgeBurnFrom()", function () { - it("throws when not called by token_vault", async () => { - const amount = BigNumber.from(1); - await expect( - erc20.bridgeBurnFrom(owner.address, amount) - ).to.be.revertedWith("RESOLVER_DENIED()"); - }); - - it("can not burn an amount greater than was minted", async () => { - const initialBalance = await erc20.balanceOf( - accountWithTokens.address - ); - - await expect( - erc20 - .connect(tokenVault) - .bridgeBurnFrom( - accountWithTokens.address, - initialBalance.add(1) - ) - ).to.be.revertedWith(ERC20_BURN_AMOUNT_EXCEEDED); - }); - }); - - describe("transferFrom()", function () { - it("throws when trying to transfer to itself", async () => { - await expect( - erc20 - .connect(accountWithTokens) - .transferFrom(accountWithTokens.address, erc20.address, 1) - ).to.be.revertedWith("B_ERC20_CANNOT_RECEIVE()"); - }); - }); - - describe("transfer()", function () { - it("throws when trying to transfer to itself", async () => { - await expect( - erc20.connect(accountWithTokens).transfer(erc20.address, 1) - ).to.be.revertedWith("B_ERC20_CANNOT_RECEIVE()"); - }); - - it("throws when trying to transfer amount greater than holder owns", async () => { - const initialBalance = await erc20.balanceOf( - accountWithTokens.address - ); - - await expect( - erc20 - .connect(accountWithTokens) - .transfer(owner.address, initialBalance.add(1)) - ).to.be.revertedWith(ERC20_TRANSFER_AMOUNT_EXCEEDED); - }); - - it("transfers, emits Transfer event, balances are correct after transfer", async () => { - const initialRecipientBalance = await erc20.balanceOf( - owner.address - ); - const initialAccountWithTokensBalance = await erc20.balanceOf( - accountWithTokens.address - ); - const amount = BigNumber.from(100); - - expect( - await erc20 - .connect(accountWithTokens) - .transfer(owner.address, amount) - ) - .to.emit(erc20, "Transfer") - .withArgs(accountWithTokens.address, owner.address, amount); - - const newRecipientBalance = await erc20.balanceOf(owner.address); - const newAccountWithTokensBalance = await erc20.balanceOf( - accountWithTokens.address - ); - - expect(newRecipientBalance).to.be.eq( - initialRecipientBalance.add(amount) - ); - expect(newAccountWithTokensBalance).to.be.eq( - initialAccountWithTokensBalance.sub(amount) - ); - }); - }); -}); diff --git a/packages/protocol/test/constants/errors.ts b/packages/protocol/test/constants/errors.ts deleted file mode 100644 index 60420437565..00000000000 --- a/packages/protocol/test/constants/errors.ts +++ /dev/null @@ -1,3 +0,0 @@ -const ERC20_BURN_AMOUNT_EXCEEDED = "ERC20: burn amount exceeds balance"; -const ERC20_TRANSFER_AMOUNT_EXCEEDED = "ERC20: transfer amount exceeds balance"; -export { ERC20_BURN_AMOUNT_EXCEEDED, ERC20_TRANSFER_AMOUNT_EXCEEDED }; diff --git a/packages/protocol/test/data/test_proof.json b/packages/protocol/test/data/test_proof.json deleted file mode 100644 index e35722dc478..00000000000 --- a/packages/protocol/test/data/test_proof.json +++ /dev/null @@ -1,37 +0,0 @@ -{ - "jsonrpc": "2.0", - "id": 1, - "result": { - "aggregation": { - "duration": 0, - "instance": [], - "k": 0, - "label": "pi-600000-a", - "proof": "0x", - "randomness": "0x" - }, - "circuit": { - "duration": 291422, - "instance": [ - "0xecbb89532da16c6aaba65173df994a0b", - "0xdc43ac5f0c4d96dda954d14935efd6a3" - ], - "k": 19, - "label": "pi-600000", - "proof": "0x2bf20ff78727f38ef16e03bfb3d4895f35cc626f97ede7cc99f48aeff8661fe32015ea8d62ec7a79e01cd398e85867bafdcf55cb6a7121b6fef097f5f5656a5d11ddf336b6879926ea2ae425e91c748a553c9a496cbe2ab556a91689f75ee2b01ad3c43aa774b50a9d8411a9f65be42d6cde781db1a1949a1e886f868917997b0ddf417d2fa8b5fb32dd641ef94ba838efb46de478000cc32c62367ea7f68f341ab25760acb25df78b85ffaf11edcaf986c0ed939c32989df7127129000e0bfb21f302010a7798aecee8552aa1c226cf9908e813008ee2f29e21784a3f32078a0ed17a8070ca28e6fb79356d372926921e08a609bfde3f9416a69da8cbf4faba1958b1d14fc9092e077af4e9c438857aa200afd32dcf7848a217fb187fa9e1bb2b88c35121977f4de6a34c88c2fe4678205292ca22683d073687f77a68070e1e227874e3cddb99c6347c7d47232d2aa51b32076e81b130e96dc0ca2ac7dcef601bfbd31520044ed64796953f3345b49ac812514aa3886a17e8eab324c8940abd220669e9b95d47ddc7774695be89576663bf96b0e6dea37abfbfb4620178b74e124862d1788641479260a68ebba6dbc9cd80e10ef9d7627966db2063222eb2751a9959e70854d3379c63eb3ec8177441f568d79ec82875aa36645f01bd53e10d302a9f8b678d6b09c54d072c7e9d6443a0aa89021ec0748568d3d5b5745c92b11f31c13d11b94f892bb9f96bd2931b66ffa5e22b104c549e7c0d5010e4e70e271d48c0bd6e4be68c920ea77af85d12eb155d9b25703eabbd0ede1909565a55f12f654ccc6771897acdaaf83e3674c7141927ac3a8e9915bf27f033779110c0ba0b635753acf8f53fed904adc20368c93691f8e49cf07e0b6f10a9d8a0bea4f3d259764b0f53960cd7b9a81fa4379d396364814249a5fddcf7efa7d2e68e729550a92392f5c23c73868961d6edfd9fc4f1379c8e34191c372cbebf13c2fa337fd1a0a0068708d0d60db275be717d35676c27cf58b5044adb1d764b8bcd6951a9f1c5c1a2fb96d6cecb1c153fbe082948de02930c0cdb295d8ac4df91ea2d34b442fd18f84509838c84d4ebc980c96be6d0667fc18cd949ac93b5dfb38d712bb2d29fcbac5bb3a620b2b5aadf1a4e2a3c254610dfffe7e216b4a9ecc93a8081b970d13d113582885390dfc9cc4ae10eca93a6c81003305c0a03213293e919e041712192fb8374c269bf5e3cbfd8cfc1fa4408c0a55fd98d8f57926aa9d9772e5b114ffe9e64acbf6e0543d3c55a5140116e8130f3369b0f819a21f5fa24980b11b2f12481042cbff8b2dec629f37fa4a64a4641656629fb11261a66a36e969b74a20753d54c05301075e315bdb0a39fd7665edd8d73fbfa6c4faaf6c66e6c8b1a830453b758b0047d93d9970b49c617dd582fbad0539f9f5eadeeb51e35775f98f2bfb750f3ca68d27197e3d86d4283f5859a6ef7bd66b68991f474e26317dc1df15d4acaa898abf97f2e5c1b4e560336e76ccbe2613d85454a095bbe5ae6b2a1212064ca8776f0f33bd9797c164a92c211167e81c6dc3418d096fecc989ae97d004e2bfa53207b036b5183468f4435e9df40413fd4f3fbb7c0e4080765a68d1e80b262e54ab27cdb4904018a73566c5f3fbf93e637081714ffbd106c3f03f69fb20444983ce2fed71bf96c17049506c3d667ccc7d29dac0a1830187c2f0f130a31166f5e0f55fdd7796be8c989e9c55b87e135356cabdb13314693c4f4cdb3a350524f7494c0b7c9679c651970b2076b58718cf6077b1d5bcd1193708faf3f1812a4811c5965495da8054c9a4a4447f50b08138ea05c6df2bdc444689b78b9a37196917eaed3edc25d1ddc1b60a8041330a4759ee8725c87234374c60b43ab7d8066fe95537bb96857a5357ff97dab62f0e56511d7cb8d3695d919db350eb949002f4fde22120e0e8d3023dbd46a7f0f4e5f84cb59a19c331806f71a381f72da81f27884447fe57e3271ebc651916dced06db9c7a51572c5ce7021eaff9c0bc7c02380abf987c89ba8029744c07e0eeab3a228793e9a69adba4ae42404fb2ce4d2495da393f0d0ac5a0178ca4720e8e6a193e3579a3ef50df7ed8a4b06ca54e33150ae76933a36e9979336b44461efbeaa9de08379687b1dd8ed6656438480d0c0237ca9000cca1bfd6adfdd043364af965aeea9b0571e2debb244e7b632d287011c7ff356c7cce34ad9f5e910280dedd1fae543c3e4405dd47648ae52e8793902beefdab93b509be5c3d84808db2186920e75fb6211f92e965cb901dcdf2ce9c14e21ebcbbc81a57784d0900fac3c31566ded583eb0867eefd75bbf3df363ef01b7932b70e7b068a2656173d241e8f20bb6be3a3a3767111aa6f459f84be961c2337f6e03ed3cc6c847a3683894288b471504cbdc43a78f856801a10a87c77322e36e0ca426ec67ad3a2a3b79bc5cb81928a79a67a0fb46bb967cbab73fd36022f92d920204de61717dde6a85b7bcf57584c11ce54ac92998f856bf042a01c5017345a34999a1048429a6ac79724c62d55446e80fe8fe17c45eee3fbff6d5adb18976d640fa9d0cdc20bed46b5c726df89e442099e0d5a7c7229c3c17dd878671c2794a56de602afc80c531d41f6239868a7f6c2eaf6ee31e765fccd39d9f8f20ca9299f4339b73796bdb401f68953f9b796798756c87db489cf79b7a29c4c6124b6cccd46862b0c28a6f2a03603cb6dfecf6a9b92a01f722b47b50d04963fc12cef50cc58129155b15f279e8bc71a20a663022516cd7c72b9c6cd3782569d150f046473cbb519f5719cd1c8edae7313d9869a20ef43cf2f668cbf98b904e421301b032acb7515be27039f0a02275eacac5600eb1df8d8e48096b31ecce40dbc1a462346830d8dee6311caec0a83aff85a70a0180b999bd3c1b2932596ef3c9524fbf7971c6d9e75ecdbd2ec7943b47d7feec6f26abe42c6aa6bc4f10085843712406bf56c20010ec8dbe8684e174894aa0b6471ef3d3a33ef77887fe5a6b33220a7a1991e56a31e51d2cd82555ccd8f31056d312d9f4c37ba7915a271ca814222616327752f8354ff401a5cf2efcc342752f919a11a0a7a35a1b574ea36637f2c6e14989ad2f7668502cebbd59b3346379d577daf4a0981f0a341d38d9ee58a0463484d31623127c09c6cec446a9ac9a53cb6841ca2a097ceef88e537e209880ffdcfd5033bc3f5a885c271e41ee332366345fa867780beb3c1d5eaa496ea09055c1664fe43a3cee202c7086555143481e8407952aacd465042664e99dc869d1d0641ba576f7351c66c4177418bde4d2e3146083e9362cdba7c0a0ddd2ef8c82b2db81d6fa83b980ab5eabd8a697cdea718c98148d907c2732a3912bfffb59b0a01f361062fc5eb023866f05f6f24277f2b862978b8be3a195787d83b2793092b2060ecd7e35d7ccc5588c367292d227e94b521736a89da3093cc26a45c4f450b64ff3e97f834e2e1303cb0abc9b31704c4b4f99a595e0b32e8632628a1b31f11caf94b127957d16938243e7b9da2c99131bfba20d052f1f741a4e724b4442008cd72dc748b9dd66eb047c4fe9768d0f752aac429c8dede3b8173d7d0e2e4f228985166aa6daa1e3e8bc8cec535cc49fb04cc983eef4b0489ca58d5127b7a4c110fbb8418e62e1086ceeeff2fcda91add54a78321104268324cb978846c129309e5c32019fbd8052926e9945847120ce2bd31a6fde1ad4a333d37c2d948d83b120b6b6d387a0f7fe5f7dfaf3ab3af823d4bb85236ba2d5e8887f5a322190296046eaa65541bce11841715fb8243c61739456c3219755317d0d2d3f84e58dcd115cfbbd8e41b40a6244082c566923dc347ecf89ff8683c7b56dc3af8dde4804f245883c795c063ca8f0e676f70a76e463b325f4754f992c72a18197c4265904822a7e3926f2a0b5e928982620244b3fa5a74a6d77cf3b212dc1cc738487604752fe83dadcc0a47916ef7c4643b82c068b50ccc27589a3d41e86d9b028236e94f24b13227d4df86f3fcb52c583b6feb799268050d2527a6ae8662735dcf14a07c0bc93053770d51f357c745e6c9c1546699eeda30310f3277630a023b5dcfb1a10f4155812cd16cc0048d8844187135ce6a6c90e81c4ecc3e503f26ea92dfe5a817cdd5cbaa3fe8bffacc2f6940eb0c5ba38eb739133532579194d745218102bb088ff27a05e9d5d857b8d131974574fa4a1511b0497e2b332ffe349571d59da52c2225198daa0e27f0e429523c3bd45bbd4d0bddee05003c953e5d22c42ade7f0e3b871be6eaf13236041a6ca2614ea28cb541352aa0eca871a852be7bbabfe30c3173bcbdd8733f8d0df021ee3a454551194d07518f936a2cfef1c0c1196ee50772aea8115ef7e2f2523c18cfb2dae0c60f04d13b7e8d4c8cde37759f5dc5270103f142f7085265670f065353108b482fc711c0ee1279cbc0c85811e3f58bf4199d7b1fdf06e516bd2b85ee9012c2cebf508a4d76779df91a1ab8481765c74c29c2afe960284cf26a0a917979539bc21cd620dab7d35e624a36f9c20baaa6d52ad980d965aed1dfb5495455fb68b41e3ba9ee06521960fe63d4441dbf3b7a352b28baec06f95a8cdcf4aa81ec02a44712a21202439c19409d137f22c115ff871297f0c3eee03f15cf46f9f786d3c7596084b24439d7b95ea61b357c24b967ae204113c1ec8cf103289aaa6b9436da1f572cb1972fe2305b74a88a74ee5353391c3f13a1d0fbc1e674fa13f385b34f7eda4a6ae60eb27aa02fdad51757820b7c0e7b2744e7782fe393581875b14e8d62cd51c6f5621d500f99216d1797dec34522f4baa9ee2ef08fa4338582f8a2ea1109715304d95690ad7141c02d4914b3482dbffd460e1bda19f0b4bcde737c899b5e8b149545611a69a51d121de0f404a62b9c5fe22a7eff88d9dc7625a2b421ea63fc4bd1c3de012179a2a896be077a35108e1b0cf51d88c6e57ab0bd702527959e9805d6f7c6628e337ac905df6bda5713c88ef0c3a2d7a54837f1313ceb899ec6cb96253c24ac94a87f2a0bd90373f81f84f10d4bba42c769ecea87a4bbf854c151772fd97e31bf3e531c8aee6d0dfe01f06fe15736edae5b11ac891cc8b5b847b6b0c7d9e09c5856d755a1d9ab15872e89bca1e7a253e547584b144e517daf9fe4824001d92a7bc355baaa421aa1f92ae543153ca763112d9181802212bd8cb1f7047fe09bff0bf17ad3acff6148d42de1d4b0ecf116b80ead2f02c118b6df97df4f56baf03f5955173f9d68f827ed27ad554f90aff457a8a23280e2be8885d5d3642f0ec59b3a1ec492ae8f4cdd85125ac43e978624cdb90de36025b6ac4e0d83e4735c67858b6afe1c72794b2f8f154e162a34beb4b7fb3bfbc1925cbc903321f47a70f532417d7eacde29cc747d1f7e85b9ebc9881281c08219b47f01dd25a0cabbbf682afdb25fa9e750f9159e120e9e372281d0859ed0b8977cf93eed7ae008b71e7fce7db5ead0d46065e90509dd2e820573d21adc9c48cad23b0b7d0feed2a8300e1e5dc489a61e4cd316ca29f60acd695b5630a10caa7c3d21c151f7e4dc343e98e1753a8e446c554859f02a8614476fea682a8e2ea573bb36dc88d7d8c51e14a11a22834fdd33cd6a077f00b5f8bdfef25b77c6f4985199b3b8dc039f385df28607fcdd45f64d745d5bde0cb5f17221f8335b58db4fd93a1aa6e16d091c66cdc903e4519eb95683c7eff018d47f14e841e216ef87942b3364ce60d94c2eba0a8d4d9909ad4be7e0a866dd0880a33e25c95afb6100f737083a761451047d59b753032e68cb591d1ba5a09d0ab6f9196887dc665035140aec389bfcb7e304dadf6509f4a8e466c8c52c124b1f9002e724d23e13f4bda538a4003a6b719e08075d4aea1a881f9c90fd34b4f22b9983e7ce125798e735db18dc08c49e95e20b685bf2a9ee2d6ea7cc1437e7b1201348d0d498e170c185f96a771a4642f444ec00ccf69fb94869926eb0f539f01be43ab9e8823c746bbf27bbc62081218eb728595fafd0f257bb0267468b4b2111636c36985b5450f724201f3cf862423ff099c177b53624f07a699b831a98ae06d21c2ed3ff85c918c27abb2fbe3266bce49d11de75b54a577ba0f4e1286fbe2523a04d1245a9940cf25efd5d2b4f1d9a38c939b439484964d1458ac5f63a8f0449ec481df725c09691bdd8b4605f2c378f4326055193cd7e0d4e625763da941c71f8ba138c652fc8b1230bb1ffc1d8649e883079d6f72154ee5e91c16b46e11f9de2cb6581ea13027a6445aa0f2dceb24de24e119b421f7718bff774bfd33c15bf1db21b36cd7ab8bcc97cbb2f79126640dfc5926290638e4c1099b7ca9673253fe95dbcfefad83574d6d3bb4934a57152a4dd598178900f8c4283dca089f71e1760d063de4d4e16ba091db51d7bcb31257831b78e74534f2d87fbc534ae09138bbbfa082932956596372c6f57c29cd18daecb33e2e40eff4fb23844b99dfc234258d2105be4f8f95ae781e8e5b105cacdb4bedcf319d548f75f53257041ed08b96961984cef1d11aeb686c928e12b5a2d8315d12fec299f6a47278af96e3a0ef706564615c35891a21d3e4c6ace3863ceb74eb610f6df878743d1126194ee21afc2f5121aed95c8b776bdd74536bee8708410ded1ef78400498c2b842e257214a9e7c186fd8cf719303653d6f0848de33d142161c9116e281efba4714f82c2049a208ab4cd5b9f98a1601b2cb0d4fbb7570938e1d536140d4cc4c05a69c20295367916c381f7f60e3589a2b6e1b9c8bfe57985ec74fd7ce9c8d311b2483dd28f5b53c50c6a1556d6bfc3ec7ad225939a0b0e87fc8ae3cf49c632c6f8d0f3b0e36cf8f44fa705719f1cc74949aa5c97866e2f8abb9a329700c64210cb701932c9f527bc4e2a83637f0eb868c700f66df7e6bde882c686a2832862366a4759c0920569110fa746596834284a02db15179d900454bf2d3a8f912ee1a62a32c071bb89c96cf82a3173caab9901b2ab1d005b21ff8dddf2e4a7c8b4174534648ce1f473f57ce66cb4877561212f1424b7808f47cb267d3a9f7c6122a23f146840529440cf04028b263e2432120acf949234e59b01b1c5edfe36968138f771db95b19bbdf7ac619ccc786132fc38687ab929fe10f7656b9b7f2f0f8ff1c2567e5d4092eeed98d0b457811d6516cf28c935606774c9676cc27d77b7229b13d5c7409064a369b568b597f7dabf1fee789328a6a216ebad1d827bea6f3dc73de73b8f00d2cbf971ea012fdfe667fa3c71827d0831e119023625038e5caeef9244e20e305834cecd12f46e2dfc4e73154ae503b431d62de912fadcd3785203a41d9457d291826033c13ccac3bc3a63425f14953eed324c08f03d2a5722c76ed44712720296c14474d1dab39626f11c0927c17fcab09040481732a9d13b976e8101836181591c892dfb24fd04250fb08bcca8d6649e4a17de62a9066bf74486cf09a1d01287c8535e17d8e466c2ea15ad5c300e1dd7a7d83470629a7e5f7f5151b1251161e1e75cb24c1e6ed7f99ae065b2dbcc5a96429445bbea9917571566a1d0defc601d76fb4390fe028274e98c82c78930ffdb30fb626bef3342d6f35994eb539a210af0e3ae6f3efdc7c5efcd287d7e699e6d1a402246a797d4db46fbbbbbb94cf257d65d7748f905906b74e7da9e8770e313ab08145e1f6b2eb684decf91fcd5a130e726c8d82850c78e1756542d52758a82d06f2839c79e9d13466b0477a0ab12743f4e1d5b347a5bbe7960af573d8ecaa19ecc2f467517a809b958502af98f42114752aa79a8fa137a23516ee6fceec1c2301dedb00ba071acdf7568266efad2a37a8884dbb5f76312429a2e4b0bdbe1131751b730e521b21693e5f0fb788fc21549886936f5608626170146dc1fb531f56ad7155510930cb19b33fdac1962009d7f1a7e779b32593404d855e10fa92b8c5db1daf63c8b36b00b8602f7e5a65", - "randomness": "0x" - }, - "config": { - "block_gas_limit": 625000, - "keccak_padding": 1600000, - "max_bytecode": 139500, - "max_calldata": 697500, - "max_rws": 3161966, - "max_txs": 80, - "min_k": 21, - "min_k_aggregation": 26, - "pad_to": 2097152 - }, - "gas": 21000 - } -} diff --git a/packages/protocol/test/genesis/generate_genesis.test.sh b/packages/protocol/test/genesis/generate_genesis.test.sh index a1cadc9d244..9da67a737d6 100755 --- a/packages/protocol/test/genesis/generate_genesis.test.sh +++ b/packages/protocol/test/genesis/generate_genesis.test.sh @@ -48,7 +48,7 @@ echo ' echo "Starting generate_genesis tests..." # compile the contracts to get latest bytecode -rm -rf out && pnpm compile:foundry +rm -rf out && pnpm compile # run the task pnpm run generate:genesis $DIR/test_config.json diff --git a/packages/protocol/test/libs/Lib1559Math.test.ts b/packages/protocol/test/libs/Lib1559Math.test.ts deleted file mode 100644 index fde48e435ab..00000000000 --- a/packages/protocol/test/libs/Lib1559Math.test.ts +++ /dev/null @@ -1,118 +0,0 @@ -import { expect } from "chai"; - -const hre = require("hardhat"); -const ethers = hre.ethers; - -describe("Lib1559Math", function () { - let Lib1559Math: any; - before(async function () { - Lib1559Math = await ( - await ethers.getContractFactory("TestLib1559Math") - ).deploy(); - }); - - describe("Testing adjustTarget", function () { - it("testing adjustTarget works as docs intend", async function () { - // 15000000 * ((9) * 15000000 + 10000000) == 2.175E15 - // divide by: - // (10 * 15000000) == 1.5E8 - // == 1.45E7 - const initTarget = 15000000; - const prevMeasurement = 10000000; - const baseTarget = 15000000; - const adjustFactor = 10; - - const result = await Lib1559Math.adjustTarget( - initTarget, - prevMeasurement, - baseTarget, - adjustFactor - ); - expect(result).to.equal(14500000); - }); - - it("testing adjustTarget iterative is increasing", async function () { - // (since prevMeasured > T, nextTarget > prevTarget) as described in Lib1559Math.sol - const initTarget = 10000000; - const prevMeasured = 20000000; - const baseTarget = 15000000; - const adjustFactor = 10; - - let target = await Lib1559Math.adjustTarget( - initTarget, - prevMeasured, - baseTarget, - adjustFactor - ); - const arr: any[] = []; - for (let index = 0; index < 10; index++) { - target = await Lib1559Math.adjustTarget( - target, - prevMeasured, - baseTarget, - adjustFactor - ); - arr.push(target); - // log.info(target) - } - // eslint-disable-next-line eqeqeq - const isAscending = arr.every((x, i) => { - return i === 0 || x >= arr[i - 1]; - }); - expect(isAscending).to.equal(true); - }); - }); - - describe("Testing adjustTargetReverse", function () { - it("testing adjustTargetReverse works as docs intend", async function () { - // (15000000 * 10 * 15000000) == 2.25E15 - // divide by: - // ((9) * 15000000 + 10000000) == 1.45E8 - // == 15,517,241.379310345 - // == 15517241 - const initTarget = 15000000; - const prevMeasurement = 10000000; - const baseTarget = 15000000; - const adjustFactor = 10; - - const result = await Lib1559Math.adjustTargetReverse( - initTarget, - prevMeasurement, - baseTarget, - adjustFactor - ); - expect(result).to.equal(15517241); - }); - - it("testing adjustTargetReverse iterative is decreasing", async function () { - // (since prevTarget >= T, nextTarget < prevTarget) as described in Lib1559Math.sol - const initTarget = 15000000; - const prevMeasurement = 20000000; - const baseTarget = 15000000; - const adjustFactor = 10; - - let target = await Lib1559Math.adjustTargetReverse( - initTarget, - prevMeasurement, - baseTarget, - adjustFactor - ); - const arr: any[] = []; - for (let index = 0; index < 10; index++) { - target = await Lib1559Math.adjustTargetReverse( - target, - prevMeasurement, - baseTarget, - adjustFactor - ); - arr.push(target); - // log.info(target) - } - // eslint-disable-next-line eqeqeq - const isDescending = arr.every((x, i) => { - return i === 0 || x <= arr[i - 1]; - }); - expect(isDescending).to.equal(true); - }); - }); -}); diff --git a/packages/protocol/test/libs/LibBlockHeader.test.ts b/packages/protocol/test/libs/LibBlockHeader.test.ts deleted file mode 100644 index 994eaa765bf..00000000000 --- a/packages/protocol/test/libs/LibBlockHeader.test.ts +++ /dev/null @@ -1,189 +0,0 @@ -import { expect } from "chai"; -const hre = require("hardhat"); -const ethers = hre.ethers; -const EBN = ethers.BigNumber; - -describe("LibBlockHeader tests", function () { - let libBlockHeader: any; - - before(async function () { - libBlockHeader = await ( - await ethers.getContractFactory("TestLibBlockHeader") - ).deploy(); - }); - - it("can calculate block header hash correctly", async function () { - const blockHash = - "0xc0528bca43a7316776dddb92380cc3a5d9e717bc948ce71f6f1605d7281a4fe8"; - // block 0xc0528bca43a7316776dddb92380cc3a5d9e717bc948ce71f6f1605d7281a4fe8 on Ethereum mainnet - - const parentHash = - "0xa7881266ca0a344c43cb24175d9dbd243b58d45d6ae6ad71310a273a3d1d3afb"; - - const l2BlockHeader: any = { - parentHash: parentHash, - ommersHash: - "0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347", - beneficiary: "0xea674fdde714fd979de3edf0f56aa9716b898ec8", - stateRoot: - "0xc0dcf937b3f6136dd70a1ad11cc57b040fd410f3c49a5146f20c732895a3cc21", - transactionsRoot: - "0x7273ade6b6ed865a9975ac281da23b90b141a8b607d874d2cd95e65e81336f8e", - receiptsRoot: - "0x74bb61e381e9238a08b169580f3cbf9b8b79d7d5ee708d3e286103eb291dfd08", - logsBloom: - "112d60abc05141f1302248e0f4329627f002380f1413820692911863e7d0871261aa07e90cc01a10c3ce589153570dc2db27b8783aa52bc19a5a4a836722e813190401b4214c3908cb8b468b510c3fe482603b00ca694c806206bf099279919c334541094bd2e085210373c0b064083242d727790d2eecdb2e0b90353b66461050447626366328f0965602e8a9802d25740ad4a33162142b08a1b15292952de423fac45d235622bb0ef3b2d2d4c21690d280a0b948a8a3012136542c1c4d0955a501a022e1a1a4582220d1ae50ba475d88ce0310721a9076702d29a27283e68c2278b93a1c60d8f812069c250042cc3180a8fd54f034a2da9a03098c32b03445" - .match(/.{1,64}/g)! - .map((s) => "0x" + s), - difficulty: EBN.from("0x1aedf59a4bc180"), - height: EBN.from("0xc5ad78"), - gasLimit: EBN.from("0xe4e1c0"), - gasUsed: EBN.from("0xe4a463"), - timestamp: EBN.from("0x6109c56e"), - extraData: "0x65746865726d696e652d75732d7765737431", - mixHash: - "0xf5ba25df1e92e89a09e0b32063b81795f631100801158f5fa733f2ba26843bd0", - nonce: EBN.from("0x738b7e38476abe98"), - baseFeePerGas: 0, - withdrawalsRoot: ethers.constants.HashZero, - }; - - const headerComputed = await libBlockHeader.hashBlockHeader( - l2BlockHeader - ); - console.debug("headerComputed:", headerComputed); - - expect(headerComputed).to.equal(blockHash); - }); - - it("can hash block header which contains hash with leading zeros correctly", async function () { - const blockHash = - "0x6341fd3daf94b748c72ced5a5b26028f2474f5f00d824504e4fa37a75767e177"; - // block 0x6341fd3daf94b748c72ced5a5b26028f2474f5f00d824504e4fa37a75767e177 on Rinkeby testnet - // https://rinkeby.etherscan.io/block/0 - - const blockHeader: any = { - parentHash: ethers.constants.HashZero, - ommersHash: - "0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347", - beneficiary: ethers.constants.AddressZero, - stateRoot: - "0x53580584816f617295ea26c0e17641e0120cab2f0a8ffb53a866fd53aa8e8c2d", - transactionsRoot: - "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", - receiptsRoot: - "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", - logsBloom: - "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" - .match(/.{1,64}/g)! - .map((s) => "0x" + s), - difficulty: EBN.from("0x1"), - height: EBN.from("0x0"), - gasLimit: EBN.from("0x47b760"), - gasUsed: EBN.from("0x0"), - timestamp: EBN.from("0x58ee40ba"), - extraData: - "0x52657370656374206d7920617574686f7269746168207e452e436172746d616e42eb768f2244c8811c63729a21a3569731535f067ffc57839b00206d1ad20c69a1981b489f772031b279182d99e65703f0076e4812653aab85fca0f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - mixHash: ethers.constants.HashZero, - nonce: EBN.from("0x0"), - baseFeePerGas: 0, - withdrawalsRoot: ethers.constants.HashZero, - }; - - const headerComputed = await libBlockHeader.hashBlockHeader( - blockHeader - ); - - expect(headerComputed).to.equal(blockHash); - }); - - it("can calculate EIP-1559", async function () { - const blockHash = - "0xb39b05b327d23ca29286fa7e2331d8269cd257cf10a8310b40ebaddf411f191e"; - // block 0xb39b05b327d23ca29286fa7e2331d8269cd257cf10a8310b40ebaddf411f191e on our L1 testnet - - const parentHash = - "0xaafe1871246cecd3ff9b0025f731f227bad9f63525f46e83a6f140b5bd6bca00"; - - const l2BlockHeader: any = { - parentHash: parentHash, - ommersHash: - "0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347", - beneficiary: ethers.constants.AddressZero, - stateRoot: - "0x68a10652e4fc8882bef0ff34ffad17e881cf5eb373dc216d5764b55880df4372", - transactionsRoot: - "0x916f8cf89455136b6f8d091dc95ecc601b1956a936636aa38ec164a1dad15072", - receiptsRoot: - "0x7c82f5a7cc81af5227f325c42cf4cd742ff27da40109962be91903d702625273", - logsBloom: - "00400008000000000000000000000000000000000000000000000010000000000000000000000000000000040000000000000000000000010000000000200100008000000000000000100008002100200000000080200000000400000000000000000000100000000800000000080000000000000000000000000010000104004000000200000000000000000002000000000000000000000000000040000000020000000000000200000000000000000000000000000000418000000000008000000002800000100000000000000000000000400000100000000000000000000010000000004000000000000000000000000000000000000000000000000000" - .match(/.{1,64}/g)! - .map((s) => "0x" + s), - difficulty: EBN.from("0x2"), - height: EBN.from("0x86"), - gasLimit: EBN.from("0xade80c"), - gasUsed: EBN.from("0x430a3"), - timestamp: EBN.from("0x63637091"), - extraData: - "0xd883010b00846765746888676f312e31382e37856c696e757800000000000000497f0b2bfaa230713df47bc5340b8e325171c8e9d1aeb9b26c930b1ce5013b9955046e7a8af532b38a7344a152c5ac816e115ff8c8d65306cfe784154a221ed600", - mixHash: - "0x0000000000000000000000000000000000000000000000000000000000000000", - nonce: "0x0", - baseFeePerGas: EBN.from("0x37"), - withdrawalsRoot: ethers.constants.HashZero, - }; - - const headerComputed = await libBlockHeader.hashBlockHeader( - l2BlockHeader - ); - console.debug("headerComputed:", headerComputed); - - expect(headerComputed).to.equal(blockHash); - }); - - it("can hash post Shanghai fork blocks", async function () { - const blockHash = - "0x0fb703aea6875ca7e78a73552064cf96a0985879c3b1fa27c846d41b1aa4e98e"; - // block 0x0fb703aea6875ca7e78a73552064cf96a0985879c3b1fa27c846d41b1aa4e98e on Sepolia. - - const parentHash = - "0xe122a2cc28199703e3ed6bee61875dc1703aa97c3187d8df507f1f789e363977"; - - const l2BlockHeader: any = { - parentHash: parentHash, - ommersHash: - "0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347", - beneficiary: "0x3826539cbd8d68dcf119e80b994557b4278cec9f", - stateRoot: - "0x2525478f8cd349640e6d1780334e63c56fa0bfb44d89fbd75cb3fcf82d38521c", - transactionsRoot: - "0x97ea65e77b43073c372976694916209b916caa0caef1445d53e9757b9824bdef", - receiptsRoot: - "0xa8b034a217a5d4d4615ee0ed28c4d5275b93888c01c65a98fcdd1aeda6903e1c", - logsBloom: - "00000004000000000000000000100000000100000010001000000000000000000000880000000000000400001100000000000000000000000000000010300000000000000000000000000008000000000000200000000000000000008080000000002000020040000200000400000900000000000000000010000014000000000020024008000000000800000000900000211001000040002000000000000810021000000040400000102000000000040400002000000000000008000000001000008002300000000000000020000008004000000001000110000001000028000014440800010000000000000000000004210000000000400000000000000000" - .match(/.{1,64}/g)! - .map((s) => "0x" + s), - difficulty: EBN.from("0x0"), - height: EBN.from("0x2e93c3"), - gasLimit: EBN.from("0x1c9c380"), - gasUsed: EBN.from("0x44dd61"), - timestamp: EBN.from("0x64097a78"), - extraData: "0x", - mixHash: - "0xa3fedc5083947ffb01157d6a89aa00f0592e14b94da8768ac0e6ded0aa490eb8", - nonce: "0x0000000000000000", - baseFeePerGas: EBN.from("0x7"), - withdrawalsRoot: - "0x0975bba9482fab7591735f9dc8c344078d27abac007086d5dd62ee3a21e3ed29", - }; - - const headerComputed = await libBlockHeader.hashBlockHeader( - l2BlockHeader - ); - console.debug("headerComputed:", headerComputed); - - expect(headerComputed).to.equal(blockHash); - }); -}); diff --git a/packages/protocol/test/libs/LibTrieProof.test.ts b/packages/protocol/test/libs/LibTrieProof.test.ts deleted file mode 100644 index c63e56755ec..00000000000 --- a/packages/protocol/test/libs/LibTrieProof.test.ts +++ /dev/null @@ -1,153 +0,0 @@ -import { expect } from "chai"; -import { ethers } from "hardhat"; -import RLP from "rlp"; -import { sendMessage } from "../utils/bridge"; -import { Message } from "../utils/message"; -import { EthGetProofResponse } from "../utils/rpc"; -import { deploySignalService } from "../utils/signal"; - -// TODO(roger): this test shall not use any file in contracts/bridge/*.sol -// Instead, it should use the `writeStorageAt` function to manipulate storage -// values then verify the proof. -describe("integration:LibTrieProof", function () { - async function deployLibTrieProofFixture() { - const libTrieProof = await ( - await ethers.getContractFactory("LibTrieProof") - ).deploy(); - - const testLibTrieProof = await ( - await ethers.getContractFactory("TestLibTrieProof", { - libraries: { - LibTrieProof: libTrieProof.address, - }, - }) - ).deploy(); - - const addressManager = await ( - await ethers.getContractFactory("AddressManager") - ).deploy(); - await addressManager.init(); - - const { chainId } = await ethers.provider.getNetwork(); - - const enabledDestChainId = chainId + 1; - - await addressManager.setAddress( - chainId, - `ether_vault`, - "0xEA3dD11036f668F08940E13e3bcB097C93b09E07" - ); - - await addressManager.setAddress( - enabledDestChainId, - `bridge`, - "0x0000000000000000000000000000000000000001" // dummy address so chain is "enabled" - ); - - const [owner] = await ethers.getSigners(); - - const { signalService } = await deploySignalService( - owner, - addressManager, - chainId - ); - - const BridgeFactory = await ethers.getContractFactory("TestBridge", { - libraries: { - LibTrieProof: testLibTrieProof.address, - }, - }); - - const bridge = await BridgeFactory.deploy(); - - await bridge.init(addressManager.address); - - return { - owner, - testLibTrieProof, - signalService, - bridge, - enabledDestChainId, - }; - } - describe("verify()", function () { - it("verifies", async function () { - const { - owner, - testLibTrieProof, - signalService, - bridge, - enabledDestChainId, - } = await deployLibTrieProofFixture(); - - const { chainId } = await ethers.provider.getNetwork(); - const srcChainId = chainId; - - const message: Message = { - id: 1, - sender: owner.address, - srcChainId: srcChainId, - destChainId: enabledDestChainId, - owner: owner.address, - to: owner.address, - refundAddress: owner.address, - depositValue: 1000, - callValue: 1000, - processingFee: 1000, - gasLimit: 10000, - data: ethers.constants.HashZero, - memo: "", - }; - - const { tx, msgHash } = await sendMessage(bridge, message); - - await tx.wait(); - - expect(msgHash).not.to.be.eq(ethers.constants.HashZero); - - const messageStatus = await bridge.getMessageStatus(msgHash); - - expect(messageStatus).to.be.eq(0); - - const slot = await signalService.getSignalSlot( - bridge.address, - msgHash - ); - - // use this instead of ethers.provider.getBlock() because it doesnt have stateRoot - // in the response - const block: { - stateRoot: string; - number: string; - hash: string; - } = await ethers.provider.send("eth_getBlockByNumber", [ - "latest", - false, - ]); - - // get storageValue for the slot - const storageValue = await ethers.provider.getStorageAt( - signalService.address, - slot, - block.number - ); - // make sure it equals 1 so our proof will pass - expect(storageValue).to.be.eq( - "0x0000000000000000000000000000000000000000000000000000000000000001" - ); - // rpc call to get the merkle proof what value is at slot on the bridge contract - const proof: EthGetProofResponse = await ethers.provider.send( - "eth_getProof", - [signalService.address, [slot], block.hash] - ); - - // proof verifies the storageValue at slot is 1 - await testLibTrieProof.verify( - slot, - "0x0000000000000000000000000000000000000000000000000000000000000001", - RLP.encode(proof.storageProof[0].proof), - proof.storageHash - ); - }); - }); -}); diff --git a/packages/protocol/test/signal/SignalService.integration.test.ts b/packages/protocol/test/signal/SignalService.integration.test.ts deleted file mode 100644 index 318de05493b..00000000000 --- a/packages/protocol/test/signal/SignalService.integration.test.ts +++ /dev/null @@ -1,241 +0,0 @@ -import { expect } from "chai"; -import { ethers } from "hardhat"; -import { TestXchainSync } from "../../typechain"; -import { deploySignalService, getSignalProof } from "../utils/signal"; -import deployAddressManager from "../utils/addressManager"; -import { getBlockHeader } from "../utils/rpc"; -import { - getDefaultL2Signer, - getL1Provider, - getL2Provider, -} from "../utils/provider"; - -describe("integration:SignalService", function () { - async function deployIntegrationSignalService() { - const [owner] = await ethers.getSigners(); - - const { chainId: srcChainId } = await ethers.provider.getNetwork(); - - // ethereum node - const l1Provider = await getL1Provider(); - - // hardhat node - const l2Provider = await getL2Provider(); - - const l1Signer = await ethers.provider.getSigner(); - - const l2Signer = await getDefaultL2Signer(); - - const l2Network = await l2Provider.getNetwork(); - const enabledDestChainId = l2Network.chainId; - - const addressManager = await deployAddressManager(l1Signer); - const l2AddressManager = await deployAddressManager(l2Signer); - - const { signalService: l1SignalService } = await deploySignalService( - owner, - addressManager, - srcChainId - ); - - const { signalService: l2SignalService } = await deploySignalService( - l2Signer, - l2AddressManager, - enabledDestChainId - ); - - await addressManager.setAddress( - enabledDestChainId, - `signal_service`, - l2SignalService.address - ); - - await l2AddressManager.setAddress( - srcChainId, - `signal_service`, - l1SignalService.address - ); - - const xchainSync: TestXchainSync = await ( - await ethers.getContractFactory("TestXchainSync") - ) - .connect(l2Signer) - .deploy(); - - await l2AddressManager.setAddress( - enabledDestChainId, - `taiko`, - xchainSync.address - ); - - return { - l1Provider, - owner, - l1SignalService, - l2SignalService, - srcChainId, - enabledDestChainId, - xchainSync, - }; - } - - it("should revert if srcChainId == block.chainId", async function () { - const { - l1Provider, - owner, - l1SignalService, - l2SignalService, - enabledDestChainId, - xchainSync, - } = await deployIntegrationSignalService(); - - const signal = ethers.utils.hexlify(ethers.utils.randomBytes(32)); - - const tx = await l1SignalService.connect(owner).sendSignal(signal); - await tx.wait(); - - const app = owner.address; - const slot = await l1SignalService.getSignalSlot(app, signal); - - const { block, blockHeader } = await getBlockHeader(l1Provider); - await xchainSync.setXchainBlockHeader(block.hash); - - const signalProof = await getSignalProof( - l1Provider, - l1SignalService.address, - slot, - block.number, - blockHeader - ); - - await expect( - l2SignalService.isSignalReceived( - enabledDestChainId, - app, - signal, - signalProof.signalProof - ) - ).to.be.revertedWith("B_WRONG_CHAIN_ID()"); - }); - - it("should revert if app == AddressZero", async function () { - const { - l1Provider, - owner, - l1SignalService, - l2SignalService, - srcChainId, - xchainSync, - } = await deployIntegrationSignalService(); - - const signal = ethers.utils.hexlify(ethers.utils.randomBytes(32)); - - const tx = await l1SignalService.connect(owner).sendSignal(signal); - await tx.wait(); - - const app = ethers.constants.AddressZero; - const slot = await l1SignalService.getSignalSlot(app, signal); - - const { block, blockHeader } = await getBlockHeader(l1Provider); - await xchainSync.setXchainBlockHeader(block.hash); - - const signalProof = await getSignalProof( - l1Provider, - l1SignalService.address, - slot, - block.number, - blockHeader - ); - - await expect( - l2SignalService.isSignalReceived( - srcChainId, - app, - signal, - signalProof.signalProof - ) - ).to.be.revertedWith("B_NULL_APP_ADDR()"); - }); - - it("should revert if signal == HashZero", async function () { - const { - l1Provider, - owner, - l1SignalService, - l2SignalService, - srcChainId, - xchainSync, - } = await deployIntegrationSignalService(); - - const signal = ethers.utils.hexlify(ethers.utils.randomBytes(32)); - - const tx = await l1SignalService.connect(owner).sendSignal(signal); - await tx.wait(); - - const app = owner.address; - const slot = await l1SignalService.getSignalSlot(app, signal); - - const { block, blockHeader } = await getBlockHeader(l1Provider); - await xchainSync.setXchainBlockHeader(block.hash); - - const signalProof = await getSignalProof( - l1Provider, - l1SignalService.address, - slot, - block.number, - blockHeader - ); - - await expect( - l2SignalService.isSignalReceived( - srcChainId, - app, - ethers.constants.HashZero, - signalProof.signalProof - ) - ).to.be.revertedWith("B_ZERO_SIGNAL()"); - }); - - it.only("should pass and return true", async function () { - const { - l1Provider, - owner, - l1SignalService, - l2SignalService, - srcChainId, - xchainSync, - } = await deployIntegrationSignalService(); - - const signal = ethers.utils.hexlify(ethers.utils.randomBytes(32)); - - const tx = await l1SignalService.connect(owner).sendSignal(signal); - await tx.wait(); - - const app = owner.address; - const slot = await l1SignalService.getSignalSlot(app, signal); - - const { block, blockHeader } = await getBlockHeader(l1Provider); - - console.log(blockHeader); - await xchainSync.setXchainBlockHeader(block.hash); - - const { signalProof, signalRoot } = await getSignalProof( - l1Provider, - l1SignalService.address, - slot, - block.number, - blockHeader - ); - - await xchainSync.setXchainSignalRoot(signalRoot); - - expect( - await l2SignalService.isSignalReceived( - srcChainId, - app, - signal, - signalProof - ) - ).to.be.true; - }); -}); diff --git a/packages/protocol/test/signal/SignalService.test.ts b/packages/protocol/test/signal/SignalService.test.ts deleted file mode 100644 index 2c26fad6fb5..00000000000 --- a/packages/protocol/test/signal/SignalService.test.ts +++ /dev/null @@ -1,72 +0,0 @@ -import { expect } from "chai"; -import { ethers } from "hardhat"; -import { AddressManager, SignalService } from "../../typechain"; -import { deploySignalService } from "../utils/signal"; -import deployAddressManager from "../utils/addressManager"; -// import {getBlockHeader } from "../utils/rpc"; - -// TODO(roger): convert to integration tests and add a test case for isSignalReceived. -describe("SignalService", function () { - let owner: any; - let addr1: any; - let addr2: any; - let signalService: SignalService; - - before(async () => { - [owner, addr1, addr2] = await ethers.getSigners(); - const { chainId } = await ethers.provider.getNetwork(); - - const addressManager: AddressManager = await deployAddressManager( - owner - ); - - ({ signalService } = await deploySignalService( - owner, - addressManager, - chainId - )); - }); - - describe("getSignalSlot()", function () { - it("should return different slots for same signal from different apps", async () => { - const signal = ethers.utils.keccak256( - ethers.utils.toUtf8Bytes("a random") - ); - const slot1 = await signalService.getSignalSlot( - addr1.address, - signal - ); - const slot2 = signalService.getSignalSlot(addr2.address, signal); - - await expect(slot1).to.be.not.equal(slot2); - }); - it("should return expected slot", async () => { - const want = - "0x9b11525774df15071344c44c56f02418dd56a9050effcc5de3912e88ccf1b95d"; - - const slot = await signalService.getSignalSlot( - "0x2aB7C0ab9AB47fcF370d13058BfEE28f2Ec0940c", - "0xf697cc0b80c778b40a4e863d2d2a723cc707bcdf2ba463bb1cd28aa2c888b229" - ); - - await expect(slot).to.be.equal(want); - }); - }); - - describe("isSignalSent()", function () { - it("should return false for unsent signal and true for sent signal", async () => { - const signal = ethers.utils.keccak256( - ethers.utils.toUtf8Bytes("another random") - ); - let isSent = await signalService.isSignalSent( - addr1.address, - signal - ); - await expect(isSent).to.be.equal(false); - - await signalService.connect(addr1).sendSignal(signal); - isSent = await signalService.isSignalSent(addr1.address, signal); - await expect(isSent).to.be.equal(true); - }); - }); -}); diff --git a/packages/protocol/test/test_integration.sh b/packages/protocol/test/test_integration.sh deleted file mode 100755 index 85cd8840c0e..00000000000 --- a/packages/protocol/test/test_integration.sh +++ /dev/null @@ -1,92 +0,0 @@ -#!/bin/bash - -set -eou pipefail - -DIR=$(cd $(dirname ${BASH_SOURCE[0]}); pwd) -TEST_NODE_CONTAINER_NAME_L1="test-ethereum-node-l1" -TEST_NODE_CONTAINER_NAME_L2="test-ethereum-node-l2" -TEST_IMPORT_TEST_ACCOUNT_ETH_JOB_NAME="import-test-account-eth" -TEST_ACCOUNT_ADDRESS="0xdf08f82de32b8d460adbe8d72043e3a7e25a3b39" -TEST_ACCOUNT_PRIV_KEY="2bdd21761a483f71054e14f5b827213567971c676928d9a1808cbfa4b7501200" -GETH_NODE_KEY_L1="14d2deec982957c89c56e1dc768a1d47c40398376ed2ba7e2df51eb029e71a83" -GETH_NODE_KEY_L2="141ca39f5c00141ed7f065f5a5c9c9177fdbbe496b9bfc3e3dc7233802dc366c" - -if ! command -v docker &> /dev/null 2>&1; then - echo "ERROR: `docker` command not found" - exit 1 -fi - -if ! docker info > /dev/null 2>&1; then - echo "ERROR: docker daemon isn't running" - exit 1 -fi - -docker rm --force $TEST_NODE_CONTAINER_NAME_L1 \ - $TEST_NODE_CONTAINER_NAME_L2 \ - $TEST_IMPORT_TEST_ACCOUNT_ETH_JOB_NAME &> /dev/null - -# Start a test ethereum node -docker run -d \ - --name $TEST_NODE_CONTAINER_NAME_L1 \ - -p 18545:8545 \ - -e CHAIN_ID="1336" -e PERIOD="0" -e NODE_KEY=$GETH_NODE_KEY_L1 \ - gcr.io/evmchain/clique-geth:latest - -if [[ $TEST_TYPE = "integrationbridge" ]] -then - docker run -d \ - --name $TEST_NODE_CONTAINER_NAME_L2 \ - -p 28545:8545 \ - -e CHAIN_ID="1337" -e PERIOD="0" -e NODE_KEY=$GETH_NODE_KEY_L2 \ - gcr.io/evmchain/clique-geth:latest -else - docker run -d \ - --name $TEST_NODE_CONTAINER_NAME_L2 \ - -p 28545:8545 \ - gcr.io/evmchain/hardhat-node:latest \ - hardhat node --hostname "0.0.0.0" -fi - -function waitTestNode { - echo "Waiting for test node: $1" - # Wait till the test node fully started - RETRIES=120 - i=0 - until curl \ - --silent \ - --fail \ - --noproxy localhost \ - -X POST \ - -H "Content-Type: application/json" \ - -d '{"jsonrpc":"2.0","id":0,"method":"eth_chainId","params":[]}' \ - $1 - do - sleep 1 - if [ $i -eq $RETRIES ]; then - echo 'Timed out waiting for test node' - exit 1 - fi - ((i=i+1)) - done -} - -waitTestNode http://localhost:18545 -waitTestNode http://localhost:28545 - -docker run -d \ - --name $TEST_IMPORT_TEST_ACCOUNT_ETH_JOB_NAME \ - --add-host host.docker.internal:host-gateway \ - ethereum/client-go:latest \ - --exec 'eth.sendTransaction({from: eth.coinbase, to: "'0xdf08f82de32b8d460adbe8d72043e3a7e25a3b39'", value: web3.toWei(1024, "'ether'")})' attach http://host.docker.internal:18545 - -function cleanup { - docker rm --force $TEST_NODE_CONTAINER_NAME_L1 \ - $TEST_NODE_CONTAINER_NAME_L2 \ - $TEST_IMPORT_TEST_ACCOUNT_ETH_JOB_NAME &> /dev/null -} - -trap cleanup EXIT INT KILL ERR - -# Run the tests -PRIVATE_KEY=$TEST_ACCOUNT_PRIV_KEY \ - npx hardhat test --network l1_test --grep "^$TEST_TYPE:" diff --git a/packages/protocol/test/thirdparty/AddressManager.test.ts b/packages/protocol/test/thirdparty/AddressManager.test.ts deleted file mode 100644 index b89759e3d2d..00000000000 --- a/packages/protocol/test/thirdparty/AddressManager.test.ts +++ /dev/null @@ -1,48 +0,0 @@ -import { expect } from "chai"; -import { AddressManager } from "../../typechain"; -import { ethers } from "hardhat"; -import deployAddressManager from "../utils/addressManager"; - -describe("AddressManager", function () { - let owner: any; - let nonOwner: any; - let addressManager: AddressManager; - - before(async function () { - [owner, nonOwner] = await ethers.getSigners(); - }); - - beforeEach(async function () { - addressManager = await deployAddressManager(owner); - }); - - describe("setAddress()", async () => { - it("throws when non-owner calls", async () => { - const name = "fakename"; - await expect( - addressManager - .connect(nonOwner) - .setAddress(name, nonOwner.address) - ).to.be.revertedWith(""); - }); - - it("emits setAddress event", async () => { - const name = "fakename"; - await expect( - addressManager.connect(owner).setAddress(name, nonOwner.address) - ) - .to.emit(addressManager, "AddressSet") - .withArgs(name, nonOwner.address, ethers.constants.AddressZero); - - await expect( - addressManager.connect(owner).setAddress(name, owner.address) - ) - .to.emit(addressManager, "AddressSet") - .withArgs(name, owner.address, nonOwner.address); - - expect(await addressManager.getAddress(name)).to.be.eq( - owner.address - ); - }); - }); -}); diff --git a/packages/protocol/test/thirdparty/LibMerkleTrie.test.ts b/packages/protocol/test/thirdparty/LibMerkleTrie.test.ts deleted file mode 100644 index c24dead2cbb..00000000000 --- a/packages/protocol/test/thirdparty/LibMerkleTrie.test.ts +++ /dev/null @@ -1,74 +0,0 @@ -import { expect } from "chai"; -import { ethers } from "hardhat"; -import { BaseTrie } from "merkle-patricia-tree"; -import { TestLibMerkleTrie } from "../../typechain"; -import { MerkleTrie } from "../utils/trie"; -import { randomBytes } from "crypto"; - -describe("LibMerkleTrie", function () { - let libMerkleTrie: TestLibMerkleTrie; - let defaultMerkleTrie: MerkleTrie; - const defaultAmountOfNodes = 32; - const defaultNodeLength = 32; - - beforeEach(async function () { - libMerkleTrie = await ( - await ethers.getContractFactory("TestLibMerkleTrie") - ).deploy(); - - defaultMerkleTrie = new MerkleTrie( - defaultAmountOfNodes, - defaultNodeLength, - () => new BaseTrie() - ); - await defaultMerkleTrie.init(); - }); - - describe("verifyInclusionProof()", () => { - it(`is included, ${defaultAmountOfNodes} bytes, ${defaultNodeLength} node length`, async () => { - for (const n of defaultMerkleTrie.nodes) { - const key = n.key; - const t = await defaultMerkleTrie.makeTest(key); - const isIncluded = await libMerkleTrie.verifyInclusionProof( - key, - t.node.value, - t.proof.proof, - t.root.root - ); - expect(isIncluded).to.be.true; - } - }); - }); - - describe("get()", () => { - it(`is included`, async () => { - const key = defaultMerkleTrie.nodes[0].key; - const t = await defaultMerkleTrie.makeTest(key); - const isIncluded = await libMerkleTrie.get( - key, - t.proof.proof, - t.root.root - ); - - expect(isIncluded[0]).to.be.true; - expect(isIncluded[1]).to.be.eq( - ethers.utils.hexlify(defaultMerkleTrie.nodes[0].value) - ); - }); - it(`is not included`, async () => { - const t = await defaultMerkleTrie.makeTest( - defaultMerkleTrie.nodes[0].key - ); - - const key = randomBytes(defaultNodeLength); - const isIncluded = await libMerkleTrie.get( - key, - t.proof.proof, - t.root.root - ); - - expect(isIncluded[0]).to.be.false; - expect(isIncluded[1]).to.be.eq("0x"); - }); - }); -}); diff --git a/packages/protocol/test/thirdparty/LibSecureMerkleTrie.test.ts b/packages/protocol/test/thirdparty/LibSecureMerkleTrie.test.ts deleted file mode 100644 index 80b1e1671ee..00000000000 --- a/packages/protocol/test/thirdparty/LibSecureMerkleTrie.test.ts +++ /dev/null @@ -1,74 +0,0 @@ -import { expect } from "chai"; -import { randomBytes } from "crypto"; -import { ethers } from "hardhat"; -import { SecureTrie } from "merkle-patricia-tree"; -import { TestLibSecureMerkleTrie } from "../../typechain"; -import { MerkleTrie } from "../utils/trie"; - -describe("LibSecureMerkleTrie", function () { - let libSecureMerkleTrie: TestLibSecureMerkleTrie; - let defaultSecureMerkleTrie: MerkleTrie; - const defaultAmountOfNodes = 32; - const defaultNodeLength = 32; - - beforeEach(async function () { - libSecureMerkleTrie = await ( - await ethers.getContractFactory("TestLibSecureMerkleTrie") - ).deploy(); - - defaultSecureMerkleTrie = new MerkleTrie( - defaultAmountOfNodes, - defaultNodeLength, - () => new SecureTrie() - ); - await defaultSecureMerkleTrie.init(); - }); - - describe("verifyInclusionProof()", () => { - it(`is included, ${defaultAmountOfNodes} bytes, ${defaultNodeLength} node length`, async () => { - const n = defaultSecureMerkleTrie.nodes[0]; - const key = n.key; - const t = await defaultSecureMerkleTrie.makeTest(key); - const isIncluded = await libSecureMerkleTrie.verifyInclusionProof( - key, - t.node.value, - t.proof.proof, - t.root.root - ); - expect(isIncluded).to.be.true; - }); - }); - - describe("get()", () => { - it(`is included`, async () => { - const key = defaultSecureMerkleTrie.nodes[0].key; - const t = await defaultSecureMerkleTrie.makeTest(key); - const isIncluded = await libSecureMerkleTrie.get( - key, - t.proof.proof, - t.root.root - ); - - expect(isIncluded[0]).to.be.true; - expect(isIncluded[1]).to.be.eq( - ethers.utils.hexlify(defaultSecureMerkleTrie.nodes[0].value) - ); - }); - - it(`is not included`, async () => { - const t = await defaultSecureMerkleTrie.makeTest( - defaultSecureMerkleTrie.nodes[0].key - ); - - const key = randomBytes(defaultNodeLength); - const isIncluded = await libSecureMerkleTrie.get( - key, - t.proof.proof, - t.root.root - ); - - expect(isIncluded[0]).to.be.false; - expect(isIncluded[1]).to.be.eq("0x"); - }); - }); -}); diff --git a/packages/protocol/test/tokenomics/blockFee.test.ts b/packages/protocol/test/tokenomics/blockFee.test.ts deleted file mode 100644 index 602d97d5971..00000000000 --- a/packages/protocol/test/tokenomics/blockFee.test.ts +++ /dev/null @@ -1,110 +0,0 @@ -import { expect } from "chai"; -import { SimpleChannel } from "channel-ts"; -import { BigNumber, ethers } from "ethers"; -import { AddressManager, TaikoL1 } from "../../typechain"; -import { TestTaikoToken } from "../../typechain/TestTaikoToken"; -import blockListener from "../utils/blockListener"; -import { onNewL2Block } from "../utils/onNewL2Block"; -import Proposer from "../utils/proposer"; - -import { initIntegrationFixture } from "../utils/fixture"; -import sleep from "../utils/sleep"; -import { deployTaikoL1 } from "../utils/taikoL1"; - -describe("tokenomics: blockFee", function () { - let taikoL1: TaikoL1; - let l2Provider: ethers.providers.JsonRpcProvider; - let proposerSigner: any; - let genesisHeight: number; - let genesisHash: string; - let taikoTokenL1: TestTaikoToken; - let l1AddressManager: AddressManager; - let interval: any; - let chan: SimpleChannel; - /* eslint-disable-next-line */ - let config: Awaited>; - let proposer: Proposer; - - beforeEach(async () => { - ({ - taikoL1, - l2Provider, - proposerSigner, - genesisHeight, - genesisHash, - taikoTokenL1, - l1AddressManager, - interval, - chan, - config, - proposer, - } = await initIntegrationFixture(true, true)); - }); - - afterEach(() => clearInterval(interval)); - - it("expects getBlockFee to return the initial basefee at time of contract deployment", async function () { - // deploy a new instance of TaikoL1 so no blocks have passed. - const tL1 = await deployTaikoL1(l1AddressManager, genesisHash, true); - const blockFee = await tL1.getBlockFee(); - expect(blockFee).to.be.eq(0); - }); - - it( - "proposes blocks on interval, proposer's balance for TkoToken should decrease as it pays proposer fee, " + - "proofReward should increase since more slots are used and " + - "no proofs have been submitted", - async function () { - // get the initial tkoBalance, which should decrease every block proposal - let lastProposerBalance = await taikoTokenL1.balanceOf( - await proposerSigner.getAddress() - ); - - let lastProofReward = BigNumber.from(0); - - // we want to wait for enough blocks until the blockFee is no longer 0, then run our - // tests. - while ((await taikoL1.getBlockFee()).eq(0)) { - await sleep(500); - } - - l2Provider.on("block", blockListener(chan, genesisHeight)); - /* eslint-disable-next-line */ - for await (const blockNumber of chan) { - if ( - blockNumber > - genesisHeight + (config.maxNumProposedBlocks.toNumber() - 1) - ) { - break; - } - const { newProposerBalance, newProofReward } = - await onNewL2Block( - l2Provider, - blockNumber, - proposer, - taikoL1, - proposerSigner, - taikoTokenL1 - ); - - // console.log("lastProposerBalance", lastProposerBalance); - // console.log("newProposerBalance", newProposerBalance); - - expect(newProposerBalance).to.be.lt(lastProposerBalance); - - // console.log("lastBlockFee", lastBlockFee); - // console.log("newBlockFee", newBlockFee); - - // expect(newBlockFee).to.be.gt(lastBlockFee); - - // console.log("lastProofReward", lastProofReward); - // console.log("newProofReward", newProofReward); - - expect(newProofReward).to.be.gt(lastProofReward); - - lastProofReward = newProofReward; - lastProposerBalance = newProposerBalance; - } - } - ); -}); diff --git a/packages/protocol/test/tokenomics/proofReward.test.ts b/packages/protocol/test/tokenomics/proofReward.test.ts deleted file mode 100644 index e8c6e6b2be3..00000000000 --- a/packages/protocol/test/tokenomics/proofReward.test.ts +++ /dev/null @@ -1,121 +0,0 @@ -import { expect } from "chai"; -import { SimpleChannel } from "channel-ts"; -import { ethers } from "ethers"; -import { TaikoL1 } from "../../typechain"; -import { TestTaikoToken } from "../../typechain/TestTaikoToken"; -import blockListener from "../utils/blockListener"; -import { initIntegrationFixture } from "../utils/fixture"; -import Proposer from "../utils/proposer"; -import Prover from "../utils/prover"; -import { seedTko } from "../utils/seed"; -import { proposeProveAndVerify } from "../utils/verify"; - -describe("tokenomics: proofReward", function () { - let taikoL1: TaikoL1; - let l2Provider: ethers.providers.JsonRpcProvider; - let l1Signer: any; - let genesisHeight: number; - let taikoTokenL1: TestTaikoToken; - let interval: any; - let chan: SimpleChannel; - let proposer: Proposer; - let prover: Prover; - - /* eslint-disable-next-line */ - let config: Awaited>; - - beforeEach(async () => { - ({ - taikoL1, - l2Provider, - l1Signer, - genesisHeight, - taikoTokenL1, - interval, - chan, - config, - proposer, - prover, - } = await initIntegrationFixture(true, true)); - }); - - afterEach(() => { - clearInterval(interval); - l2Provider.off("block"); - chan.close(); - }); - - it(`single prover, single proposer. - propose blocks, wait til maxNumProposedBlocks is filled. - proverReward should decline should increase as blocks are proved then verified. - the provers TKO balance should increase as the blocks are verified and - they receive the proofReward. - the proposer should receive a refund on his deposit because he holds a tkoBalance > 0 at time of verification.`, async function () { - // prover needs TKO or their reward will be cut down to 1 wei. - - await seedTko([prover], taikoTokenL1.connect(l1Signer)); - - l2Provider.on("block", blockListener(chan, genesisHeight)); - - /* eslint-disable-next-line */ - for await (const blockNumber of chan) { - if ( - blockNumber > - genesisHeight + (config.maxNumProposedBlocks.toNumber() - 1) - ) { - break; - } - const balanceBefore = await taikoTokenL1.balanceOf( - await prover.getSigner().address - ); - - const { provedEvent, proposedBlock, verifyEvent } = - await proposeProveAndVerify( - taikoL1, - l2Provider, - blockNumber, - proposer, - taikoTokenL1, - prover - ); - - expect(verifyEvent).not.to.be.undefined; - - const proofReward = await taikoL1.getProofReward( - provedEvent.args.provenAt, - proposedBlock.proposedAt - ); - - // proof reward can be 0. make sure there is a proof reward first - if (proofReward.gt(0)) { - const rewardBalance = await taikoL1.getTaikoTokenBalance( - await prover.getSigner().getAddress() - ); - - expect(rewardBalance.gt(0)).to.be.eq(true); - - // rewardBalance can be 1, and withdrawBalance only withdrawals is balance > 1. - // make sure we have a valid reward balance waiting to be withdrawn - // before comparing balances. - if (rewardBalance.gt(1)) { - let balanceAfter = await taikoTokenL1.balanceOf( - await prover.getSigner().address - ); - - expect(balanceAfter).to.be.eq(balanceBefore); - - const tx = await taikoL1 - .connect(prover.getSigner()) - .withdrawBalance(); - await tx.wait(); - - balanceAfter = await taikoTokenL1.balanceOf( - await prover.getSigner().address - ); - - expect(balanceAfter).to.be.gt(balanceBefore); - } - } - } - }); -}); diff --git a/packages/protocol/test/utils/addressManager.ts b/packages/protocol/test/utils/addressManager.ts deleted file mode 100644 index 0b0ad048c8a..00000000000 --- a/packages/protocol/test/utils/addressManager.ts +++ /dev/null @@ -1,15 +0,0 @@ -import { ethers } from "ethers"; -import { ethers as hardhatEthers } from "hardhat"; -import { AddressManager } from "../../typechain"; - -const deployAddressManager = async (signer: ethers.Signer) => { - const addressManager: AddressManager = await ( - await hardhatEthers.getContractFactory("AddressManager") - ) - .connect(signer) - .deploy(); - await (await addressManager.init()).wait(1); - return addressManager; -}; - -export default deployAddressManager; diff --git a/packages/protocol/test/utils/array.ts b/packages/protocol/test/utils/array.ts deleted file mode 100644 index 3455de9d2f8..00000000000 --- a/packages/protocol/test/utils/array.ts +++ /dev/null @@ -1,5 +0,0 @@ -function pickRandomElement(arr: T[]): T { - return arr[Math.floor(Math.random() * arr.length)]; -} - -export { pickRandomElement }; diff --git a/packages/protocol/test/utils/blockListener.ts b/packages/protocol/test/utils/blockListener.ts deleted file mode 100644 index a9937686320..00000000000 --- a/packages/protocol/test/utils/blockListener.ts +++ /dev/null @@ -1,34 +0,0 @@ -import type { SimpleChannel } from "channel-ts"; - -// blockListener should be called as follows: -// `l2Provider.on("block", blockListener(chan, genesisHeight)` -// it will send incoming blockNumbers, generated from the l2 provider on a new block, -// through a Golang-style channel, which can then be waited on like such: -// for await (const blockNumber of chan) -// so we can then run a propose, prove, and verify flow in our test cases -// in the main javascript event loop, instead of in the event handler of the l2Provider -// itself. - -const blockListener = function ( - chan: SimpleChannel, - genesisHeight: number -) { - let notFirstEvent = false; - - return function (blockNumber: number) { - if (blockNumber <= genesisHeight) return; - // Sometimes the first block number will be greater than start height, - // we need to fill the gap manually. - if (!notFirstEvent) { - if (blockNumber > genesisHeight) { - for (let i = genesisHeight + 1; i < blockNumber; i++) { - chan.send(i); - } - } - notFirstEvent = true; - } - chan.send(blockNumber); - }; -}; - -export default blockListener; diff --git a/packages/protocol/test/utils/block_metadata.ts b/packages/protocol/test/utils/block_metadata.ts deleted file mode 100644 index 9b1c20b06c0..00000000000 --- a/packages/protocol/test/utils/block_metadata.ts +++ /dev/null @@ -1,32 +0,0 @@ -import { BigNumber, BigNumberish } from "ethers"; - -type BlockMetadata = { - id: number; - l1Height: number; - l1Hash: string; - beneficiary: string; - txListHash: string; - mixHash: string; - extraData: string; - gasLimit: BigNumberish; - timestamp: number; -}; - -type ForkChoice = { - provenAt: BigNumber; - provers: string[]; - blockHash: string; -}; - -type BlockInfo = { - proposedAt: number; - provenAt: number; - id: number; - parentHash: string; - blockHash: string; - forkChoice: ForkChoice; - deposit: BigNumber; - proposer: string; -}; - -export { BlockMetadata, ForkChoice, BlockInfo }; diff --git a/packages/protocol/test/utils/bridge.ts b/packages/protocol/test/utils/bridge.ts deleted file mode 100644 index 21adafedf56..00000000000 --- a/packages/protocol/test/utils/bridge.ts +++ /dev/null @@ -1,158 +0,0 @@ -import { BigNumber, ethers, Signer } from "ethers"; -import { ethers as hardhatEthers } from "hardhat"; -import { - AddressManager, - Bridge, - SignalService, - EtherVault, - TestXchainSync, - LibTrieProof, -} from "../../typechain"; -import { MessageStatusChangedEvent } from "../../typechain/LibBridgeStatus"; -import { Message } from "./message"; -import { Block, BlockHeader, getBlockHeader } from "./rpc"; -import { getSignalProof } from "./signal"; - -async function deployBridge( - signer: Signer, - addressManager: AddressManager, - chainId: number -): Promise<{ bridge: Bridge; etherVault: EtherVault }> { - const libTrieProof: LibTrieProof = await ( - await hardhatEthers.getContractFactory("LibTrieProof") - ) - .connect(signer) - .deploy(); - - const BridgeFactory = await hardhatEthers.getContractFactory("TestBridge", { - libraries: { - LibTrieProof: libTrieProof.address, - }, - }); - - const bridge: Bridge = await BridgeFactory.connect(signer).deploy(); - - await bridge.connect(signer).init(addressManager.address); - - const etherVault: EtherVault = await ( - await hardhatEthers.getContractFactory("TestEtherVault") - ) - .connect(signer) - .deploy(); - - await etherVault.connect(signer).init(addressManager.address); - - await etherVault.connect(signer).authorize(bridge.address, true); - - await etherVault.connect(signer).authorize(await signer.getAddress(), true); - - await addressManager.setAddress(chainId, `ether_vault`, etherVault.address); - - await signer.sendTransaction({ - to: etherVault.address, - value: BigNumber.from(100000000), - gasLimit: 1000000, - }); - - await addressManager.setAddress(chainId, `bridge`, bridge.address); - - return { bridge, etherVault }; -} - -async function sendMessage( - bridge: Bridge, - m: Message -): Promise<{ - bridge: Bridge; - msgHash: string; - messageSentEvent: any; - message: Message; - tx: ethers.ContractTransaction; -}> { - const expectedAmount = m.depositValue + m.callValue + m.processingFee; - - m.refundAddress = "0x10020FCb72e27650651B05eD2CEcA493bC807Ba4"; - m.to = "0x200708D76eB1B69761c23821809d53F65049939e"; - m.gasLimit = 1000000; - const tx = await bridge.sendMessage(m, { - value: expectedAmount, - }); - - const receipt = await tx.wait(); - - const [messageSentEvent] = receipt.events as any as Event[]; - - const { msgHash, message } = (messageSentEvent as any).args; - - return { bridge, messageSentEvent, msgHash, message, tx }; -} - -// Process a L1-to-L1 message -async function processMessage( - l1SignalService: SignalService, - l1Bridge: Bridge, - l2Bridge: Bridge, - signal: string, - provider: ethers.providers.JsonRpcProvider, - xchainSync: TestXchainSync, - message: Message -): Promise<{ - tx: ethers.ContractTransaction; - signalProof: string; - block: Block; - blockHeader: BlockHeader; - messageStatusChangedEvent: MessageStatusChangedEvent; -}> { - const sender = l1Bridge.address; - - const slot = await l1SignalService.getSignalSlot(sender, signal); - - const { block, blockHeader } = await getBlockHeader(provider); - - await xchainSync.setXchainBlockHeader(block.hash); - - const { signalProof, signalRoot } = await getSignalProof( - provider, - l1SignalService.address, - slot, - block.number, - blockHeader - ); - - await xchainSync.setXchainSignalRoot(signalRoot); - - const tx = await l2Bridge.processMessage(message, signalProof); - const receipt = await tx.wait(1); - const messageStatusChangedEvent = (receipt.events || []).find( - (e) => e.event === "MessageStatusChanged" - ) as any as MessageStatusChangedEvent; - return { tx, signalProof, block, blockHeader, messageStatusChangedEvent }; -} - -async function sendAndProcessMessage( - provider: ethers.providers.JsonRpcProvider, - xchainSync: TestXchainSync, - m: Message, - l1SignalService: SignalService, - l1Bridge: Bridge, - l2Bridge: Bridge -): Promise<{ - tx: ethers.ContractTransaction; - message: Message; - msgHash: string; - signalProof: string; -}> { - const { msgHash, message } = await sendMessage(l1Bridge, m); - const { tx, signalProof } = await processMessage( - l1SignalService, - l1Bridge, - l2Bridge, - msgHash, - provider, - xchainSync, - message - ); - return { tx, msgHash, message, signalProof }; -} - -export { deployBridge, sendMessage, processMessage, sendAndProcessMessage }; diff --git a/packages/protocol/test/utils/bytes.ts b/packages/protocol/test/utils/bytes.ts deleted file mode 100644 index 50331a1d3a3..00000000000 --- a/packages/protocol/test/utils/bytes.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { ethers } from "hardhat"; - -function randomBytes32() { - return ethers.utils.hexlify(ethers.utils.randomBytes(32)); -} - -export { randomBytes32 }; diff --git a/packages/protocol/test/utils/commit.ts b/packages/protocol/test/utils/commit.ts deleted file mode 100644 index 796649e1659..00000000000 --- a/packages/protocol/test/utils/commit.ts +++ /dev/null @@ -1,26 +0,0 @@ -import { ethers } from "ethers"; -import { TaikoL1 } from "../../typechain"; -import { BlockProposedEvent } from "../../typechain/LibProposing"; -import { proposeBlock } from "./propose"; - -const proposeLatestBlock = async ( - taikoL1: TaikoL1, - l1Signer: any, - l2Provider: ethers.providers.JsonRpcProvider -) => { - const block = await l2Provider.getBlock("latest"); - - const proposeReceipt = await proposeBlock( - taikoL1.connect(l1Signer), - block, - block.gasLimit - ); - - const proposedEvent: BlockProposedEvent = ( - proposeReceipt.events as any[] - ).find((e) => e.event === "BlockProposed"); - - return { proposedEvent, proposeReceipt, block }; -}; - -export { proposeLatestBlock }; diff --git a/packages/protocol/test/utils/encoding.ts b/packages/protocol/test/utils/encoding.ts deleted file mode 100644 index e6dd68b6d44..00000000000 --- a/packages/protocol/test/utils/encoding.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { ethers } from "hardhat"; -import { BlockMetadata } from "./block_metadata"; -import Evidence from "./evidence"; - -function encodeBlockMetadata(meta: BlockMetadata) { - return ethers.utils.defaultAbiCoder.encode( - [ - "tuple(uint64 id,uint32 gasLimit,uint64 timestamp,uint64 l1Height,bytes32 l1Hash,bytes32 mixHash,bytes32 txListHash,uint24 txListByteStart,uint24 txListByteEnd,address beneficiary}", - ], - [meta] - ); -} - -function encodeEvidence(evidence: Evidence) { - return ethers.utils.defaultAbiCoder.encode( - [ - "tuple(tuple(uint64 id,uint32 gasLimit,uint64 timestamp,uint64 l1Height,bytes32 l1Hash,bytes32 mixHash,bytes32 txListHash,uint24 txListByteStart,uint24 txListByteEnd,address beneficiary) meta,tuple(bytes data,uint16 verifierId) zkproof,bytes32 parentHash,bytes32 blockHash,bytes32 signalRoot,address prover)", - ], - [evidence] - ); -} - -export { encodeBlockMetadata, encodeEvidence }; diff --git a/packages/protocol/test/utils/errors.ts b/packages/protocol/test/utils/errors.ts deleted file mode 100644 index 0640d7252f7..00000000000 --- a/packages/protocol/test/utils/errors.ts +++ /dev/null @@ -1,58 +0,0 @@ -import { ethers, utils } from "ethers"; -import { expect } from "chai"; - -async function txShouldRevertWithCustomError( - txPromise: Promise, - provider: ethers.providers.JsonRpcProvider, - customError: string -) { - try { - await txPromise; - expect.fail("Expected promise to throw but it didn't"); - } catch (tx) { - // console.log(tx) - const _tx = await provider.getTransaction( - (tx as { transactionHash: string }).transactionHash - ); - const code = await provider.call( - _tx as ethers.providers.TransactionRequest, - _tx.blockNumber - ); - - const expectedCode = utils - .keccak256(utils.toUtf8Bytes(customError)) - .substring(0, 10); - - if (code !== expectedCode) { - expect.fail( - `Error code mismatch: actual= - ${code} - expected= - ${expectedCode}` - ); - } - } -} - -async function readShouldRevertWithCustomError( - txPromise: Promise, - customError: string -) { - try { - await txPromise; - - expect.fail("Expected promise to throw but it didn't"); - } catch (result) { - const r = result as { errorSignature: string }; - if (r.errorSignature !== customError) { - expect.fail( - `Error code mismatch: actual= - ${r.errorSignature} - "expected=" - ${customError}` - ); - } - } -} - -export { txShouldRevertWithCustomError, readShouldRevertWithCustomError }; diff --git a/packages/protocol/test/utils/evidence.ts b/packages/protocol/test/utils/evidence.ts deleted file mode 100644 index 2bc68269da3..00000000000 --- a/packages/protocol/test/utils/evidence.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { BlockMetadata } from "./block_metadata"; -import { BlockHeader } from "./rpc"; - -type Evidence = { - meta: BlockMetadata; - header: BlockHeader; - prover: string; - proofs: string[]; - circuits: number[]; -}; - -export default Evidence; diff --git a/packages/protocol/test/utils/fixture.ts b/packages/protocol/test/utils/fixture.ts deleted file mode 100644 index ca57573fa75..00000000000 --- a/packages/protocol/test/utils/fixture.ts +++ /dev/null @@ -1,150 +0,0 @@ -import { SimpleChannel } from "channel-ts"; -import { ethers } from "ethers"; -import deployAddressManager from "./addressManager"; -import Proposer from "./proposer"; -import Prover from "./prover"; -import { - getDefaultL1Signer, - getDefaultL2Signer, - getL1Provider, - getL2Provider, -} from "./provider"; -import { createAndSeedWallets, sendTinyEtherToZeroAddress } from "./seed"; -import { defaultBasefee, deployTaikoL1 } from "./taikoL1"; -import { deployTaikoL2 } from "./taikoL2"; -import deployTaikoToken from "./taikoToken"; - -async function initIntegrationFixture(mintTkoToProposer: boolean) { - const l1Provider = getL1Provider(); - - l1Provider.pollingInterval = 100; - - const l1Signer = await getDefaultL1Signer(); - - const l2Provider = getL2Provider(); - - l2Provider.pollingInterval = 100; - - const l2Signer = await getDefaultL2Signer(); - - // When connecting to a geth node, we need to unlock the account manually, and - // we can safely ignore the unlock error when connecting to a hardhat node. - try { - await Promise.all([l1Signer.unlock(""), l2Signer.unlock("")]); - } catch (_) {} - - // const l2AddressManager = await deployAddressManager(l2Signer); - const taikoL2 = await deployTaikoL2( - l2Signer, - 5000000 // Note: need to explicitly set gasLimit here, otherwise the deployment transaction may fail. - ); - const taikoL2DeployReceipt = await taikoL2.deployTransaction.wait(); - - const genesisHash = taikoL2DeployReceipt.blockHash as string; - const genesisHeight = taikoL2DeployReceipt.blockNumber as number; - - const l1AddressManager = await deployAddressManager(l1Signer); - const taikoL1 = await deployTaikoL1( - l1AddressManager, - genesisHash, - defaultBasefee - ); - const { chainId } = await l1Provider.getNetwork(); - - const [proposerSigner, proverSigner] = await createAndSeedWallets( - 2, - l1Signer - ); - - const taikoTokenL1 = await deployTaikoToken( - l1Signer, - l1AddressManager, - taikoL1.address - ); - - await ( - await l1AddressManager.setAddress( - chainId, - `taiko_token`, - taikoTokenL1.address - ) - ).wait(1); - - const { chainId: l2ChainId } = await l2Provider.getNetwork(); - - await ( - await l1AddressManager.setAddress(l2ChainId, `taiko`, taikoL2.address) - ).wait(1); - - await ( - await l1AddressManager.setAddress( - chainId, - `proof_verifier`, - taikoL1.address - ) - ).wait(1); - - if (mintTkoToProposer) { - const mintTx = await taikoTokenL1 - .connect(l1Signer) - .mintAnyone( - await proposerSigner.getAddress(), - ethers.utils.parseEther("100") - ); - - await mintTx.wait(1); - } - - // send transactions to L1 so we always get new blocks - const interval = setInterval( - async () => await sendTinyEtherToZeroAddress(l1Signer), - 1 * 1000 - ); - - // send transactions to L2 so we always get new blocks (replaces evm_setAutomine?) - const interval2 = setInterval( - async () => await sendTinyEtherToZeroAddress(l2Signer), - 1 * 1000 - ); - - const tx = await l2Signer.sendTransaction({ - to: proverSigner.address, - value: ethers.utils.parseUnits("1", "ether"), - }); - await tx.wait(1); - - const chan = new SimpleChannel(); - const config = await taikoL1.getConfig(); - - const proposer = new Proposer( - taikoL1.connect(proposerSigner), - l2Provider, - config.maxNumProposedBlocks.toNumber(), - 0, - proposerSigner - ); - - const prover = new Prover(taikoL1, l2Provider, proverSigner); - return { - taikoL1, - taikoL2, - l1Provider, - l2Provider, - l1Signer, - l2Signer, - proposerSigner, - proverSigner, - genesisHeight, - genesisHash, - taikoTokenL1, - l1AddressManager, - interval, - interval2, - chan, - config, - proposer, - prover, - }; -} - -export { initIntegrationFixture }; diff --git a/packages/protocol/test/utils/message.ts b/packages/protocol/test/utils/message.ts deleted file mode 100644 index bf74fb99068..00000000000 --- a/packages/protocol/test/utils/message.ts +++ /dev/null @@ -1,31 +0,0 @@ -type Message = { - id: number; - sender: string; - srcChainId: number; - destChainId: number; - owner: string; - to: string; - refundAddress: string; - depositValue: number; - callValue: number; - processingFee: number; - gasLimit: number; - data: string; - memo: string; -}; - -const MessageStatus = { - NEW: 0, - RETRIABLE: 1, - DONE: 2, - FAILED: 3, -}; - -async function getMessageStatusSlot(hre: any, signal: any) { - return hre.ethers.utils.solidityKeccak256( - ["string", "bytes"], - ["MESSAGE_STATUS", signal] - ); -} - -export { Message, MessageStatus, getMessageStatusSlot }; diff --git a/packages/protocol/test/utils/onNewL2Block.ts b/packages/protocol/test/utils/onNewL2Block.ts deleted file mode 100644 index 386f728cf8f..00000000000 --- a/packages/protocol/test/utils/onNewL2Block.ts +++ /dev/null @@ -1,51 +0,0 @@ -import { BigNumber, ethers } from "ethers"; -import { TaikoL1, TaikoToken } from "../../typechain"; -import { BlockProposedEvent } from "../../typechain/LibProposing"; -import Proposer from "./proposer"; - -// onNewL2Block should be called from a tokenomics test case when a new block -// is generated from the l2Provider. -// It will propose the block to the TaikoL1 contract, -// and then return the latest fee information and the proposal event, -// which can then be asserted on depending on your test case. -async function onNewL2Block( - l2Provider: ethers.providers.JsonRpcProvider, - blockNumber: number, - proposer: Proposer, - taikoL1: TaikoL1, - proposerSigner: any, - taikoTokenL1: TaikoToken -): Promise<{ - proposedEvent: BlockProposedEvent; - newProposerBalance: BigNumber; - newBlockFee: BigNumber; - newProofReward: BigNumber; -}> { - // const config = await taikoL1.getConfig(); - - const block = await l2Provider.getBlock(blockNumber); - const { proposedEvent } = await proposer.proposeBlock(block); - const { id, meta } = proposedEvent.args; - - const newProofReward = await taikoL1.getProofReward( - new Date().getTime(), - meta.timestamp - ); - - const newProposerBalance = await taikoTokenL1.balanceOf( - await proposerSigner.getAddress() - ); - - const newBlockFee = await taikoL1.getBlockFee(); - - console.log("-------------------proposed----------", id); - - return { - proposedEvent, - newProposerBalance, - newBlockFee, - newProofReward, - }; -} - -export { onNewL2Block }; diff --git a/packages/protocol/test/utils/propose.ts b/packages/protocol/test/utils/propose.ts deleted file mode 100644 index 6de0f964739..00000000000 --- a/packages/protocol/test/utils/propose.ts +++ /dev/null @@ -1,44 +0,0 @@ -import { BigNumber, ethers } from "ethers"; -import RLP from "rlp"; -import { TaikoL1 } from "../../typechain"; -import { BlockMetadata } from "./block_metadata"; -import { encodeBlockMetadata } from "./encoding"; - -const buildProposeBlockInputs = ( - block: ethers.providers.Block, - meta: BlockMetadata -) => { - const inputs = []; - const blockMetadataBytes = encodeBlockMetadata(meta); - inputs[0] = blockMetadataBytes; - inputs[1] = RLP.encode(block.transactions); - return inputs; -}; - -const proposeBlock = async ( - taikoL1: TaikoL1, - block: ethers.providers.Block, - txListHash: string, - gasLimit: BigNumber, - beneficiary: string -) => { - const meta: BlockMetadata = { - id: 0, - l1Height: 0, - l1Hash: ethers.constants.HashZero, - beneficiary, - txListHash: txListHash, - mixHash: ethers.constants.HashZero, - extraData: ethers.utils.hexlify(ethers.utils.randomBytes(32)), - gasLimit: gasLimit, - timestamp: 0, - }; - - const inputs = buildProposeBlockInputs(block, meta); - - const tx = await taikoL1.proposeBlock(inputs, { gasLimit: 1000000 }); - const receipt = await tx.wait(1); - return receipt; -}; - -export { buildProposeBlockInputs, proposeBlock }; diff --git a/packages/protocol/test/utils/proposer.ts b/packages/protocol/test/utils/proposer.ts deleted file mode 100644 index fe89fe40429..00000000000 --- a/packages/protocol/test/utils/proposer.ts +++ /dev/null @@ -1,58 +0,0 @@ -import { ethers } from "ethers"; -import { TaikoL1 } from "../../typechain"; -import { BlockProposedEvent } from "../../typechain/LibProposing"; -import { proposeBlock } from "./propose"; -import sleep from "./sleep"; - -class Proposer { - private readonly taikoL1: TaikoL1; - private readonly l2Provider: ethers.providers.JsonRpcProvider; - private readonly maxNumProposedBlocks: number; - private signer: ethers.Wallet; - - private proposingMutex: boolean = false; - - constructor( - taikoL1: TaikoL1, - l2Provider: ethers.providers.JsonRpcProvider, - maxNumProposedBlocks: number, - signer: ethers.Wallet - ) { - this.taikoL1 = taikoL1; - this.l2Provider = l2Provider; - this.maxNumProposedBlocks = maxNumProposedBlocks; - this.signer = signer; - } - - getSigner() { - return this.signer; - } - - async proposeBlock(block?: ethers.providers.Block) { - try { - while (this.proposingMutex) { - await sleep(500); - } - this.proposingMutex = true; - if (!block) block = await this.l2Provider.getBlock("latest"); - - const receipt = await proposeBlock( - this.taikoL1, - block, - block.gasLimit - ); - - const proposedEvent: BlockProposedEvent = ( - receipt.events as any[] - ).find((e) => e.event === "BlockProposed"); - - this.proposingMutex = false; - - return { receipt, proposedEvent }; - } finally { - this.proposingMutex = false; - } - } -} - -export default Proposer; diff --git a/packages/protocol/test/utils/prove.ts b/packages/protocol/test/utils/prove.ts deleted file mode 100644 index 603922d5ec8..00000000000 --- a/packages/protocol/test/utils/prove.ts +++ /dev/null @@ -1,66 +0,0 @@ -import { ethers } from "ethers"; -import { TaikoL1 } from "../../typechain"; -import { BlockProvenEvent } from "../../typechain/LibProving"; -import { BlockMetadata } from "./block_metadata"; -import { encodeEvidence } from "./encoding"; -import Evidence from "./evidence"; -import { BlockHeader, getBlockHeader } from "./rpc"; - -const buildProveBlockInputs = ( - meta: BlockMetadata, - header: BlockHeader, - prover: string - // anchorTx: Uint8Array | string, - // anchorReceipt: Uint8Array | string -) => { - const inputs = []; - const evidence: Evidence = { - meta: meta, - header: header, - prover: prover, - proofs: [], - circuits: [], - }; - - // we have mkp + zkp returnign true in testing, so can just push 0xff - // instead of actually making proofs for anchor tx, anchor receipt, and - // zkp - for (let i = 0; i < 3; i++) { - evidence.proofs.push("0xff"); - } - - for (let i = 0; i < 1; i++) { - evidence.circuits.push(1); - } - - inputs[0] = encodeEvidence(evidence); - // inputs[1] = anchorTx; - // inputs[2] = anchorReceipt; - return inputs; -}; - -const proveBlock = async ( - taikoL1: TaikoL1, - l2Provider: ethers.providers.JsonRpcProvider, - proverAddress: string, - blockId: number, - blockNumber: number, - meta: BlockMetadata -): Promise => { - const header = await getBlockHeader(l2Provider, blockNumber); - const inputs = buildProveBlockInputs( - meta, - header.blockHeader, - proverAddress - // "0x", - // "0x" - ); - const tx = await taikoL1.proveBlock(blockId, inputs, { gasLimit: 1000000 }); - const receipt = await tx.wait(1); - const event: BlockProvenEvent = (receipt.events as any[]).find( - (e) => e.event === "BlockProven" - ); - return event; -}; - -export { buildProveBlockInputs, proveBlock }; diff --git a/packages/protocol/test/utils/prover.ts b/packages/protocol/test/utils/prover.ts deleted file mode 100644 index df1bed6b2da..00000000000 --- a/packages/protocol/test/utils/prover.ts +++ /dev/null @@ -1,59 +0,0 @@ -import { ethers } from "ethers"; -import { TaikoL1 } from "../../typechain"; -import { BlockProvenEvent } from "../../typechain/LibProving"; -import { BlockMetadata } from "./block_metadata"; -import { proveBlock } from "./prove"; -import sleep from "./sleep"; - -class Prover { - private readonly taikoL1: TaikoL1; - private readonly l2Provider: ethers.providers.JsonRpcProvider; - private provingMutex: boolean = false; - private readonly signer: ethers.Wallet; - - constructor( - taikoL1: TaikoL1, - l2Provider: ethers.providers.JsonRpcProvider, - signer: ethers.Wallet - ) { - this.taikoL1 = taikoL1; - this.l2Provider = l2Provider; - this.signer = signer; - } - - getSigner() { - return this.signer; - } - - async prove( - blockId: number, - blockNumber: number, - meta: BlockMetadata - ): Promise { - while (this.provingMutex) { - await sleep(100); - } - this.provingMutex = true; - - let blockProvenEvent: BlockProvenEvent; - try { - blockProvenEvent = await proveBlock( - this.taikoL1, - this.l2Provider, - await this.getSigner().getAddress(), - blockId, - blockNumber, - meta - ); - } catch (e) { - console.error("prove error", e); - throw e; - } finally { - this.provingMutex = false; - } - - return blockProvenEvent; - } -} - -export default Prover; diff --git a/packages/protocol/test/utils/provider.ts b/packages/protocol/test/utils/provider.ts deleted file mode 100644 index 11fc81a0c27..00000000000 --- a/packages/protocol/test/utils/provider.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { ethers } from "ethers"; -// providers for integration tests - -const getL1Provider = () => - new ethers.providers.JsonRpcProvider("http://localhost:18545"); - -const getL2Provider = () => - new ethers.providers.JsonRpcProvider("http://localhost:28545"); - -const getDefaultL1Signer = async () => - getL1Provider().getSigner((await getL1Provider().listAccounts())[0]); - -const getDefaultL2Signer = async () => - getL2Provider().getSigner((await getL2Provider().listAccounts())[0]); - -export { getL1Provider, getL2Provider, getDefaultL1Signer, getDefaultL2Signer }; diff --git a/packages/protocol/test/utils/rpc.ts b/packages/protocol/test/utils/rpc.ts deleted file mode 100644 index cdac87a5e6c..00000000000 --- a/packages/protocol/test/utils/rpc.ts +++ /dev/null @@ -1,108 +0,0 @@ -import { BigNumber, ethers } from "ethers"; - -type StorageEntry = { - key: string; - value: string; - proof: string[]; // Array of rlp-serialized MerkleTree-Nodes, starting with the storageHash-Node, -}; - -type EthGetProofResponse = { - balance: string; - codeHash: string; - nonce: string; - storageHash: string; - accountProof: string[]; // array of rlp-serialized merkle nodes beginning with stateRoot-node - storageProof: StorageEntry[]; -}; - -type Block = { - number: number; - hash: string; - parentHash: string; - nonce: number; - sha3Uncles: string; - logsBloom: string[]; - transactionsRoot: string; - stateRoot: string; - receiptsRoot: string; - miner: string; - difficulty: number; - totalDifficulty: number; - extraData: string; - size: number; - gasLimit: number; - gasUsed: number; - timestamp: number; - transactions: string[]; - uncles: string[]; - baseFeePerGas?: string; - mixHash: string; - withdrawalsRoot: string; -}; - -type BlockHeader = { - parentHash: string; - ommersHash: string; - beneficiary: string; - stateRoot: string; - transactionsRoot: string; - receiptsRoot: string; - logsBloom: string[]; - difficulty: number; - height: number; - gasLimit: number; - gasUsed: number; - timestamp: number; - extraData: string; - mixHash: string; - nonce: number; - baseFeePerGas: number; - withdrawalsRoot: string; -}; - -async function getBlockHeader( - provider: ethers.providers.JsonRpcProvider, - blockNumber?: number -) { - const b = await provider.getBlock( - blockNumber ? BigNumber.from(blockNumber).toHexString() : "latest" - ); - - const block: Block = await provider.send("eth_getBlockByHash", [ - b.hash, - false, - ]); - - const logsBloom = block.logsBloom.toString().substring(2); - - const blockHeader: BlockHeader = { - parentHash: block.parentHash, - ommersHash: block.sha3Uncles, - beneficiary: block.miner, - stateRoot: block.stateRoot, - transactionsRoot: block.transactionsRoot, - receiptsRoot: block.receiptsRoot, - logsBloom: logsBloom.match(/.{1,64}/g)!.map((s: string) => "0x" + s), - difficulty: block.difficulty, - height: block.number, - gasLimit: block.gasLimit, - gasUsed: block.gasUsed, - timestamp: block.timestamp, - extraData: block.extraData, - mixHash: block.mixHash, - nonce: block.nonce, - baseFeePerGas: block.baseFeePerGas ? parseInt(block.baseFeePerGas) : 0, - // set to zero for pre-shanghai L1 blocks used in the integration test node - withdrawalsRoot: ethers.constants.HashZero, - }; - - return { block, blockHeader }; -} - -export { - Block, - BlockHeader, - StorageEntry, - EthGetProofResponse, - getBlockHeader, -}; diff --git a/packages/protocol/test/utils/seed.ts b/packages/protocol/test/utils/seed.ts deleted file mode 100644 index 60663893cdd..00000000000 --- a/packages/protocol/test/utils/seed.ts +++ /dev/null @@ -1,49 +0,0 @@ -import { BigNumber, ethers } from "ethers"; -import { TestTaikoToken } from "../../typechain"; - -const createAndSeedWallets = async ( - len: number, - signer: any, - amount: BigNumber = ethers.utils.parseEther("1") -): Promise => { - const wallets: ethers.Wallet[] = []; - for (let i = 0; i < len; i++) { - const wallet = ethers.Wallet.createRandom({ - extraEntropy: ethers.utils.randomBytes(32), - }).connect(signer.provider); - const tx = await signer.sendTransaction({ - to: await wallet.getAddress(), - value: amount, - }); - - await tx.wait(1); - wallets.push(wallet); - } - - return wallets; -}; - -const sendTinyEtherToZeroAddress = async (signer: any) => { - const tx = await signer.sendTransaction({ - to: ethers.constants.AddressZero, - value: BigNumber.from(1), - }); - await tx.wait(1); -}; - -const seedTko = async ( - wallets: { getSigner: () => ethers.Wallet }[], - taikoToken: TestTaikoToken -) => { - for (const wallet of wallets) { - // prover needs TKO or their reward will be cut down to 1 wei. - await ( - await taikoToken.mintAnyone( - await wallet.getSigner().getAddress(), - ethers.utils.parseEther("100") - ) - ).wait(1); - } -}; - -export { createAndSeedWallets, sendTinyEtherToZeroAddress, seedTko }; diff --git a/packages/protocol/test/utils/signal.ts b/packages/protocol/test/utils/signal.ts deleted file mode 100644 index b96a5a05dd5..00000000000 --- a/packages/protocol/test/utils/signal.ts +++ /dev/null @@ -1,88 +0,0 @@ -import { ethers, Signer } from "ethers"; -import RLP from "rlp"; -import { ethers as hardhatEthers } from "hardhat"; -import { BlockHeader, EthGetProofResponse } from "./rpc"; -import { AddressManager, TestSignalService } from "../../typechain"; - -async function deploySignalService( - signer: Signer, - addressManager: AddressManager, - srcChain: number -): Promise<{ signalService: TestSignalService }> { - const SignalServiceFactory = await hardhatEthers.getContractFactory( - "TestSignalService" - ); - - const signalService: TestSignalService = await SignalServiceFactory.connect( - signer - ).deploy(); - - await signalService.connect(signer).init(addressManager.address); - - await addressManager.setAddress( - srcChain, - `signal_service`, - signalService.address - ); - return { signalService }; -} - -async function getSignalProofWithAccountProof( - provider: ethers.providers.JsonRpcProvider, - contractAddress: string, - slot: string, - blockNumber: number, - blockHeader: BlockHeader -) { - const proof: EthGetProofResponse = await provider.send("eth_getProof", [ - contractAddress, - [slot], - blockNumber, - ]); - - // RLP encode the proof together for LibTrieProof to decode - const encodedProof = ethers.utils.defaultAbiCoder.encode( - ["bytes", "bytes"], - [ - RLP.encode(proof.accountProof), - RLP.encode(proof.storageProof[0].proof), - ] - ); - // encode the SignalProof struct from LibBridgeSignal - const signalProof = ethers.utils.defaultAbiCoder.encode( - [ - "tuple(tuple(bytes32 parentHash, bytes32 ommersHash, address beneficiary, bytes32 stateRoot, bytes32 transactionsRoot, bytes32 receiptsRoot, bytes32[8] logsBloom, uint256 difficulty, uint128 height, uint64 gasLimit, uint64 gasUsed, uint64 timestamp, bytes extraData, bytes32 mixHash, uint64 nonce, uint256 baseFeePerGas, bytes32 withdrawalsRoot) header, bytes proof)", - ], - [{ header: blockHeader, proof: encodedProof }] - ); - - return signalProof; -} - -async function getSignalProof( - provider: ethers.providers.JsonRpcProvider, - contractAddress: string, - slot: string, - blockNumber: number, - blockHeader: BlockHeader -) { - const proof: EthGetProofResponse = await provider.send("eth_getProof", [ - contractAddress, - [slot], - blockNumber, - ]); - - // RLP encode the proof together for LibTrieProof to decode - const encodedProof = RLP.encode(proof.storageProof[0].proof); - // encode the SignalProof struct from LibBridgeSignal - const signalProof = ethers.utils.defaultAbiCoder.encode( - [ - "tuple(tuple(bytes32 parentHash, bytes32 ommersHash, address beneficiary, bytes32 stateRoot, bytes32 transactionsRoot, bytes32 receiptsRoot, bytes32[8] logsBloom, uint256 difficulty, uint128 height, uint64 gasLimit, uint64 gasUsed, uint64 timestamp, bytes extraData, bytes32 mixHash, uint64 nonce, uint256 baseFeePerGas, bytes32 withdrawalsRoot) header, bytes proof)", - ], - [{ header: blockHeader, proof: encodedProof }] - ); - - return { signalProof: signalProof, signalRoot: proof.storageHash }; -} - -export { deploySignalService, getSignalProof, getSignalProofWithAccountProof }; diff --git a/packages/protocol/test/utils/sleep.ts b/packages/protocol/test/utils/sleep.ts deleted file mode 100644 index 268c312630f..00000000000 --- a/packages/protocol/test/utils/sleep.ts +++ /dev/null @@ -1,7 +0,0 @@ -function sleep(ms: number) { - return new Promise((resolve) => { - setTimeout(resolve, ms); - }); -} - -export default sleep; diff --git a/packages/protocol/test/utils/taikoL1.ts b/packages/protocol/test/utils/taikoL1.ts deleted file mode 100644 index 5a099588bb5..00000000000 --- a/packages/protocol/test/utils/taikoL1.ts +++ /dev/null @@ -1,48 +0,0 @@ -import { BigNumber } from "ethers"; -import { ethers } from "hardhat"; -import { AddressManager, TaikoL1 } from "../../typechain"; - -const defaultBasefee = BigNumber.from(10).pow(18); - -async function deployTaikoL1( - addressManager: AddressManager, - genesisHash: string, - basefee?: BigNumber -): Promise { - // const libProposing = await ( - // await ethers.getContractFactory("LibProposing") - // ).deploy(); - - // const libProving = await ( - // await ethers.getContractFactory("LibProving") - // ).deploy(); - - // const libVerifying = await ( - // await ethers.getContractFactory("LibVerifying") - // ).deploy(); - - const taikoL1 = await ( - await ethers.getContractFactory( - "TestTaikoL1EnableTokenomics" - // { - // libraries: { - // LibVerifying: libVerifying.address, - // LibProposing: libProposing.address, - // LibProving: libProving.address, - // }, - // } - ) - ).deploy(); - - await ( - await taikoL1.init( - addressManager.address, - genesisHash, - basefee ?? defaultBasefee - ) - ).wait(1); - - return taikoL1 as TaikoL1; -} - -export { deployTaikoL1, defaultBasefee }; diff --git a/packages/protocol/test/utils/taikoL2.ts b/packages/protocol/test/utils/taikoL2.ts deleted file mode 100644 index eeeed085514..00000000000 --- a/packages/protocol/test/utils/taikoL2.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { ethers } from "ethers"; -import { ethers as hardhatEthers } from "hardhat"; -import { TaikoL2 } from "../../typechain"; - -async function deployTaikoL2( - signer: ethers.Signer, - gasLimit: number | undefined = undefined -): Promise { - const taikoL2 = await ( - await hardhatEthers.getContractFactory("TestTaikoL2") - ) - .connect(signer) - .deploy({ gasLimit }); - - return taikoL2 as TaikoL2; -} - -export { deployTaikoL2 }; diff --git a/packages/protocol/test/utils/taikoToken.ts b/packages/protocol/test/utils/taikoToken.ts deleted file mode 100644 index 6b0a572b7b4..00000000000 --- a/packages/protocol/test/utils/taikoToken.ts +++ /dev/null @@ -1,28 +0,0 @@ -import { ethers } from "ethers"; -import { ethers as hardhatEthers } from "hardhat"; -import { AddressManager } from "../../typechain"; - -const deployTaikoToken = async ( - signer: ethers.Signer, - addressManager: AddressManager, - protoBroker: string -) => { - const token = await ( - await hardhatEthers.getContractFactory("TestTaikoToken") - ) - .connect(signer) - .deploy(); - await token.init(addressManager.address, "Taiko Token", "TKO", [], []); - - const network = await signer.provider?.getNetwork(); - - await addressManager.setAddress( - network?.chainId, - `proto_broker`, - protoBroker - ); - - return token; -}; - -export default deployTaikoToken; diff --git a/packages/protocol/test/utils/tokenomics.ts b/packages/protocol/test/utils/tokenomics.ts deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/packages/protocol/test/utils/trie.ts b/packages/protocol/test/utils/trie.ts deleted file mode 100644 index 7afec4cc43c..00000000000 --- a/packages/protocol/test/utils/trie.ts +++ /dev/null @@ -1,75 +0,0 @@ -import { BaseTrie, SecureTrie } from "merkle-patricia-tree"; -import { ethers } from "ethers"; -import * as rlp from "rlp"; -import { randomBytes } from "crypto"; - -type Node = { - key: Buffer; - value: Buffer; -}; - -type Root = { - root: Buffer; -}; - -type Proof = { - proof: string; -}; - -type Test = { - node: Node; - root: Root; - proof: Proof; -}; - -class MerkleTrie { - public trie: T; - public nodes: Node[] = []; - private nodeLength: number; - private amountOfNodes: number; - - constructor(amountOfNodes: number, nodeLength: number, f: () => T) { - this.amountOfNodes = amountOfNodes; - this.nodeLength = nodeLength; - this.trie = f(); - } - - async init() { - this.nodes = []; - for (let i = 0; i < this.amountOfNodes; i++) { - this.nodes.push(this.newRandomNode()); - } - await this.build(this.nodes); - } - - newRandomNode(): Node { - return { - key: randomBytes(this.nodeLength), - value: randomBytes(this.nodeLength), - }; - } - - async build(nodes: Node[]): Promise { - nodes.map(async (n) => await this.trie.put(n.key, n.value)); - } - - async makeTest(key: Buffer): Promise { - const trie = this.trie.copy(); - const value = await trie.get(key); - const proof = await BaseTrie.createProof(trie, key); - - return { - node: { - key: key, - value: value as Buffer, - }, - proof: { - proof: ethers.utils.hexlify(rlp.encode(proof)), - }, - root: { - root: trie.root, - }, - }; - } -} -export { MerkleTrie }; diff --git a/packages/protocol/test/utils/verify.ts b/packages/protocol/test/utils/verify.ts deleted file mode 100644 index aa4359533e7..00000000000 --- a/packages/protocol/test/utils/verify.ts +++ /dev/null @@ -1,135 +0,0 @@ -import { expect } from "chai"; -import { BigNumber, ethers as ethersLib } from "ethers"; -import { ethers } from "hardhat"; -import { TaikoL1, TaikoToken } from "../../typechain"; -import { BlockVerifiedEvent } from "../../typechain/LibVerifying"; -import { BlockInfo, BlockMetadata } from "./block_metadata"; -import { onNewL2Block } from "./onNewL2Block"; -import Proposer from "./proposer"; -import Prover from "./prover"; -import { getDefaultL1Signer } from "./provider"; -import { sendTinyEtherToZeroAddress } from "./seed"; - -async function verifyBlocks(taikoL1: TaikoL1, maxBlocks: number) { - // Since we are connecting to a geth node with clique consensus (auto mine), we - // need to manually mine a new block here to ensure the latest block.timestamp increased as expected when - // calling eth_estimateGas. - await sendTinyEtherToZeroAddress(await getDefaultL1Signer()); - - const verifyTx = await taikoL1.verifyBlocks(maxBlocks, { - gasLimit: 1000000, - }); - - const verifyReceipt = await verifyTx.wait(1); - const verifiedEvent: BlockVerifiedEvent = ( - verifyReceipt.events as any[] - ).find((e) => e.event === "BlockVerified"); - return verifiedEvent; -} - -async function verifyBlockAndAssert( - taikoL1: TaikoL1, - taikoTokenL1: TaikoToken, - block: BlockInfo, - lastProofReward: BigNumber -): Promise<{ newProofReward: BigNumber }> { - const prover = block.forkChoice.provers[0]; - - const proverBalanceBeforeVerification = await taikoTokenL1.balanceOf( - prover - ); - - const proposerBalanceBeforeVerification = await taikoTokenL1.balanceOf( - block.proposer - ); - - expect(proposerBalanceBeforeVerification.gt(0)).to.be.true; - const verifiedEvent = await verifyBlocks(taikoL1, 1); - expect(verifiedEvent).to.be.not.undefined; - - expect(verifiedEvent.args.blockHash).to.be.eq(block.blockHash); - expect(verifiedEvent.args.id.eq(block.id)).to.be.true; - - const proverBalanceAfterVerification = await taikoTokenL1.balanceOf(prover); - - // prover should have increased in balance as he received the proof reward. - expect(proverBalanceAfterVerification.gt(proverBalanceBeforeVerification)) - .to.be.true; - - const newProofReward = await taikoL1.getProofReward( - block.proposedAt, - block.provenAt - ); - - // last proof reward should be larger than the new proof reward, - // since we have stopped proposing, and slots are growing as we verify. - if (lastProofReward.gt(0)) { - expect(newProofReward).to.be.lt(lastProofReward); - } - - // latest synced header should be our just-verified block hash. - const latestHash = await taikoL1.getXchainBlockHash(0); - expect(latestHash).to.be.eq(block.blockHash); - - // fork choice should be nullified via _cleanUp in LibVerifying - const forkChoice = await taikoL1.getForkChoice(block.id, block.parentHash); - expect(forkChoice.provenAt).to.be.eq(BigNumber.from(0)); - expect(forkChoice.provers).to.be.empty; - expect(forkChoice.blockHash).to.be.eq(ethers.constants.HashZero); - - // proposer should be minted their refund of their deposit back after - // verification, as long as their balance is > 0; - return { newProofReward }; -} - -async function proposeProveAndVerify( - taikoL1: TaikoL1, - l2Provider: ethersLib.providers.JsonRpcProvider, - blockNumber: number, - proposer: Proposer, - taikoTokenL1: TaikoToken, - prover: Prover -) { - console.log("proposing", blockNumber); - const { proposedEvent } = await onNewL2Block( - l2Provider, - blockNumber, - proposer, - taikoL1, - proposer.getSigner(), - taikoTokenL1 - ); - expect(proposedEvent).not.to.be.undefined; - - console.log("proving", blockNumber); - const provedEvent = await prover.prove( - proposedEvent.args.id.toNumber(), - blockNumber, - proposedEvent.args.meta as any as BlockMetadata - ); - - const { args } = provedEvent; - const { blockHash, id: blockId, parentHash } = args; - - const proposedBlock = await taikoL1.getBlock( - proposedEvent.args.id.toNumber() - ); - - const forkChoice = await taikoL1.getForkChoice( - blockId.toNumber(), - parentHash - ); - - expect(forkChoice.blockHash).to.be.eq(blockHash); - - expect(forkChoice.prover).to.be.eq(await prover.getSigner().getAddress()); - - console.log("verifying", blockNumber); - const verifyEvent = await verifyBlocks(taikoL1, 1); - expect(verifyEvent).not.to.be.eq(undefined); - console.log("verified", blockNumber); - - return { verifyEvent, proposedEvent, provedEvent, proposedBlock }; -} - -export { verifyBlocks, verifyBlockAndAssert, proposeProveAndVerify }; diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 9b5850a0fd2..028e6642eb5 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -14,7 +14,7 @@ importers: dependencies: '@coinbase/wallet-sdk': specifier: ^3.6.3 - version: 3.6.3(@babel/core@7.20.2) + version: 3.6.3(@babel/core@7.21.4) '@ethersproject/experimental': specifier: ^5.7.0 version: 5.7.0 @@ -26,10 +26,10 @@ importers: version: 1.6.0 '@wagmi/connectors': specifier: ^0.1.1 - version: 0.1.1(@babel/core@7.20.2)(@wagmi/core@0.8.4)(ethers@5.7.2)(typescript@4.9.3) + version: 0.1.1(@babel/core@7.21.4)(@wagmi/core@0.8.4)(ethers@5.7.2)(typescript@4.9.3) '@wagmi/core': specifier: ^0.8.0 - version: 0.8.4(@babel/core@7.20.2)(@coinbase/wallet-sdk@3.6.3)(ethers@5.7.2)(react@18.2.0)(typescript@4.9.3) + version: 0.8.4(@babel/core@7.21.4)(@coinbase/wallet-sdk@3.6.3)(ethers@5.7.2)(react@18.2.0)(typescript@4.9.3) axios: specifier: ^1.2.0 version: 1.2.0 @@ -51,7 +51,7 @@ importers: devDependencies: '@babel/preset-env': specifier: ^7.16.0 - version: 7.20.2(@babel/core@7.20.2) + version: 7.20.2(@babel/core@7.21.4) '@sveltejs/vite-plugin-svelte': specifier: ^1.0.1 version: 1.3.1(svelte@3.53.1)(vite@3.2.4) @@ -75,10 +75,10 @@ importers: version: 2.6.2 '@typescript-eslint/eslint-plugin': specifier: ^5.16.0 - version: 5.44.0(@typescript-eslint/parser@5.44.0)(eslint@8.37.0)(typescript@4.9.3) + version: 5.44.0(@typescript-eslint/parser@5.44.0)(eslint@8.39.0)(typescript@4.9.3) '@typescript-eslint/parser': specifier: ^5.16.0 - version: 5.44.0(eslint@8.37.0)(typescript@4.9.3) + version: 5.44.0(eslint@8.39.0)(typescript@4.9.3) '@zerodevx/svelte-toast': specifier: ^0.6.3 version: 0.6.3 @@ -87,7 +87,7 @@ importers: version: 10.4.13(postcss@8.4.19) babel-jest: specifier: ^27.3.1 - version: 27.5.1(@babel/core@7.20.2) + version: 27.5.1(@babel/core@7.21.4) babel-plugin-transform-es2015-modules-commonjs: specifier: ^6.26.2 version: 6.26.2 @@ -96,13 +96,13 @@ importers: version: 1.16.6 eslint-plugin-jest: specifier: ^27.2.1 - version: 27.2.1(@typescript-eslint/eslint-plugin@5.44.0)(eslint@8.37.0)(jest@27.5.1)(typescript@4.9.3) + version: 27.2.1(@typescript-eslint/eslint-plugin@5.44.0)(eslint@8.39.0)(jest@27.5.1)(typescript@4.9.3) eslint-plugin-simple-import-sort: specifier: ^10.0.0 - version: 10.0.0(eslint@8.37.0) + version: 10.0.0(eslint@8.39.0) eslint-plugin-svelte3: specifier: ^4.0.0 - version: 4.0.0(eslint@8.37.0)(svelte@3.53.1) + version: 4.0.0(eslint@8.39.0)(svelte@3.53.1) jest: specifier: ^27.5.1 version: 27.5.1 @@ -120,7 +120,7 @@ importers: version: 7.1.2 postcss-loader: specifier: ^6.2.0 - version: 6.2.1(postcss@8.4.19)(webpack@5.75.0) + version: 6.2.1(postcss@8.4.19)(webpack@5.80.0) prettier: specifier: 2.7.1 version: 2.7.1 @@ -138,7 +138,7 @@ importers: version: 3.53.1 svelte-check: specifier: ^2.8.0 - version: 2.9.2(@babel/core@7.20.2)(node-sass@7.0.3)(postcss@8.4.19)(svelte@3.53.1) + version: 2.9.2(@babel/core@7.21.4)(node-sass@7.0.3)(postcss@8.4.19)(svelte@3.53.1) svelte-heros-v2: specifier: ^0.3.10 version: 0.3.10 @@ -150,7 +150,7 @@ importers: version: 3.1.4(svelte@3.53.1) svelte-preprocess: specifier: ^4.10.7 - version: 4.10.7(@babel/core@7.20.2)(node-sass@7.0.3)(postcss@8.4.19)(svelte@3.53.1)(typescript@4.9.3) + version: 4.10.7(@babel/core@7.21.4)(node-sass@7.0.3)(postcss@8.4.19)(svelte@3.53.1)(typescript@4.9.3) tailwindcss: specifier: ^3.2.4 version: 3.2.4(postcss@8.4.19) @@ -159,13 +159,13 @@ importers: version: 2.2.0 ts-jest: specifier: ^27.0.7 - version: 27.1.5(@babel/core@7.20.2)(@types/jest@27.5.2)(babel-jest@27.5.1)(jest@27.5.1)(typescript@4.9.3) + version: 27.1.5(@babel/core@7.21.4)(@types/jest@27.5.2)(babel-jest@27.5.1)(jest@27.5.1)(typescript@4.9.3) ts-jest-mock-import-meta: specifier: ^0.12.0 version: 0.12.0(ts-jest@27.1.5) ts-loader: specifier: ^9.2.6 - version: 9.4.1(typescript@4.9.3)(webpack@5.75.0) + version: 9.4.1(typescript@4.9.3)(webpack@5.80.0) tslib: specifier: ^2.4.0 version: 2.4.1 @@ -187,42 +187,42 @@ importers: specifier: ^1.1.9 version: 1.1.9 '@openzeppelin/contracts': - specifier: ^4.8.2 - version: 4.8.2 + specifier: ^4.8.3 + version: 4.8.3 '@openzeppelin/contracts-upgradeable': - specifier: ^4.8.2 - version: 4.8.2 + specifier: ^4.8.3 + version: 4.8.3 channel-ts: specifier: ^0.1.2 version: 0.1.2 devDependencies: '@defi-wonderland/smock': specifier: ^2.3.4 - version: 2.3.4(@ethersproject/abi@5.7.0)(@ethersproject/abstract-provider@5.7.0)(@ethersproject/abstract-signer@5.7.0)(@nomiclabs/hardhat-ethers@2.2.2)(ethers@5.7.2)(hardhat@2.13.0) + version: 2.3.4(@ethersproject/abi@5.7.0)(@ethersproject/abstract-provider@5.7.0)(@ethersproject/abstract-signer@5.7.0)(@nomiclabs/hardhat-ethers@2.2.3)(ethers@5.7.2)(hardhat@2.14.0) '@foundry-rs/hardhat-forge': specifier: ^0.1.17 - version: 0.1.17(@nomiclabs/hardhat-ethers@2.2.2)(ethereum-waffle@3.4.4)(ethers@5.7.2)(hardhat@2.13.0) + version: 0.1.17(@nomiclabs/hardhat-ethers@2.2.3)(ethereum-waffle@3.4.4)(ethers@5.7.2)(hardhat@2.14.0) '@nomicfoundation/hardhat-network-helpers': specifier: ^1.0.8 - version: 1.0.8(hardhat@2.13.0) + version: 1.0.8(hardhat@2.14.0) '@nomiclabs/hardhat-ethers': - specifier: ^2.2.2 - version: 2.2.2(ethers@5.7.2)(hardhat@2.13.0) + specifier: ^2.2.3 + version: 2.2.3(ethers@5.7.2)(hardhat@2.14.0) '@nomiclabs/hardhat-etherscan': specifier: ^3.1.7 - version: 3.1.7(hardhat@2.13.0) + version: 3.1.7(hardhat@2.14.0) '@nomiclabs/hardhat-waffle': specifier: ^2.0.5 - version: 2.0.5(@nomiclabs/hardhat-ethers@2.2.2)(ethereum-waffle@3.4.4)(ethers@5.7.2)(hardhat@2.13.0) + version: 2.0.5(@nomiclabs/hardhat-ethers@2.2.3)(ethereum-waffle@3.4.4)(ethers@5.7.2)(hardhat@2.14.0) '@openzeppelin/hardhat-upgrades': specifier: ^1.22.1 - version: 1.22.1(@nomiclabs/hardhat-ethers@2.2.2)(@nomiclabs/hardhat-etherscan@3.1.7)(ethers@5.7.2)(hardhat@2.13.0) + version: 1.22.1(@nomiclabs/hardhat-ethers@2.2.3)(@nomiclabs/hardhat-etherscan@3.1.7)(ethers@5.7.2)(hardhat@2.14.0) '@typechain/ethers-v5': specifier: ^7.2.0 version: 7.2.0(@ethersproject/abi@5.7.0)(@ethersproject/bytes@5.7.0)(@ethersproject/providers@5.7.2)(ethers@5.7.2)(typechain@5.2.0)(typescript@4.9.5) '@typechain/hardhat': specifier: ^2.3.1 - version: 2.3.1(hardhat@2.13.0)(lodash@4.17.21)(typechain@5.2.0) + version: 2.3.1(hardhat@2.14.0)(lodash@4.17.21)(typechain@5.2.0) '@types/chai': specifier: ^4.3.4 version: 4.3.4 @@ -254,8 +254,8 @@ importers: specifier: ^7.32.0 version: 7.32.0 eslint-config-prettier: - specifier: ^8.6.0 - version: 8.6.0(eslint@7.32.0) + specifier: ^8.8.0 + version: 8.8.0(eslint@7.32.0) eslint-config-standard: specifier: ^16.0.3 version: 16.0.3(eslint-plugin-import@2.27.5)(eslint-plugin-node@11.1.0)(eslint-plugin-promise@5.2.0)(eslint@7.32.0) @@ -267,7 +267,7 @@ importers: version: 11.1.0(eslint@7.32.0) eslint-plugin-prettier: specifier: ^3.4.1 - version: 3.4.1(eslint-config-prettier@8.6.0)(eslint@7.32.0)(prettier@2.8.4) + version: 3.4.1(eslint-config-prettier@8.8.0)(eslint@7.32.0)(prettier@2.8.8) eslint-plugin-promise: specifier: ^5.2.0 version: 5.2.0(eslint@7.32.0) @@ -281,20 +281,20 @@ importers: specifier: ^8.1.0 version: 8.1.0 hardhat: - specifier: ^2.13.0 - version: 2.13.0(ts-node@10.9.1)(typescript@4.9.5) + specifier: ^2.14.0 + version: 2.14.0(ts-node@10.9.1)(typescript@4.9.5) hardhat-abi-exporter: specifier: ^2.10.1 - version: 2.10.1(hardhat@2.13.0) + version: 2.10.1(hardhat@2.14.0) hardhat-contract-sizer: specifier: ^2.8.0 - version: 2.8.0(hardhat@2.13.0) + version: 2.8.0(hardhat@2.14.0) hardhat-docgen: specifier: ^1.3.0 - version: 1.3.0(hardhat@2.13.0)(lodash@4.17.21) + version: 1.3.0(hardhat@2.14.0)(lodash@4.17.21) hardhat-gas-reporter: specifier: ^1.0.9 - version: 1.0.9(hardhat@2.13.0) + version: 1.0.9(hardhat@2.14.0) lint-staged: specifier: ^12.5.0 version: 12.5.0 @@ -302,23 +302,23 @@ importers: specifier: ^4.2.4 version: 4.2.4 prettier: - specifier: ^2.8.4 - version: 2.8.4 + specifier: ^2.8.8 + version: 2.8.8 prettier-plugin-solidity: specifier: ^1.1.3 - version: 1.1.3(prettier@2.8.4) + version: 1.1.3(prettier@2.8.8) rlp: specifier: ^3.0.0 version: 3.0.0 solhint: - specifier: ^3.4.0 - version: 3.4.0 + specifier: ^3.4.1 + version: 3.4.1 solidity-coverage: specifier: github:taikoxyz/solidity-coverage - version: github.com/taikoxyz/solidity-coverage/ceb49fd1f6041e4fcd26079dfb0d3b0f58c812e5(hardhat@2.13.0) + version: github.com/taikoxyz/solidity-coverage/ceb49fd1f6041e4fcd26079dfb0d3b0f58c812e5(hardhat@2.14.0) solidity-docgen: specifier: 0.6.0-beta.35 - version: 0.6.0-beta.35(hardhat@2.13.0) + version: 0.6.0-beta.35(hardhat@2.14.0) ts-node: specifier: ^10.9.1 version: 10.9.1(@types/node@12.20.55)(typescript@4.9.5) @@ -335,7 +335,7 @@ importers: dependencies: '@coinbase/wallet-sdk': specifier: ^3.6.3 - version: 3.6.3(@babel/core@7.20.2) + version: 3.6.3(@babel/core@7.21.4) '@ethersproject/experimental': specifier: ^5.7.0 version: 5.7.0 @@ -347,10 +347,10 @@ importers: version: 1.6.0 '@wagmi/connectors': specifier: ^0.1.1 - version: 0.1.1(@babel/core@7.20.2)(@wagmi/core@0.8.4)(ethers@5.7.2)(typescript@4.9.5) + version: 0.1.1(@babel/core@7.21.4)(@wagmi/core@0.8.4)(ethers@5.7.2)(typescript@4.9.5) '@wagmi/core': specifier: ^0.8.0 - version: 0.8.4(@babel/core@7.20.2)(@coinbase/wallet-sdk@3.6.3)(ethers@5.7.2)(react@18.2.0)(typescript@4.9.5) + version: 0.8.4(@babel/core@7.21.4)(@coinbase/wallet-sdk@3.6.3)(ethers@5.7.2)(react@18.2.0)(typescript@4.9.5) axios: specifier: ^1.2.0 version: 1.2.0 @@ -372,7 +372,7 @@ importers: devDependencies: '@babel/preset-env': specifier: ^7.16.0 - version: 7.20.2(@babel/core@7.20.2) + version: 7.20.2(@babel/core@7.21.4) '@sveltejs/vite-plugin-svelte': specifier: ^1.0.1 version: 1.3.1(svelte@3.53.1)(vite@3.2.4) @@ -396,10 +396,10 @@ importers: version: 2.6.2 '@typescript-eslint/eslint-plugin': specifier: ^5.16.0 - version: 5.44.0(@typescript-eslint/parser@5.44.0)(eslint@7.32.0)(typescript@4.9.5) + version: 5.44.0(@typescript-eslint/parser@5.44.0)(eslint@8.39.0)(typescript@4.9.5) '@typescript-eslint/parser': specifier: ^5.16.0 - version: 5.44.0(eslint@7.32.0)(typescript@4.9.5) + version: 5.44.0(eslint@8.39.0)(typescript@4.9.5) '@zerodevx/svelte-toast': specifier: ^0.6.3 version: 0.6.3 @@ -408,7 +408,7 @@ importers: version: 10.4.13(postcss@8.4.21) babel-jest: specifier: ^27.3.1 - version: 27.5.1(@babel/core@7.20.2) + version: 27.5.1(@babel/core@7.21.4) babel-plugin-transform-es2015-modules-commonjs: specifier: ^6.26.2 version: 6.26.2 @@ -429,7 +429,7 @@ importers: version: 7.1.2 postcss-loader: specifier: ^6.2.0 - version: 6.2.1(postcss@8.4.21)(webpack@5.75.0) + version: 6.2.1(postcss@8.4.21)(webpack@5.80.0) prettier: specifier: 2.7.1 version: 2.7.1 @@ -444,7 +444,7 @@ importers: version: 3.53.1 svelte-check: specifier: ^2.8.0 - version: 2.9.2(@babel/core@7.20.2)(node-sass@7.0.3)(postcss@8.4.21)(svelte@3.53.1) + version: 2.9.2(@babel/core@7.21.4)(node-sass@7.0.3)(postcss@8.4.21)(svelte@3.53.1) svelte-heros-v2: specifier: ^0.3.10 version: 0.3.10 @@ -456,7 +456,7 @@ importers: version: 3.1.4(svelte@3.53.1) svelte-preprocess: specifier: ^4.10.7 - version: 4.10.7(@babel/core@7.20.2)(node-sass@7.0.3)(postcss@8.4.21)(svelte@3.53.1)(typescript@4.9.5) + version: 4.10.7(@babel/core@7.21.4)(node-sass@7.0.3)(postcss@8.4.21)(svelte@3.53.1)(typescript@4.9.5) tailwindcss: specifier: ^3.2.4 version: 3.2.6(postcss@8.4.21) @@ -465,13 +465,13 @@ importers: version: 2.2.0 ts-jest: specifier: ^27.0.7 - version: 27.1.5(@babel/core@7.20.2)(@types/jest@27.5.2)(babel-jest@27.5.1)(jest@27.5.1)(typescript@4.9.5) + version: 27.1.5(@babel/core@7.21.4)(@types/jest@27.5.2)(babel-jest@27.5.1)(jest@27.5.1)(typescript@4.9.5) ts-jest-mock-import-meta: specifier: ^0.12.0 version: 0.12.0(ts-jest@27.1.5) ts-loader: specifier: ^9.2.6 - version: 9.4.1(typescript@4.9.5)(webpack@5.75.0) + version: 9.4.1(typescript@4.9.5)(webpack@5.80.0) tslib: specifier: ^2.4.0 version: 2.5.0 @@ -489,7 +489,7 @@ importers: dependencies: '@coinbase/wallet-sdk': specifier: ^3.6.3 - version: 3.6.3(@babel/core@7.20.2) + version: 3.6.3(@babel/core@7.21.4) '@ethersproject/experimental': specifier: ^5.7.0 version: 5.7.0 @@ -501,10 +501,10 @@ importers: version: 1.6.0 '@wagmi/connectors': specifier: ^0.1.1 - version: 0.1.1(@babel/core@7.20.2)(@wagmi/core@0.8.4)(ethers@5.7.2)(typescript@4.9.3) + version: 0.1.1(@babel/core@7.21.4)(@wagmi/core@0.8.4)(ethers@5.7.2)(typescript@4.9.3) '@wagmi/core': specifier: ^0.8.0 - version: 0.8.4(@babel/core@7.20.2)(@coinbase/wallet-sdk@3.6.3)(ethers@5.7.2)(react@18.2.0)(typescript@4.9.3) + version: 0.8.4(@babel/core@7.21.4)(@coinbase/wallet-sdk@3.6.3)(ethers@5.7.2)(react@18.2.0)(typescript@4.9.3) axios: specifier: ^1.2.0 version: 1.2.0 @@ -526,7 +526,7 @@ importers: devDependencies: '@babel/preset-env': specifier: ^7.16.0 - version: 7.20.2(@babel/core@7.20.2) + version: 7.20.2(@babel/core@7.21.4) '@sveltejs/vite-plugin-svelte': specifier: ^1.0.1 version: 1.3.1(svelte@3.53.1)(vite@3.2.4) @@ -550,10 +550,10 @@ importers: version: 2.6.2 '@typescript-eslint/eslint-plugin': specifier: ^5.16.0 - version: 5.44.0(@typescript-eslint/parser@5.44.0)(eslint@7.32.0)(typescript@4.9.3) + version: 5.44.0(@typescript-eslint/parser@5.44.0)(eslint@8.39.0)(typescript@4.9.3) '@typescript-eslint/parser': specifier: ^5.16.0 - version: 5.44.0(eslint@7.32.0)(typescript@4.9.3) + version: 5.44.0(eslint@8.39.0)(typescript@4.9.3) '@zerodevx/svelte-toast': specifier: ^0.6.3 version: 0.6.3 @@ -562,7 +562,7 @@ importers: version: 10.4.13(postcss@8.4.19) babel-jest: specifier: ^27.3.1 - version: 27.5.1(@babel/core@7.20.2) + version: 27.5.1(@babel/core@7.21.4) babel-plugin-transform-es2015-modules-commonjs: specifier: ^6.26.2 version: 6.26.2 @@ -583,7 +583,7 @@ importers: version: 7.1.2 postcss-loader: specifier: ^6.2.0 - version: 6.2.1(postcss@8.4.19)(webpack@5.75.0) + version: 6.2.1(postcss@8.4.19)(webpack@5.80.0) prettier: specifier: 2.7.1 version: 2.7.1 @@ -598,7 +598,7 @@ importers: version: 3.53.1 svelte-check: specifier: ^2.8.0 - version: 2.9.2(@babel/core@7.20.2)(node-sass@7.0.3)(postcss@8.4.19)(svelte@3.53.1) + version: 2.9.2(@babel/core@7.21.4)(node-sass@7.0.3)(postcss@8.4.19)(svelte@3.53.1) svelte-heros-v2: specifier: ^0.3.10 version: 0.3.10 @@ -610,7 +610,7 @@ importers: version: 3.1.4(svelte@3.53.1) svelte-preprocess: specifier: ^4.10.7 - version: 4.10.7(@babel/core@7.20.2)(node-sass@7.0.3)(postcss@8.4.19)(svelte@3.53.1)(typescript@4.9.3) + version: 4.10.7(@babel/core@7.21.4)(node-sass@7.0.3)(postcss@8.4.19)(svelte@3.53.1)(typescript@4.9.3) tailwindcss: specifier: ^3.2.4 version: 3.2.4(postcss@8.4.19) @@ -619,13 +619,13 @@ importers: version: 2.2.0 ts-jest: specifier: ^27.0.7 - version: 27.1.5(@babel/core@7.20.2)(@types/jest@27.5.2)(babel-jest@27.5.1)(jest@27.5.1)(typescript@4.9.3) + version: 27.1.5(@babel/core@7.21.4)(@types/jest@27.5.2)(babel-jest@27.5.1)(jest@27.5.1)(typescript@4.9.3) ts-jest-mock-import-meta: specifier: ^0.12.0 version: 0.12.0(ts-jest@27.1.5) ts-loader: specifier: ^9.2.6 - version: 9.4.1(typescript@4.9.3)(webpack@5.75.0) + version: 9.4.1(typescript@4.9.3)(webpack@5.80.0) tslib: specifier: ^2.4.0 version: 2.4.1 @@ -695,6 +695,14 @@ packages: dependencies: '@jridgewell/gen-mapping': 0.1.1 '@jridgewell/trace-mapping': 0.3.17 + dev: true + + /@ampproject/remapping@2.2.1: + resolution: {integrity: sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==} + engines: {node: '>=6.0.0'} + dependencies: + '@jridgewell/gen-mapping': 0.3.3 + '@jridgewell/trace-mapping': 0.3.18 /@babel/code-frame@7.12.11: resolution: {integrity: sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==} @@ -707,11 +715,22 @@ packages: engines: {node: '>=6.9.0'} dependencies: '@babel/highlight': 7.18.6 + dev: true + + /@babel/code-frame@7.21.4: + resolution: {integrity: sha512-LYvhNKfwWSPpocw8GI7gpK2nq3HSDuEPC/uSYaALSJu9xjsalaaYFOq0Pwt5KmVqwEbZlDu81aLXwBOmD/Fv9g==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/highlight': 7.18.6 /@babel/compat-data@7.20.1: resolution: {integrity: sha512-EWZ4mE2diW3QALKvDMiXnbZpRvlj+nayZ112nK93SnhqOtpdsbVD4W+2tEoT3YNBAG9RBR0ISY758ZkOgsn6pQ==} engines: {node: '>=6.9.0'} + /@babel/compat-data@7.21.4: + resolution: {integrity: sha512-/DYyDpeCfaVinT40FPGdkkb+lYSKvsVuMjDAG7jPOWWiM1ibOaB9CXJAlc4d1QpP/U2q2P9jbrSlClKSErd55g==} + engines: {node: '>=6.9.0'} + /@babel/core@7.20.2: resolution: {integrity: sha512-w7DbG8DtMrJcFOi4VrLm+8QM4az8Mo+PuLBKLp2zrYRCow8W/f9xiXm5sN53C8HksCyDQwCKha9JiDoIyPjT2g==} engines: {node: '>=6.9.0'} @@ -727,12 +746,35 @@ packages: '@babel/traverse': 7.20.1 '@babel/types': 7.20.2 convert-source-map: 1.9.0 - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.4(supports-color@9.3.1) gensync: 1.0.0-beta.2 json5: 2.2.1 semver: 6.3.0 transitivePeerDependencies: - supports-color + dev: true + + /@babel/core@7.21.4: + resolution: {integrity: sha512-qt/YV149Jman/6AfmlxJ04LMIu8bMoyl3RB91yTFrxQmgbrSvQMy7cI8Q62FHx1t8wJ8B5fu0UDoLwHAhUo1QA==} + engines: {node: '>=6.9.0'} + dependencies: + '@ampproject/remapping': 2.2.1 + '@babel/code-frame': 7.21.4 + '@babel/generator': 7.21.4 + '@babel/helper-compilation-targets': 7.21.4(@babel/core@7.21.4) + '@babel/helper-module-transforms': 7.21.2 + '@babel/helpers': 7.21.0 + '@babel/parser': 7.21.4 + '@babel/template': 7.20.7 + '@babel/traverse': 7.21.4 + '@babel/types': 7.21.4 + convert-source-map: 1.9.0 + debug: 4.3.4(supports-color@9.3.1) + gensync: 1.0.0-beta.2 + json5: 2.2.3 + semver: 6.3.0 + transitivePeerDependencies: + - supports-color /@babel/generator@7.20.4: resolution: {integrity: sha512-luCf7yk/cm7yab6CAW1aiFnmEfBJplb/JojV56MYEK7ziWfGmFlTfmL9Ehwfy4gFhbjBfWO1wj7/TuSbVNEEtA==} @@ -741,6 +783,16 @@ packages: '@babel/types': 7.20.2 '@jridgewell/gen-mapping': 0.3.2 jsesc: 2.5.2 + dev: true + + /@babel/generator@7.21.4: + resolution: {integrity: sha512-NieM3pVIYW2SwGzKoqfPrQsf4xGs9M9AIG3ThppsSRmO+m7eQhmI6amajKMUeIO37wFfsvnvcxQFx6x6iqxDnA==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.21.4 + '@jridgewell/gen-mapping': 0.3.3 + '@jridgewell/trace-mapping': 0.3.18 + jsesc: 2.5.2 /@babel/helper-annotate-as-pure@7.18.6: resolution: {integrity: sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA==} @@ -768,14 +820,40 @@ packages: '@babel/helper-validator-option': 7.18.6 browserslist: 4.21.5 semver: 6.3.0 + dev: true + + /@babel/helper-compilation-targets@7.20.0(@babel/core@7.21.4): + resolution: {integrity: sha512-0jp//vDGp9e8hZzBc6N/KwA5ZK3Wsm/pfm4CrY7vzegkVxc65SgSn6wYOnwHe9Js9HRQ1YTCKLGPzDtaS3RoLQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/compat-data': 7.20.1 + '@babel/core': 7.21.4 + '@babel/helper-validator-option': 7.18.6 + browserslist: 4.21.5 + semver: 6.3.0 + + /@babel/helper-compilation-targets@7.21.4(@babel/core@7.21.4): + resolution: {integrity: sha512-Fa0tTuOXZ1iL8IeDFUWCzjZcn+sJGd9RZdH9esYVjEejGmzf+FFYQpMi/kZUk2kPy/q1H3/GPw7np8qar/stfg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/compat-data': 7.21.4 + '@babel/core': 7.21.4 + '@babel/helper-validator-option': 7.21.0 + browserslist: 4.21.5 + lru-cache: 5.1.1 + semver: 6.3.0 - /@babel/helper-create-class-features-plugin@7.20.2(@babel/core@7.20.2): + /@babel/helper-create-class-features-plugin@7.20.2(@babel/core@7.21.4): resolution: {integrity: sha512-k22GoYRAHPYr9I+Gvy2ZQlAe5mGy8BqWst2wRt8cwIufWTxrsVshhIBvYNqC80N0GSFWTsqRVexOtfzlgOEDvA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.20.2 + '@babel/core': 7.21.4 '@babel/helper-annotate-as-pure': 7.18.6 '@babel/helper-environment-visitor': 7.18.9 '@babel/helper-function-name': 7.19.0 @@ -787,26 +865,26 @@ packages: - supports-color dev: true - /@babel/helper-create-regexp-features-plugin@7.19.0(@babel/core@7.20.2): + /@babel/helper-create-regexp-features-plugin@7.19.0(@babel/core@7.21.4): resolution: {integrity: sha512-htnV+mHX32DF81amCDrwIDr8nrp1PTm+3wfBN9/v8QJOLEioOCOG7qNyq0nHeFiWbT3Eb7gsPwEmV64UCQ1jzw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.20.2 + '@babel/core': 7.21.4 '@babel/helper-annotate-as-pure': 7.18.6 regexpu-core: 5.2.2 dev: true - /@babel/helper-define-polyfill-provider@0.3.3(@babel/core@7.20.2): + /@babel/helper-define-polyfill-provider@0.3.3(@babel/core@7.21.4): resolution: {integrity: sha512-z5aQKU4IzbqCC1XH0nAqfsFLMVSo22SBKUc0BxGrLkolTdPTructy0ToNnlO2zA4j9Q/7pjMZf0DSY+DSTYzww==} peerDependencies: '@babel/core': ^7.4.0-0 dependencies: - '@babel/core': 7.20.2 - '@babel/helper-compilation-targets': 7.20.0(@babel/core@7.20.2) + '@babel/core': 7.21.4 + '@babel/helper-compilation-targets': 7.20.0(@babel/core@7.21.4) '@babel/helper-plugin-utils': 7.20.2 - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.4(supports-color@9.3.1) lodash.debounce: 4.0.8 resolve: 1.22.1 semver: 6.3.0 @@ -830,6 +908,14 @@ packages: dependencies: '@babel/template': 7.18.10 '@babel/types': 7.20.2 + dev: true + + /@babel/helper-function-name@7.21.0: + resolution: {integrity: sha512-HfK1aMRanKHpxemaY2gqBmL04iAPOPRj7DxtNbiDOrJK+gdwkiNRVpCpUJYbUT+aZyemKN8brqTOxzCaG6ExRg==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/template': 7.20.7 + '@babel/types': 7.21.4 /@babel/helper-hoist-variables@7.18.6: resolution: {integrity: sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==} @@ -850,6 +936,12 @@ packages: dependencies: '@babel/types': 7.20.2 + /@babel/helper-module-imports@7.21.4: + resolution: {integrity: sha512-orajc5T2PsRYUN3ZryCEFeMDYwyw09c/pZeaQEZPH0MpKzSvn3e0uXsDBu3k03VI+9DBiRo+l22BfKTpKwa/Wg==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.21.4 + /@babel/helper-module-transforms@7.20.2: resolution: {integrity: sha512-zvBKyJXRbmK07XhMuujYoJ48B5yvvmM6+wcpv6Ivj4Yg6qO7NOZOSnvZN9CRl1zz1Z4cKf8YejmCMh8clOoOeA==} engines: {node: '>=6.9.0'} @@ -864,6 +956,22 @@ packages: '@babel/types': 7.20.2 transitivePeerDependencies: - supports-color + dev: true + + /@babel/helper-module-transforms@7.21.2: + resolution: {integrity: sha512-79yj2AR4U/Oqq/WOV7Lx6hUjau1Zfo4cI+JLAVYeMV5XIlbOhmjEk5ulbTc9fMpmlojzZHkUUxAiK+UKn+hNQQ==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-environment-visitor': 7.18.9 + '@babel/helper-module-imports': 7.21.4 + '@babel/helper-simple-access': 7.20.2 + '@babel/helper-split-export-declaration': 7.18.6 + '@babel/helper-validator-identifier': 7.19.1 + '@babel/template': 7.20.7 + '@babel/traverse': 7.21.4 + '@babel/types': 7.21.4 + transitivePeerDependencies: + - supports-color /@babel/helper-optimise-call-expression@7.18.6: resolution: {integrity: sha512-HP59oD9/fEHQkdcbgFCnbmgH5vIQTJbxh2yf+CdM89/glUNnuzr87Q8GIjGEnOktTROemO0Pe0iPAYbqZuOUiA==} @@ -876,13 +984,13 @@ packages: resolution: {integrity: sha512-8RvlJG2mj4huQ4pZ+rU9lqKi9ZKiRmuvGuM2HlWmkmgOhbs6zEAw6IEiJ5cQqGbDzGZOhwuOQNtZMi/ENLjZoQ==} engines: {node: '>=6.9.0'} - /@babel/helper-remap-async-to-generator@7.18.9(@babel/core@7.20.2): + /@babel/helper-remap-async-to-generator@7.18.9(@babel/core@7.21.4): resolution: {integrity: sha512-dI7q50YKd8BAv3VEfgg7PS7yD3Rtbi2J1XMXaalXO0W0164hYLnh8zpjRS0mte9MfVp/tltvr/cfdXPvJr1opA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.20.2 + '@babel/core': 7.21.4 '@babel/helper-annotate-as-pure': 7.18.6 '@babel/helper-environment-visitor': 7.18.9 '@babel/helper-wrap-function': 7.19.0 @@ -935,6 +1043,10 @@ packages: resolution: {integrity: sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw==} engines: {node: '>=6.9.0'} + /@babel/helper-validator-option@7.21.0: + resolution: {integrity: sha512-rmL/B8/f0mKS2baE9ZpyTcTavvEuWhTTW8amjzXNvYG4AwBsqTLikfXsEofsJEfKHf+HQVQbFOHy6o+4cnC/fQ==} + engines: {node: '>=6.9.0'} + /@babel/helper-wrap-function@7.19.0: resolution: {integrity: sha512-txX8aN8CZyYGTwcLhlk87KRqncAzhh5TpQamZUa0/u3an36NtDpUP6bQgBCBcLeBs09R/OwQu3OjK0k/HwfNDg==} engines: {node: '>=6.9.0'} @@ -956,6 +1068,17 @@ packages: '@babel/types': 7.20.2 transitivePeerDependencies: - supports-color + dev: true + + /@babel/helpers@7.21.0: + resolution: {integrity: sha512-XXve0CBtOW0pd7MRzzmoyuSj0e3SEzj8pgyFxnTT1NJZL38BD1MK7yYrm8yefRPIDvNNe14xR4FdbHwpInD4rA==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/template': 7.20.7 + '@babel/traverse': 7.21.4 + '@babel/types': 7.21.4 + transitivePeerDependencies: + - supports-color /@babel/highlight@7.18.6: resolution: {integrity: sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==} @@ -971,218 +1094,218 @@ packages: hasBin: true dependencies: '@babel/types': 7.20.2 + dev: true - /@babel/parser@7.21.2: - resolution: {integrity: sha512-URpaIJQwEkEC2T9Kn+Ai6Xe/02iNaVCuT/PtoRz3GPVJVDpPd7mLo+VddTbhCRU9TXqW5mSrQfXZyi8kDKOVpQ==} + /@babel/parser@7.21.4: + resolution: {integrity: sha512-alVJj7k7zIxqBZ7BTRhz0IqJFxW1VJbm6N8JbcYhQ186df9ZBPbZBmWSqAMXwHGsCJdYks7z/voa3ibiS5bCIw==} engines: {node: '>=6.0.0'} hasBin: true dependencies: - '@babel/types': 7.21.2 - dev: true + '@babel/types': 7.21.4 - /@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.18.6(@babel/core@7.20.2): + /@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.18.6(@babel/core@7.21.4): resolution: {integrity: sha512-Dgxsyg54Fx1d4Nge8UnvTrED63vrwOdPmyvPzlNN/boaliRP54pm3pGzZD1SJUwrBA+Cs/xdG8kXX6Mn/RfISQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.20.2 + '@babel/core': 7.21.4 '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.18.9(@babel/core@7.20.2): + /@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.18.9(@babel/core@7.21.4): resolution: {integrity: sha512-AHrP9jadvH7qlOj6PINbgSuphjQUAK7AOT7DPjBo9EHoLhQTnnK5u45e1Hd4DbSQEO9nqPWtQ89r+XEOWFScKg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.13.0 dependencies: - '@babel/core': 7.20.2 + '@babel/core': 7.21.4 '@babel/helper-plugin-utils': 7.20.2 '@babel/helper-skip-transparent-expression-wrappers': 7.20.0 - '@babel/plugin-proposal-optional-chaining': 7.18.9(@babel/core@7.20.2) + '@babel/plugin-proposal-optional-chaining': 7.18.9(@babel/core@7.21.4) dev: true - /@babel/plugin-proposal-async-generator-functions@7.20.1(@babel/core@7.20.2): + /@babel/plugin-proposal-async-generator-functions@7.20.1(@babel/core@7.21.4): resolution: {integrity: sha512-Gh5rchzSwE4kC+o/6T8waD0WHEQIsDmjltY8WnWRXHUdH8axZhuH86Ov9M72YhJfDrZseQwuuWaaIT/TmePp3g==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.20.2 + '@babel/core': 7.21.4 '@babel/helper-environment-visitor': 7.18.9 '@babel/helper-plugin-utils': 7.20.2 - '@babel/helper-remap-async-to-generator': 7.18.9(@babel/core@7.20.2) - '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.20.2) + '@babel/helper-remap-async-to-generator': 7.18.9(@babel/core@7.21.4) + '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.21.4) transitivePeerDependencies: - supports-color dev: true - /@babel/plugin-proposal-class-properties@7.18.6(@babel/core@7.20.2): + /@babel/plugin-proposal-class-properties@7.18.6(@babel/core@7.21.4): resolution: {integrity: sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.20.2 - '@babel/helper-create-class-features-plugin': 7.20.2(@babel/core@7.20.2) + '@babel/core': 7.21.4 + '@babel/helper-create-class-features-plugin': 7.20.2(@babel/core@7.21.4) '@babel/helper-plugin-utils': 7.20.2 transitivePeerDependencies: - supports-color dev: true - /@babel/plugin-proposal-class-static-block@7.18.6(@babel/core@7.20.2): + /@babel/plugin-proposal-class-static-block@7.18.6(@babel/core@7.21.4): resolution: {integrity: sha512-+I3oIiNxrCpup3Gi8n5IGMwj0gOCAjcJUSQEcotNnCCPMEnixawOQ+KeJPlgfjzx+FKQ1QSyZOWe7wmoJp7vhw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.12.0 dependencies: - '@babel/core': 7.20.2 - '@babel/helper-create-class-features-plugin': 7.20.2(@babel/core@7.20.2) + '@babel/core': 7.21.4 + '@babel/helper-create-class-features-plugin': 7.20.2(@babel/core@7.21.4) '@babel/helper-plugin-utils': 7.20.2 - '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.20.2) + '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.21.4) transitivePeerDependencies: - supports-color dev: true - /@babel/plugin-proposal-dynamic-import@7.18.6(@babel/core@7.20.2): + /@babel/plugin-proposal-dynamic-import@7.18.6(@babel/core@7.21.4): resolution: {integrity: sha512-1auuwmK+Rz13SJj36R+jqFPMJWyKEDd7lLSdOj4oJK0UTgGueSAtkrCvz9ewmgyU/P941Rv2fQwZJN8s6QruXw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.20.2 + '@babel/core': 7.21.4 '@babel/helper-plugin-utils': 7.20.2 - '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.20.2) + '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.21.4) dev: true - /@babel/plugin-proposal-export-namespace-from@7.18.9(@babel/core@7.20.2): + /@babel/plugin-proposal-export-namespace-from@7.18.9(@babel/core@7.21.4): resolution: {integrity: sha512-k1NtHyOMvlDDFeb9G5PhUXuGj8m/wiwojgQVEhJ/fsVsMCpLyOP4h0uGEjYJKrRI+EVPlb5Jk+Gt9P97lOGwtA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.20.2 + '@babel/core': 7.21.4 '@babel/helper-plugin-utils': 7.20.2 - '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.20.2) + '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.21.4) dev: true - /@babel/plugin-proposal-json-strings@7.18.6(@babel/core@7.20.2): + /@babel/plugin-proposal-json-strings@7.18.6(@babel/core@7.21.4): resolution: {integrity: sha512-lr1peyn9kOdbYc0xr0OdHTZ5FMqS6Di+H0Fz2I/JwMzGmzJETNeOFq2pBySw6X/KFL5EWDjlJuMsUGRFb8fQgQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.20.2 + '@babel/core': 7.21.4 '@babel/helper-plugin-utils': 7.20.2 - '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.20.2) + '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.21.4) dev: true - /@babel/plugin-proposal-logical-assignment-operators@7.18.9(@babel/core@7.20.2): + /@babel/plugin-proposal-logical-assignment-operators@7.18.9(@babel/core@7.21.4): resolution: {integrity: sha512-128YbMpjCrP35IOExw2Fq+x55LMP42DzhOhX2aNNIdI9avSWl2PI0yuBWarr3RYpZBSPtabfadkH2yeRiMD61Q==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.20.2 + '@babel/core': 7.21.4 '@babel/helper-plugin-utils': 7.20.2 - '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.20.2) + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.21.4) dev: true - /@babel/plugin-proposal-nullish-coalescing-operator@7.18.6(@babel/core@7.20.2): + /@babel/plugin-proposal-nullish-coalescing-operator@7.18.6(@babel/core@7.21.4): resolution: {integrity: sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.20.2 + '@babel/core': 7.21.4 '@babel/helper-plugin-utils': 7.20.2 - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.20.2) + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.21.4) dev: true - /@babel/plugin-proposal-numeric-separator@7.18.6(@babel/core@7.20.2): + /@babel/plugin-proposal-numeric-separator@7.18.6(@babel/core@7.21.4): resolution: {integrity: sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.20.2 + '@babel/core': 7.21.4 '@babel/helper-plugin-utils': 7.20.2 - '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.20.2) + '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.21.4) dev: true - /@babel/plugin-proposal-object-rest-spread@7.20.2(@babel/core@7.20.2): + /@babel/plugin-proposal-object-rest-spread@7.20.2(@babel/core@7.21.4): resolution: {integrity: sha512-Ks6uej9WFK+fvIMesSqbAto5dD8Dz4VuuFvGJFKgIGSkJuRGcrwGECPA1fDgQK3/DbExBJpEkTeYeB8geIFCSQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: '@babel/compat-data': 7.20.1 - '@babel/core': 7.20.2 - '@babel/helper-compilation-targets': 7.20.0(@babel/core@7.20.2) + '@babel/core': 7.21.4 + '@babel/helper-compilation-targets': 7.20.0(@babel/core@7.21.4) '@babel/helper-plugin-utils': 7.20.2 - '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.20.2) - '@babel/plugin-transform-parameters': 7.20.3(@babel/core@7.20.2) + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.21.4) + '@babel/plugin-transform-parameters': 7.20.3(@babel/core@7.21.4) dev: true - /@babel/plugin-proposal-optional-catch-binding@7.18.6(@babel/core@7.20.2): + /@babel/plugin-proposal-optional-catch-binding@7.18.6(@babel/core@7.21.4): resolution: {integrity: sha512-Q40HEhs9DJQyaZfUjjn6vE8Cv4GmMHCYuMGIWUnlxH6400VGxOuwWsPt4FxXxJkC/5eOzgn0z21M9gMT4MOhbw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.20.2 + '@babel/core': 7.21.4 '@babel/helper-plugin-utils': 7.20.2 - '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.20.2) + '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.21.4) dev: true - /@babel/plugin-proposal-optional-chaining@7.18.9(@babel/core@7.20.2): + /@babel/plugin-proposal-optional-chaining@7.18.9(@babel/core@7.21.4): resolution: {integrity: sha512-v5nwt4IqBXihxGsW2QmCWMDS3B3bzGIk/EQVZz2ei7f3NJl8NzAJVvUmpDW5q1CRNY+Beb/k58UAH1Km1N411w==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.20.2 + '@babel/core': 7.21.4 '@babel/helper-plugin-utils': 7.20.2 '@babel/helper-skip-transparent-expression-wrappers': 7.20.0 - '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.20.2) + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.21.4) dev: true - /@babel/plugin-proposal-private-methods@7.18.6(@babel/core@7.20.2): + /@babel/plugin-proposal-private-methods@7.18.6(@babel/core@7.21.4): resolution: {integrity: sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.20.2 - '@babel/helper-create-class-features-plugin': 7.20.2(@babel/core@7.20.2) + '@babel/core': 7.21.4 + '@babel/helper-create-class-features-plugin': 7.20.2(@babel/core@7.21.4) '@babel/helper-plugin-utils': 7.20.2 transitivePeerDependencies: - supports-color dev: true - /@babel/plugin-proposal-private-property-in-object@7.18.6(@babel/core@7.20.2): + /@babel/plugin-proposal-private-property-in-object@7.18.6(@babel/core@7.21.4): resolution: {integrity: sha512-9Rysx7FOctvT5ouj5JODjAFAkgGoudQuLPamZb0v1TGLpapdNaftzifU8NTWQm0IRjqoYypdrSmyWgkocDQ8Dw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.20.2 + '@babel/core': 7.21.4 '@babel/helper-annotate-as-pure': 7.18.6 - '@babel/helper-create-class-features-plugin': 7.20.2(@babel/core@7.20.2) + '@babel/helper-create-class-features-plugin': 7.20.2(@babel/core@7.21.4) '@babel/helper-plugin-utils': 7.20.2 - '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.20.2) + '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.21.4) transitivePeerDependencies: - supports-color dev: true - /@babel/plugin-proposal-unicode-property-regex@7.18.6(@babel/core@7.20.2): + /@babel/plugin-proposal-unicode-property-regex@7.18.6(@babel/core@7.21.4): resolution: {integrity: sha512-2BShG/d5yoZyXZfVePH91urL5wTG6ASZU9M4o03lKK8u8UW1y08OMttBSOADTcJrnPMpvDXRG3G8fyLh4ovs8w==} engines: {node: '>=4'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.20.2 - '@babel/helper-create-regexp-features-plugin': 7.19.0(@babel/core@7.20.2) + '@babel/core': 7.21.4 + '@babel/helper-create-regexp-features-plugin': 7.19.0(@babel/core@7.21.4) '@babel/helper-plugin-utils': 7.20.2 dev: true @@ -1195,6 +1318,15 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true + /@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.21.4): + resolution: {integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.4 + '@babel/helper-plugin-utils': 7.20.2 + dev: true + /@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.20.2): resolution: {integrity: sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==} peerDependencies: @@ -1204,6 +1336,15 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true + /@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.21.4): + resolution: {integrity: sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.4 + '@babel/helper-plugin-utils': 7.20.2 + dev: true + /@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.20.2): resolution: {integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==} peerDependencies: @@ -1213,41 +1354,50 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.20.2): + /@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.21.4): + resolution: {integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.4 + '@babel/helper-plugin-utils': 7.20.2 + dev: true + + /@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.21.4): resolution: {integrity: sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.20.2 + '@babel/core': 7.21.4 '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-syntax-dynamic-import@7.8.3(@babel/core@7.20.2): + /@babel/plugin-syntax-dynamic-import@7.8.3(@babel/core@7.21.4): resolution: {integrity: sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.20.2 + '@babel/core': 7.21.4 '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-syntax-export-namespace-from@7.8.3(@babel/core@7.20.2): + /@babel/plugin-syntax-export-namespace-from@7.8.3(@babel/core@7.21.4): resolution: {integrity: sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.20.2 + '@babel/core': 7.21.4 '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-syntax-import-assertions@7.20.0(@babel/core@7.20.2): + /@babel/plugin-syntax-import-assertions@7.20.0(@babel/core@7.21.4): resolution: {integrity: sha512-IUh1vakzNoWalR8ch/areW7qFopR2AEw03JlG7BbrDqmQ4X3q9uuipQwSGrUn7oGiemKjtSLDhNtQHzMHr1JdQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.20.2 + '@babel/core': 7.21.4 '@babel/helper-plugin-utils': 7.20.2 dev: true @@ -1260,6 +1410,15 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true + /@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.21.4): + resolution: {integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.4 + '@babel/helper-plugin-utils': 7.20.2 + dev: true + /@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.20.2): resolution: {integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==} peerDependencies: @@ -1269,6 +1428,15 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true + /@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.21.4): + resolution: {integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.4 + '@babel/helper-plugin-utils': 7.20.2 + dev: true + /@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.20.2): resolution: {integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==} peerDependencies: @@ -1278,6 +1446,15 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true + /@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.21.4): + resolution: {integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.4 + '@babel/helper-plugin-utils': 7.20.2 + dev: true + /@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.20.2): resolution: {integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==} peerDependencies: @@ -1287,6 +1464,15 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true + /@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.21.4): + resolution: {integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.4 + '@babel/helper-plugin-utils': 7.20.2 + dev: true + /@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.20.2): resolution: {integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==} peerDependencies: @@ -1296,6 +1482,15 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true + /@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.21.4): + resolution: {integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.4 + '@babel/helper-plugin-utils': 7.20.2 + dev: true + /@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.20.2): resolution: {integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==} peerDependencies: @@ -1305,6 +1500,15 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true + /@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.21.4): + resolution: {integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.4 + '@babel/helper-plugin-utils': 7.20.2 + dev: true + /@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.20.2): resolution: {integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==} peerDependencies: @@ -1314,6 +1518,15 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true + /@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.21.4): + resolution: {integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.4 + '@babel/helper-plugin-utils': 7.20.2 + dev: true + /@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.20.2): resolution: {integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==} peerDependencies: @@ -1323,13 +1536,22 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.20.2): + /@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.21.4): + resolution: {integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.4 + '@babel/helper-plugin-utils': 7.20.2 + dev: true + + /@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.21.4): resolution: {integrity: sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.20.2 + '@babel/core': 7.21.4 '@babel/helper-plugin-utils': 7.20.2 dev: true @@ -1343,6 +1565,16 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true + /@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.21.4): + resolution: {integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.4 + '@babel/helper-plugin-utils': 7.20.2 + dev: true + /@babel/plugin-syntax-typescript@7.20.0(@babel/core@7.20.2): resolution: {integrity: sha512-rd9TkG+u1CExzS4SM1BlMEhMXwFLKVjOAFFCDx9PbX5ycJWDoWMcwdJH9RhkPu1dOgn5TrxLot/Gx6lWFuAUNQ==} engines: {node: '>=6.9.0'} @@ -1353,59 +1585,59 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-transform-arrow-functions@7.18.6(@babel/core@7.20.2): + /@babel/plugin-transform-arrow-functions@7.18.6(@babel/core@7.21.4): resolution: {integrity: sha512-9S9X9RUefzrsHZmKMbDXxweEH+YlE8JJEuat9FdvW9Qh1cw7W64jELCtWNkPBPX5En45uy28KGvA/AySqUh8CQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.20.2 + '@babel/core': 7.21.4 '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-transform-async-to-generator@7.18.6(@babel/core@7.20.2): + /@babel/plugin-transform-async-to-generator@7.18.6(@babel/core@7.21.4): resolution: {integrity: sha512-ARE5wZLKnTgPW7/1ftQmSi1CmkqqHo2DNmtztFhvgtOWSDfq0Cq9/9L+KnZNYSNrydBekhW3rwShduf59RoXag==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.20.2 + '@babel/core': 7.21.4 '@babel/helper-module-imports': 7.18.6 '@babel/helper-plugin-utils': 7.20.2 - '@babel/helper-remap-async-to-generator': 7.18.9(@babel/core@7.20.2) + '@babel/helper-remap-async-to-generator': 7.18.9(@babel/core@7.21.4) transitivePeerDependencies: - supports-color dev: true - /@babel/plugin-transform-block-scoped-functions@7.18.6(@babel/core@7.20.2): + /@babel/plugin-transform-block-scoped-functions@7.18.6(@babel/core@7.21.4): resolution: {integrity: sha512-ExUcOqpPWnliRcPqves5HJcJOvHvIIWfuS4sroBUenPuMdmW+SMHDakmtS7qOo13sVppmUijqeTv7qqGsvURpQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.20.2 + '@babel/core': 7.21.4 '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-transform-block-scoping@7.20.2(@babel/core@7.20.2): + /@babel/plugin-transform-block-scoping@7.20.2(@babel/core@7.21.4): resolution: {integrity: sha512-y5V15+04ry69OV2wULmwhEA6jwSWXO1TwAtIwiPXcvHcoOQUqpyMVd2bDsQJMW8AurjulIyUV8kDqtjSwHy1uQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.20.2 + '@babel/core': 7.21.4 '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-transform-classes@7.20.2(@babel/core@7.20.2): + /@babel/plugin-transform-classes@7.20.2(@babel/core@7.21.4): resolution: {integrity: sha512-9rbPp0lCVVoagvtEyQKSo5L8oo0nQS/iif+lwlAz29MccX2642vWDlSZK+2T2buxbopotId2ld7zZAzRfz9j1g==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.20.2 + '@babel/core': 7.21.4 '@babel/helper-annotate-as-pure': 7.18.6 - '@babel/helper-compilation-targets': 7.20.0(@babel/core@7.20.2) + '@babel/helper-compilation-targets': 7.20.0(@babel/core@7.21.4) '@babel/helper-environment-visitor': 7.18.9 '@babel/helper-function-name': 7.19.0 '@babel/helper-optimise-call-expression': 7.18.6 @@ -1417,120 +1649,120 @@ packages: - supports-color dev: true - /@babel/plugin-transform-computed-properties@7.18.9(@babel/core@7.20.2): + /@babel/plugin-transform-computed-properties@7.18.9(@babel/core@7.21.4): resolution: {integrity: sha512-+i0ZU1bCDymKakLxn5srGHrsAPRELC2WIbzwjLhHW9SIE1cPYkLCL0NlnXMZaM1vhfgA2+M7hySk42VBvrkBRw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.20.2 + '@babel/core': 7.21.4 '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-transform-destructuring@7.20.2(@babel/core@7.20.2): + /@babel/plugin-transform-destructuring@7.20.2(@babel/core@7.21.4): resolution: {integrity: sha512-mENM+ZHrvEgxLTBXUiQ621rRXZes3KWUv6NdQlrnr1TkWVw+hUjQBZuP2X32qKlrlG2BzgR95gkuCRSkJl8vIw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.20.2 + '@babel/core': 7.21.4 '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-transform-dotall-regex@7.18.6(@babel/core@7.20.2): + /@babel/plugin-transform-dotall-regex@7.18.6(@babel/core@7.21.4): resolution: {integrity: sha512-6S3jpun1eEbAxq7TdjLotAsl4WpQI9DxfkycRcKrjhQYzU87qpXdknpBg/e+TdcMehqGnLFi7tnFUBR02Vq6wg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.20.2 - '@babel/helper-create-regexp-features-plugin': 7.19.0(@babel/core@7.20.2) + '@babel/core': 7.21.4 + '@babel/helper-create-regexp-features-plugin': 7.19.0(@babel/core@7.21.4) '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-transform-duplicate-keys@7.18.9(@babel/core@7.20.2): + /@babel/plugin-transform-duplicate-keys@7.18.9(@babel/core@7.21.4): resolution: {integrity: sha512-d2bmXCtZXYc59/0SanQKbiWINadaJXqtvIQIzd4+hNwkWBgyCd5F/2t1kXoUdvPMrxzPvhK6EMQRROxsue+mfw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.20.2 + '@babel/core': 7.21.4 '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-transform-exponentiation-operator@7.18.6(@babel/core@7.20.2): + /@babel/plugin-transform-exponentiation-operator@7.18.6(@babel/core@7.21.4): resolution: {integrity: sha512-wzEtc0+2c88FVR34aQmiz56dxEkxr2g8DQb/KfaFa1JYXOFVsbhvAonFN6PwVWj++fKmku8NP80plJ5Et4wqHw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.20.2 + '@babel/core': 7.21.4 '@babel/helper-builder-binary-assignment-operator-visitor': 7.18.9 '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-transform-for-of@7.18.8(@babel/core@7.20.2): + /@babel/plugin-transform-for-of@7.18.8(@babel/core@7.21.4): resolution: {integrity: sha512-yEfTRnjuskWYo0k1mHUqrVWaZwrdq8AYbfrpqULOJOaucGSp4mNMVps+YtA8byoevxS/urwU75vyhQIxcCgiBQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.20.2 + '@babel/core': 7.21.4 '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-transform-function-name@7.18.9(@babel/core@7.20.2): + /@babel/plugin-transform-function-name@7.18.9(@babel/core@7.21.4): resolution: {integrity: sha512-WvIBoRPaJQ5yVHzcnJFor7oS5Ls0PYixlTYE63lCj2RtdQEl15M68FXQlxnG6wdraJIXRdR7KI+hQ7q/9QjrCQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.20.2 - '@babel/helper-compilation-targets': 7.20.0(@babel/core@7.20.2) + '@babel/core': 7.21.4 + '@babel/helper-compilation-targets': 7.20.0(@babel/core@7.21.4) '@babel/helper-function-name': 7.19.0 '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-transform-literals@7.18.9(@babel/core@7.20.2): + /@babel/plugin-transform-literals@7.18.9(@babel/core@7.21.4): resolution: {integrity: sha512-IFQDSRoTPnrAIrI5zoZv73IFeZu2dhu6irxQjY9rNjTT53VmKg9fenjvoiOWOkJ6mm4jKVPtdMzBY98Fp4Z4cg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.20.2 + '@babel/core': 7.21.4 '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-transform-member-expression-literals@7.18.6(@babel/core@7.20.2): + /@babel/plugin-transform-member-expression-literals@7.18.6(@babel/core@7.21.4): resolution: {integrity: sha512-qSF1ihLGO3q+/g48k85tUjD033C29TNTVB2paCwZPVmOsjn9pClvYYrM2VeJpBY2bcNkuny0YUyTNRyRxJ54KA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.20.2 + '@babel/core': 7.21.4 '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-transform-modules-amd@7.19.6(@babel/core@7.20.2): + /@babel/plugin-transform-modules-amd@7.19.6(@babel/core@7.21.4): resolution: {integrity: sha512-uG3od2mXvAtIFQIh0xrpLH6r5fpSQN04gIVovl+ODLdUMANokxQLZnPBHcjmv3GxRjnqwLuHvppjjcelqUFZvg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.20.2 + '@babel/core': 7.21.4 '@babel/helper-module-transforms': 7.20.2 '@babel/helper-plugin-utils': 7.20.2 transitivePeerDependencies: - supports-color dev: true - /@babel/plugin-transform-modules-commonjs@7.19.6(@babel/core@7.20.2): + /@babel/plugin-transform-modules-commonjs@7.19.6(@babel/core@7.21.4): resolution: {integrity: sha512-8PIa1ym4XRTKuSsOUXqDG0YaOlEuTVvHMe5JCfgBMOtHvJKw/4NGovEGN33viISshG/rZNVrACiBmPQLvWN8xQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.20.2 + '@babel/core': 7.21.4 '@babel/helper-module-transforms': 7.20.2 '@babel/helper-plugin-utils': 7.20.2 '@babel/helper-simple-access': 7.20.2 @@ -1538,13 +1770,13 @@ packages: - supports-color dev: true - /@babel/plugin-transform-modules-systemjs@7.19.6(@babel/core@7.20.2): + /@babel/plugin-transform-modules-systemjs@7.19.6(@babel/core@7.21.4): resolution: {integrity: sha512-fqGLBepcc3kErfR9R3DnVpURmckXP7gj7bAlrTQyBxrigFqszZCkFkcoxzCp2v32XmwXLvbw+8Yq9/b+QqksjQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.20.2 + '@babel/core': 7.21.4 '@babel/helper-hoist-variables': 7.18.6 '@babel/helper-module-transforms': 7.20.2 '@babel/helper-plugin-utils': 7.20.2 @@ -1553,278 +1785,278 @@ packages: - supports-color dev: true - /@babel/plugin-transform-modules-umd@7.18.6(@babel/core@7.20.2): + /@babel/plugin-transform-modules-umd@7.18.6(@babel/core@7.21.4): resolution: {integrity: sha512-dcegErExVeXcRqNtkRU/z8WlBLnvD4MRnHgNs3MytRO1Mn1sHRyhbcpYbVMGclAqOjdW+9cfkdZno9dFdfKLfQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.20.2 + '@babel/core': 7.21.4 '@babel/helper-module-transforms': 7.20.2 '@babel/helper-plugin-utils': 7.20.2 transitivePeerDependencies: - supports-color dev: true - /@babel/plugin-transform-named-capturing-groups-regex@7.19.1(@babel/core@7.20.2): + /@babel/plugin-transform-named-capturing-groups-regex@7.19.1(@babel/core@7.21.4): resolution: {integrity: sha512-oWk9l9WItWBQYS4FgXD4Uyy5kq898lvkXpXQxoJEY1RnvPk4R/Dvu2ebXU9q8lP+rlMwUQTFf2Ok6d78ODa0kw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.20.2 - '@babel/helper-create-regexp-features-plugin': 7.19.0(@babel/core@7.20.2) + '@babel/core': 7.21.4 + '@babel/helper-create-regexp-features-plugin': 7.19.0(@babel/core@7.21.4) '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-transform-new-target@7.18.6(@babel/core@7.20.2): + /@babel/plugin-transform-new-target@7.18.6(@babel/core@7.21.4): resolution: {integrity: sha512-DjwFA/9Iu3Z+vrAn+8pBUGcjhxKguSMlsFqeCKbhb9BAV756v0krzVK04CRDi/4aqmk8BsHb4a/gFcaA5joXRw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.20.2 + '@babel/core': 7.21.4 '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-transform-object-super@7.18.6(@babel/core@7.20.2): + /@babel/plugin-transform-object-super@7.18.6(@babel/core@7.21.4): resolution: {integrity: sha512-uvGz6zk+pZoS1aTZrOvrbj6Pp/kK2mp45t2B+bTDre2UgsZZ8EZLSJtUg7m/no0zOJUWgFONpB7Zv9W2tSaFlA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.20.2 + '@babel/core': 7.21.4 '@babel/helper-plugin-utils': 7.20.2 '@babel/helper-replace-supers': 7.19.1 transitivePeerDependencies: - supports-color dev: true - /@babel/plugin-transform-parameters@7.20.3(@babel/core@7.20.2): + /@babel/plugin-transform-parameters@7.20.3(@babel/core@7.21.4): resolution: {integrity: sha512-oZg/Fpx0YDrj13KsLyO8I/CX3Zdw7z0O9qOd95SqcoIzuqy/WTGWvePeHAnZCN54SfdyjHcb1S30gc8zlzlHcA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.20.2 + '@babel/core': 7.21.4 '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-transform-property-literals@7.18.6(@babel/core@7.20.2): + /@babel/plugin-transform-property-literals@7.18.6(@babel/core@7.21.4): resolution: {integrity: sha512-cYcs6qlgafTud3PAzrrRNbQtfpQ8+y/+M5tKmksS9+M1ckbH6kzY8MrexEM9mcA6JDsukE19iIRvAyYl463sMg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.20.2 + '@babel/core': 7.21.4 '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-transform-regenerator@7.18.6(@babel/core@7.20.2): + /@babel/plugin-transform-regenerator@7.18.6(@babel/core@7.21.4): resolution: {integrity: sha512-poqRI2+qiSdeldcz4wTSTXBRryoq3Gc70ye7m7UD5Ww0nE29IXqMl6r7Nd15WBgRd74vloEMlShtH6CKxVzfmQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.20.2 + '@babel/core': 7.21.4 '@babel/helper-plugin-utils': 7.20.2 regenerator-transform: 0.15.1 dev: true - /@babel/plugin-transform-reserved-words@7.18.6(@babel/core@7.20.2): + /@babel/plugin-transform-reserved-words@7.18.6(@babel/core@7.21.4): resolution: {integrity: sha512-oX/4MyMoypzHjFrT1CdivfKZ+XvIPMFXwwxHp/r0Ddy2Vuomt4HDFGmft1TAY2yiTKiNSsh3kjBAzcM8kSdsjA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.20.2 + '@babel/core': 7.21.4 '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-transform-runtime@7.19.6(@babel/core@7.20.2): + /@babel/plugin-transform-runtime@7.19.6(@babel/core@7.21.4): resolution: {integrity: sha512-PRH37lz4JU156lYFW1p8OxE5i7d6Sl/zV58ooyr+q1J1lnQPyg5tIiXlIwNVhJaY4W3TmOtdc8jqdXQcB1v5Yw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.20.2 + '@babel/core': 7.21.4 '@babel/helper-module-imports': 7.18.6 '@babel/helper-plugin-utils': 7.20.2 - babel-plugin-polyfill-corejs2: 0.3.3(@babel/core@7.20.2) - babel-plugin-polyfill-corejs3: 0.6.0(@babel/core@7.20.2) - babel-plugin-polyfill-regenerator: 0.4.1(@babel/core@7.20.2) + babel-plugin-polyfill-corejs2: 0.3.3(@babel/core@7.21.4) + babel-plugin-polyfill-corejs3: 0.6.0(@babel/core@7.21.4) + babel-plugin-polyfill-regenerator: 0.4.1(@babel/core@7.21.4) semver: 6.3.0 transitivePeerDependencies: - supports-color dev: false - /@babel/plugin-transform-shorthand-properties@7.18.6(@babel/core@7.20.2): + /@babel/plugin-transform-shorthand-properties@7.18.6(@babel/core@7.21.4): resolution: {integrity: sha512-eCLXXJqv8okzg86ywZJbRn19YJHU4XUa55oz2wbHhaQVn/MM+XhukiT7SYqp/7o00dg52Rj51Ny+Ecw4oyoygw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.20.2 + '@babel/core': 7.21.4 '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-transform-spread@7.19.0(@babel/core@7.20.2): + /@babel/plugin-transform-spread@7.19.0(@babel/core@7.21.4): resolution: {integrity: sha512-RsuMk7j6n+r752EtzyScnWkQyuJdli6LdO5Klv8Yx0OfPVTcQkIUfS8clx5e9yHXzlnhOZF3CbQ8C2uP5j074w==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.20.2 + '@babel/core': 7.21.4 '@babel/helper-plugin-utils': 7.20.2 '@babel/helper-skip-transparent-expression-wrappers': 7.20.0 dev: true - /@babel/plugin-transform-sticky-regex@7.18.6(@babel/core@7.20.2): + /@babel/plugin-transform-sticky-regex@7.18.6(@babel/core@7.21.4): resolution: {integrity: sha512-kfiDrDQ+PBsQDO85yj1icueWMfGfJFKN1KCkndygtu/C9+XUfydLC8Iv5UYJqRwy4zk8EcplRxEOeLyjq1gm6Q==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.20.2 + '@babel/core': 7.21.4 '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-transform-template-literals@7.18.9(@babel/core@7.20.2): + /@babel/plugin-transform-template-literals@7.18.9(@babel/core@7.21.4): resolution: {integrity: sha512-S8cOWfT82gTezpYOiVaGHrCbhlHgKhQt8XH5ES46P2XWmX92yisoZywf5km75wv5sYcXDUCLMmMxOLCtthDgMA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.20.2 + '@babel/core': 7.21.4 '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-transform-typeof-symbol@7.18.9(@babel/core@7.20.2): + /@babel/plugin-transform-typeof-symbol@7.18.9(@babel/core@7.21.4): resolution: {integrity: sha512-SRfwTtF11G2aemAZWivL7PD+C9z52v9EvMqH9BuYbabyPuKUvSWks3oCg6041pT925L4zVFqaVBeECwsmlguEw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.20.2 + '@babel/core': 7.21.4 '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-transform-unicode-escapes@7.18.10(@babel/core@7.20.2): + /@babel/plugin-transform-unicode-escapes@7.18.10(@babel/core@7.21.4): resolution: {integrity: sha512-kKAdAI+YzPgGY/ftStBFXTI1LZFju38rYThnfMykS+IXy8BVx+res7s2fxf1l8I35DV2T97ezo6+SGrXz6B3iQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.20.2 + '@babel/core': 7.21.4 '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-transform-unicode-regex@7.18.6(@babel/core@7.20.2): + /@babel/plugin-transform-unicode-regex@7.18.6(@babel/core@7.21.4): resolution: {integrity: sha512-gE7A6Lt7YLnNOL3Pb9BNeZvi+d8l7tcRrG4+pwJjK9hD2xX4mEvjlQW60G9EEmfXVYRPv9VRQcyegIVHCql/AA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.20.2 - '@babel/helper-create-regexp-features-plugin': 7.19.0(@babel/core@7.20.2) + '@babel/core': 7.21.4 + '@babel/helper-create-regexp-features-plugin': 7.19.0(@babel/core@7.21.4) '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/preset-env@7.20.2(@babel/core@7.20.2): + /@babel/preset-env@7.20.2(@babel/core@7.21.4): resolution: {integrity: sha512-1G0efQEWR1EHkKvKHqbG+IN/QdgwfByUpM5V5QroDzGV2t3S/WXNQd693cHiHTlCFMpr9B6FkPFXDA2lQcKoDg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: '@babel/compat-data': 7.20.1 - '@babel/core': 7.20.2 - '@babel/helper-compilation-targets': 7.20.0(@babel/core@7.20.2) + '@babel/core': 7.21.4 + '@babel/helper-compilation-targets': 7.20.0(@babel/core@7.21.4) '@babel/helper-plugin-utils': 7.20.2 '@babel/helper-validator-option': 7.18.6 - '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.18.6(@babel/core@7.20.2) - '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.18.9(@babel/core@7.20.2) - '@babel/plugin-proposal-async-generator-functions': 7.20.1(@babel/core@7.20.2) - '@babel/plugin-proposal-class-properties': 7.18.6(@babel/core@7.20.2) - '@babel/plugin-proposal-class-static-block': 7.18.6(@babel/core@7.20.2) - '@babel/plugin-proposal-dynamic-import': 7.18.6(@babel/core@7.20.2) - '@babel/plugin-proposal-export-namespace-from': 7.18.9(@babel/core@7.20.2) - '@babel/plugin-proposal-json-strings': 7.18.6(@babel/core@7.20.2) - '@babel/plugin-proposal-logical-assignment-operators': 7.18.9(@babel/core@7.20.2) - '@babel/plugin-proposal-nullish-coalescing-operator': 7.18.6(@babel/core@7.20.2) - '@babel/plugin-proposal-numeric-separator': 7.18.6(@babel/core@7.20.2) - '@babel/plugin-proposal-object-rest-spread': 7.20.2(@babel/core@7.20.2) - '@babel/plugin-proposal-optional-catch-binding': 7.18.6(@babel/core@7.20.2) - '@babel/plugin-proposal-optional-chaining': 7.18.9(@babel/core@7.20.2) - '@babel/plugin-proposal-private-methods': 7.18.6(@babel/core@7.20.2) - '@babel/plugin-proposal-private-property-in-object': 7.18.6(@babel/core@7.20.2) - '@babel/plugin-proposal-unicode-property-regex': 7.18.6(@babel/core@7.20.2) - '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.20.2) - '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.20.2) - '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.20.2) - '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.20.2) - '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.20.2) - '@babel/plugin-syntax-import-assertions': 7.20.0(@babel/core@7.20.2) - '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.20.2) - '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.20.2) - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.20.2) - '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.20.2) - '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.20.2) - '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.20.2) - '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.20.2) - '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.20.2) - '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.20.2) - '@babel/plugin-transform-arrow-functions': 7.18.6(@babel/core@7.20.2) - '@babel/plugin-transform-async-to-generator': 7.18.6(@babel/core@7.20.2) - '@babel/plugin-transform-block-scoped-functions': 7.18.6(@babel/core@7.20.2) - '@babel/plugin-transform-block-scoping': 7.20.2(@babel/core@7.20.2) - '@babel/plugin-transform-classes': 7.20.2(@babel/core@7.20.2) - '@babel/plugin-transform-computed-properties': 7.18.9(@babel/core@7.20.2) - '@babel/plugin-transform-destructuring': 7.20.2(@babel/core@7.20.2) - '@babel/plugin-transform-dotall-regex': 7.18.6(@babel/core@7.20.2) - '@babel/plugin-transform-duplicate-keys': 7.18.9(@babel/core@7.20.2) - '@babel/plugin-transform-exponentiation-operator': 7.18.6(@babel/core@7.20.2) - '@babel/plugin-transform-for-of': 7.18.8(@babel/core@7.20.2) - '@babel/plugin-transform-function-name': 7.18.9(@babel/core@7.20.2) - '@babel/plugin-transform-literals': 7.18.9(@babel/core@7.20.2) - '@babel/plugin-transform-member-expression-literals': 7.18.6(@babel/core@7.20.2) - '@babel/plugin-transform-modules-amd': 7.19.6(@babel/core@7.20.2) - '@babel/plugin-transform-modules-commonjs': 7.19.6(@babel/core@7.20.2) - '@babel/plugin-transform-modules-systemjs': 7.19.6(@babel/core@7.20.2) - '@babel/plugin-transform-modules-umd': 7.18.6(@babel/core@7.20.2) - '@babel/plugin-transform-named-capturing-groups-regex': 7.19.1(@babel/core@7.20.2) - '@babel/plugin-transform-new-target': 7.18.6(@babel/core@7.20.2) - '@babel/plugin-transform-object-super': 7.18.6(@babel/core@7.20.2) - '@babel/plugin-transform-parameters': 7.20.3(@babel/core@7.20.2) - '@babel/plugin-transform-property-literals': 7.18.6(@babel/core@7.20.2) - '@babel/plugin-transform-regenerator': 7.18.6(@babel/core@7.20.2) - '@babel/plugin-transform-reserved-words': 7.18.6(@babel/core@7.20.2) - '@babel/plugin-transform-shorthand-properties': 7.18.6(@babel/core@7.20.2) - '@babel/plugin-transform-spread': 7.19.0(@babel/core@7.20.2) - '@babel/plugin-transform-sticky-regex': 7.18.6(@babel/core@7.20.2) - '@babel/plugin-transform-template-literals': 7.18.9(@babel/core@7.20.2) - '@babel/plugin-transform-typeof-symbol': 7.18.9(@babel/core@7.20.2) - '@babel/plugin-transform-unicode-escapes': 7.18.10(@babel/core@7.20.2) - '@babel/plugin-transform-unicode-regex': 7.18.6(@babel/core@7.20.2) - '@babel/preset-modules': 0.1.5(@babel/core@7.20.2) + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.18.6(@babel/core@7.21.4) + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.18.9(@babel/core@7.21.4) + '@babel/plugin-proposal-async-generator-functions': 7.20.1(@babel/core@7.21.4) + '@babel/plugin-proposal-class-properties': 7.18.6(@babel/core@7.21.4) + '@babel/plugin-proposal-class-static-block': 7.18.6(@babel/core@7.21.4) + '@babel/plugin-proposal-dynamic-import': 7.18.6(@babel/core@7.21.4) + '@babel/plugin-proposal-export-namespace-from': 7.18.9(@babel/core@7.21.4) + '@babel/plugin-proposal-json-strings': 7.18.6(@babel/core@7.21.4) + '@babel/plugin-proposal-logical-assignment-operators': 7.18.9(@babel/core@7.21.4) + '@babel/plugin-proposal-nullish-coalescing-operator': 7.18.6(@babel/core@7.21.4) + '@babel/plugin-proposal-numeric-separator': 7.18.6(@babel/core@7.21.4) + '@babel/plugin-proposal-object-rest-spread': 7.20.2(@babel/core@7.21.4) + '@babel/plugin-proposal-optional-catch-binding': 7.18.6(@babel/core@7.21.4) + '@babel/plugin-proposal-optional-chaining': 7.18.9(@babel/core@7.21.4) + '@babel/plugin-proposal-private-methods': 7.18.6(@babel/core@7.21.4) + '@babel/plugin-proposal-private-property-in-object': 7.18.6(@babel/core@7.21.4) + '@babel/plugin-proposal-unicode-property-regex': 7.18.6(@babel/core@7.21.4) + '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.21.4) + '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.21.4) + '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.21.4) + '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.21.4) + '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.21.4) + '@babel/plugin-syntax-import-assertions': 7.20.0(@babel/core@7.21.4) + '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.21.4) + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.21.4) + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.21.4) + '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.21.4) + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.21.4) + '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.21.4) + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.21.4) + '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.21.4) + '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.21.4) + '@babel/plugin-transform-arrow-functions': 7.18.6(@babel/core@7.21.4) + '@babel/plugin-transform-async-to-generator': 7.18.6(@babel/core@7.21.4) + '@babel/plugin-transform-block-scoped-functions': 7.18.6(@babel/core@7.21.4) + '@babel/plugin-transform-block-scoping': 7.20.2(@babel/core@7.21.4) + '@babel/plugin-transform-classes': 7.20.2(@babel/core@7.21.4) + '@babel/plugin-transform-computed-properties': 7.18.9(@babel/core@7.21.4) + '@babel/plugin-transform-destructuring': 7.20.2(@babel/core@7.21.4) + '@babel/plugin-transform-dotall-regex': 7.18.6(@babel/core@7.21.4) + '@babel/plugin-transform-duplicate-keys': 7.18.9(@babel/core@7.21.4) + '@babel/plugin-transform-exponentiation-operator': 7.18.6(@babel/core@7.21.4) + '@babel/plugin-transform-for-of': 7.18.8(@babel/core@7.21.4) + '@babel/plugin-transform-function-name': 7.18.9(@babel/core@7.21.4) + '@babel/plugin-transform-literals': 7.18.9(@babel/core@7.21.4) + '@babel/plugin-transform-member-expression-literals': 7.18.6(@babel/core@7.21.4) + '@babel/plugin-transform-modules-amd': 7.19.6(@babel/core@7.21.4) + '@babel/plugin-transform-modules-commonjs': 7.19.6(@babel/core@7.21.4) + '@babel/plugin-transform-modules-systemjs': 7.19.6(@babel/core@7.21.4) + '@babel/plugin-transform-modules-umd': 7.18.6(@babel/core@7.21.4) + '@babel/plugin-transform-named-capturing-groups-regex': 7.19.1(@babel/core@7.21.4) + '@babel/plugin-transform-new-target': 7.18.6(@babel/core@7.21.4) + '@babel/plugin-transform-object-super': 7.18.6(@babel/core@7.21.4) + '@babel/plugin-transform-parameters': 7.20.3(@babel/core@7.21.4) + '@babel/plugin-transform-property-literals': 7.18.6(@babel/core@7.21.4) + '@babel/plugin-transform-regenerator': 7.18.6(@babel/core@7.21.4) + '@babel/plugin-transform-reserved-words': 7.18.6(@babel/core@7.21.4) + '@babel/plugin-transform-shorthand-properties': 7.18.6(@babel/core@7.21.4) + '@babel/plugin-transform-spread': 7.19.0(@babel/core@7.21.4) + '@babel/plugin-transform-sticky-regex': 7.18.6(@babel/core@7.21.4) + '@babel/plugin-transform-template-literals': 7.18.9(@babel/core@7.21.4) + '@babel/plugin-transform-typeof-symbol': 7.18.9(@babel/core@7.21.4) + '@babel/plugin-transform-unicode-escapes': 7.18.10(@babel/core@7.21.4) + '@babel/plugin-transform-unicode-regex': 7.18.6(@babel/core@7.21.4) + '@babel/preset-modules': 0.1.5(@babel/core@7.21.4) '@babel/types': 7.20.2 - babel-plugin-polyfill-corejs2: 0.3.3(@babel/core@7.20.2) - babel-plugin-polyfill-corejs3: 0.6.0(@babel/core@7.20.2) - babel-plugin-polyfill-regenerator: 0.4.1(@babel/core@7.20.2) + babel-plugin-polyfill-corejs2: 0.3.3(@babel/core@7.21.4) + babel-plugin-polyfill-corejs3: 0.6.0(@babel/core@7.21.4) + babel-plugin-polyfill-regenerator: 0.4.1(@babel/core@7.21.4) core-js-compat: 3.26.1 semver: 6.3.0 transitivePeerDependencies: - supports-color dev: true - /@babel/preset-modules@0.1.5(@babel/core@7.20.2): + /@babel/preset-modules@0.1.5(@babel/core@7.21.4): resolution: {integrity: sha512-A57th6YRG7oR3cq/yt/Y84MvGgE0eJG2F1JLhKuyG+jFxEgrd/HAMJatiFtmOiZurz+0DkrvbheCLaV5f2JfjA==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.20.2 + '@babel/core': 7.21.4 '@babel/helper-plugin-utils': 7.20.2 - '@babel/plugin-proposal-unicode-property-regex': 7.18.6(@babel/core@7.20.2) - '@babel/plugin-transform-dotall-regex': 7.18.6(@babel/core@7.20.2) + '@babel/plugin-proposal-unicode-property-regex': 7.18.6(@babel/core@7.21.4) + '@babel/plugin-transform-dotall-regex': 7.18.6(@babel/core@7.21.4) '@babel/types': 7.20.2 esutils: 2.0.3 dev: true @@ -1849,6 +2081,15 @@ packages: '@babel/code-frame': 7.18.6 '@babel/parser': 7.20.3 '@babel/types': 7.20.2 + dev: true + + /@babel/template@7.20.7: + resolution: {integrity: sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/code-frame': 7.21.4 + '@babel/parser': 7.21.4 + '@babel/types': 7.21.4 /@babel/traverse@7.20.1: resolution: {integrity: sha512-d3tN8fkVJwFLkHkBN479SOsw4DMZnz8cdbL/gvuDuzy3TS6Nfw80HuQqhw1pITbIruHyh7d1fMA47kWzmcUEGA==} @@ -1862,7 +2103,25 @@ packages: '@babel/helper-split-export-declaration': 7.18.6 '@babel/parser': 7.20.3 '@babel/types': 7.20.2 - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.4(supports-color@9.3.1) + globals: 11.12.0 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/traverse@7.21.4: + resolution: {integrity: sha512-eyKrRHKdyZxqDm+fV1iqL9UAHMoIg0nDaGqfIOd8rKH17m5snv7Gn4qgjBoFfLz9APvjFU/ICT00NVCv1Epp8Q==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/code-frame': 7.21.4 + '@babel/generator': 7.21.4 + '@babel/helper-environment-visitor': 7.18.9 + '@babel/helper-function-name': 7.21.0 + '@babel/helper-hoist-variables': 7.18.6 + '@babel/helper-split-export-declaration': 7.18.6 + '@babel/parser': 7.21.4 + '@babel/types': 7.21.4 + debug: 4.3.4(supports-color@9.3.1) globals: 11.12.0 transitivePeerDependencies: - supports-color @@ -1875,20 +2134,50 @@ packages: '@babel/helper-validator-identifier': 7.19.1 to-fast-properties: 2.0.0 - /@babel/types@7.21.2: - resolution: {integrity: sha512-3wRZSs7jiFaB8AjxiiD+VqN5DTG2iRvJGQ+qYFrs/654lg6kGTQWIOFjlBo5RaXuAZjBmP3+OQH4dmhqiiyYxw==} + /@babel/types@7.21.4: + resolution: {integrity: sha512-rU2oY501qDxE8Pyo7i/Orqma4ziCOrby0/9mvbDUGEfvZjb279Nk9k19e2fiCxHbRRpY2ZyrgW1eq22mvmOIzA==} engines: {node: '>=6.9.0'} dependencies: '@babel/helper-string-parser': 7.19.4 '@babel/helper-validator-identifier': 7.19.1 to-fast-properties: 2.0.0 - dev: true /@bcoe/v8-coverage@0.2.3: resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} dev: true - /@coinbase/wallet-sdk@3.6.3(@babel/core@7.20.2): + /@chainsafe/as-sha256@0.3.1: + resolution: {integrity: sha512-hldFFYuf49ed7DAakWVXSJODuq3pzJEguD8tQ7h+sGkM18vja+OFoJI9krnGmgzyuZC2ETX0NOIcCTy31v2Mtg==} + dev: true + + /@chainsafe/persistent-merkle-tree@0.4.2: + resolution: {integrity: sha512-lLO3ihKPngXLTus/L7WHKaw9PnNJWizlOF1H9NNzHP6Xvh82vzg9F2bzkXhYIFshMZ2gTCEz8tq6STe7r5NDfQ==} + dependencies: + '@chainsafe/as-sha256': 0.3.1 + dev: true + + /@chainsafe/persistent-merkle-tree@0.5.0: + resolution: {integrity: sha512-l0V1b5clxA3iwQLXP40zYjyZYospQLZXzBVIhhr9kDg/1qHZfzzHw0jj4VPBijfYCArZDlPkRi1wZaV2POKeuw==} + dependencies: + '@chainsafe/as-sha256': 0.3.1 + dev: true + + /@chainsafe/ssz@0.10.2: + resolution: {integrity: sha512-/NL3Lh8K+0q7A3LsiFq09YXS9fPE+ead2rr7vM2QK8PLzrNsw3uqrif9bpRX5UxgeRjM+vYi+boCM3+GM4ovXg==} + dependencies: + '@chainsafe/as-sha256': 0.3.1 + '@chainsafe/persistent-merkle-tree': 0.5.0 + dev: true + + /@chainsafe/ssz@0.9.4: + resolution: {integrity: sha512-77Qtg2N1ayqs4Bg/wvnWfg5Bta7iy7IRh8XqXh7oNMeP2HBbBwx8m6yTpA8p0EHItWPEBkgZd5S5/LSlp3GXuQ==} + dependencies: + '@chainsafe/as-sha256': 0.3.1 + '@chainsafe/persistent-merkle-tree': 0.4.2 + case: 1.6.3 + dev: true + + /@coinbase/wallet-sdk@3.6.3(@babel/core@7.21.4): resolution: {integrity: sha512-XUR4poOJE+dKzwBTdlM693CdLFitr046oZOVY3iDnbFcRrrQswhbDji7q4CmUcD4HxbfViX7PFoIwl79YQcukg==} engines: {node: '>= 10.0.0'} dependencies: @@ -1898,7 +2187,7 @@ packages: bn.js: 5.2.1 buffer: 6.0.3 clsx: 1.2.1 - eth-block-tracker: 4.4.3(@babel/core@7.20.2) + eth-block-tracker: 4.4.3(@babel/core@7.21.4) eth-json-rpc-filters: 4.2.2 eth-rpc-errors: 4.0.2 json-rpc-engine: 6.1.0 @@ -1931,7 +2220,7 @@ packages: '@jridgewell/trace-mapping': 0.3.9 dev: true - /@defi-wonderland/smock@2.3.4(@ethersproject/abi@5.7.0)(@ethersproject/abstract-provider@5.7.0)(@ethersproject/abstract-signer@5.7.0)(@nomiclabs/hardhat-ethers@2.2.2)(ethers@5.7.2)(hardhat@2.13.0): + /@defi-wonderland/smock@2.3.4(@ethersproject/abi@5.7.0)(@ethersproject/abstract-provider@5.7.0)(@ethersproject/abstract-signer@5.7.0)(@nomiclabs/hardhat-ethers@2.2.3)(ethers@5.7.2)(hardhat@2.14.0): resolution: {integrity: sha512-VYJbsoCOdFRyGkAwvaQhQRrU6V8AjK3five8xdbo41DEE9n3qXzUNBUxyD9HhXB/dWWPFWT21IGw5Ztl6Qw3Ew==} peerDependencies: '@ethersproject/abi': ^5 @@ -1944,17 +2233,17 @@ packages: '@ethersproject/abi': 5.7.0 '@ethersproject/abstract-provider': 5.7.0 '@ethersproject/abstract-signer': 5.7.0 - '@nomicfoundation/ethereumjs-evm': 1.0.0 - '@nomicfoundation/ethereumjs-util': 8.0.0 - '@nomicfoundation/ethereumjs-vm': 6.0.0 - '@nomiclabs/hardhat-ethers': 2.2.2(ethers@5.7.2)(hardhat@2.13.0) + '@nomicfoundation/ethereumjs-evm': 1.3.2 + '@nomicfoundation/ethereumjs-util': 8.0.6 + '@nomicfoundation/ethereumjs-vm': 6.4.2 + '@nomiclabs/hardhat-ethers': 2.2.3(ethers@5.7.2)(hardhat@2.14.0) diff: 5.1.0 ethers: 5.7.2 - hardhat: 2.13.0(ts-node@10.9.1)(typescript@4.9.5) + hardhat: 2.14.0(ts-node@10.9.1)(typescript@4.9.5) lodash.isequal: 4.5.0 lodash.isequalwith: 4.4.0 rxjs: 7.8.0 - semver: 7.3.8 + semver: 7.5.0 transitivePeerDependencies: - supports-color dev: true @@ -1967,7 +2256,7 @@ packages: eth-ens-namehash: 2.0.8 solc: 0.4.26 testrpc: 0.0.1 - web3-utils: 1.8.2 + web3-utils: 1.9.0 dev: true /@ensdomains/resolver@0.2.4: @@ -1993,13 +2282,13 @@ packages: dev: true optional: true - /@eslint-community/eslint-utils@4.4.0(eslint@8.37.0): + /@eslint-community/eslint-utils@4.4.0(eslint@8.39.0): resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 dependencies: - eslint: 8.37.0 + eslint: 8.39.0 eslint-visitor-keys: 3.4.0 dev: true @@ -2013,7 +2302,7 @@ packages: engines: {node: ^10.12.0 || >=12.0.0} dependencies: ajv: 6.12.6 - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.4(supports-color@9.3.1) espree: 7.3.1 globals: 13.20.0 ignore: 4.0.6 @@ -2030,7 +2319,7 @@ packages: engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dependencies: ajv: 6.12.6 - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.4(supports-color@9.3.1) espree: 9.5.1 globals: 13.20.0 ignore: 5.2.4 @@ -2042,8 +2331,8 @@ packages: - supports-color dev: true - /@eslint/js@8.37.0: - resolution: {integrity: sha512-x5vzdtOOGgFVDCUs81QRB2+liax8rFg3+7hqM+QhBG0/G3F1ZsoYl97UrqgHgQ9KKT7G6c4V+aTUCgu/n22v1A==} + /@eslint/js@8.39.0: + resolution: {integrity: sha512-kf9RB0Fg7NZfap83B3QOqOGg9QmD9yBudqQXzzOtn3i4y7ZUXe5ONeW34Gwi+TxhH4mvj72R1Zc300KUMa9Bng==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dev: true @@ -2068,7 +2357,7 @@ packages: '@resolver-engine/imports-fs': 0.3.3 '@typechain/ethers-v5': 2.0.0(ethers@5.7.2)(typechain@3.0.0) '@types/mkdirp': 0.5.2 - '@types/node-fetch': 2.6.2 + '@types/node-fetch': 2.6.3 ethers: 5.7.2 mkdirp: 0.5.6 node-fetch: 2.6.9 @@ -2474,7 +2763,7 @@ packages: ts-interface-checker: 0.1.13 dev: true - /@foundry-rs/hardhat-forge@0.1.17(@nomiclabs/hardhat-ethers@2.2.2)(ethereum-waffle@3.4.4)(ethers@5.7.2)(hardhat@2.13.0): + /@foundry-rs/hardhat-forge@0.1.17(@nomiclabs/hardhat-ethers@2.2.3)(ethereum-waffle@3.4.4)(ethers@5.7.2)(hardhat@2.14.0): resolution: {integrity: sha512-2wxzxA12CQmT11PH/KigyVTNm/4vzsVtzVZow6gwCbC41fTyf73a5qbggHZFRR74JXfmvVSkX1BJitTmdzQvxw==} peerDependencies: '@nomiclabs/hardhat-ethers': ^2.0.0 @@ -2483,17 +2772,17 @@ packages: hardhat: ^2.0.0 dependencies: '@foundry-rs/easy-foundryup': 0.1.3 - '@nomiclabs/hardhat-ethers': 2.2.2(ethers@5.7.2)(hardhat@2.13.0) - '@nomiclabs/hardhat-waffle': 2.0.5(@nomiclabs/hardhat-ethers@2.2.2)(ethereum-waffle@3.4.4)(ethers@5.7.2)(hardhat@2.13.0) + '@nomiclabs/hardhat-ethers': 2.2.3(ethers@5.7.2)(hardhat@2.14.0) + '@nomiclabs/hardhat-waffle': 2.0.5(@nomiclabs/hardhat-ethers@2.2.3)(ethereum-waffle@3.4.4)(ethers@5.7.2)(hardhat@2.14.0) '@types/sinon-chai': 3.2.9 '@types/web3': 1.0.19 camelcase-keys: 7.0.2 - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.4(supports-color@9.3.1) ethereum-waffle: 3.4.4(typescript@4.9.5) ethers: 5.7.2 fs-extra: 10.1.0 - glob: 7.2.3 - hardhat: 2.13.0(ts-node@10.9.1)(typescript@4.9.5) + glob: 7.2.0 + hardhat: 2.14.0(ts-node@10.9.1)(typescript@4.9.5) true-case-path: 2.2.1 ts-interface-checker: 0.1.13 transitivePeerDependencies: @@ -2521,8 +2810,8 @@ packages: dependencies: '@gnosis.pm/mock-contract': 4.0.0 '@gnosis.pm/safe-contracts': 1.3.0(ethers@5.7.2) - '@openzeppelin/contracts': 4.8.2 - '@openzeppelin/contracts-upgradeable': 4.8.2 + '@openzeppelin/contracts': 4.8.3 + '@openzeppelin/contracts-upgradeable': 4.8.3 argv: 0.0.2 dotenv: 16.0.3 ethers: 5.7.2 @@ -2559,7 +2848,7 @@ packages: engines: {node: '>=10.10.0'} dependencies: '@humanwhocodes/object-schema': 1.2.1 - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.4(supports-color@9.3.1) minimatch: 3.1.2 transitivePeerDependencies: - supports-color @@ -2570,7 +2859,7 @@ packages: engines: {node: '>=10.10.0'} dependencies: '@humanwhocodes/object-schema': 1.2.1 - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.4(supports-color@9.3.1) minimatch: 3.1.2 transitivePeerDependencies: - supports-color @@ -2606,7 +2895,7 @@ packages: engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: '@jest/types': 27.5.1 - '@types/node': 18.14.2 + '@types/node': 18.15.1 chalk: 4.1.2 jest-message-util: 27.5.1 jest-util: 27.5.1 @@ -2627,7 +2916,7 @@ packages: '@jest/test-result': 27.5.1 '@jest/transform': 27.5.1 '@jest/types': 27.5.1 - '@types/node': 18.13.0 + '@types/node': 18.15.1 ansi-escapes: 4.3.2 chalk: 4.1.2 emittery: 0.8.1 @@ -2703,7 +2992,7 @@ packages: '@jest/test-result': 27.5.1 '@jest/transform': 27.5.1 '@jest/types': 27.5.1 - '@types/node': 18.14.2 + '@types/node': 18.15.1 chalk: 4.1.2 collect-v8-coverage: 1.0.1 exit: 0.1.2 @@ -2787,7 +3076,7 @@ packages: dependencies: '@types/istanbul-lib-coverage': 2.0.4 '@types/istanbul-reports': 3.0.1 - '@types/node': 18.13.0 + '@types/node': 18.15.1 '@types/yargs': 16.0.4 chalk: 4.1.2 dev: true @@ -2798,6 +3087,7 @@ packages: dependencies: '@jridgewell/set-array': 1.1.2 '@jridgewell/sourcemap-codec': 1.4.14 + dev: true /@jridgewell/gen-mapping@0.3.2: resolution: {integrity: sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==} @@ -2806,36 +3096,60 @@ packages: '@jridgewell/set-array': 1.1.2 '@jridgewell/sourcemap-codec': 1.4.14 '@jridgewell/trace-mapping': 0.3.17 + dev: true + + /@jridgewell/gen-mapping@0.3.3: + resolution: {integrity: sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==} + engines: {node: '>=6.0.0'} + dependencies: + '@jridgewell/set-array': 1.1.2 + '@jridgewell/sourcemap-codec': 1.4.15 + '@jridgewell/trace-mapping': 0.3.18 /@jridgewell/resolve-uri@3.1.0: resolution: {integrity: sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==} engines: {node: '>=6.0.0'} + /@jridgewell/resolve-uri@3.1.1: + resolution: {integrity: sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==} + engines: {node: '>=6.0.0'} + dev: true + /@jridgewell/set-array@1.1.2: resolution: {integrity: sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==} engines: {node: '>=6.0.0'} - /@jridgewell/source-map@0.3.2: - resolution: {integrity: sha512-m7O9o2uR8k2ObDysZYzdfhb08VuEml5oWGiosa1VdaPZ/A6QyPkAJuwN0Q1lhULOf6B7MtQmHENS743hWtCrgw==} + /@jridgewell/source-map@0.3.3: + resolution: {integrity: sha512-b+fsZXeLYi9fEULmfBrhxn4IrPlINf8fiNarzTof004v3lFdntdwa9PF7vFJqm3mg7s+ScJMxXaE3Acp1irZcg==} dependencies: - '@jridgewell/gen-mapping': 0.3.2 - '@jridgewell/trace-mapping': 0.3.17 + '@jridgewell/gen-mapping': 0.3.3 + '@jridgewell/trace-mapping': 0.3.18 dev: true /@jridgewell/sourcemap-codec@1.4.14: resolution: {integrity: sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==} + /@jridgewell/sourcemap-codec@1.4.15: + resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} + /@jridgewell/trace-mapping@0.3.17: resolution: {integrity: sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==} dependencies: '@jridgewell/resolve-uri': 3.1.0 '@jridgewell/sourcemap-codec': 1.4.14 + dev: true + + /@jridgewell/trace-mapping@0.3.18: + resolution: {integrity: sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA==} + dependencies: + '@jridgewell/resolve-uri': 3.1.0 + '@jridgewell/sourcemap-codec': 1.4.14 /@jridgewell/trace-mapping@0.3.9: resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} dependencies: - '@jridgewell/resolve-uri': 3.1.0 - '@jridgewell/sourcemap-codec': 1.4.14 + '@jridgewell/resolve-uri': 3.1.1 + '@jridgewell/sourcemap-codec': 1.4.15 dev: true /@json-rpc-tools/provider@1.7.6: @@ -3204,137 +3518,272 @@ packages: fastq: 1.15.0 dev: true - /@nomicfoundation/ethereumjs-block@4.0.0: - resolution: {integrity: sha512-bk8uP8VuexLgyIZAHExH1QEovqx0Lzhc9Ntm63nCRKLHXIZkobaFaeCVwTESV7YkPKUk7NiK11s8ryed4CS9yA==} + /@nomicfoundation/ethereumjs-block@4.2.2: + resolution: {integrity: sha512-atjpt4gc6ZGZUPHBAQaUJsm1l/VCo7FmyQ780tMGO8QStjLdhz09dXynmhwVTy5YbRr0FOh/uX3QaEM0yIB2Zg==} + engines: {node: '>=14'} + dependencies: + '@nomicfoundation/ethereumjs-common': 3.1.2 + '@nomicfoundation/ethereumjs-rlp': 4.0.3 + '@nomicfoundation/ethereumjs-trie': 5.0.5 + '@nomicfoundation/ethereumjs-tx': 4.1.2 + '@nomicfoundation/ethereumjs-util': 8.0.6 + ethereum-cryptography: 0.1.3 + dev: true + + /@nomicfoundation/ethereumjs-block@5.0.1: + resolution: {integrity: sha512-u1Yioemi6Ckj3xspygu/SfFvm8vZEO8/Yx5a1QLzi6nVU0jz3Pg2OmHKJ5w+D9Ogk1vhwRiqEBAqcb0GVhCyHw==} + engines: {node: '>=14'} + dependencies: + '@nomicfoundation/ethereumjs-common': 4.0.1 + '@nomicfoundation/ethereumjs-rlp': 5.0.1 + '@nomicfoundation/ethereumjs-trie': 6.0.1 + '@nomicfoundation/ethereumjs-tx': 5.0.1 + '@nomicfoundation/ethereumjs-util': 9.0.1 + ethereum-cryptography: 0.1.3 + ethers: 5.7.2 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + dev: true + + /@nomicfoundation/ethereumjs-blockchain@6.2.2: + resolution: {integrity: sha512-6AIB2MoTEPZJLl6IRKcbd8mUmaBAQ/NMe3O7OsAOIiDjMNPPH5KaUQiLfbVlegT4wKIg/GOsFH7XlH2KDVoJNg==} + engines: {node: '>=14'} + dependencies: + '@nomicfoundation/ethereumjs-block': 4.2.2 + '@nomicfoundation/ethereumjs-common': 3.1.2 + '@nomicfoundation/ethereumjs-ethash': 2.0.5 + '@nomicfoundation/ethereumjs-rlp': 4.0.3 + '@nomicfoundation/ethereumjs-trie': 5.0.5 + '@nomicfoundation/ethereumjs-util': 8.0.6 + abstract-level: 1.0.3 + debug: 4.3.4(supports-color@9.3.1) + ethereum-cryptography: 0.1.3 + level: 8.0.0 + lru-cache: 5.1.1 + memory-level: 1.0.0 + transitivePeerDependencies: + - supports-color + dev: true + + /@nomicfoundation/ethereumjs-blockchain@7.0.1: + resolution: {integrity: sha512-NhzndlGg829XXbqJEYrF1VeZhAwSPgsK/OB7TVrdzft3y918hW5KNd7gIZ85sn6peDZOdjBsAXIpXZ38oBYE5A==} + engines: {node: '>=14'} + dependencies: + '@nomicfoundation/ethereumjs-block': 5.0.1 + '@nomicfoundation/ethereumjs-common': 4.0.1 + '@nomicfoundation/ethereumjs-ethash': 3.0.1 + '@nomicfoundation/ethereumjs-rlp': 5.0.1 + '@nomicfoundation/ethereumjs-trie': 6.0.1 + '@nomicfoundation/ethereumjs-tx': 5.0.1 + '@nomicfoundation/ethereumjs-util': 9.0.1 + abstract-level: 1.0.3 + debug: 4.3.4(supports-color@9.3.1) + ethereum-cryptography: 0.1.3 + level: 8.0.0 + lru-cache: 5.1.1 + memory-level: 1.0.0 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + dev: true + + /@nomicfoundation/ethereumjs-common@3.1.2: + resolution: {integrity: sha512-JAEBpIua62dyObHM9KI2b4wHZcRQYYge9gxiygTWa3lNCr2zo+K0TbypDpgiNij5MCGNWP1eboNfNfx1a3vkvA==} + dependencies: + '@nomicfoundation/ethereumjs-util': 8.0.6 + crc-32: 1.2.2 + dev: true + + /@nomicfoundation/ethereumjs-common@4.0.1: + resolution: {integrity: sha512-OBErlkfp54GpeiE06brBW/TTbtbuBJV5YI5Nz/aB2evTDo+KawyEzPjBlSr84z/8MFfj8wS2wxzQX1o32cev5g==} + dependencies: + '@nomicfoundation/ethereumjs-util': 9.0.1 + crc-32: 1.2.2 + dev: true + + /@nomicfoundation/ethereumjs-ethash@2.0.5: + resolution: {integrity: sha512-xlLdcICGgAYyYmnI3r1t0R5fKGBJNDQSOQxXNjVO99JmxJIdXR5MgPo5CSJO1RpyzKOgzi3uIFn8agv564dZEQ==} + engines: {node: '>=14'} + dependencies: + '@nomicfoundation/ethereumjs-block': 4.2.2 + '@nomicfoundation/ethereumjs-rlp': 4.0.3 + '@nomicfoundation/ethereumjs-util': 8.0.6 + abstract-level: 1.0.3 + bigint-crypto-utils: 3.2.2 + ethereum-cryptography: 0.1.3 + dev: true + + /@nomicfoundation/ethereumjs-ethash@3.0.1: + resolution: {integrity: sha512-KDjGIB5igzWOp8Ik5I6QiRH5DH+XgILlplsHR7TEuWANZA759G6krQ6o8bvj+tRUz08YygMQu/sGd9mJ1DYT8w==} + engines: {node: '>=14'} + dependencies: + '@nomicfoundation/ethereumjs-block': 5.0.1 + '@nomicfoundation/ethereumjs-rlp': 5.0.1 + '@nomicfoundation/ethereumjs-util': 9.0.1 + abstract-level: 1.0.3 + bigint-crypto-utils: 3.2.2 + ethereum-cryptography: 0.1.3 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + dev: true + + /@nomicfoundation/ethereumjs-evm@1.3.2: + resolution: {integrity: sha512-I00d4MwXuobyoqdPe/12dxUQxTYzX8OckSaWsMcWAfQhgVDvBx6ffPyP/w1aL0NW7MjyerySPcSVfDJAMHjilw==} + engines: {node: '>=14'} + dependencies: + '@nomicfoundation/ethereumjs-common': 3.1.2 + '@nomicfoundation/ethereumjs-util': 8.0.6 + '@types/async-eventemitter': 0.2.1 + async-eventemitter: 0.2.4 + debug: 4.3.4(supports-color@9.3.1) + ethereum-cryptography: 0.1.3 + mcl-wasm: 0.7.9 + rustbn.js: 0.2.0 + transitivePeerDependencies: + - supports-color + dev: true + + /@nomicfoundation/ethereumjs-evm@2.0.1: + resolution: {integrity: sha512-oL8vJcnk0Bx/onl+TgQOQ1t/534GKFaEG17fZmwtPFeH8S5soiBYPCLUrvANOl4sCp9elYxIMzIiTtMtNNN8EQ==} engines: {node: '>=14'} dependencies: - '@nomicfoundation/ethereumjs-common': 3.0.0 - '@nomicfoundation/ethereumjs-rlp': 4.0.0 - '@nomicfoundation/ethereumjs-trie': 5.0.0 - '@nomicfoundation/ethereumjs-tx': 4.0.0 - '@nomicfoundation/ethereumjs-util': 8.0.0 + '@ethersproject/providers': 5.7.2 + '@nomicfoundation/ethereumjs-common': 4.0.1 + '@nomicfoundation/ethereumjs-tx': 5.0.1 + '@nomicfoundation/ethereumjs-util': 9.0.1 + debug: 4.3.4(supports-color@9.3.1) ethereum-cryptography: 0.1.3 + mcl-wasm: 0.7.9 + rustbn.js: 0.2.0 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + dev: true + + /@nomicfoundation/ethereumjs-rlp@4.0.3: + resolution: {integrity: sha512-DZMzB/lqPK78T6MluyXqtlRmOMcsZbTTbbEyAjo0ncaff2mqu/k8a79PBcyvpgAhWD/R59Fjq/x3ro5Lof0AtA==} + engines: {node: '>=14'} + hasBin: true dev: true - /@nomicfoundation/ethereumjs-blockchain@6.0.0: - resolution: {integrity: sha512-pLFEoea6MWd81QQYSReLlLfH7N9v7lH66JC/NMPN848ySPPQA5renWnE7wPByfQFzNrPBuDDRFFULMDmj1C0xw==} + /@nomicfoundation/ethereumjs-rlp@5.0.1: + resolution: {integrity: sha512-xtxrMGa8kP4zF5ApBQBtjlSbN5E2HI8m8FYgVSYAnO6ssUoY5pVPGy2H8+xdf/bmMa22Ce8nWMH3aEW8CcqMeQ==} engines: {node: '>=14'} + hasBin: true + dev: true + + /@nomicfoundation/ethereumjs-statemanager@1.0.5: + resolution: {integrity: sha512-CAhzpzTR5toh/qOJIZUUOnWekUXuRqkkzaGAQrVcF457VhtCmr+ddZjjK50KNZ524c1XP8cISguEVNqJ6ij1sA==} dependencies: - '@nomicfoundation/ethereumjs-block': 4.0.0 - '@nomicfoundation/ethereumjs-common': 3.0.0 - '@nomicfoundation/ethereumjs-ethash': 2.0.0 - '@nomicfoundation/ethereumjs-rlp': 4.0.0 - '@nomicfoundation/ethereumjs-trie': 5.0.0 - '@nomicfoundation/ethereumjs-util': 8.0.0 - abstract-level: 1.0.3 - debug: 4.3.4(supports-color@8.1.1) + '@nomicfoundation/ethereumjs-common': 3.1.2 + '@nomicfoundation/ethereumjs-rlp': 4.0.3 + '@nomicfoundation/ethereumjs-trie': 5.0.5 + '@nomicfoundation/ethereumjs-util': 8.0.6 + debug: 4.3.4(supports-color@9.3.1) ethereum-cryptography: 0.1.3 - level: 8.0.0 - lru-cache: 5.1.1 - memory-level: 1.0.0 + functional-red-black-tree: 1.0.1 transitivePeerDependencies: - supports-color dev: true - /@nomicfoundation/ethereumjs-common@3.0.0: - resolution: {integrity: sha512-WS7qSshQfxoZOpHG/XqlHEGRG1zmyjYrvmATvc4c62+gZXgre1ymYP8ZNgx/3FyZY0TWe9OjFlKOfLqmgOeYwA==} + /@nomicfoundation/ethereumjs-statemanager@2.0.1: + resolution: {integrity: sha512-B5ApMOnlruVOR7gisBaYwFX+L/AP7i/2oAahatssjPIBVDF6wTX1K7Qpa39E/nzsH8iYuL3krkYeUFIdO3EMUQ==} dependencies: - '@nomicfoundation/ethereumjs-util': 8.0.0 - crc-32: 1.2.2 + '@nomicfoundation/ethereumjs-common': 4.0.1 + '@nomicfoundation/ethereumjs-rlp': 5.0.1 + debug: 4.3.4(supports-color@9.3.1) + ethereum-cryptography: 0.1.3 + ethers: 5.7.2 + js-sdsl: 4.4.0 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate dev: true - /@nomicfoundation/ethereumjs-ethash@2.0.0: - resolution: {integrity: sha512-WpDvnRncfDUuXdsAXlI4lXbqUDOA+adYRQaEezIkxqDkc+LDyYDbd/xairmY98GnQzo1zIqsIL6GB5MoMSJDew==} + /@nomicfoundation/ethereumjs-trie@5.0.5: + resolution: {integrity: sha512-+8sNZrXkzvA1NH5F4kz5RSYl1I6iaRz7mAZRsyxOm0IVY4UaP43Ofvfp/TwOalFunurQrYB5pRO40+8FBcxFMA==} engines: {node: '>=14'} dependencies: - '@nomicfoundation/ethereumjs-block': 4.0.0 - '@nomicfoundation/ethereumjs-rlp': 4.0.0 - '@nomicfoundation/ethereumjs-util': 8.0.0 - abstract-level: 1.0.3 - bigint-crypto-utils: 3.1.8 + '@nomicfoundation/ethereumjs-rlp': 4.0.3 + '@nomicfoundation/ethereumjs-util': 8.0.6 ethereum-cryptography: 0.1.3 + readable-stream: 3.6.2 dev: true - /@nomicfoundation/ethereumjs-evm@1.0.0: - resolution: {integrity: sha512-hVS6qRo3V1PLKCO210UfcEQHvlG7GqR8iFzp0yyjTg2TmJQizcChKgWo8KFsdMw6AyoLgLhHGHw4HdlP8a4i+Q==} + /@nomicfoundation/ethereumjs-trie@6.0.1: + resolution: {integrity: sha512-A64It/IMpDVODzCgxDgAAla8jNjNtsoQZIzZUfIV5AY6Coi4nvn7+VReBn5itlxMiL2yaTlQr9TRWp3CSI6VoA==} engines: {node: '>=14'} dependencies: - '@nomicfoundation/ethereumjs-common': 3.0.0 - '@nomicfoundation/ethereumjs-util': 8.0.0 - '@types/async-eventemitter': 0.2.1 - async-eventemitter: 0.2.4 - debug: 4.3.4(supports-color@8.1.1) + '@nomicfoundation/ethereumjs-rlp': 5.0.1 + '@nomicfoundation/ethereumjs-util': 9.0.1 + '@types/readable-stream': 2.3.15 ethereum-cryptography: 0.1.3 - mcl-wasm: 0.7.9 - rustbn.js: 0.2.0 - transitivePeerDependencies: - - supports-color + readable-stream: 3.6.2 dev: true - /@nomicfoundation/ethereumjs-rlp@4.0.0: - resolution: {integrity: sha512-GaSOGk5QbUk4eBP5qFbpXoZoZUj/NrW7MRa0tKY4Ew4c2HAS0GXArEMAamtFrkazp0BO4K5p2ZCG3b2FmbShmw==} + /@nomicfoundation/ethereumjs-tx@4.1.2: + resolution: {integrity: sha512-emJBJZpmTdUa09cqxQqHaysbBI9Od353ZazeH7WgPb35miMgNY6mb7/3vBA98N5lUW/rgkiItjX0KZfIzihSoQ==} engines: {node: '>=14'} - hasBin: true - dev: true - - /@nomicfoundation/ethereumjs-statemanager@1.0.0: - resolution: {integrity: sha512-jCtqFjcd2QejtuAMjQzbil/4NHf5aAWxUc+CvS0JclQpl+7M0bxMofR2AJdtz+P3u0ke2euhYREDiE7iSO31vQ==} dependencies: - '@nomicfoundation/ethereumjs-common': 3.0.0 - '@nomicfoundation/ethereumjs-rlp': 4.0.0 - '@nomicfoundation/ethereumjs-trie': 5.0.0 - '@nomicfoundation/ethereumjs-util': 8.0.0 - debug: 4.3.4(supports-color@8.1.1) + '@nomicfoundation/ethereumjs-common': 3.1.2 + '@nomicfoundation/ethereumjs-rlp': 4.0.3 + '@nomicfoundation/ethereumjs-util': 8.0.6 ethereum-cryptography: 0.1.3 - functional-red-black-tree: 1.0.1 - transitivePeerDependencies: - - supports-color dev: true - /@nomicfoundation/ethereumjs-trie@5.0.0: - resolution: {integrity: sha512-LIj5XdE+s+t6WSuq/ttegJzZ1vliwg6wlb+Y9f4RlBpuK35B9K02bO7xU+E6Rgg9RGptkWd6TVLdedTI4eNc2A==} + /@nomicfoundation/ethereumjs-tx@5.0.1: + resolution: {integrity: sha512-0HwxUF2u2hrsIM1fsasjXvlbDOq1ZHFV2dd1yGq8CA+MEYhaxZr8OTScpVkkxqMwBcc5y83FyPl0J9MZn3kY0w==} engines: {node: '>=14'} dependencies: - '@nomicfoundation/ethereumjs-rlp': 4.0.0 - '@nomicfoundation/ethereumjs-util': 8.0.0 + '@chainsafe/ssz': 0.9.4 + '@ethersproject/providers': 5.7.2 + '@nomicfoundation/ethereumjs-common': 4.0.1 + '@nomicfoundation/ethereumjs-rlp': 5.0.1 + '@nomicfoundation/ethereumjs-util': 9.0.1 ethereum-cryptography: 0.1.3 - readable-stream: 3.6.2 + transitivePeerDependencies: + - bufferutil + - utf-8-validate dev: true - /@nomicfoundation/ethereumjs-tx@4.0.0: - resolution: {integrity: sha512-Gg3Lir2lNUck43Kp/3x6TfBNwcWC9Z1wYue9Nz3v4xjdcv6oDW9QSMJxqsKw9QEGoBBZ+gqwpW7+F05/rs/g1w==} + /@nomicfoundation/ethereumjs-util@8.0.6: + resolution: {integrity: sha512-jOQfF44laa7xRfbfLXojdlcpkvxeHrE2Xu7tSeITsWFgoII163MzjOwFEzSNozHYieFysyoEMhCdP+NY5ikstw==} engines: {node: '>=14'} dependencies: - '@nomicfoundation/ethereumjs-common': 3.0.0 - '@nomicfoundation/ethereumjs-rlp': 4.0.0 - '@nomicfoundation/ethereumjs-util': 8.0.0 + '@nomicfoundation/ethereumjs-rlp': 4.0.3 ethereum-cryptography: 0.1.3 dev: true - /@nomicfoundation/ethereumjs-util@8.0.0: - resolution: {integrity: sha512-2emi0NJ/HmTG+CGY58fa+DQuAoroFeSH9gKu9O6JnwTtlzJtgfTixuoOqLEgyyzZVvwfIpRueuePb8TonL1y+A==} + /@nomicfoundation/ethereumjs-util@9.0.1: + resolution: {integrity: sha512-TwbhOWQ8QoSCFhV/DDfSmyfFIHjPjFBj957219+V3jTZYZ2rf9PmDtNOeZWAE3p3vlp8xb02XGpd0v6nTUPbsA==} engines: {node: '>=14'} dependencies: - '@nomicfoundation/ethereumjs-rlp': 4.0.0 + '@chainsafe/ssz': 0.10.2 + '@nomicfoundation/ethereumjs-rlp': 5.0.1 ethereum-cryptography: 0.1.3 dev: true - /@nomicfoundation/ethereumjs-vm@6.0.0: - resolution: {integrity: sha512-JMPxvPQ3fzD063Sg3Tp+UdwUkVxMoo1uML6KSzFhMH3hoQi/LMuXBoEHAoW83/vyNS9BxEe6jm6LmT5xdeEJ6w==} + /@nomicfoundation/ethereumjs-vm@6.4.2: + resolution: {integrity: sha512-PRTyxZMP6kx+OdAzBhuH1LD2Yw+hrSpaytftvaK//thDy2OI07S0nrTdbrdk7b8ZVPAc9H9oTwFBl3/wJ3w15g==} engines: {node: '>=14'} dependencies: - '@nomicfoundation/ethereumjs-block': 4.0.0 - '@nomicfoundation/ethereumjs-blockchain': 6.0.0 - '@nomicfoundation/ethereumjs-common': 3.0.0 - '@nomicfoundation/ethereumjs-evm': 1.0.0 - '@nomicfoundation/ethereumjs-rlp': 4.0.0 - '@nomicfoundation/ethereumjs-statemanager': 1.0.0 - '@nomicfoundation/ethereumjs-trie': 5.0.0 - '@nomicfoundation/ethereumjs-tx': 4.0.0 - '@nomicfoundation/ethereumjs-util': 8.0.0 + '@nomicfoundation/ethereumjs-block': 4.2.2 + '@nomicfoundation/ethereumjs-blockchain': 6.2.2 + '@nomicfoundation/ethereumjs-common': 3.1.2 + '@nomicfoundation/ethereumjs-evm': 1.3.2 + '@nomicfoundation/ethereumjs-rlp': 4.0.3 + '@nomicfoundation/ethereumjs-statemanager': 1.0.5 + '@nomicfoundation/ethereumjs-trie': 5.0.5 + '@nomicfoundation/ethereumjs-tx': 4.1.2 + '@nomicfoundation/ethereumjs-util': 8.0.6 '@types/async-eventemitter': 0.2.1 async-eventemitter: 0.2.4 - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.4(supports-color@9.3.1) ethereum-cryptography: 0.1.3 functional-red-black-tree: 1.0.1 mcl-wasm: 0.7.9 @@ -3343,13 +3792,36 @@ packages: - supports-color dev: true - /@nomicfoundation/hardhat-network-helpers@1.0.8(hardhat@2.13.0): + /@nomicfoundation/ethereumjs-vm@7.0.1: + resolution: {integrity: sha512-rArhyn0jPsS/D+ApFsz3yVJMQ29+pVzNZ0VJgkzAZ+7FqXSRtThl1C1prhmlVr3YNUlfpZ69Ak+RUT4g7VoOuQ==} + engines: {node: '>=14'} + dependencies: + '@nomicfoundation/ethereumjs-block': 5.0.1 + '@nomicfoundation/ethereumjs-blockchain': 7.0.1 + '@nomicfoundation/ethereumjs-common': 4.0.1 + '@nomicfoundation/ethereumjs-evm': 2.0.1 + '@nomicfoundation/ethereumjs-rlp': 5.0.1 + '@nomicfoundation/ethereumjs-statemanager': 2.0.1 + '@nomicfoundation/ethereumjs-trie': 6.0.1 + '@nomicfoundation/ethereumjs-tx': 5.0.1 + '@nomicfoundation/ethereumjs-util': 9.0.1 + debug: 4.3.4(supports-color@9.3.1) + ethereum-cryptography: 0.1.3 + mcl-wasm: 0.7.9 + rustbn.js: 0.2.0 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + dev: true + + /@nomicfoundation/hardhat-network-helpers@1.0.8(hardhat@2.14.0): resolution: {integrity: sha512-MNqQbzUJZnCMIYvlniC3U+kcavz/PhhQSsY90tbEtUyMj/IQqsLwIRZa4ctjABh3Bz0KCh9OXUZ7Yk/d9hr45Q==} peerDependencies: hardhat: ^2.9.5 dependencies: ethereumjs-util: 7.1.5 - hardhat: 2.13.0(ts-node@10.9.1)(typescript@4.9.5) + hardhat: 2.14.0(ts-node@10.9.1)(typescript@4.9.5) dev: true /@nomicfoundation/solidity-analyzer-darwin-arm64@0.1.1: @@ -3458,17 +3930,17 @@ packages: '@nomicfoundation/solidity-analyzer-win32-x64-msvc': 0.1.1 dev: true - /@nomiclabs/hardhat-ethers@2.2.2(ethers@5.7.2)(hardhat@2.13.0): - resolution: {integrity: sha512-NLDlDFL2us07C0jB/9wzvR0kuLivChJWCXTKcj3yqjZqMoYp7g7wwS157F70VHx/+9gHIBGzak5pKDwG8gEefA==} + /@nomiclabs/hardhat-ethers@2.2.3(ethers@5.7.2)(hardhat@2.14.0): + resolution: {integrity: sha512-YhzPdzb612X591FOe68q+qXVXGG2ANZRvDo0RRUtimev85rCrAlv/TLMEZw5c+kq9AbzocLTVX/h2jVIFPL9Xg==} peerDependencies: ethers: ^5.0.0 hardhat: ^2.0.0 dependencies: ethers: 5.7.2 - hardhat: 2.13.0(ts-node@10.9.1)(typescript@4.9.5) + hardhat: 2.14.0(ts-node@10.9.1)(typescript@4.9.5) dev: true - /@nomiclabs/hardhat-etherscan@3.1.7(hardhat@2.13.0): + /@nomiclabs/hardhat-etherscan@3.1.7(hardhat@2.14.0): resolution: {integrity: sha512-tZ3TvSgpvsQ6B6OGmo1/Au6u8BrAkvs1mIC/eURA3xgIfznUZBhmpne8hv7BXUzw9xNL3fXdpOYgOQlVMTcoHQ==} peerDependencies: hardhat: ^2.0.4 @@ -3477,18 +3949,18 @@ packages: '@ethersproject/address': 5.7.0 cbor: 8.1.0 chalk: 2.4.2 - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.4(supports-color@9.3.1) fs-extra: 7.0.1 - hardhat: 2.13.0(ts-node@10.9.1)(typescript@4.9.5) + hardhat: 2.14.0(ts-node@10.9.1)(typescript@4.9.5) lodash: 4.17.21 semver: 6.3.0 table: 6.8.1 - undici: 5.20.0 + undici: 5.22.0 transitivePeerDependencies: - supports-color dev: true - /@nomiclabs/hardhat-waffle@2.0.5(@nomiclabs/hardhat-ethers@2.2.2)(ethereum-waffle@3.4.4)(ethers@5.7.2)(hardhat@2.13.0): + /@nomiclabs/hardhat-waffle@2.0.5(@nomiclabs/hardhat-ethers@2.2.3)(ethereum-waffle@3.4.4)(ethers@5.7.2)(hardhat@2.14.0): resolution: {integrity: sha512-U1RH9OQ1mWYQfb+moX5aTgGjpVVlOcpiFI47wwnaGG4kLhcTy90cNiapoqZenxcRAITVbr0/+QSduINL5EsUIQ==} peerDependencies: '@nomiclabs/hardhat-ethers': ^2.0.0 @@ -3496,10 +3968,10 @@ packages: ethers: ^5.0.0 hardhat: ^2.0.0 dependencies: - '@nomiclabs/hardhat-ethers': 2.2.2(ethers@5.7.2)(hardhat@2.13.0) + '@nomiclabs/hardhat-ethers': 2.2.3(ethers@5.7.2)(hardhat@2.14.0) ethereum-waffle: 3.4.4(typescript@4.9.5) ethers: 5.7.2 - hardhat: 2.13.0(ts-node@10.9.1)(typescript@4.9.5) + hardhat: 2.14.0(ts-node@10.9.1)(typescript@4.9.5) dev: true /@npmcli/fs@1.1.1: @@ -3518,15 +3990,15 @@ packages: rimraf: 3.0.2 dev: true - /@openzeppelin/contracts-upgradeable@4.8.2: - resolution: {integrity: sha512-zIggnBwemUmmt9IS73qxi+tumALxCY4QEs3zLCII78k0Gfse2hAOdAkuAeLUzvWUpneMUfFE5sGHzEUSTvn4Ag==} + /@openzeppelin/contracts-upgradeable@4.8.3: + resolution: {integrity: sha512-SXDRl7HKpl2WDoJpn7CK/M9U4Z8gNXDHHChAKh0Iz+Wew3wu6CmFYBeie3je8V0GSXZAIYYwUktSrnW/kwVPtg==} dev: false - /@openzeppelin/contracts@4.8.2: - resolution: {integrity: sha512-kEUOgPQszC0fSYWpbh2kT94ltOJwj1qfT2DWo+zVttmGmf97JZ99LspePNaeeaLhCImaHVeBbjaQFZQn7+Zc5g==} + /@openzeppelin/contracts@4.8.3: + resolution: {integrity: sha512-bQHV8R9Me8IaJoJ2vPG4rXcL7seB7YVuskr4f+f5RyOStSZetwzkWtoqDMl5erkBJy0lDRUnIR2WIkPiC0GJlg==} dev: false - /@openzeppelin/hardhat-upgrades@1.22.1(@nomiclabs/hardhat-ethers@2.2.2)(@nomiclabs/hardhat-etherscan@3.1.7)(ethers@5.7.2)(hardhat@2.13.0): + /@openzeppelin/hardhat-upgrades@1.22.1(@nomiclabs/hardhat-ethers@2.2.3)(@nomiclabs/hardhat-etherscan@3.1.7)(ethers@5.7.2)(hardhat@2.14.0): resolution: {integrity: sha512-MdoitCTLl4zwMU8MeE/bCj+7JMWBEvd38XqJkw36PkJrXlbv6FedDVCPoumMAhpmtymm0nTwTYYklYG+L6WiiQ==} hasBin: true peerDependencies: @@ -3539,13 +4011,13 @@ packages: '@nomiclabs/harhdat-etherscan': optional: true dependencies: - '@nomiclabs/hardhat-ethers': 2.2.2(ethers@5.7.2)(hardhat@2.13.0) - '@nomiclabs/hardhat-etherscan': 3.1.7(hardhat@2.13.0) + '@nomiclabs/hardhat-ethers': 2.2.3(ethers@5.7.2)(hardhat@2.14.0) + '@nomiclabs/hardhat-etherscan': 3.1.7(hardhat@2.14.0) '@openzeppelin/upgrades-core': 1.24.1 chalk: 4.1.2 - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.4(supports-color@9.3.1) ethers: 5.7.2 - hardhat: 2.13.0(ts-node@10.9.1)(typescript@4.9.5) + hardhat: 2.14.0(ts-node@10.9.1)(typescript@4.9.5) proper-lockfile: 4.1.2 transitivePeerDependencies: - supports-color @@ -3557,7 +4029,7 @@ packages: cbor: 8.1.0 chalk: 4.1.2 compare-versions: 5.0.3 - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.4(supports-color@9.3.1) ethereumjs-util: 7.1.5 proper-lockfile: 4.1.2 solidity-ast: 0.4.46 @@ -3813,7 +4285,7 @@ packages: diff-match-patch: optional: true dependencies: - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.4(supports-color@9.3.1) deepmerge: 4.2.2 kleur: 4.1.5 magic-string: 0.26.7 @@ -3911,7 +4383,7 @@ packages: typescript: 4.9.5 dev: true - /@typechain/hardhat@2.3.1(hardhat@2.13.0)(lodash@4.17.21)(typechain@5.2.0): + /@typechain/hardhat@2.3.1(hardhat@2.14.0)(lodash@4.17.21)(typechain@5.2.0): resolution: {integrity: sha512-BQV8OKQi0KAzLXCdsPO0pZBNQQ6ra8A2ucC26uFX/kquRBtJu1yEyWnVSmtr07b5hyRoJRpzUeINLnyqz4/MAw==} peerDependencies: hardhat: ^2.0.10 @@ -3919,7 +4391,7 @@ packages: typechain: ^5.1.2 dependencies: fs-extra: 9.1.0 - hardhat: 2.13.0(ts-node@10.9.1)(typescript@4.9.5) + hardhat: 2.14.0(ts-node@10.9.1)(typescript@4.9.5) lodash: 4.17.21 typechain: 5.2.0(typescript@4.9.5) dev: true @@ -3970,12 +4442,12 @@ packages: /@types/bn.js@4.11.6: resolution: {integrity: sha512-pqr857jrp2kPuO9uRjZ3PwnJTjoQy+fcdxvBTvHm6dkmEL9q+hDD/2j/0ELOBPtPnS8LjCX0gI9nbl8lVkadpg==} dependencies: - '@types/node': 18.15.1 + '@types/node': 12.20.55 /@types/bn.js@5.1.1: resolution: {integrity: sha512-qNrYbZqMx0uJAfKnKclPh+dTwK33KfLHYqtyODwd5HnXOjnkhc4qgn3BrK6RWyGZm5+sIFE7Q7Vz6QQtJB7w7g==} dependencies: - '@types/node': 18.15.1 + '@types/node': 12.20.55 dev: true /@types/cacheable-request@6.0.3: @@ -3983,7 +4455,7 @@ packages: dependencies: '@types/http-cache-semantics': 4.0.1 '@types/keyv': 3.1.4 - '@types/node': 18.15.1 + '@types/node': 12.20.55 '@types/responselike': 1.0.0 dev: true optional: true @@ -3995,7 +4467,7 @@ packages: /@types/concat-stream@1.6.1: resolution: {integrity: sha512-eHE4cQPoj6ngxBZMvVf6Hw7Mh4jMW4U9lpGmS5GBPB9RYxlFg+CHaVN7ErNY4W9XfLIEn20b4VDYaIrbq0q4uA==} dependencies: - '@types/node': 18.15.1 + '@types/node': 12.20.55 dev: true /@types/connect@3.4.35: @@ -4013,14 +4485,14 @@ packages: /@types/eslint-scope@3.7.4: resolution: {integrity: sha512-9K4zoImiZc3HlIp6AVUDE4CWYx22a+lhSZMYNpbjW04+YF0KWj4pJXnEMjdnFTiQibFFmElcsasJXDbdI/EPhA==} dependencies: - '@types/eslint': 8.21.1 - '@types/estree': 0.0.51 + '@types/eslint': 8.37.0 + '@types/estree': 1.0.1 dev: true - /@types/eslint@8.21.1: - resolution: {integrity: sha512-rc9K8ZpVjNcLs8Fp0dkozd5Pt2Apk1glO4Vgz8ix1u6yFByxfqo5Yavpy65o+93TAe24jr7v+eSBtFLvOQtCRQ==} + /@types/eslint@8.37.0: + resolution: {integrity: sha512-Piet7dG2JBuDIfohBngQ3rCt7MgO9xCO4xIMKxBThCq5PNRB91IjlJ10eJVwfoNtvTErmxLzwBZ7rHZtbOMmFQ==} dependencies: - '@types/estree': 0.0.51 + '@types/estree': 1.0.1 '@types/json-schema': 7.0.11 dev: true @@ -4053,17 +4525,21 @@ packages: resolution: {integrity: sha512-WulqXMDUTYAXCjZnk6JtIHPigp55cVtDgDrO2gHRwhyJto21+1zbVCtOYB2L1F9w4qCQ0rOGWBnBe0FNTiEJIQ==} dev: false + /@types/estree@1.0.1: + resolution: {integrity: sha512-LG4opVs2ANWZ1TJoKc937iMmNstM/d0ae1vNbnBvBhqCSezgVUOzcLCqbI5elV8Vy6WKwKjaqR+zO9VKirBBCA==} + dev: true + /@types/form-data@0.0.33: resolution: {integrity: sha512-8BSvG1kGm83cyJITQMZSulnl6QV8jqAGreJsc5tPu1Jq0vTSOiY/k24Wx82JRpWwZSqrala6sd5rWi6aNXvqcw==} dependencies: - '@types/node': 18.15.1 + '@types/node': 12.20.55 dev: true /@types/glob@7.2.0: resolution: {integrity: sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==} dependencies: '@types/minimatch': 5.1.2 - '@types/node': 18.15.1 + '@types/node': 12.20.55 dev: true /@types/glob@8.1.0: @@ -4136,7 +4612,7 @@ packages: /@types/keyv@3.1.4: resolution: {integrity: sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==} dependencies: - '@types/node': 18.15.1 + '@types/node': 12.20.55 dev: true optional: true @@ -4181,7 +4657,7 @@ packages: /@types/mkdirp@0.5.2: resolution: {integrity: sha512-U5icWpv7YnZYGsN4/cmh3WD2onMY0aJIiTE6+51TwJCttdHvtCYmkBNOobHlXwrJRL0nkH9jH4kD+1FAdMN4Tg==} dependencies: - '@types/node': 18.15.1 + '@types/node': 12.20.55 dev: true /@types/mocha@9.1.1: @@ -4192,10 +4668,10 @@ packages: resolution: {integrity: sha512-iiUgKzV9AuaEkZqkOLDIvlQiL6ltuZd9tGcW3gwpnX8JbuiuhFlEGmmFXEXkN50Cvq7Os88IY2v0dkDqXYWVgA==} dev: false - /@types/node-fetch@2.6.2: - resolution: {integrity: sha512-DHqhlq5jeESLy19TYhLakJ07kNumXWjcDdxXsLUMJZ6ue8VZJj4kLPQVE/2mdHh3xZziNF1xppu5lwmS53HR+A==} + /@types/node-fetch@2.6.3: + resolution: {integrity: sha512-ETTL1mOEdq/sxUtgtOhKjyB2Irra4cjxksvcMUR5Zr4n+PxVhsCD9WS46oPbHL3et9Zde7CNRr+WUNlcHvsX+w==} dependencies: - '@types/node': 18.15.1 + '@types/node': 12.20.55 form-data: 3.0.1 dev: true @@ -4206,14 +4682,6 @@ packages: /@types/node@12.20.55: resolution: {integrity: sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==} - /@types/node@18.13.0: - resolution: {integrity: sha512-gC3TazRzGoOnoKAhUx+Q0t8S9Tzs74z7m0ipwGpSqQrleP14hKxP4/JUeEQcD3W1/aIpnWl8pHowI7WokuZpXg==} - dev: true - - /@types/node@18.14.2: - resolution: {integrity: sha512-1uEQxww3DaghA0RxqHx0O0ppVlo43pJhepY51OxuQIKHpjbnYLA7vcdwioNPzIqmC2u3I/dmylcqjlh0e7AyUA==} - dev: true - /@types/node@18.15.1: resolution: {integrity: sha512-U2TWca8AeHSmbpi314QBESRk7oPjSZjDsR+c+H4ECC1l+kFgpZf8Ydhv3SJpPy51VyZHHqxlb6mTTqYNNRVAIw==} @@ -4260,16 +4728,23 @@ packages: '@types/scheduler': 0.16.2 csstype: 3.1.1 + /@types/readable-stream@2.3.15: + resolution: {integrity: sha512-oM5JSKQCcICF1wvGgmecmHldZ48OZamtMxcGGVICOJA8o8cahXC1zEVAif8iwoc5j8etxFaRFnf095+CDsuoFQ==} + dependencies: + '@types/node': 12.20.55 + safe-buffer: 5.1.2 + dev: true + /@types/resolve@0.0.8: resolution: {integrity: sha512-auApPaJf3NPfe18hSoJkp8EbZzer2ISk7o8mCC3M9he/a04+gbMF97NkpD2S8riMGvm4BMRI59/SZQSaLTKpsQ==} dependencies: - '@types/node': 18.15.1 + '@types/node': 12.20.55 dev: true /@types/responselike@1.0.0: resolution: {integrity: sha512-85Y2BjiufFzaMIlvJDvTTB8Fxl2xfLo4HgmHzVBz08w4wDePCTjYw66PdrolO0kzli3yam/YCgRufyo1DdQVTA==} dependencies: - '@types/node': 18.15.1 + '@types/node': 12.20.55 dev: true optional: true @@ -4282,7 +4757,7 @@ packages: /@types/sass@1.43.1: resolution: {integrity: sha512-BPdoIt1lfJ6B7rw35ncdwBZrAssjcwzI5LByIrYs+tpXlj/CAkuVdRsgZDdP4lq5EjyWzwxZCqAoFyHKFwp32g==} dependencies: - '@types/node': 18.13.0 + '@types/node': 18.15.1 dev: true /@types/scheduler@0.16.2: @@ -4301,11 +4776,11 @@ packages: resolution: {integrity: sha512-/19t63pFYU0ikrdbXKBWj9PCdnKyTd0Qkz0X91Ta081cYsq90OxYdcWwK/dwEoDa6dtXgj2HJfmzgq+QZTHdmQ==} dependencies: '@types/chai': 4.3.4 - '@types/sinon': 10.0.13 + '@types/sinon': 10.0.14 dev: true - /@types/sinon@10.0.13: - resolution: {integrity: sha512-UVjDqJblVNQYvVNUsj0PuYYw0ELRmgt1Nt5Vk0pT5f16ROGfcKJY8o1HVuMOJOpD727RrGB9EGvoaTQE5tgxZQ==} + /@types/sinon@10.0.14: + resolution: {integrity: sha512-mn72up6cjaMyMuaPaa/AwKf6WtsSRysQC7wxFkCm1XcOKXPM1z+5Y4H5wjIVBz4gdAkjvZxVVfjA6ba1nHr5WQ==} dependencies: '@types/sinonjs__fake-timers': 8.1.2 dev: true @@ -4363,19 +4838,19 @@ packages: '@typescript-eslint/experimental-utils': 4.33.0(eslint@7.32.0)(typescript@4.9.5) '@typescript-eslint/parser': 4.33.0(eslint@7.32.0)(typescript@4.9.5) '@typescript-eslint/scope-manager': 4.33.0 - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.4(supports-color@9.3.1) eslint: 7.32.0 functional-red-black-tree: 1.0.1 ignore: 5.2.4 regexpp: 3.2.0 - semver: 7.3.8 + semver: 7.5.0 tsutils: 3.21.0(typescript@4.9.5) typescript: 4.9.5 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/eslint-plugin@5.44.0(@typescript-eslint/parser@5.44.0)(eslint@7.32.0)(typescript@4.9.3): + /@typescript-eslint/eslint-plugin@5.44.0(@typescript-eslint/parser@5.44.0)(eslint@8.39.0)(typescript@4.9.3): resolution: {integrity: sha512-j5ULd7FmmekcyWeArx+i8x7sdRHzAtXTkmDPthE4amxZOWKFK7bomoJ4r7PJ8K7PoMzD16U8MmuZFAonr1ERvw==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: @@ -4386,12 +4861,12 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/parser': 5.44.0(eslint@7.32.0)(typescript@4.9.3) + '@typescript-eslint/parser': 5.44.0(eslint@8.39.0)(typescript@4.9.3) '@typescript-eslint/scope-manager': 5.44.0 - '@typescript-eslint/type-utils': 5.44.0(eslint@7.32.0)(typescript@4.9.3) - '@typescript-eslint/utils': 5.44.0(eslint@7.32.0)(typescript@4.9.3) - debug: 4.3.4(supports-color@8.1.1) - eslint: 7.32.0 + '@typescript-eslint/type-utils': 5.44.0(eslint@8.39.0)(typescript@4.9.3) + '@typescript-eslint/utils': 5.44.0(eslint@8.39.0)(typescript@4.9.3) + debug: 4.3.4(supports-color@9.3.1) + eslint: 8.39.0 ignore: 5.2.0 natural-compare-lite: 1.4.0 regexpp: 3.2.0 @@ -4402,7 +4877,7 @@ packages: - supports-color dev: true - /@typescript-eslint/eslint-plugin@5.44.0(@typescript-eslint/parser@5.44.0)(eslint@7.32.0)(typescript@4.9.5): + /@typescript-eslint/eslint-plugin@5.44.0(@typescript-eslint/parser@5.44.0)(eslint@8.39.0)(typescript@4.9.5): resolution: {integrity: sha512-j5ULd7FmmekcyWeArx+i8x7sdRHzAtXTkmDPthE4amxZOWKFK7bomoJ4r7PJ8K7PoMzD16U8MmuZFAonr1ERvw==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: @@ -4413,12 +4888,12 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/parser': 5.44.0(eslint@7.32.0)(typescript@4.9.5) + '@typescript-eslint/parser': 5.44.0(eslint@8.39.0)(typescript@4.9.5) '@typescript-eslint/scope-manager': 5.44.0 - '@typescript-eslint/type-utils': 5.44.0(eslint@7.32.0)(typescript@4.9.5) - '@typescript-eslint/utils': 5.44.0(eslint@7.32.0)(typescript@4.9.5) - debug: 4.3.4(supports-color@8.1.1) - eslint: 7.32.0 + '@typescript-eslint/type-utils': 5.44.0(eslint@8.39.0)(typescript@4.9.5) + '@typescript-eslint/utils': 5.44.0(eslint@8.39.0)(typescript@4.9.5) + debug: 4.3.4(supports-color@9.3.1) + eslint: 8.39.0 ignore: 5.2.0 natural-compare-lite: 1.4.0 regexpp: 3.2.0 @@ -4429,33 +4904,6 @@ packages: - supports-color dev: true - /@typescript-eslint/eslint-plugin@5.44.0(@typescript-eslint/parser@5.44.0)(eslint@8.37.0)(typescript@4.9.3): - resolution: {integrity: sha512-j5ULd7FmmekcyWeArx+i8x7sdRHzAtXTkmDPthE4amxZOWKFK7bomoJ4r7PJ8K7PoMzD16U8MmuZFAonr1ERvw==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - '@typescript-eslint/parser': ^5.0.0 - eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - dependencies: - '@typescript-eslint/parser': 5.44.0(eslint@8.37.0)(typescript@4.9.3) - '@typescript-eslint/scope-manager': 5.44.0 - '@typescript-eslint/type-utils': 5.44.0(eslint@8.37.0)(typescript@4.9.3) - '@typescript-eslint/utils': 5.44.0(eslint@8.37.0)(typescript@4.9.3) - debug: 4.3.4(supports-color@8.1.1) - eslint: 8.37.0 - ignore: 5.2.0 - natural-compare-lite: 1.4.0 - regexpp: 3.2.0 - semver: 7.3.8 - tsutils: 3.21.0(typescript@4.9.3) - typescript: 4.9.3 - 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} @@ -4487,14 +4935,14 @@ packages: '@typescript-eslint/scope-manager': 4.33.0 '@typescript-eslint/types': 4.33.0 '@typescript-eslint/typescript-estree': 4.33.0(typescript@4.9.5) - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.4(supports-color@9.3.1) eslint: 7.32.0 typescript: 4.9.5 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/parser@5.44.0(eslint@7.32.0)(typescript@4.9.3): + /@typescript-eslint/parser@5.44.0(eslint@8.39.0)(typescript@4.9.3): resolution: {integrity: sha512-H7LCqbZnKqkkgQHaKLGC6KUjt3pjJDx8ETDqmwncyb6PuoigYajyAwBGz08VU/l86dZWZgI4zm5k2VaKqayYyA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: @@ -4507,14 +4955,14 @@ packages: '@typescript-eslint/scope-manager': 5.44.0 '@typescript-eslint/types': 5.44.0 '@typescript-eslint/typescript-estree': 5.44.0(typescript@4.9.3) - debug: 4.3.4(supports-color@8.1.1) - eslint: 7.32.0 + debug: 4.3.4(supports-color@9.3.1) + eslint: 8.39.0 typescript: 4.9.3 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/parser@5.44.0(eslint@7.32.0)(typescript@4.9.5): + /@typescript-eslint/parser@5.44.0(eslint@8.39.0)(typescript@4.9.5): resolution: {integrity: sha512-H7LCqbZnKqkkgQHaKLGC6KUjt3pjJDx8ETDqmwncyb6PuoigYajyAwBGz08VU/l86dZWZgI4zm5k2VaKqayYyA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: @@ -4527,33 +4975,13 @@ packages: '@typescript-eslint/scope-manager': 5.44.0 '@typescript-eslint/types': 5.44.0 '@typescript-eslint/typescript-estree': 5.44.0(typescript@4.9.5) - debug: 4.3.4(supports-color@8.1.1) - eslint: 7.32.0 + debug: 4.3.4(supports-color@9.3.1) + eslint: 8.39.0 typescript: 4.9.5 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/parser@5.44.0(eslint@8.37.0)(typescript@4.9.3): - resolution: {integrity: sha512-H7LCqbZnKqkkgQHaKLGC6KUjt3pjJDx8ETDqmwncyb6PuoigYajyAwBGz08VU/l86dZWZgI4zm5k2VaKqayYyA==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - dependencies: - '@typescript-eslint/scope-manager': 5.44.0 - '@typescript-eslint/types': 5.44.0 - '@typescript-eslint/typescript-estree': 5.44.0(typescript@4.9.3) - debug: 4.3.4(supports-color@8.1.1) - eslint: 8.37.0 - typescript: 4.9.3 - transitivePeerDependencies: - - supports-color - dev: true - /@typescript-eslint/scope-manager@4.33.0: resolution: {integrity: sha512-5IfJHpgTsTZuONKbODctL4kKuQje/bzBRkwHE8UOZ4f89Zeddg+EGZs8PD8NcN4LdM3ygHWYB3ukPAYjvl/qbQ==} engines: {node: ^8.10.0 || ^10.13.0 || >=11.10.1} @@ -4570,7 +4998,7 @@ packages: '@typescript-eslint/visitor-keys': 5.44.0 dev: true - /@typescript-eslint/type-utils@5.44.0(eslint@7.32.0)(typescript@4.9.3): + /@typescript-eslint/type-utils@5.44.0(eslint@8.39.0)(typescript@4.9.3): resolution: {integrity: sha512-A1u0Yo5wZxkXPQ7/noGkRhV4J9opcymcr31XQtOzcc5nO/IHN2E2TPMECKWYpM3e6olWEM63fq/BaL1wEYnt/w==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: @@ -4581,16 +5009,16 @@ packages: optional: true dependencies: '@typescript-eslint/typescript-estree': 5.44.0(typescript@4.9.3) - '@typescript-eslint/utils': 5.44.0(eslint@7.32.0)(typescript@4.9.3) - debug: 4.3.4(supports-color@8.1.1) - eslint: 7.32.0 + '@typescript-eslint/utils': 5.44.0(eslint@8.39.0)(typescript@4.9.3) + debug: 4.3.4(supports-color@9.3.1) + eslint: 8.39.0 tsutils: 3.21.0(typescript@4.9.3) typescript: 4.9.3 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/type-utils@5.44.0(eslint@7.32.0)(typescript@4.9.5): + /@typescript-eslint/type-utils@5.44.0(eslint@8.39.0)(typescript@4.9.5): resolution: {integrity: sha512-A1u0Yo5wZxkXPQ7/noGkRhV4J9opcymcr31XQtOzcc5nO/IHN2E2TPMECKWYpM3e6olWEM63fq/BaL1wEYnt/w==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: @@ -4601,35 +5029,15 @@ packages: optional: true dependencies: '@typescript-eslint/typescript-estree': 5.44.0(typescript@4.9.5) - '@typescript-eslint/utils': 5.44.0(eslint@7.32.0)(typescript@4.9.5) - debug: 4.3.4(supports-color@8.1.1) - eslint: 7.32.0 + '@typescript-eslint/utils': 5.44.0(eslint@8.39.0)(typescript@4.9.5) + debug: 4.3.4(supports-color@9.3.1) + eslint: 8.39.0 tsutils: 3.21.0(typescript@4.9.5) typescript: 4.9.5 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/type-utils@5.44.0(eslint@8.37.0)(typescript@4.9.3): - resolution: {integrity: sha512-A1u0Yo5wZxkXPQ7/noGkRhV4J9opcymcr31XQtOzcc5nO/IHN2E2TPMECKWYpM3e6olWEM63fq/BaL1wEYnt/w==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - eslint: '*' - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - dependencies: - '@typescript-eslint/typescript-estree': 5.44.0(typescript@4.9.3) - '@typescript-eslint/utils': 5.44.0(eslint@8.37.0)(typescript@4.9.3) - debug: 4.3.4(supports-color@8.1.1) - eslint: 8.37.0 - tsutils: 3.21.0(typescript@4.9.3) - typescript: 4.9.3 - transitivePeerDependencies: - - supports-color - dev: true - /@typescript-eslint/types@4.33.0: resolution: {integrity: sha512-zKp7CjQzLQImXEpLt2BUw1tvOMPfNoTAfb8l51evhYbOEEzdWyQNmHWWGPR6hwKJDAi+1VXSBmnhL9kyVTTOuQ==} engines: {node: ^8.10.0 || ^10.13.0 || >=11.10.1} @@ -4651,10 +5059,10 @@ packages: dependencies: '@typescript-eslint/types': 4.33.0 '@typescript-eslint/visitor-keys': 4.33.0 - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.4(supports-color@9.3.1) globby: 11.1.0 is-glob: 4.0.3 - semver: 7.3.8 + semver: 7.5.0 tsutils: 3.21.0(typescript@4.9.5) typescript: 4.9.5 transitivePeerDependencies: @@ -4672,7 +5080,7 @@ packages: dependencies: '@typescript-eslint/types': 5.44.0 '@typescript-eslint/visitor-keys': 5.44.0 - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.4(supports-color@9.3.1) globby: 11.1.0 is-glob: 4.0.3 semver: 7.3.8 @@ -4693,7 +5101,7 @@ packages: dependencies: '@typescript-eslint/types': 5.44.0 '@typescript-eslint/visitor-keys': 5.44.0 - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.4(supports-color@9.3.1) globby: 11.1.0 is-glob: 4.0.3 semver: 7.3.8 @@ -4703,7 +5111,7 @@ packages: - supports-color dev: true - /@typescript-eslint/utils@5.44.0(eslint@7.32.0)(typescript@4.9.3): + /@typescript-eslint/utils@5.44.0(eslint@8.39.0)(typescript@4.9.3): resolution: {integrity: sha512-fMzA8LLQ189gaBjS0MZszw5HBdZgVwxVFShCO3QN+ws3GlPkcy9YuS3U4wkT6su0w+Byjq3mS3uamy9HE4Yfjw==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: @@ -4714,16 +5122,16 @@ packages: '@typescript-eslint/scope-manager': 5.44.0 '@typescript-eslint/types': 5.44.0 '@typescript-eslint/typescript-estree': 5.44.0(typescript@4.9.3) - eslint: 7.32.0 + eslint: 8.39.0 eslint-scope: 5.1.1 - eslint-utils: 3.0.0(eslint@7.32.0) + eslint-utils: 3.0.0(eslint@8.39.0) semver: 7.3.8 transitivePeerDependencies: - supports-color - typescript dev: true - /@typescript-eslint/utils@5.44.0(eslint@7.32.0)(typescript@4.9.5): + /@typescript-eslint/utils@5.44.0(eslint@8.39.0)(typescript@4.9.5): resolution: {integrity: sha512-fMzA8LLQ189gaBjS0MZszw5HBdZgVwxVFShCO3QN+ws3GlPkcy9YuS3U4wkT6su0w+Byjq3mS3uamy9HE4Yfjw==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: @@ -4734,29 +5142,9 @@ packages: '@typescript-eslint/scope-manager': 5.44.0 '@typescript-eslint/types': 5.44.0 '@typescript-eslint/typescript-estree': 5.44.0(typescript@4.9.5) - eslint: 7.32.0 - eslint-scope: 5.1.1 - eslint-utils: 3.0.0(eslint@7.32.0) - semver: 7.3.8 - transitivePeerDependencies: - - supports-color - - typescript - dev: true - - /@typescript-eslint/utils@5.44.0(eslint@8.37.0)(typescript@4.9.3): - resolution: {integrity: sha512-fMzA8LLQ189gaBjS0MZszw5HBdZgVwxVFShCO3QN+ws3GlPkcy9YuS3U4wkT6su0w+Byjq3mS3uamy9HE4Yfjw==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 - dependencies: - '@types/json-schema': 7.0.11 - '@types/semver': 7.3.13 - '@typescript-eslint/scope-manager': 5.44.0 - '@typescript-eslint/types': 5.44.0 - '@typescript-eslint/typescript-estree': 5.44.0(typescript@4.9.3) - eslint: 8.37.0 + eslint: 8.39.0 eslint-scope: 5.1.1 - eslint-utils: 3.0.0(eslint@8.37.0) + eslint-utils: 3.0.0(eslint@8.39.0) semver: 7.3.8 transitivePeerDependencies: - supports-color @@ -4782,8 +5170,8 @@ packages: /@vue/compiler-sfc@2.7.14: resolution: {integrity: sha512-aNmNHyLPsw+sVvlQFQ2/8sjNuLtK54TC6cuKnVzAY93ks4ZBrvwQSnkkIh7bsbNhum5hJBS00wSDipQ937f5DA==} dependencies: - '@babel/parser': 7.21.2 - postcss: 8.4.21 + '@babel/parser': 7.21.4 + postcss: 8.4.23 source-map: 0.6.1 dev: true @@ -4799,7 +5187,7 @@ packages: source-map: 0.6.1 vue-template-es2015-compiler: 1.9.1 optionalDependencies: - prettier: 2.8.4 + prettier: 2.8.8 transitivePeerDependencies: - arc-templates - atpl @@ -4860,7 +5248,7 @@ packages: resolution: {integrity: sha512-L+lUuyxsocjBB3fwak3t0miXxyMHuXntysgm/R+MIbBfidsZEHpeky44z4Qdft2TUlGtb08i5QSl+4eUEQGTNw==} dev: false - /@wagmi/connectors@0.1.1(@babel/core@7.20.2)(@wagmi/core@0.8.4)(ethers@5.7.2)(typescript@4.9.3): + /@wagmi/connectors@0.1.1(@babel/core@7.21.4)(@wagmi/core@0.8.4)(ethers@5.7.2)(typescript@4.9.3): resolution: {integrity: sha512-W9w73o9HCYzuBsDHuujwBT/nGGIu5qLBSqVqslXf/S1Q9OiWoudmuIs3opuYqxgw5MpWbMqhq6QaxA7Qcd6NrA==} peerDependencies: '@wagmi/core': 0.8.x @@ -4869,9 +5257,9 @@ packages: '@wagmi/core': optional: true dependencies: - '@coinbase/wallet-sdk': 3.6.3(@babel/core@7.20.2) + '@coinbase/wallet-sdk': 3.6.3(@babel/core@7.21.4) '@ledgerhq/connect-kit-loader': 1.0.1 - '@wagmi/core': 0.8.4(@babel/core@7.20.2)(@coinbase/wallet-sdk@3.6.3)(ethers@5.7.2)(react@18.2.0)(typescript@4.9.3) + '@wagmi/core': 0.8.4(@babel/core@7.21.4)(@coinbase/wallet-sdk@3.6.3)(ethers@5.7.2)(react@18.2.0)(typescript@4.9.3) '@walletconnect/ethereum-provider': 1.8.0 abitype: 0.1.8(typescript@4.9.3) ethers: 5.7.2 @@ -4886,7 +5274,7 @@ packages: - utf-8-validate dev: false - /@wagmi/connectors@0.1.1(@babel/core@7.20.2)(@wagmi/core@0.8.4)(ethers@5.7.2)(typescript@4.9.5): + /@wagmi/connectors@0.1.1(@babel/core@7.21.4)(@wagmi/core@0.8.4)(ethers@5.7.2)(typescript@4.9.5): resolution: {integrity: sha512-W9w73o9HCYzuBsDHuujwBT/nGGIu5qLBSqVqslXf/S1Q9OiWoudmuIs3opuYqxgw5MpWbMqhq6QaxA7Qcd6NrA==} peerDependencies: '@wagmi/core': 0.8.x @@ -4895,9 +5283,9 @@ packages: '@wagmi/core': optional: true dependencies: - '@coinbase/wallet-sdk': 3.6.3(@babel/core@7.20.2) + '@coinbase/wallet-sdk': 3.6.3(@babel/core@7.21.4) '@ledgerhq/connect-kit-loader': 1.0.1 - '@wagmi/core': 0.8.4(@babel/core@7.20.2)(@coinbase/wallet-sdk@3.6.3)(ethers@5.7.2)(react@18.2.0)(typescript@4.9.5) + '@wagmi/core': 0.8.4(@babel/core@7.21.4)(@coinbase/wallet-sdk@3.6.3)(ethers@5.7.2)(react@18.2.0)(typescript@4.9.5) '@walletconnect/ethereum-provider': 1.8.0 abitype: 0.1.8(typescript@4.9.5) ethers: 5.7.2 @@ -4912,7 +5300,7 @@ packages: - utf-8-validate dev: false - /@wagmi/core@0.8.4(@babel/core@7.20.2)(@coinbase/wallet-sdk@3.6.3)(ethers@5.7.2)(react@18.2.0)(typescript@4.9.3): + /@wagmi/core@0.8.4(@babel/core@7.21.4)(@coinbase/wallet-sdk@3.6.3)(ethers@5.7.2)(react@18.2.0)(typescript@4.9.3): resolution: {integrity: sha512-orFRGOei+ixH8fIU9DitjKFSnv7sEv4j0A32gin2aADLuyBsAqG7xD+5LzfVD8EarHzU98Mk9d4hmmIkMg8bXw==} peerDependencies: '@coinbase/wallet-sdk': '>=3.6.0' @@ -4924,9 +5312,9 @@ packages: '@walletconnect/ethereum-provider': optional: true dependencies: - '@coinbase/wallet-sdk': 3.6.3(@babel/core@7.20.2) + '@coinbase/wallet-sdk': 3.6.3(@babel/core@7.21.4) '@wagmi/chains': 0.1.3 - '@wagmi/connectors': 0.1.1(@babel/core@7.20.2)(@wagmi/core@0.8.4)(ethers@5.7.2)(typescript@4.9.3) + '@wagmi/connectors': 0.1.1(@babel/core@7.21.4)(@wagmi/core@0.8.4)(ethers@5.7.2)(typescript@4.9.3) abitype: 0.2.5(typescript@4.9.3) ethers: 5.7.2 eventemitter3: 4.0.7 @@ -4944,7 +5332,7 @@ packages: - zod dev: false - /@wagmi/core@0.8.4(@babel/core@7.20.2)(@coinbase/wallet-sdk@3.6.3)(ethers@5.7.2)(react@18.2.0)(typescript@4.9.5): + /@wagmi/core@0.8.4(@babel/core@7.21.4)(@coinbase/wallet-sdk@3.6.3)(ethers@5.7.2)(react@18.2.0)(typescript@4.9.5): resolution: {integrity: sha512-orFRGOei+ixH8fIU9DitjKFSnv7sEv4j0A32gin2aADLuyBsAqG7xD+5LzfVD8EarHzU98Mk9d4hmmIkMg8bXw==} peerDependencies: '@coinbase/wallet-sdk': '>=3.6.0' @@ -4956,9 +5344,9 @@ packages: '@walletconnect/ethereum-provider': optional: true dependencies: - '@coinbase/wallet-sdk': 3.6.3(@babel/core@7.20.2) + '@coinbase/wallet-sdk': 3.6.3(@babel/core@7.21.4) '@wagmi/chains': 0.1.3 - '@wagmi/connectors': 0.1.1(@babel/core@7.20.2)(@wagmi/core@0.8.4)(ethers@5.7.2)(typescript@4.9.5) + '@wagmi/connectors': 0.1.1(@babel/core@7.21.4)(@wagmi/core@0.8.4)(ethers@5.7.2)(typescript@4.9.5) abitype: 0.2.5(typescript@4.9.5) ethers: 5.7.2 eventemitter3: 4.0.7 @@ -5189,109 +5577,109 @@ packages: '@walletconnect/window-getters': 1.0.1 dev: false - /@webassemblyjs/ast@1.11.1: - resolution: {integrity: sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw==} + /@webassemblyjs/ast@1.11.5: + resolution: {integrity: sha512-LHY/GSAZZRpsNQH+/oHqhRQ5FT7eoULcBqgfyTB5nQHogFnK3/7QoN7dLnwSE/JkUAF0SrRuclT7ODqMFtWxxQ==} dependencies: - '@webassemblyjs/helper-numbers': 1.11.1 - '@webassemblyjs/helper-wasm-bytecode': 1.11.1 + '@webassemblyjs/helper-numbers': 1.11.5 + '@webassemblyjs/helper-wasm-bytecode': 1.11.5 dev: true - /@webassemblyjs/floating-point-hex-parser@1.11.1: - resolution: {integrity: sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ==} + /@webassemblyjs/floating-point-hex-parser@1.11.5: + resolution: {integrity: sha512-1j1zTIC5EZOtCplMBG/IEwLtUojtwFVwdyVMbL/hwWqbzlQoJsWCOavrdnLkemwNoC/EOwtUFch3fuo+cbcXYQ==} dev: true - /@webassemblyjs/helper-api-error@1.11.1: - resolution: {integrity: sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg==} + /@webassemblyjs/helper-api-error@1.11.5: + resolution: {integrity: sha512-L65bDPmfpY0+yFrsgz8b6LhXmbbs38OnwDCf6NpnMUYqa+ENfE5Dq9E42ny0qz/PdR0LJyq/T5YijPnU8AXEpA==} dev: true - /@webassemblyjs/helper-buffer@1.11.1: - resolution: {integrity: sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA==} + /@webassemblyjs/helper-buffer@1.11.5: + resolution: {integrity: sha512-fDKo1gstwFFSfacIeH5KfwzjykIE6ldh1iH9Y/8YkAZrhmu4TctqYjSh7t0K2VyDSXOZJ1MLhht/k9IvYGcIxg==} dev: true - /@webassemblyjs/helper-numbers@1.11.1: - resolution: {integrity: sha512-vDkbxiB8zfnPdNK9Rajcey5C0w+QJugEglN0of+kmO8l7lDb77AnlKYQF7aarZuCrv+l0UvqL+68gSDr3k9LPQ==} + /@webassemblyjs/helper-numbers@1.11.5: + resolution: {integrity: sha512-DhykHXM0ZABqfIGYNv93A5KKDw/+ywBFnuWybZZWcuzWHfbp21wUfRkbtz7dMGwGgT4iXjWuhRMA2Mzod6W4WA==} dependencies: - '@webassemblyjs/floating-point-hex-parser': 1.11.1 - '@webassemblyjs/helper-api-error': 1.11.1 + '@webassemblyjs/floating-point-hex-parser': 1.11.5 + '@webassemblyjs/helper-api-error': 1.11.5 '@xtuc/long': 4.2.2 dev: true - /@webassemblyjs/helper-wasm-bytecode@1.11.1: - resolution: {integrity: sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q==} + /@webassemblyjs/helper-wasm-bytecode@1.11.5: + resolution: {integrity: sha512-oC4Qa0bNcqnjAowFn7MPCETQgDYytpsfvz4ujZz63Zu/a/v71HeCAAmZsgZ3YVKec3zSPYytG3/PrRCqbtcAvA==} dev: true - /@webassemblyjs/helper-wasm-section@1.11.1: - resolution: {integrity: sha512-10P9No29rYX1j7F3EVPX3JvGPQPae+AomuSTPiF9eBQeChHI6iqjMIwR9JmOJXwpnn/oVGDk7I5IlskuMwU/pg==} + /@webassemblyjs/helper-wasm-section@1.11.5: + resolution: {integrity: sha512-uEoThA1LN2NA+K3B9wDo3yKlBfVtC6rh0i4/6hvbz071E8gTNZD/pT0MsBf7MeD6KbApMSkaAK0XeKyOZC7CIA==} dependencies: - '@webassemblyjs/ast': 1.11.1 - '@webassemblyjs/helper-buffer': 1.11.1 - '@webassemblyjs/helper-wasm-bytecode': 1.11.1 - '@webassemblyjs/wasm-gen': 1.11.1 + '@webassemblyjs/ast': 1.11.5 + '@webassemblyjs/helper-buffer': 1.11.5 + '@webassemblyjs/helper-wasm-bytecode': 1.11.5 + '@webassemblyjs/wasm-gen': 1.11.5 dev: true - /@webassemblyjs/ieee754@1.11.1: - resolution: {integrity: sha512-hJ87QIPtAMKbFq6CGTkZYJivEwZDbQUgYd3qKSadTNOhVY7p+gfP6Sr0lLRVTaG1JjFj+r3YchoqRYxNH3M0GQ==} + /@webassemblyjs/ieee754@1.11.5: + resolution: {integrity: sha512-37aGq6qVL8A8oPbPrSGMBcp38YZFXcHfiROflJn9jxSdSMMM5dS5P/9e2/TpaJuhE+wFrbukN2WI6Hw9MH5acg==} dependencies: '@xtuc/ieee754': 1.2.0 dev: true - /@webassemblyjs/leb128@1.11.1: - resolution: {integrity: sha512-BJ2P0hNZ0u+Th1YZXJpzW6miwqQUGcIHT1G/sf72gLVD9DZ5AdYTqPNbHZh6K1M5VmKvFXwGSWZADz+qBWxeRw==} + /@webassemblyjs/leb128@1.11.5: + resolution: {integrity: sha512-ajqrRSXaTJoPW+xmkfYN6l8VIeNnR4vBOTQO9HzR7IygoCcKWkICbKFbVTNMjMgMREqXEr0+2M6zukzM47ZUfQ==} dependencies: '@xtuc/long': 4.2.2 dev: true - /@webassemblyjs/utf8@1.11.1: - resolution: {integrity: sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ==} + /@webassemblyjs/utf8@1.11.5: + resolution: {integrity: sha512-WiOhulHKTZU5UPlRl53gHR8OxdGsSOxqfpqWeA2FmcwBMaoEdz6b2x2si3IwC9/fSPLfe8pBMRTHVMk5nlwnFQ==} dev: true - /@webassemblyjs/wasm-edit@1.11.1: - resolution: {integrity: sha512-g+RsupUC1aTHfR8CDgnsVRVZFJqdkFHpsHMfJuWQzWU3tvnLC07UqHICfP+4XyL2tnr1amvl1Sdp06TnYCmVkA==} + /@webassemblyjs/wasm-edit@1.11.5: + resolution: {integrity: sha512-C0p9D2fAu3Twwqvygvf42iGCQ4av8MFBLiTb+08SZ4cEdwzWx9QeAHDo1E2k+9s/0w1DM40oflJOpkZ8jW4HCQ==} dependencies: - '@webassemblyjs/ast': 1.11.1 - '@webassemblyjs/helper-buffer': 1.11.1 - '@webassemblyjs/helper-wasm-bytecode': 1.11.1 - '@webassemblyjs/helper-wasm-section': 1.11.1 - '@webassemblyjs/wasm-gen': 1.11.1 - '@webassemblyjs/wasm-opt': 1.11.1 - '@webassemblyjs/wasm-parser': 1.11.1 - '@webassemblyjs/wast-printer': 1.11.1 + '@webassemblyjs/ast': 1.11.5 + '@webassemblyjs/helper-buffer': 1.11.5 + '@webassemblyjs/helper-wasm-bytecode': 1.11.5 + '@webassemblyjs/helper-wasm-section': 1.11.5 + '@webassemblyjs/wasm-gen': 1.11.5 + '@webassemblyjs/wasm-opt': 1.11.5 + '@webassemblyjs/wasm-parser': 1.11.5 + '@webassemblyjs/wast-printer': 1.11.5 dev: true - /@webassemblyjs/wasm-gen@1.11.1: - resolution: {integrity: sha512-F7QqKXwwNlMmsulj6+O7r4mmtAlCWfO/0HdgOxSklZfQcDu0TpLiD1mRt/zF25Bk59FIjEuGAIyn5ei4yMfLhA==} + /@webassemblyjs/wasm-gen@1.11.5: + resolution: {integrity: sha512-14vteRlRjxLK9eSyYFvw1K8Vv+iPdZU0Aebk3j6oB8TQiQYuO6hj9s4d7qf6f2HJr2khzvNldAFG13CgdkAIfA==} dependencies: - '@webassemblyjs/ast': 1.11.1 - '@webassemblyjs/helper-wasm-bytecode': 1.11.1 - '@webassemblyjs/ieee754': 1.11.1 - '@webassemblyjs/leb128': 1.11.1 - '@webassemblyjs/utf8': 1.11.1 + '@webassemblyjs/ast': 1.11.5 + '@webassemblyjs/helper-wasm-bytecode': 1.11.5 + '@webassemblyjs/ieee754': 1.11.5 + '@webassemblyjs/leb128': 1.11.5 + '@webassemblyjs/utf8': 1.11.5 dev: true - /@webassemblyjs/wasm-opt@1.11.1: - resolution: {integrity: sha512-VqnkNqnZlU5EB64pp1l7hdm3hmQw7Vgqa0KF/KCNO9sIpI6Fk6brDEiX+iCOYrvMuBWDws0NkTOxYEb85XQHHw==} + /@webassemblyjs/wasm-opt@1.11.5: + resolution: {integrity: sha512-tcKwlIXstBQgbKy1MlbDMlXaxpucn42eb17H29rawYLxm5+MsEmgPzeCP8B1Cl69hCice8LeKgZpRUAPtqYPgw==} dependencies: - '@webassemblyjs/ast': 1.11.1 - '@webassemblyjs/helper-buffer': 1.11.1 - '@webassemblyjs/wasm-gen': 1.11.1 - '@webassemblyjs/wasm-parser': 1.11.1 + '@webassemblyjs/ast': 1.11.5 + '@webassemblyjs/helper-buffer': 1.11.5 + '@webassemblyjs/wasm-gen': 1.11.5 + '@webassemblyjs/wasm-parser': 1.11.5 dev: true - /@webassemblyjs/wasm-parser@1.11.1: - resolution: {integrity: sha512-rrBujw+dJu32gYB7/Lup6UhdkPx9S9SnobZzRVL7VcBH9Bt9bCBLEuX/YXOOtBsOZ4NQrRykKhffRWHvigQvOA==} + /@webassemblyjs/wasm-parser@1.11.5: + resolution: {integrity: sha512-SVXUIwsLQlc8srSD7jejsfTU83g7pIGr2YYNb9oHdtldSxaOhvA5xwvIiWIfcX8PlSakgqMXsLpLfbbJ4cBYew==} dependencies: - '@webassemblyjs/ast': 1.11.1 - '@webassemblyjs/helper-api-error': 1.11.1 - '@webassemblyjs/helper-wasm-bytecode': 1.11.1 - '@webassemblyjs/ieee754': 1.11.1 - '@webassemblyjs/leb128': 1.11.1 - '@webassemblyjs/utf8': 1.11.1 + '@webassemblyjs/ast': 1.11.5 + '@webassemblyjs/helper-api-error': 1.11.5 + '@webassemblyjs/helper-wasm-bytecode': 1.11.5 + '@webassemblyjs/ieee754': 1.11.5 + '@webassemblyjs/leb128': 1.11.5 + '@webassemblyjs/utf8': 1.11.5 dev: true - /@webassemblyjs/wast-printer@1.11.1: - resolution: {integrity: sha512-IQboUWM4eKzWW+N/jij2sRatKMh99QEelo3Eb2q0qXkvPRISAj8Qxtmw5itwqK+TTkBuUIE45AxYPToqPtL5gg==} + /@webassemblyjs/wast-printer@1.11.5: + resolution: {integrity: sha512-f7Pq3wvg3GSPUPzR0F6bmI89Hdb+u9WXrSKc4v+N0aV0q6r42WoF92Jp2jEorBEBRoRNXgjp53nBniDXcqZYPA==} dependencies: - '@webassemblyjs/ast': 1.11.1 + '@webassemblyjs/ast': 1.11.5 '@xtuc/long': 4.2.2 dev: true @@ -5533,7 +5921,7 @@ packages: resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} engines: {node: '>= 6.0.0'} dependencies: - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.4(supports-color@9.3.1) transitivePeerDependencies: - supports-color dev: true @@ -5542,7 +5930,7 @@ packages: resolution: {integrity: sha512-Zn4cw2NEqd+9fiSVWMscnjyQ1a8Yfoc5oBajLeo5w+YBHgDUcEBY2hS4YpTz6iN5f/2zQiktcuM6tS8x1p9dpA==} engines: {node: '>= 8.0.0'} dependencies: - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.4(supports-color@9.3.1) depd: 1.1.2 humanize-ms: 1.2.1 transitivePeerDependencies: @@ -5760,6 +6148,13 @@ packages: typical: 2.6.1 dev: true + /array-buffer-byte-length@1.0.0: + resolution: {integrity: sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==} + dependencies: + call-bind: 1.0.2 + is-array-buffer: 3.0.2 + dev: true + /array-flatten@1.1.1: resolution: {integrity: sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==} dev: true @@ -5771,7 +6166,7 @@ packages: dependencies: call-bind: 1.0.2 define-properties: 1.2.0 - es-abstract: 1.21.1 + es-abstract: 1.21.2 get-intrinsic: 1.2.0 is-string: 1.0.7 dev: true @@ -5797,7 +6192,7 @@ packages: dependencies: call-bind: 1.0.2 define-properties: 1.2.0 - es-abstract: 1.21.1 + es-abstract: 1.21.2 es-shim-unscopables: 1.0.0 dev: true @@ -5807,7 +6202,7 @@ packages: dependencies: call-bind: 1.0.2 define-properties: 1.2.0 - es-abstract: 1.21.1 + es-abstract: 1.21.2 es-shim-unscopables: 1.0.0 dev: true @@ -5817,7 +6212,7 @@ packages: dependencies: call-bind: 1.0.2 define-properties: 1.2.0 - es-abstract: 1.21.1 + es-abstract: 1.21.2 es-array-method-boxes-properly: 1.0.0 is-string: 1.0.7 dev: true @@ -5901,7 +6296,7 @@ packages: /async@2.6.2: resolution: {integrity: sha512-H1qVYh1MYhEEFLsP97cVKqCGo7KfCyTt6uEWqsTBr9SO84oK9Uwbyd/yCW+6rKJLHksBNUVWZDAjfS+Ccx0Bbg==} dependencies: - lodash: 4.17.21 + lodash: 4.17.20 dev: true /async@2.6.4: @@ -5980,8 +6375,8 @@ packages: resolution: {integrity: sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==} dev: true - /aws4@1.12.0: - resolution: {integrity: sha512-NmWvPnx0F1SfrQbYwOi7OeaNGokp9XhzNioJ/CSBs8Qa4vxug81mhJEAVZwxXuBmYB5KDRfMq/F3RR0BIU7sWg==} + /aws4@1.11.0: + resolution: {integrity: sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==} dev: true /axios@0.21.4: @@ -6026,7 +6421,7 @@ packages: convert-source-map: 1.9.0 debug: 2.6.9 json5: 0.5.1 - lodash: 4.17.21 + lodash: 4.17.20 minimatch: 3.1.2 path-is-absolute: 1.0.1 private: 0.1.8 @@ -6044,7 +6439,7 @@ packages: babel-types: 6.26.0 detect-indent: 4.0.0 jsesc: 1.3.0 - lodash: 4.17.21 + lodash: 4.17.20 source-map: 0.5.7 trim-right: 1.0.1 dev: true @@ -6076,7 +6471,7 @@ packages: babel-helper-function-name: 6.24.1 babel-runtime: 6.26.0 babel-types: 6.26.0 - lodash: 4.17.21 + lodash: 4.17.20 transitivePeerDependencies: - supports-color dev: true @@ -6129,7 +6524,7 @@ packages: dependencies: babel-runtime: 6.26.0 babel-types: 6.26.0 - lodash: 4.17.21 + lodash: 4.17.20 dev: true /babel-helper-remap-async-to-generator@6.24.1: @@ -6166,18 +6561,37 @@ packages: - supports-color dev: true - /babel-jest@27.5.1(@babel/core@7.20.2): + /babel-jest@27.5.1(@babel/core@7.20.2): + resolution: {integrity: sha512-cdQ5dXjGRd0IBRATiQ4mZGlGlRE8kJpjPOixdNRdT+m3UcNqmYWN6rK6nvtXYfY3D76cb8s/O1Ss8ea24PIwcg==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + peerDependencies: + '@babel/core': ^7.8.0 + dependencies: + '@babel/core': 7.20.2 + '@jest/transform': 27.5.1 + '@jest/types': 27.5.1 + '@types/babel__core': 7.1.20 + babel-plugin-istanbul: 6.1.1 + babel-preset-jest: 27.5.1(@babel/core@7.20.2) + chalk: 4.1.2 + graceful-fs: 4.2.10 + slash: 3.0.0 + transitivePeerDependencies: + - supports-color + dev: true + + /babel-jest@27.5.1(@babel/core@7.21.4): resolution: {integrity: sha512-cdQ5dXjGRd0IBRATiQ4mZGlGlRE8kJpjPOixdNRdT+m3UcNqmYWN6rK6nvtXYfY3D76cb8s/O1Ss8ea24PIwcg==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} peerDependencies: '@babel/core': ^7.8.0 dependencies: - '@babel/core': 7.20.2 + '@babel/core': 7.21.4 '@jest/transform': 27.5.1 '@jest/types': 27.5.1 '@types/babel__core': 7.1.20 babel-plugin-istanbul: 6.1.1 - babel-preset-jest: 27.5.1(@babel/core@7.20.2) + babel-preset-jest: 27.5.1(@babel/core@7.21.4) chalk: 4.1.2 graceful-fs: 4.2.10 slash: 3.0.0 @@ -6220,36 +6634,36 @@ packages: '@types/babel__traverse': 7.18.2 dev: true - /babel-plugin-polyfill-corejs2@0.3.3(@babel/core@7.20.2): + /babel-plugin-polyfill-corejs2@0.3.3(@babel/core@7.21.4): resolution: {integrity: sha512-8hOdmFYFSZhqg2C/JgLUQ+t52o5nirNwaWM2B9LWteozwIvM14VSwdsCAUET10qT+kmySAlseadmfeeSWFCy+Q==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: '@babel/compat-data': 7.20.1 - '@babel/core': 7.20.2 - '@babel/helper-define-polyfill-provider': 0.3.3(@babel/core@7.20.2) + '@babel/core': 7.21.4 + '@babel/helper-define-polyfill-provider': 0.3.3(@babel/core@7.21.4) semver: 6.3.0 transitivePeerDependencies: - supports-color - /babel-plugin-polyfill-corejs3@0.6.0(@babel/core@7.20.2): + /babel-plugin-polyfill-corejs3@0.6.0(@babel/core@7.21.4): resolution: {integrity: sha512-+eHqR6OPcBhJOGgsIar7xoAB1GcSwVUA3XjAd7HJNzOXT4wv6/H7KIdA/Nc60cvUlDbKApmqNvD1B1bzOt4nyA==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.20.2 - '@babel/helper-define-polyfill-provider': 0.3.3(@babel/core@7.20.2) + '@babel/core': 7.21.4 + '@babel/helper-define-polyfill-provider': 0.3.3(@babel/core@7.21.4) core-js-compat: 3.26.1 transitivePeerDependencies: - supports-color - /babel-plugin-polyfill-regenerator@0.4.1(@babel/core@7.20.2): + /babel-plugin-polyfill-regenerator@0.4.1(@babel/core@7.21.4): resolution: {integrity: sha512-NtQGmyQDXjQqQ+IzRkBVwEOz9lQ4zxAQZgoAYEtU9dJjnl1Oc98qnN7jcp+bE7O7aYzVpavXE3/VKXNzUbh7aw==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.20.2 - '@babel/helper-define-polyfill-provider': 0.3.3(@babel/core@7.20.2) + '@babel/core': 7.21.4 + '@babel/helper-define-polyfill-provider': 0.3.3(@babel/core@7.21.4) transitivePeerDependencies: - supports-color @@ -6294,7 +6708,7 @@ packages: babel-template: 6.26.0 babel-traverse: 6.26.0 babel-types: 6.26.0 - lodash: 4.17.21 + lodash: 4.17.20 transitivePeerDependencies: - supports-color dev: true @@ -6506,6 +6920,26 @@ packages: '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.20.2) dev: true + /babel-preset-current-node-syntax@1.0.1(@babel/core@7.21.4): + resolution: {integrity: sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.21.4 + '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.21.4) + '@babel/plugin-syntax-bigint': 7.8.3(@babel/core@7.21.4) + '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.21.4) + '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.21.4) + '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.21.4) + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.21.4) + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.21.4) + '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.21.4) + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.21.4) + '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.21.4) + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.21.4) + '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.21.4) + dev: true + /babel-preset-env@1.7.0: resolution: {integrity: sha512-9OR2afuKDneX2/q2EurSftUYM0xGu4O2D9adAhVfADDhrYDaxXV0rBbevVYoY9n6nyX1PmQW/0jtpJvUNr9CHg==} dependencies: @@ -6554,6 +6988,17 @@ packages: babel-preset-current-node-syntax: 1.0.1(@babel/core@7.20.2) dev: true + /babel-preset-jest@27.5.1(@babel/core@7.21.4): + resolution: {integrity: sha512-Nptf2FzlPCWYuJg41HBqXVT8ym6bXOevuCTbhxlUpjwtysGaIWFvDEjp4y+G7fl13FgOdjs7P/DmErqH7da0Ag==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.21.4 + babel-plugin-jest-hoist: 27.5.1 + babel-preset-current-node-syntax: 1.0.1(@babel/core@7.21.4) + dev: true + /babel-register@6.26.0: resolution: {integrity: sha512-veliHlHX06wjaeY8xNITbveXSiI+ASFnOqvne/LaIJIqOWi2Ogmj91KOugEz/hoh/fwMhXNBJPCv8Xaz5CyM4A==} dependencies: @@ -6561,7 +7006,7 @@ packages: babel-runtime: 6.26.0 core-js: 2.6.12 home-or-tmp: 2.0.0 - lodash: 4.17.21 + lodash: 4.17.20 mkdirp: 0.5.6 source-map-support: 0.4.18 transitivePeerDependencies: @@ -6683,16 +7128,9 @@ packages: bindings: 1.5.0 dev: false - /bigint-crypto-utils@3.1.8: - resolution: {integrity: sha512-+VMV9Laq8pXLBKKKK49nOoq9bfR3j7NNQAtbA617a4nw9bVLo8rsqkKMBgM2AJWlNX9fEIyYaYX+d0laqYV4tw==} - engines: {node: '>=10.4.0'} - dependencies: - bigint-mod-arith: 3.1.2 - dev: true - - /bigint-mod-arith@3.1.2: - resolution: {integrity: sha512-nx8J8bBeiRR+NlsROFH9jHswW5HO8mgfOSqW0AmjicMMvaONDa8AO+5ViKDUUNytBPWiwfvZP4/Bj4Y3lUfvgQ==} - engines: {node: '>=10.4.0'} + /bigint-crypto-utils@3.2.2: + resolution: {integrity: sha512-U1RbE3aX9ayCUVcIPHuPDPKcK3SFOXf93J1UK/iHlJuQB7bhagPIX06/CLpLEsDThJ7KA4Dhrnzynl+d2weTiw==} + engines: {node: '>=14.0.0'} dev: true /bignumber.js@9.1.1: @@ -6932,8 +7370,8 @@ packages: resolution: {integrity: sha512-WHVocJYavUwVgVViC0ORikPHQquXwVh939TaelZ4WDqpWgTX/FsGhl/+P4qBUAGcRvtOgDgC+xftNWWp2RUTAQ==} hasBin: true dependencies: - caniuse-lite: 1.0.30001465 - electron-to-chromium: 1.4.328 + caniuse-lite: 1.0.30001481 + electron-to-chromium: 1.4.369 dev: true /browserslist@4.21.4: @@ -7164,7 +7602,7 @@ packages: resolution: {integrity: sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==} dependencies: function-bind: 1.1.1 - get-intrinsic: 1.2.0 + get-intrinsic: 1.1.3 /caller-callsite@2.0.0: resolution: {integrity: sha512-JuG3qI4QOftFsZyOn1qq87fq5grLIyk1JYd5lJmdA+fG7aQ9pA/i3JIJGcO3q0MrRcHlOt1U+ZeHW8Dq9axALQ==} @@ -7245,6 +7683,15 @@ packages: /caniuse-lite@1.0.30001465: resolution: {integrity: sha512-HvjgL3MYAJjceTDCcjRnQGjwUz/5qec9n7JPOzUursUoOTIsYCSDOb1l7RsnZE8mjbxG78zVRCKfrBXyvChBag==} + /caniuse-lite@1.0.30001481: + resolution: {integrity: sha512-KCqHwRnaa1InZBtqXzP98LPg0ajCVujMKjqKDhZEthIpAsJl/YEIa3YvXjGXPVqzZVguccuu7ga9KOE1J9rKPQ==} + dev: true + + /case@1.6.3: + resolution: {integrity: sha512-mzDSXIPaFwVDvZAHqZ9VlbyF4yyXRuX6IvB06WvPYkqJVO24kX1PPhv9bfpKNFZyxYFmmgo03HUiD8iklmJYRQ==} + engines: {node: '>= 0.8.0'} + dev: true + /caseless@0.12.0: resolution: {integrity: sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==} dev: true @@ -7443,15 +7890,15 @@ packages: static-extend: 0.1.2 dev: true - /classic-level@1.2.0: - resolution: {integrity: sha512-qw5B31ANxSluWz9xBzklRWTUAJ1SXIdaVKTVS7HcTGKOAmExx65Wo5BUICW+YGORe2FOUaDghoI9ZDxj82QcFg==} + /classic-level@1.3.0: + resolution: {integrity: sha512-iwFAJQYtqRTRM0F6L8h4JCt00ZSGdOyqh7yVrhhjrOpFhmBjNlRUey64MCiyo6UmQHMJ+No3c81nujPv+n9yrg==} engines: {node: '>=12'} requiresBuild: true dependencies: abstract-level: 1.0.3 catering: 2.1.1 module-error: 1.0.2 - napi-macros: 2.0.0 + napi-macros: 2.2.2 node-gyp-build: 4.6.0 dev: true @@ -7654,6 +8101,10 @@ packages: resolution: {integrity: sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ==} dev: true + /colorette@2.0.20: + resolution: {integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==} + dev: true + /colors@1.4.0: resolution: {integrity: sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==} engines: {node: '>=0.1.90'} @@ -7681,8 +8132,8 @@ packages: typical: 2.6.1 dev: true - /commander@10.0.0: - resolution: {integrity: sha512-zS5PnTI22FIRM6ylNW8G4Ap0IEOyk62fhLSD0+uHRT9McRCLGpkVNvao4bjimpK/GShynyQkFFxHhwMcETmduA==} + /commander@10.0.1: + resolution: {integrity: sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==} engines: {node: '>=14'} dev: true @@ -7724,7 +8175,7 @@ packages: dependencies: buffer-from: 1.1.2 inherits: 2.0.4 - readable-stream: 2.3.8 + readable-stream: 2.3.7 typedarray: 0.0.6 dev: true @@ -7964,8 +8415,8 @@ packages: dependencies: browserslist: 4.21.4 - /core-js-pure@3.29.0: - resolution: {integrity: sha512-v94gUjN5UTe1n0yN/opTihJ8QBWD2O8i19RfTZR7foONPWArnjB96QA/wk5ozu1mm6ja3udQCzOzwQXTxi3xOQ==} + /core-js-pure@3.30.1: + resolution: {integrity: sha512-nXBEVpmUnNRhz83cHd9JRQC52cTMcuXAmR56+9dSMpRdpeA4I1PX6yjmhd71Eyc/wXNsdBdUDIj1QTIeZpU5Tg==} requiresBuild: true dev: true @@ -8013,8 +8464,8 @@ packages: yaml: 1.10.2 dev: true - /cosmiconfig@8.1.0: - resolution: {integrity: sha512-0tLZ9URlPGU7JsKq0DQOQ3FoRsYX8xDZ7xMiATQfaiGMz7EHowNkbU9u1coAOmnh9p/1ySpm0RB3JNWRXM5GCg==} + /cosmiconfig@8.1.3: + resolution: {integrity: sha512-/UkO2JKI18b5jVMJUp0lvKFMpa/Gye+ZgZjKD+DGEN9y7NRcf/nK1A0sp67ONmKtnDCNMS44E6jrk0Yc3bDuUw==} engines: {node: '>=14'} dependencies: import-fresh: 3.3.0 @@ -8124,21 +8575,21 @@ packages: randomfill: 1.0.4 dev: true - /css-loader@6.7.3(webpack@5.75.0): + /css-loader@6.7.3(webpack@5.80.0): resolution: {integrity: sha512-qhOH1KlBMnZP8FzRO6YCH9UHXQhVMcEGLyNdb7Hv2cpcmJbW0YrddO+tG1ab5nT41KpHIYGsbeHqxB9xPu1pKQ==} engines: {node: '>= 12.13.0'} peerDependencies: webpack: ^5.0.0 dependencies: - icss-utils: 5.1.0(postcss@8.4.21) - postcss: 8.4.21 - postcss-modules-extract-imports: 3.0.0(postcss@8.4.21) - postcss-modules-local-by-default: 4.0.0(postcss@8.4.21) - postcss-modules-scope: 3.0.0(postcss@8.4.21) - postcss-modules-values: 4.0.0(postcss@8.4.21) + icss-utils: 5.1.0(postcss@8.4.23) + postcss: 8.4.23 + postcss-modules-extract-imports: 3.0.0(postcss@8.4.23) + postcss-modules-local-by-default: 4.0.0(postcss@8.4.23) + postcss-modules-scope: 3.0.0(postcss@8.4.23) + postcss-modules-values: 4.0.0(postcss@8.4.23) postcss-value-parser: 4.2.0 - semver: 7.3.8 - webpack: 5.75.0 + semver: 7.5.0 + webpack: 5.80.0 dev: true /css-select@4.3.0: @@ -8180,6 +8631,10 @@ packages: /csstype@3.1.1: resolution: {integrity: sha512-DJR/VvkAvSZW9bTouZue2sSxDwdTN92uHjqeKVm+0dAqdfNykRzQ95tay8aXMBAAPpUiq4Qcug2L7neoRh2Egw==} + /csstype@3.1.2: + resolution: {integrity: sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==} + dev: true + /d@1.0.1: resolution: {integrity: sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==} dependencies: @@ -8234,7 +8689,7 @@ packages: supports-color: optional: true dependencies: - ms: 2.1.3 + ms: 2.1.1 supports-color: 6.0.0 dev: true @@ -8260,6 +8715,7 @@ packages: dependencies: ms: 2.1.2 supports-color: 8.1.1 + dev: true /debug@4.3.4(supports-color@9.3.1): resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} @@ -8272,7 +8728,6 @@ packages: dependencies: ms: 2.1.2 supports-color: 9.3.1 - dev: true /decamelize-keys@1.1.1: resolution: {integrity: sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==} @@ -8344,7 +8799,7 @@ packages: is-regex: 1.1.4 object-is: 1.1.5 object-keys: 1.1.1 - regexp.prototype.flags: 1.4.3 + regexp.prototype.flags: 1.5.0 dev: true /deep-extend@0.6.0: @@ -8520,7 +8975,7 @@ packages: hasBin: true dependencies: address: 1.2.2 - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.4(supports-color@9.3.1) transitivePeerDependencies: - supports-color dev: true @@ -8711,6 +9166,10 @@ packages: /electron-to-chromium@1.4.328: resolution: {integrity: sha512-DE9tTy2PNmy1v55AZAO542ui+MLC2cvINMK4P2LXGsJdput/ThVG9t+QGecPuAZZSgC8XoI+Jh9M1OG9IoNSCw==} + /electron-to-chromium@1.4.369: + resolution: {integrity: sha512-LfxbHXdA/S+qyoTEA4EbhxGjrxx7WK2h6yb5K2v0UCOufUKX+VZaHbl3svlzZfv9sGseym/g3Ne4DpsgRULmqg==} + dev: true + /elliptic@6.5.4: resolution: {integrity: sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==} dependencies: @@ -8789,6 +9248,14 @@ packages: tapable: 2.2.1 dev: true + /enhanced-resolve@5.13.0: + resolution: {integrity: sha512-eyV8f0y1+bzyfh8xAwW/WTSZpLbjhqc4ne9eGSH4Zo2ejdyiNG9pU6mf9DG8a7+Auk6MFTlNOT4Y2y/9k8GKVg==} + engines: {node: '>=10.13.0'} + dependencies: + graceful-fs: 4.2.11 + tapable: 2.2.1 + dev: true + /enquirer@2.3.6: resolution: {integrity: sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==} engines: {node: '>=8.6'} @@ -8822,15 +9289,15 @@ packages: is-arrayish: 0.2.1 dev: true - /es-abstract@1.21.1: - resolution: {integrity: sha512-QudMsPOz86xYz/1dG1OuGBKOELjCh99IIWHLzy5znUB6j8xG2yMA7bfTV86VSqKF+Y/H08vQPR+9jyXpuC6hfg==} + /es-abstract@1.21.2: + resolution: {integrity: sha512-y/B5POM2iBnIxCiernH1G7rC9qQoM77lLIMQLuob0zhp8C56Po81+2Nj0WFKnd0pNReDTnkYryc+zhOzpEIROg==} engines: {node: '>= 0.4'} dependencies: + array-buffer-byte-length: 1.0.0 available-typed-arrays: 1.0.5 call-bind: 1.0.2 es-set-tostringtag: 2.0.1 es-to-primitive: 1.2.1 - function-bind: 1.1.1 function.prototype.name: 1.1.5 get-intrinsic: 1.2.0 get-symbol-description: 1.0.0 @@ -8852,8 +9319,9 @@ packages: object-inspect: 1.12.3 object-keys: 1.1.1 object.assign: 4.1.4 - regexp.prototype.flags: 1.4.3 + regexp.prototype.flags: 1.5.0 safe-regex-test: 1.0.0 + string.prototype.trim: 1.2.7 string.prototype.trimend: 1.0.6 string.prototype.trimstart: 1.0.6 typed-array-length: 1.0.4 @@ -8865,8 +9333,8 @@ packages: resolution: {integrity: sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA==} dev: true - /es-module-lexer@0.9.3: - resolution: {integrity: sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ==} + /es-module-lexer@1.2.1: + resolution: {integrity: sha512-9978wrXM50Y4rTMmW5kXIC09ZdXQZqkE4mxhwkd8VbzsGkXGPgV4zWuqQJgCEzYngdo2dYDa0l8xhX4fkSwJSg==} dev: true /es-set-tostringtag@2.0.1: @@ -9202,8 +9670,8 @@ packages: source-map: 0.6.1 dev: true - /eslint-config-prettier@8.6.0(eslint@7.32.0): - resolution: {integrity: sha512-bAF0eLpLVqP5oEVUFKpMA+NnRFICwn9X8B5jrR9FcqnYBuPbqWEjTEspPWMj5ye6czoSLDweCzSo3Ko7gGrZaA==} + /eslint-config-prettier@8.8.0(eslint@7.32.0): + resolution: {integrity: sha512-wLbQiFre3tdGgpDv67NQKnJuTlcUVYHas3k+DZCc2U2BadthoEY4B7hLPvAxaqdyOGCzuLfii2fqGph10va7oA==} hasBin: true peerDependencies: eslint: '>=7.0.0' @@ -9229,14 +9697,14 @@ packages: resolution: {integrity: sha512-gozW2blMLJCeFpBwugLTGyvVjNoeo1knonXAcatC6bjPBZitotxdWf7Gimr25N4c0AAOo4eOUfaG82IJPDpqCA==} dependencies: debug: 3.2.7 - is-core-module: 2.11.0 - resolve: 1.22.1 + is-core-module: 2.12.0 + resolve: 1.22.2 transitivePeerDependencies: - supports-color dev: true - /eslint-module-utils@2.7.4(@typescript-eslint/parser@4.33.0)(eslint-import-resolver-node@0.3.7)(eslint@7.32.0): - resolution: {integrity: sha512-j4GT+rqzCoRKHwURX7pddtIPGySnX9Si/cgMI5ztrcqOPtk5dDEeZ34CQVPphnqkJytlc97Vuk05Um2mJ3gEQA==} + /eslint-module-utils@2.8.0(@typescript-eslint/parser@4.33.0)(eslint-import-resolver-node@0.3.7)(eslint@7.32.0): + resolution: {integrity: sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==} engines: {node: '>=4'} peerDependencies: '@typescript-eslint/parser': '*' @@ -9293,13 +9761,13 @@ packages: doctrine: 2.1.0 eslint: 7.32.0 eslint-import-resolver-node: 0.3.7 - eslint-module-utils: 2.7.4(@typescript-eslint/parser@4.33.0)(eslint-import-resolver-node@0.3.7)(eslint@7.32.0) + eslint-module-utils: 2.8.0(@typescript-eslint/parser@4.33.0)(eslint-import-resolver-node@0.3.7)(eslint@7.32.0) has: 1.0.3 - is-core-module: 2.11.0 + is-core-module: 2.12.0 is-glob: 4.0.3 minimatch: 3.1.2 object.values: 1.1.6 - resolve: 1.22.1 + resolve: 1.22.2 semver: 6.3.0 tsconfig-paths: 3.14.2 transitivePeerDependencies: @@ -9308,7 +9776,7 @@ packages: - supports-color dev: true - /eslint-plugin-jest@27.2.1(@typescript-eslint/eslint-plugin@5.44.0)(eslint@8.37.0)(jest@27.5.1)(typescript@4.9.3): + /eslint-plugin-jest@27.2.1(@typescript-eslint/eslint-plugin@5.44.0)(eslint@8.39.0)(jest@27.5.1)(typescript@4.9.3): resolution: {integrity: sha512-l067Uxx7ZT8cO9NJuf+eJHvt6bqJyz2Z29wykyEdz/OtmcELQl2MQGQLX8J94O1cSJWAwUSEvCjwjA7KEK3Hmg==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} peerDependencies: @@ -9321,9 +9789,9 @@ packages: jest: optional: true dependencies: - '@typescript-eslint/eslint-plugin': 5.44.0(@typescript-eslint/parser@5.44.0)(eslint@8.37.0)(typescript@4.9.3) - '@typescript-eslint/utils': 5.44.0(eslint@8.37.0)(typescript@4.9.3) - eslint: 8.37.0 + '@typescript-eslint/eslint-plugin': 5.44.0(@typescript-eslint/parser@5.44.0)(eslint@8.39.0)(typescript@4.9.3) + '@typescript-eslint/utils': 5.44.0(eslint@8.39.0)(typescript@4.9.3) + eslint: 8.39.0 jest: 27.5.1 transitivePeerDependencies: - supports-color @@ -9341,11 +9809,11 @@ packages: eslint-utils: 2.1.0 ignore: 5.2.4 minimatch: 3.1.2 - resolve: 1.22.1 + resolve: 1.22.2 semver: 6.3.0 dev: true - /eslint-plugin-prettier@3.4.1(eslint-config-prettier@8.6.0)(eslint@7.32.0)(prettier@2.8.4): + /eslint-plugin-prettier@3.4.1(eslint-config-prettier@8.8.0)(eslint@7.32.0)(prettier@2.8.8): resolution: {integrity: sha512-htg25EUYUeIhKHXjOinK4BgCcDwtLHjqaxCDsMy5nbnUMkKFvIhMVCp+5GFUXQ4Nr8lBsPqtGAqBenbpFqAA2g==} engines: {node: '>=6.0.0'} peerDependencies: @@ -9357,8 +9825,8 @@ packages: optional: true dependencies: eslint: 7.32.0 - eslint-config-prettier: 8.6.0(eslint@7.32.0) - prettier: 2.8.4 + eslint-config-prettier: 8.8.0(eslint@7.32.0) + prettier: 2.8.8 prettier-linter-helpers: 1.0.0 dev: true @@ -9371,21 +9839,21 @@ packages: eslint: 7.32.0 dev: true - /eslint-plugin-simple-import-sort@10.0.0(eslint@8.37.0): + /eslint-plugin-simple-import-sort@10.0.0(eslint@8.39.0): resolution: {integrity: sha512-AeTvO9UCMSNzIHRkg8S6c3RPy5YEwKWSQPx3DYghLedo2ZQxowPFLGDN1AZ2evfg6r6mjBSZSLxLFsWSu3acsw==} peerDependencies: eslint: '>=5.0.0' dependencies: - eslint: 8.37.0 + eslint: 8.39.0 dev: true - /eslint-plugin-svelte3@4.0.0(eslint@8.37.0)(svelte@3.53.1): + /eslint-plugin-svelte3@4.0.0(eslint@8.39.0)(svelte@3.53.1): resolution: {integrity: sha512-OIx9lgaNzD02+MDFNLw0GEUbuovNcglg+wnd/UY0fbZmlQSz7GlQiQ1f+yX0XvC07XPcDOnFcichqI3xCwp71g==} peerDependencies: eslint: '>=8.0.0' svelte: ^3.2.0 dependencies: - eslint: 8.37.0 + eslint: 8.39.0 svelte: 3.53.1 dev: true @@ -9397,8 +9865,8 @@ packages: estraverse: 4.3.0 dev: true - /eslint-scope@7.1.1: - resolution: {integrity: sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==} + /eslint-scope@7.2.0: + resolution: {integrity: sha512-DYj5deGlHBfMt15J7rdtyKNq/Nqlv5KfU4iodrQ019XESsRnwXH9KAE0y3cwtUHDo2ob7CypAnCqefh6vioWRw==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dependencies: esrecurse: 4.3.0 @@ -9422,13 +9890,13 @@ packages: eslint-visitor-keys: 2.1.0 dev: true - /eslint-utils@3.0.0(eslint@8.37.0): + /eslint-utils@3.0.0(eslint@8.39.0): resolution: {integrity: sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==} engines: {node: ^10.0.0 || ^12.0.0 || >= 14.0.0} peerDependencies: eslint: '>=5' dependencies: - eslint: 8.37.0 + eslint: 8.39.0 eslint-visitor-keys: 2.1.0 dev: true @@ -9463,7 +9931,7 @@ packages: ajv: 6.12.6 chalk: 4.1.2 cross-spawn: 7.0.3 - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.4(supports-color@9.3.1) doctrine: 3.0.0 enquirer: 2.3.6 escape-string-regexp: 4.0.0 @@ -9491,7 +9959,7 @@ packages: optionator: 0.9.1 progress: 2.0.3 regexpp: 3.2.0 - semver: 7.3.8 + semver: 7.5.0 strip-ansi: 6.0.1 strip-json-comments: 3.1.1 table: 6.8.1 @@ -9501,25 +9969,25 @@ packages: - supports-color dev: true - /eslint@8.37.0: - resolution: {integrity: sha512-NU3Ps9nI05GUoVMxcZx1J8CNR6xOvUT4jAUMH5+z8lpp3aEdPVCImKw6PWG4PY+Vfkpr+jvMpxs/qoE7wq0sPw==} + /eslint@8.39.0: + resolution: {integrity: sha512-mwiok6cy7KTW7rBpo05k6+p4YVZByLNjAZ/ACB9DRCu4YDRwjXI01tWHp6KAUWelsBetTxKK/2sHB0vdS8Z2Og==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} hasBin: true dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.37.0) + '@eslint-community/eslint-utils': 4.4.0(eslint@8.39.0) '@eslint-community/regexpp': 4.5.0 '@eslint/eslintrc': 2.0.2 - '@eslint/js': 8.37.0 + '@eslint/js': 8.39.0 '@humanwhocodes/config-array': 0.11.8 '@humanwhocodes/module-importer': 1.0.1 '@nodelib/fs.walk': 1.2.8 ajv: 6.12.6 chalk: 4.1.2 cross-spawn: 7.0.3 - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.4(supports-color@9.3.1) doctrine: 3.0.0 escape-string-regexp: 4.0.0 - eslint-scope: 7.1.1 + eslint-scope: 7.2.0 eslint-visitor-keys: 3.4.0 espree: 9.5.1 esquery: 1.5.0 @@ -9686,10 +10154,10 @@ packages: - supports-color dev: true - /eth-block-tracker@4.4.3(@babel/core@7.20.2): + /eth-block-tracker@4.4.3(@babel/core@7.21.4): resolution: {integrity: sha512-A8tG4Z4iNg4mw5tP1Vung9N9IjgMNqpiMoJ/FouSFwNCGHv2X0mmOYwtQOJzki6XN7r7Tyo01S29p7b224I4jw==} dependencies: - '@babel/plugin-transform-runtime': 7.19.6(@babel/core@7.20.2) + '@babel/plugin-transform-runtime': 7.19.6(@babel/core@7.21.4) '@babel/runtime': 7.20.13 eth-query: 2.1.2 json-rpc-random-id: 1.0.1 @@ -9760,7 +10228,7 @@ packages: /eth-json-rpc-middleware@1.6.0: resolution: {integrity: sha512-tDVCTlrUvdqHKqivYMjtFZsdD7TtpNLBCfKAcOpaVs7orBMS/A8HWro6dIzNtTZIR05FAbJ3bioFOnZpuCew9Q==} dependencies: - async: 2.6.4 + async: 2.6.2 eth-query: 2.1.2 eth-tx-summary: 3.2.4 ethereumjs-block: 1.7.1 @@ -9860,7 +10328,7 @@ packages: /eth-tx-summary@3.2.4: resolution: {integrity: sha512-NtlDnaVZah146Rm8HMRUNMgIwG/ED4jiqk0TME9zFheMl1jOp6jL1m0NKGjJwehXQ6ZKCPr16MTr+qspKpEXNg==} dependencies: - async: 2.6.4 + async: 2.6.2 clone: 2.1.2 concat-stream: 1.6.2 end-of-stream: 1.4.4 @@ -9876,7 +10344,7 @@ packages: resolution: {integrity: sha512-/MSbf/r2/Ld8o0l15AymjOTlPqpN8Cr4ByUEA9GtR4x0yAh3TdtDzEg29zMjXCNPI7u6E5fOQdj/Cf9Tc7oVNw==} deprecated: 'New package name format for new versions: @ethereumjs/ethash. Please update.' dependencies: - async: 2.6.4 + async: 2.6.2 buffer-xor: 2.0.2 ethereumjs-util: 7.1.5 miller-rabin: 4.0.1 @@ -9907,7 +10375,7 @@ packages: create-hash: 1.2.0 create-hmac: 1.1.7 hash.js: 1.1.7 - keccak: 3.0.3 + keccak: 3.0.2 pbkdf2: 3.1.2 randombytes: 2.1.0 safe-buffer: 5.2.1 @@ -9977,7 +10445,7 @@ packages: resolution: {integrity: sha512-B+sSdtqm78fmKkBq78/QLKJbu/4Ts4P2KFISdgcuZUPDm9x+N7qgBPIIFUGbaakQh8bzuquiRVbdmvPKqbILRg==} deprecated: 'New package name format for new versions: @ethereumjs/block. Please update.' dependencies: - async: 2.6.4 + async: 2.6.2 ethereum-common: 0.2.0 ethereumjs-tx: 1.3.7 ethereumjs-util: 5.2.1 @@ -9988,7 +10456,7 @@ packages: resolution: {integrity: sha512-2p49ifhek3h2zeg/+da6XpdFR3GlqY3BIEiqxGF8j9aSRIgkb7M1Ky+yULBKJOu8PAZxfhsYA+HxUk2aCQp3vg==} deprecated: 'New package name format for new versions: @ethereumjs/block. Please update.' dependencies: - async: 2.6.4 + async: 2.6.2 ethereumjs-common: 1.5.0 ethereumjs-tx: 2.1.2 ethereumjs-util: 5.2.1 @@ -9999,7 +10467,7 @@ packages: resolution: {integrity: sha512-zCxaRMUOzzjvX78DTGiKjA+4h2/sF0OYL1QuPux0DHpyq8XiNoF5GYHtb++GUxVlMsMfZV7AVyzbtgcRdIcEPQ==} deprecated: 'New package name format for new versions: @ethereumjs/blockchain. Please update.' dependencies: - async: 2.6.4 + async: 2.6.2 ethashjs: 0.0.8 ethereumjs-block: 2.2.2 ethereumjs-common: 1.5.0 @@ -10079,7 +10547,7 @@ packages: resolution: {integrity: sha512-r/XIUik/ynGbxS3y+mvGnbOKnuLo40V5Mj1J25+HEO63aWYREIqvWeRO/hnROlMBE5WoniQmPmhiaN0ctiHaXw==} deprecated: 'New package name format for new versions: @ethereumjs/vm. Please update.' dependencies: - async: 2.6.4 + async: 2.6.2 async-eventemitter: 0.2.4 ethereumjs-account: 2.0.5 ethereumjs-block: 2.2.2 @@ -10096,9 +10564,9 @@ packages: resolution: {integrity: sha512-X6qqZbsY33p5FTuZqCnQ4+lo957iUJMM6Mpa6bL4UW0dxM6WmDSHuI4j/zOp1E2TDKImBGCJA9QPfc08PaNubA==} deprecated: 'New package name format for new versions: @ethereumjs/vm. Please update.' dependencies: - async: 2.6.4 + async: 2.6.2 async-eventemitter: 0.2.4 - core-js-pure: 3.29.0 + core-js-pure: 3.30.1 ethereumjs-account: 3.0.0 ethereumjs-block: 2.2.2 ethereumjs-blockchain: 4.0.4 @@ -10110,7 +10578,7 @@ packages: merkle-patricia-tree: 2.3.2 rustbn.js: 0.2.0 safe-buffer: 5.2.1 - util.promisify: 1.1.1 + util.promisify: 1.1.2 dev: true /ethereumjs-wallet@0.6.5: @@ -10585,7 +11053,7 @@ packages: debug: optional: true dependencies: - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.4(supports-color@9.3.1) /for-each@0.3.3: resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} @@ -10675,7 +11143,7 @@ packages: /fs-extra@0.30.0: resolution: {integrity: sha512-UvSPKyhMn6LEd/WpUaV9C9t3zATuqoqfWc3QdPhPLb58prN9tqYPlPWi8Krxi44loBoUzlobqZ3+8tGpxxSzwA==} dependencies: - graceful-fs: 4.2.10 + graceful-fs: 4.2.11 jsonfile: 2.4.0 klaw: 1.3.1 path-is-absolute: 1.0.1 @@ -10694,7 +11162,7 @@ packages: /fs-extra@4.0.3: resolution: {integrity: sha512-q6rbdDd1o2mAnQreO7YADIxf/Whx4AHBiRf6d+/cVT8h44ss+lHgxf1FemcqDnQt9X3ct4McHr+JMGlYSsK7Cg==} dependencies: - graceful-fs: 4.2.10 + graceful-fs: 4.2.11 jsonfile: 4.0.0 universalify: 0.1.2 dev: true @@ -10703,7 +11171,7 @@ packages: resolution: {integrity: sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==} engines: {node: '>=6 <7 || >=8'} dependencies: - graceful-fs: 4.2.10 + graceful-fs: 4.2.11 jsonfile: 4.0.0 universalify: 0.1.2 dev: true @@ -10712,7 +11180,7 @@ packages: resolution: {integrity: sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==} engines: {node: '>=6 <7 || >=8'} dependencies: - graceful-fs: 4.2.10 + graceful-fs: 4.2.11 jsonfile: 4.0.0 universalify: 0.1.2 dev: true @@ -10722,7 +11190,7 @@ packages: engines: {node: '>=10'} dependencies: at-least-node: 1.0.0 - graceful-fs: 4.2.10 + graceful-fs: 4.2.11 jsonfile: 6.1.0 universalify: 2.0.0 dev: true @@ -10775,7 +11243,7 @@ packages: dependencies: call-bind: 1.0.2 define-properties: 1.2.0 - es-abstract: 1.21.1 + es-abstract: 1.21.2 functions-have-names: 1.2.3 dev: true @@ -10889,12 +11357,20 @@ packages: resolution: {integrity: sha512-Hm0ixYtaSZ/V7C8FJrtZIuBBI+iSgL+1Aq82zSu8VQNB4S3Gk8e7Qs3VwBDJAhmRZcFqkl3tQu36g/Foh5I5ig==} dev: true + /get-intrinsic@1.1.3: + resolution: {integrity: sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==} + dependencies: + function-bind: 1.1.1 + has: 1.0.3 + has-symbols: 1.0.3 + /get-intrinsic@1.2.0: resolution: {integrity: sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q==} dependencies: function-bind: 1.1.1 has: 1.0.3 has-symbols: 1.0.3 + dev: true /get-package-type@0.1.0: resolution: {integrity: sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==} @@ -11120,7 +11596,7 @@ packages: array-union: 2.1.0 dir-glob: 3.0.1 fast-glob: 3.2.12 - glob: 7.2.3 + glob: 7.2.0 ignore: 5.2.4 merge2: 1.4.1 slash: 3.0.0 @@ -11154,7 +11630,7 @@ packages: /gopd@1.0.1: resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} dependencies: - get-intrinsic: 1.2.0 + get-intrinsic: 1.1.3 /got@11.8.6: resolution: {integrity: sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g==} @@ -11197,6 +11673,10 @@ packages: /graceful-fs@4.2.10: resolution: {integrity: sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==} + /graceful-fs@4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + dev: true + /grapheme-splitter@1.0.4: resolution: {integrity: sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==} dev: true @@ -11248,7 +11728,7 @@ packages: engines: {node: '>=6'} dev: true - /hardhat-abi-exporter@2.10.1(hardhat@2.13.0): + /hardhat-abi-exporter@2.10.1(hardhat@2.14.0): resolution: {integrity: sha512-X8GRxUTtebMAd2k4fcPyVnCdPa6dYK4lBsrwzKP5yiSq4i+WadWPIumaLfce53TUf/o2TnLpLOduyO1ylE2NHQ==} engines: {node: '>=14.14.0'} peerDependencies: @@ -11256,34 +11736,34 @@ packages: dependencies: '@ethersproject/abi': 5.7.0 delete-empty: 3.0.0 - hardhat: 2.13.0(ts-node@10.9.1)(typescript@4.9.5) + hardhat: 2.14.0(ts-node@10.9.1)(typescript@4.9.5) dev: true - /hardhat-contract-sizer@2.8.0(hardhat@2.13.0): + /hardhat-contract-sizer@2.8.0(hardhat@2.14.0): resolution: {integrity: sha512-jXt2Si3uIDx5z99J+gvKa0yvIw156pE4dpH9X/PvTQv652BUd+qGj7WT93PXnHXGh5qhQLkjDYeZMYNOThfjFg==} peerDependencies: hardhat: ^2.0.0 dependencies: chalk: 4.1.2 cli-table3: 0.6.3 - hardhat: 2.13.0(ts-node@10.9.1)(typescript@4.9.5) + hardhat: 2.14.0(ts-node@10.9.1)(typescript@4.9.5) strip-ansi: 6.0.1 dev: true - /hardhat-docgen@1.3.0(hardhat@2.13.0)(lodash@4.17.21): + /hardhat-docgen@1.3.0(hardhat@2.14.0)(lodash@4.17.21): resolution: {integrity: sha512-paaiOHjJFLCLz2/qM1TQ7ZEG+Vy+LBvJL+SW4A64ZhBnVnyoZ/zv9DvEuawaWhqP5P7AOM6r22reVz4ecWgW7A==} engines: {node: '>=14.14.0'} peerDependencies: hardhat: ^2.0.0 dependencies: - css-loader: 6.7.3(webpack@5.75.0) - hardhat: 2.13.0(ts-node@10.9.1)(typescript@4.9.5) - html-webpack-plugin: 5.5.0(webpack@5.75.0) + css-loader: 6.7.3(webpack@5.80.0) + hardhat: 2.14.0(ts-node@10.9.1)(typescript@4.9.5) + html-webpack-plugin: 5.5.1(webpack@5.80.0) vue: 2.7.14 - vue-loader: 15.10.1(css-loader@6.7.3)(lodash@4.17.21)(vue-template-compiler@2.7.14)(webpack@5.75.0) + vue-loader: 15.10.1(css-loader@6.7.3)(lodash@4.17.21)(vue-template-compiler@2.7.14)(webpack@5.80.0) vue-router: 3.6.5(vue@2.7.14) vue-template-compiler: 2.7.14 - webpack: 5.75.0 + webpack: 5.80.0 transitivePeerDependencies: - '@swc/core' - '@vue/compiler-sfc' @@ -11346,21 +11826,21 @@ packages: - whiskers dev: true - /hardhat-gas-reporter@1.0.9(hardhat@2.13.0): + /hardhat-gas-reporter@1.0.9(hardhat@2.14.0): resolution: {integrity: sha512-INN26G3EW43adGKBNzYWOlI3+rlLnasXTwW79YNnUhXPDa+yHESgt639dJEs37gCjhkbNKcRRJnomXEuMFBXJg==} peerDependencies: hardhat: ^2.0.2 dependencies: array-uniq: 1.0.3 eth-gas-reporter: 0.2.25 - hardhat: 2.13.0(ts-node@10.9.1)(typescript@4.9.5) + hardhat: 2.14.0(ts-node@10.9.1)(typescript@4.9.5) sha1: 1.1.1 transitivePeerDependencies: - '@codechecks/client' dev: true - /hardhat@2.13.0(ts-node@10.9.1)(typescript@4.9.5): - resolution: {integrity: sha512-ZlzBOLML1QGlm6JWyVAG8lVTEAoOaVm1in/RU2zoGAnYEoD1Rp4T+ZMvrLNhHaaeS9hfjJ1gJUBfiDr4cx+htQ==} + /hardhat@2.14.0(ts-node@10.9.1)(typescript@4.9.5): + resolution: {integrity: sha512-73jsInY4zZahMSVFurSK+5TNCJTXMv+vemvGia0Ac34Mm19fYp6vEPVGF3sucbumszsYxiTT2TbS8Ii2dsDSoQ==} engines: {node: '>=14.0.0'} hasBin: true peerDependencies: @@ -11374,16 +11854,16 @@ packages: dependencies: '@ethersproject/abi': 5.7.0 '@metamask/eth-sig-util': 4.0.1 - '@nomicfoundation/ethereumjs-block': 4.0.0 - '@nomicfoundation/ethereumjs-blockchain': 6.0.0 - '@nomicfoundation/ethereumjs-common': 3.0.0 - '@nomicfoundation/ethereumjs-evm': 1.0.0 - '@nomicfoundation/ethereumjs-rlp': 4.0.0 - '@nomicfoundation/ethereumjs-statemanager': 1.0.0 - '@nomicfoundation/ethereumjs-trie': 5.0.0 - '@nomicfoundation/ethereumjs-tx': 4.0.0 - '@nomicfoundation/ethereumjs-util': 8.0.0 - '@nomicfoundation/ethereumjs-vm': 6.0.0 + '@nomicfoundation/ethereumjs-block': 5.0.1 + '@nomicfoundation/ethereumjs-blockchain': 7.0.1 + '@nomicfoundation/ethereumjs-common': 4.0.1 + '@nomicfoundation/ethereumjs-evm': 2.0.1 + '@nomicfoundation/ethereumjs-rlp': 5.0.1 + '@nomicfoundation/ethereumjs-statemanager': 2.0.1 + '@nomicfoundation/ethereumjs-trie': 6.0.1 + '@nomicfoundation/ethereumjs-tx': 5.0.1 + '@nomicfoundation/ethereumjs-util': 9.0.1 + '@nomicfoundation/ethereumjs-vm': 7.0.1 '@nomicfoundation/solidity-analyzer': 0.1.1 '@sentry/node': 5.30.0 '@types/bn.js': 5.1.1 @@ -11395,7 +11875,7 @@ packages: chalk: 2.4.2 chokidar: 3.5.3 ci-info: 2.0.0 - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.4(supports-color@9.3.1) enquirer: 2.3.6 env-paths: 2.2.1 ethereum-cryptography: 1.2.0 @@ -11404,14 +11884,14 @@ packages: fp-ts: 1.19.3 fs-extra: 7.0.1 glob: 7.2.0 - immutable: 4.2.4 + immutable: 4.3.0 io-ts: 1.10.4 keccak: 3.0.3 lodash: 4.17.21 mnemonist: 0.38.5 mocha: 10.2.0 p-map: 4.0.0 - qs: 6.11.0 + qs: 6.11.1 raw-body: 2.5.2 resolve: 1.17.0 semver: 6.3.0 @@ -11421,7 +11901,7 @@ packages: ts-node: 10.9.1(@types/node@12.20.55)(typescript@4.9.5) tsort: 0.0.1 typescript: 4.9.5 - undici: 5.20.0 + undici: 5.22.0 uuid: 8.3.2 ws: 7.5.9 transitivePeerDependencies: @@ -11458,6 +11938,7 @@ packages: /has-flag@4.0.0: resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} engines: {node: '>=8'} + dev: true /has-property-descriptors@1.0.0: resolution: {integrity: sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==} @@ -11686,11 +12167,11 @@ packages: he: 1.2.0 param-case: 3.0.4 relateurl: 0.2.7 - terser: 5.16.5 + terser: 5.17.1 dev: true - /html-webpack-plugin@5.5.0(webpack@5.75.0): - resolution: {integrity: sha512-sy88PC2cRTVxvETRgUHFrL4No3UxvcH8G1NepGhqaTT+GXN2kTamqasot0inS5hXeg1cMbFDt27zzo9p35lZVw==} + /html-webpack-plugin@5.5.1(webpack@5.80.0): + resolution: {integrity: sha512-cTUzZ1+NqjGEKjmVgZKLMdiFg3m9MdRXkZW2OEe69WYVi5ONLMmlnSZdXzGGMOq0C8jGDrL6EWyEDDUioHO/pA==} engines: {node: '>=10.13.0'} peerDependencies: webpack: ^5.20.0 @@ -11700,7 +12181,7 @@ packages: lodash: 4.17.21 pretty-error: 4.0.0 tapable: 2.2.1 - webpack: 5.75.0 + webpack: 5.80.0 dev: true /htmlparser2@6.1.0: @@ -11753,7 +12234,7 @@ packages: dependencies: '@tootallnate/once': 1.1.2 agent-base: 6.0.2 - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.4(supports-color@9.3.1) transitivePeerDependencies: - supports-color dev: true @@ -11787,7 +12268,7 @@ packages: engines: {node: '>= 6'} dependencies: agent-base: 6.0.2 - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.4(supports-color@9.3.1) transitivePeerDependencies: - supports-color dev: true @@ -11822,13 +12303,13 @@ packages: safer-buffer: 2.1.2 dev: true - /icss-utils@5.1.0(postcss@8.4.21): + /icss-utils@5.1.0(postcss@8.4.23): resolution: {integrity: sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==} engines: {node: ^10 || ^12 || >= 14} peerDependencies: postcss: ^8.1.0 dependencies: - postcss: 8.4.21 + postcss: 8.4.23 dev: true /idb-wrapper@1.7.2: @@ -11872,8 +12353,8 @@ packages: resolution: {integrity: sha512-HR7EVodfFUdQCTIeySw+WDRFJlPcLOJbXfwwZ7Oom6tjsvZ3bOkCDJHehQC3nxJrv7+f9XecwazynjU8e4Vw3Q==} dev: true - /immutable@4.2.4: - resolution: {integrity: sha512-WDxL3Hheb1JkRN3sQkyujNlL/xRjAo3rJtaU5xeufUauG66JdMr32bLj4gF+vWl84DIA3Zxw7tiAjneYzRRw+w==} + /immutable@4.3.0: + resolution: {integrity: sha512-0AOCmOip+xgJwEVTQj1EfiDDOkPmuyllDuTuEX+DDXUgapLAsBIfkg3sxCYyCEA8mQqZrrxPUGjcOQ2JS3WLkg==} dev: true /import-cwd@2.1.0: @@ -12097,6 +12578,12 @@ packages: dependencies: has: 1.0.3 + /is-core-module@2.12.0: + resolution: {integrity: sha512-RECHCBCd/viahWmwj6enj19sKbHfJrddi/6cBDsNTKbNq0f7VeaUkBo60BqzvPqo/W54ChS62Z5qyun7cfOMqQ==} + dependencies: + has: 1.0.3 + dev: true + /is-data-descriptor@0.1.4: resolution: {integrity: sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg==} engines: {node: '>=0.10.0'} @@ -12412,7 +12899,6 @@ packages: /isarray@2.0.5: resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} - dev: false /isbuffer@0.0.0: resolution: {integrity: sha512-xU+NoHp+YtKQkaM2HsQchYn0sltxMxew0HavMfHbjnucBoTSGbw745tL+Z7QBANleWM1eEQMenEpi174mIeS4g==} @@ -12476,7 +12962,7 @@ packages: resolution: {integrity: sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==} engines: {node: '>=10'} dependencies: - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.4(supports-color@9.3.1) istanbul-lib-coverage: 3.2.0 source-map: 0.6.1 transitivePeerDependencies: @@ -12689,7 +13175,7 @@ packages: dependencies: '@jest/types': 27.5.1 '@types/graceful-fs': 4.1.5 - '@types/node': 18.14.2 + '@types/node': 18.15.1 anymatch: 3.1.3 fb-watchman: 2.0.2 graceful-fs: 4.2.10 @@ -12822,7 +13308,7 @@ packages: '@jest/test-result': 27.5.1 '@jest/transform': 27.5.1 '@jest/types': 27.5.1 - '@types/node': 18.14.2 + '@types/node': 18.15.1 chalk: 4.1.2 emittery: 0.8.1 graceful-fs: 4.2.10 @@ -12918,7 +13404,7 @@ packages: engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: '@jest/types': 27.5.1 - '@types/node': 18.13.0 + '@types/node': 18.15.1 chalk: 4.1.2 ci-info: 3.6.2 graceful-fs: 4.2.10 @@ -12943,7 +13429,7 @@ packages: dependencies: '@jest/test-result': 27.5.1 '@jest/types': 27.5.1 - '@types/node': 18.14.2 + '@types/node': 18.15.1 ansi-escapes: 4.3.2 chalk: 4.1.2 jest-util: 27.5.1 @@ -12954,7 +13440,7 @@ packages: resolution: {integrity: sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==} engines: {node: '>= 10.13.0'} dependencies: - '@types/node': 18.15.1 + '@types/node': 12.20.55 merge-stream: 2.0.0 supports-color: 8.1.1 dev: true @@ -13105,7 +13591,7 @@ packages: /json-rpc-engine@3.8.0: resolution: {integrity: sha512-6QNcvm2gFuuK4TKU1uwfH0Qd/cOSb9c1lls0gbnIhciktIUQJwz6NQNAW4B1KiGPenv7IKu97V222Yo1bNhGuA==} dependencies: - async: 2.6.4 + async: 2.6.2 babel-preset-env: 1.7.0 babelify: 7.3.0 json-rpc-error: 2.0.0 @@ -13179,6 +13665,12 @@ packages: resolution: {integrity: sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==} engines: {node: '>=6'} hasBin: true + dev: true + + /json5@2.2.3: + resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} + engines: {node: '>=6'} + hasBin: true /jsonc-parser@3.2.0: resolution: {integrity: sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==} @@ -13187,13 +13679,13 @@ packages: /jsonfile@2.4.0: resolution: {integrity: sha512-PKllAqbgLgxHaj8TElYymKCAgrASebJrWpTnEkOaTowt23VKXXN0sUeriJ+eh7y6ufb/CC5ap11pz71/cM0hUw==} optionalDependencies: - graceful-fs: 4.2.10 + graceful-fs: 4.2.11 dev: true /jsonfile@4.0.0: resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==} optionalDependencies: - graceful-fs: 4.2.10 + graceful-fs: 4.2.11 dev: true /jsonfile@6.1.0: @@ -13201,7 +13693,7 @@ packages: dependencies: universalify: 2.0.0 optionalDependencies: - graceful-fs: 4.2.10 + graceful-fs: 4.2.11 dev: true /jsonify@0.0.1: @@ -13255,7 +13747,6 @@ packages: node-addon-api: 2.0.2 node-gyp-build: 4.5.0 readable-stream: 3.6.2 - dev: false /keccak@3.0.3: resolution: {integrity: sha512-JZrLIAJWuZxKbCilMpNz5Vj7Vtb4scDG3dMXLOsbzBmQGyjwE61BbW7bJkfKKCShXiQZt3T6sBgALRtmd+nZaQ==} @@ -13265,6 +13756,7 @@ packages: node-addon-api: 2.0.2 node-gyp-build: 4.6.0 readable-stream: 3.6.2 + dev: true /keyv@3.1.0: resolution: {integrity: sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==} @@ -13310,13 +13802,13 @@ packages: /klaw-sync@6.0.0: resolution: {integrity: sha512-nIeuVSzdCCs6TDPTqI8w1Yre34sSq7AkZ4B3sfOBbI2CgVSB4Du4aLQijFU2+lhAFCwt9+42Hel6lQNIv6AntQ==} dependencies: - graceful-fs: 4.2.10 + graceful-fs: 4.2.11 dev: true /klaw@1.3.1: resolution: {integrity: sha512-TED5xi9gGQjGpNnvRWknrwAB1eL5GciPfVFOt3Vk1OJCVDQbzuSfrF3hkUQKlsgKrG1F+0t5W0m+Fje1jIt8rw==} optionalDependencies: - graceful-fs: 4.2.10 + graceful-fs: 4.2.11 dev: true /kleur@3.0.3: @@ -13572,7 +14064,7 @@ packages: engines: {node: '>=12'} dependencies: browser-level: 1.0.1 - classic-level: 1.2.0 + classic-level: 1.3.0 dev: true /levelup@0.18.6: @@ -13666,7 +14158,7 @@ packages: hasBin: true dependencies: cli-truncate: 3.1.0 - colorette: 2.0.19 + colorette: 2.0.20 commander: 9.5.0 debug: 4.3.4(supports-color@9.3.1) execa: 5.1.1 @@ -13697,7 +14189,7 @@ packages: log-update: 4.0.0 p-map: 4.0.0 rfdc: 1.3.0 - rxjs: 7.8.0 + rxjs: 7.5.7 through: 2.3.8 wrap-ansi: 7.0.0 dev: true @@ -13706,7 +14198,7 @@ packages: resolution: {integrity: sha512-cy7ZdNRXdablkXYNI049pthVeXFurRyb9+hA/dZzerZ0pGTx42z+y+ssxBaVV2l70t1muq5IdKhn4UtcoGUY9A==} engines: {node: '>=0.10.0'} dependencies: - graceful-fs: 4.2.10 + graceful-fs: 4.2.11 parse-json: 2.2.0 pify: 2.3.0 pinkie-promise: 2.0.1 @@ -13897,7 +14389,6 @@ packages: resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} dependencies: yallist: 3.1.1 - dev: true /lru-cache@6.0.0: resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} @@ -14347,7 +14838,7 @@ packages: /merkle-patricia-tree@3.0.0: resolution: {integrity: sha512-soRaMuNf/ILmw3KWbybaCjhx86EYeBbD8ph0edQCTed0JN/rxDt1EBN52Ajre3VyGo+91f8+/rfPIRQnnGMqmQ==} dependencies: - async: 2.6.4 + async: 2.6.2 ethereumjs-util: 5.2.1 level-mem: 3.0.1 level-ws: 1.0.0 @@ -14697,7 +15188,7 @@ packages: resolution: {integrity: sha512-6Mj0yHLdUZjHnOPgr5xfWIMqMWS12zDN6iws9SLuSz76W8jTtAv24MN4/CL7gJrl5vtxGInkkqDv/JIoRsQOvA==} dependencies: '@types/debug': 4.1.7 - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.4(supports-color@9.3.1) decode-named-character-reference: 1.0.2 micromark-core-commonmark: 1.0.6 micromark-factory-space: 1.0.0 @@ -14838,10 +15329,6 @@ packages: kind-of: 6.0.3 dev: true - /minimist@1.2.7: - resolution: {integrity: sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g==} - dev: true - /minimist@1.2.8: resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} @@ -14931,7 +15418,7 @@ packages: engines: {node: '>=4'} deprecated: This package is broken and no longer maintained. 'mkdirp' itself supports promises now, please switch to that. dependencies: - mkdirp: 2.1.5 + mkdirp: 3.0.0 dev: true optional: true @@ -14955,8 +15442,8 @@ packages: hasBin: true dev: true - /mkdirp@2.1.5: - resolution: {integrity: sha512-jbjfql+shJtAPrFoKxHOXip4xS+kul9W3OzfzzrqueWK2QMGon2bFH2opl6W9EagBThjEz+iysyi/swOoVfB/w==} + /mkdirp@3.0.0: + resolution: {integrity: sha512-7+JDnNsyCvZXoUJdkMR0oUE2AmAdsNXGTmRbiOjYIwQ6q+bL6NwrozGQdPcmYaNcrhH37F50HHBUzoaBV6FITQ==} engines: {node: '>=10'} hasBin: true dev: true @@ -15150,6 +15637,12 @@ packages: engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true + /nanoid@3.3.6: + resolution: {integrity: sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + dev: true + /nanomatch@1.2.13: resolution: {integrity: sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==} engines: {node: '>=0.10.0'} @@ -15173,8 +15666,8 @@ packages: resolution: {integrity: sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==} dev: false - /napi-macros@2.0.0: - resolution: {integrity: sha512-A0xLykHtARfueITVDernsAWdtIMbOJgKgcluwENp3AlsKN/PloyO10HtmoqnFAQAcxPkgZN7wdfPfEd0zNGxbg==} + /napi-macros@2.2.2: + resolution: {integrity: sha512-hmEVtAGYzVQpCKdbQea4skABsdXW4RUh5t5mJ2zzqowJS2OyXZTU1KhDVFhx+NlWZ4ap9mqR9TcDO3LTTttd+g==} dev: true /natural-compare-lite@1.4.0: @@ -15379,7 +15872,7 @@ packages: /node-environment-flags@1.0.6: resolution: {integrity: sha512-5Evy2epuL+6TM0lCQGpFIj6KwiEsGh1SrHUhTbNX+sLbBtjidPZFAnVK9y5yU1+h//RitLbRHTIMyxQPtxMdHw==} dependencies: - object.getownpropertydescriptors: 2.1.5 + object.getownpropertydescriptors: 2.1.6 semver: 5.7.1 dev: true @@ -15417,7 +15910,6 @@ packages: /node-gyp-build@4.5.0: resolution: {integrity: sha512-2iGbaQBV+ITgCz76ZEjmhUKAKVf7xfY1sRl4UiKQspfZMH2h06SyhNsnSVy50cwkFQDGLyif6m/6uFXHkOZ6rg==} hasBin: true - dev: false /node-gyp-build@4.6.0: resolution: {integrity: sha512-NTZVKn9IylLwUzaKjkas1e4u2DLNcV4rdYagA4PWdPwW87Bi7z+BznyKSRwS/761tV/lzCGXplWsiaMjLqP2zQ==} @@ -15619,8 +16111,12 @@ packages: engines: {node: '>= 6'} dev: true + /object-inspect@1.12.2: + resolution: {integrity: sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==} + /object-inspect@1.12.3: resolution: {integrity: sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==} + dev: true /object-is@1.1.5: resolution: {integrity: sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==} @@ -15675,14 +16171,15 @@ packages: object-keys: 1.1.1 dev: true - /object.getownpropertydescriptors@2.1.5: - resolution: {integrity: sha512-yDNzckpM6ntyQiGTik1fKV1DcVDRS+w8bvpWNCBanvH5LfRX9O8WTHqQzG4RZwRAM4I0oU7TV11Lj5v0g20ibw==} + /object.getownpropertydescriptors@2.1.6: + resolution: {integrity: sha512-lq+61g26E/BgHv0ZTFgRvi7NMEPuAxLkFU7rukXjc/AlwH4Am5xXVnIXy3un1bg/JPbXHrixRkK1itUzzPiIjQ==} engines: {node: '>= 0.8'} dependencies: array.prototype.reduce: 1.0.5 call-bind: 1.0.2 define-properties: 1.2.0 - es-abstract: 1.21.1 + es-abstract: 1.21.2 + safe-array-concat: 1.0.0 dev: true /object.pick@1.3.0: @@ -15698,7 +16195,7 @@ packages: dependencies: call-bind: 1.0.2 define-properties: 1.2.0 - es-abstract: 1.21.1 + es-abstract: 1.21.2 dev: true /obliterator@2.0.4: @@ -16063,7 +16560,7 @@ packages: resolution: {integrity: sha512-S4eENJz1pkiQn9Znv33Q+deTOKmbl+jj1Fl+qiP/vYezj+S8x+J3Uo0ISrx/QoEvIlOaDWJhPaRd1flJ9HXZqg==} engines: {node: '>=0.10.0'} dependencies: - graceful-fs: 4.2.10 + graceful-fs: 4.2.11 pify: 2.3.0 pinkie-promise: 2.0.1 dev: true @@ -16259,7 +16756,7 @@ packages: ts-node: optional: true dependencies: - lilconfig: 2.0.6 + lilconfig: 2.1.0 postcss: 8.4.19 yaml: 1.10.2 dev: true @@ -16276,12 +16773,12 @@ packages: ts-node: optional: true dependencies: - lilconfig: 2.0.6 + lilconfig: 2.1.0 postcss: 8.4.21 yaml: 1.10.2 dev: true - /postcss-loader@6.2.1(postcss@8.4.19)(webpack@5.75.0): + /postcss-loader@6.2.1(postcss@8.4.19)(webpack@5.80.0): resolution: {integrity: sha512-WbbYpmAaKcux/P66bZ40bpWsBucjx/TTgVVzRZ9yUO8yQfVBlameJ0ZGVaPfH64hNSBh63a+ICP5nqOpBA0w+Q==} engines: {node: '>= 12.13.0'} peerDependencies: @@ -16292,10 +16789,10 @@ packages: klona: 2.0.5 postcss: 8.4.19 semver: 7.3.8 - webpack: 5.75.0 + webpack: 5.80.0 dev: true - /postcss-loader@6.2.1(postcss@8.4.21)(webpack@5.75.0): + /postcss-loader@6.2.1(postcss@8.4.21)(webpack@5.80.0): resolution: {integrity: sha512-WbbYpmAaKcux/P66bZ40bpWsBucjx/TTgVVzRZ9yUO8yQfVBlameJ0ZGVaPfH64hNSBh63a+ICP5nqOpBA0w+Q==} engines: {node: '>= 12.13.0'} peerDependencies: @@ -16306,48 +16803,48 @@ packages: klona: 2.0.5 postcss: 8.4.21 semver: 7.3.8 - webpack: 5.75.0 + webpack: 5.80.0 dev: true - /postcss-modules-extract-imports@3.0.0(postcss@8.4.21): + /postcss-modules-extract-imports@3.0.0(postcss@8.4.23): resolution: {integrity: sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==} engines: {node: ^10 || ^12 || >= 14} peerDependencies: postcss: ^8.1.0 dependencies: - postcss: 8.4.21 + postcss: 8.4.23 dev: true - /postcss-modules-local-by-default@4.0.0(postcss@8.4.21): + /postcss-modules-local-by-default@4.0.0(postcss@8.4.23): resolution: {integrity: sha512-sT7ihtmGSF9yhm6ggikHdV0hlziDTX7oFoXtuVWeDd3hHObNkcHRo9V3yg7vCAY7cONyxJC/XXCmmiHHcvX7bQ==} engines: {node: ^10 || ^12 || >= 14} peerDependencies: postcss: ^8.1.0 dependencies: - icss-utils: 5.1.0(postcss@8.4.21) - postcss: 8.4.21 + icss-utils: 5.1.0(postcss@8.4.23) + postcss: 8.4.23 postcss-selector-parser: 6.0.11 postcss-value-parser: 4.2.0 dev: true - /postcss-modules-scope@3.0.0(postcss@8.4.21): + /postcss-modules-scope@3.0.0(postcss@8.4.23): resolution: {integrity: sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg==} engines: {node: ^10 || ^12 || >= 14} peerDependencies: postcss: ^8.1.0 dependencies: - postcss: 8.4.21 + postcss: 8.4.23 postcss-selector-parser: 6.0.11 dev: true - /postcss-modules-values@4.0.0(postcss@8.4.21): + /postcss-modules-values@4.0.0(postcss@8.4.23): resolution: {integrity: sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==} engines: {node: ^10 || ^12 || >= 14} peerDependencies: postcss: ^8.1.0 dependencies: - icss-utils: 5.1.0(postcss@8.4.21) - postcss: 8.4.21 + icss-utils: 5.1.0(postcss@8.4.23) + postcss: 8.4.23 dev: true /postcss-nested@6.0.0(postcss@8.4.19): @@ -16427,6 +16924,15 @@ packages: source-map-js: 1.0.2 dev: true + /postcss@8.4.23: + resolution: {integrity: sha512-bQ3qMcpF6A/YjR55xtoTr0jGOlnPOKAIMdOWiv0EIT6HVPEaJiJB4NLljSbiHoC2RX7DN5Uvjtpbg1NPdwv1oA==} + engines: {node: ^10 || ^12 || >=14} + dependencies: + nanoid: 3.3.6 + picocolors: 1.0.0 + source-map-js: 1.0.2 + dev: true + /postinstall-postinstall@2.1.0: resolution: {integrity: sha512-7hQX6ZlZXIoRiWNrbMQaLzUUfH+sSx39u8EJ9HYuDc1kLo9IXKWjM5RSquZN1ad5GnH8CGFM78fsAAQi3OKEEQ==} requiresBuild: true @@ -16487,15 +16993,15 @@ packages: fast-diff: 1.2.0 dev: true - /prettier-plugin-solidity@1.1.3(prettier@2.8.4): + /prettier-plugin-solidity@1.1.3(prettier@2.8.8): resolution: {integrity: sha512-fQ9yucPi2sBbA2U2Xjh6m4isUTJ7S7QLc/XDDsktqqxYfTwdYKJ0EnnywXHwCGAaYbQNK+HIYPL1OemxuMsgeg==} engines: {node: '>=12'} peerDependencies: prettier: '>=2.3.0 || >=3.0.0-alpha.0' dependencies: '@solidity-parser/parser': 0.16.0 - prettier: 2.8.4 - semver: 7.3.8 + prettier: 2.8.8 + semver: 7.5.0 solidity-comments-extractor: 0.0.7 dev: true @@ -16515,8 +17021,8 @@ packages: hasBin: true dev: true - /prettier@2.8.4: - resolution: {integrity: sha512-vIS4Rlc2FNh0BySk3Wkd6xmwxB0FpOndW5fisM5H8hsZSxU2VWVB5CWIkIjWvrHjIhxk2g3bfMKM87zNTrZddw==} + /prettier@2.8.8: + resolution: {integrity: sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==} engines: {node: '>=10.13.0'} hasBin: true dev: true @@ -16607,7 +17113,7 @@ packages: /proper-lockfile@4.1.2: resolution: {integrity: sha512-TjNPblN4BwAWMXU8s9AEz4JmQxnD1NNL7bNOY/AKUzyamc379FWASUhc/K1pL2noVb+XmZKLL68cjzLsiOAMaA==} dependencies: - graceful-fs: 4.2.10 + graceful-fs: 4.2.11 retry: 0.12.0 signal-exit: 3.0.7 dev: true @@ -16720,11 +17226,6 @@ packages: engines: {node: '>=6'} dev: true - /punycode@2.3.0: - resolution: {integrity: sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==} - engines: {node: '>=6'} - dev: true - /qrcode@1.4.4: resolution: {integrity: sha512-oLzEC5+NKFou9P0bMj5+v6Z40evexeE29Z9cummZXZ9QXyMr3lphkURzxjXgPJC5azpxcshoDWV1xE46z+/c3Q==} engines: {node: '>=4'} @@ -16745,6 +17246,13 @@ packages: dependencies: side-channel: 1.0.4 + /qs@6.11.1: + resolution: {integrity: sha512-0wsrzgTz/kAVIeuxSjnpGC56rzYtr6JT/2BwEvMaPhFIoYa1aGO8LbzuU1R0uUYQkLpWBTOj0l/CLAJB64J6nQ==} + engines: {node: '>=0.6'} + dependencies: + side-channel: 1.0.4 + dev: true + /qs@6.5.3: resolution: {integrity: sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==} engines: {node: '>=0.6'} @@ -16967,7 +17475,7 @@ packages: resolution: {integrity: sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==} engines: {node: '>= 0.10'} dependencies: - resolve: 1.22.1 + resolve: 1.22.2 dev: true /recursive-readdir@2.2.3: @@ -17025,8 +17533,8 @@ packages: safe-regex: 1.1.0 dev: true - /regexp.prototype.flags@1.4.3: - resolution: {integrity: sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA==} + /regexp.prototype.flags@1.5.0: + resolution: {integrity: sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA==} engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.2 @@ -17255,7 +17763,7 @@ packages: deprecated: request has been deprecated, see https://github.com/request/request/issues/3142 dependencies: aws-sign2: 0.7.0 - aws4: 1.12.0 + aws4: 1.11.0 caseless: 0.12.0 combined-stream: 1.0.8 extend: 3.0.2 @@ -17356,6 +17864,15 @@ packages: path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 + /resolve@1.22.2: + resolution: {integrity: sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==} + hasBin: true + dependencies: + is-core-module: 2.12.0 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + dev: true + /responselike@1.0.2: resolution: {integrity: sha512-/Fpe5guzJk1gPqdJLJR5u7eG/gNY4nImjbRDaVWVMRhne55TCmj2i9Q+54PBRfatRC8v/rIiv9BN0pMd9OV5EQ==} dependencies: @@ -17495,6 +18012,12 @@ packages: tslib: 1.14.1 dev: false + /rxjs@7.5.7: + resolution: {integrity: sha512-z9MzKh/UcOqB3i20H6rtrlaE/CgjLOvheWK/9ILrbhROGTweAi1BaFsTT9FbwZi5Trr1qNRs+MXkhmR06awzQA==} + dependencies: + tslib: 2.5.0 + dev: true + /rxjs@7.8.0: resolution: {integrity: sha512-F2+gxDshqmIub1KdvZkaEfGDwLNpPvk9Fs6LD/MyQxNgMds/WH9OdDDXOmxUZpME+iSK3rQCctkL0DYyytUqMg==} dependencies: @@ -17507,6 +18030,16 @@ packages: dependencies: mri: 1.2.0 + /safe-array-concat@1.0.0: + resolution: {integrity: sha512-9dVEFruWIsnie89yym+xWTAYASdpw3CJV7Li/6zBewGf9z2i1j31rP6jnY0pHEO4QZh6N0K11bFjWmdR8UGdPQ==} + engines: {node: '>=0.4'} + dependencies: + call-bind: 1.0.2 + get-intrinsic: 1.2.0 + has-symbols: 1.0.3 + isarray: 2.0.5 + dev: true + /safe-buffer@5.1.2: resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} dev: true @@ -17595,8 +18128,8 @@ packages: loose-envify: 1.4.0 dev: false - /schema-utils@3.1.1: - resolution: {integrity: sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==} + /schema-utils@3.1.2: + resolution: {integrity: sha512-pvjEHOgWc9OWA/f/DE3ohBWTD6EleVLf7iFUkoSwAxttdBhB9QUebQgxER2kWueOvRJXPHNnyrvvh9eZINB8Eg==} engines: {node: '>= 10.13.0'} dependencies: '@types/json-schema': 7.0.11 @@ -17638,7 +18171,7 @@ packages: dependencies: elliptic: 6.5.4 node-addon-api: 2.0.2 - node-gyp-build: 4.6.0 + node-gyp-build: 4.5.0 /section-matter@1.0.0: resolution: {integrity: sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA==} @@ -17687,6 +18220,14 @@ packages: dependencies: lru-cache: 6.0.0 + /semver@7.5.0: + resolution: {integrity: sha512-+XC0AD/R7Q2mPSRuy2Id0+CGTZ98+8f+KvwirxOKIEyid+XSx6HbC63p+O4IndTHuX5Z+JxQ0TghCkO5Cg/2HA==} + engines: {node: '>=10'} + hasBin: true + dependencies: + lru-cache: 6.0.0 + dev: true + /send@0.18.0: resolution: {integrity: sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==} engines: {node: '>= 0.8.0'} @@ -17833,7 +18374,7 @@ packages: engines: {node: '>=4'} hasBin: true dependencies: - glob: 7.2.3 + glob: 7.2.0 interpret: 1.4.0 rechoir: 0.6.2 dev: true @@ -17851,8 +18392,8 @@ packages: resolution: {integrity: sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==} dependencies: call-bind: 1.0.2 - get-intrinsic: 1.2.0 - object-inspect: 1.12.3 + get-intrinsic: 1.1.3 + object-inspect: 1.12.2 /signal-exit@3.0.7: resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} @@ -17969,7 +18510,7 @@ packages: engines: {node: '>= 10'} dependencies: agent-base: 6.0.2 - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.4(supports-color@9.3.1) socks: 2.7.1 transitivePeerDependencies: - supports-color @@ -18043,17 +18584,17 @@ packages: - debug dev: false - /solhint@3.4.0: - resolution: {integrity: sha512-FYEs/LoTxMsWFP/OGsEqR1CBDn3Bn7hrTWsgtjai17MzxITgearIdlo374KKZjjIycu8E2xBcJ+RSWeoBvQmkw==} + /solhint@3.4.1: + resolution: {integrity: sha512-pzZn2RlZhws1XwvLPVSsxfHrwsteFf5eySOhpAytzXwKQYbTCJV6z8EevYDiSVKMpWrvbKpEtJ055CuEmzp4Xg==} hasBin: true dependencies: - '@solidity-parser/parser': 0.15.0 + '@solidity-parser/parser': 0.16.0 ajv: 6.12.6 antlr4: 4.12.0 ast-parents: 0.0.1 chalk: 4.1.2 - commander: 10.0.0 - cosmiconfig: 8.1.0 + commander: 10.0.1 + cosmiconfig: 8.1.3 fast-diff: 1.2.0 glob: 8.1.0 ignore: 5.2.4 @@ -18065,7 +18606,7 @@ packages: table: 6.8.1 text-table: 0.2.0 optionalDependencies: - prettier: 2.8.4 + prettier: 2.8.8 dev: true /solidity-ast@0.4.46: @@ -18076,13 +18617,13 @@ packages: resolution: {integrity: sha512-wciNMLg/Irp8OKGrh3S2tfvZiZ0NEyILfcRCXCD4mp7SgK/i9gzLfhY2hY7VMCQJ3kH9UB9BzNdibIVMchzyYw==} dev: true - /solidity-docgen@0.6.0-beta.35(hardhat@2.13.0): + /solidity-docgen@0.6.0-beta.35(hardhat@2.14.0): resolution: {integrity: sha512-9QdwK1THk/MWIdq1PEW/6dvtND0pUqpFTsbKwwU9YQIMYuRhH1lek9SsgnsGGYtdJ0VTrXXcVT30q20a8Y610A==} peerDependencies: hardhat: ^2.8.0 dependencies: handlebars: 4.7.7 - hardhat: 2.13.0(ts-node@10.9.1)(typescript@4.9.5) + hardhat: 2.14.0(ts-node@10.9.1)(typescript@4.9.5) solidity-ast: 0.4.46 dev: true @@ -18091,7 +18632,7 @@ packages: hasBin: true dependencies: buffer-crc32: 0.2.13 - minimist: 1.2.7 + minimist: 1.2.8 sander: 0.5.1 sourcemap-codec: 1.4.8 dev: true @@ -18368,7 +18909,7 @@ packages: dependencies: call-bind: 1.0.2 define-properties: 1.2.0 - es-abstract: 1.21.1 + es-abstract: 1.21.2 dev: true /string.prototype.trimend@1.0.6: @@ -18376,7 +18917,7 @@ packages: dependencies: call-bind: 1.0.2 define-properties: 1.2.0 - es-abstract: 1.21.1 + es-abstract: 1.21.2 dev: true /string.prototype.trimstart@1.0.6: @@ -18384,7 +18925,7 @@ packages: dependencies: call-bind: 1.0.2 define-properties: 1.2.0 - es-abstract: 1.21.1 + es-abstract: 1.21.2 dev: true /string_decoder@0.10.31: @@ -18567,11 +19108,11 @@ packages: engines: {node: '>=10'} dependencies: has-flag: 4.0.0 + dev: true /supports-color@9.3.1: resolution: {integrity: sha512-knBY82pjmnIzK3NifMo3RxEIRD9E0kIzV4BKcyTZ9+9kWgLMxd4PrsTSMoFQUabgRBbF8KOLRDCyKgNV+iK44Q==} engines: {node: '>=12'} - dev: true /supports-hyperlinks@2.3.0: resolution: {integrity: sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA==} @@ -18585,7 +19126,7 @@ packages: resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} engines: {node: '>= 0.4'} - /svelte-check@2.9.2(@babel/core@7.20.2)(node-sass@7.0.3)(postcss@8.4.19)(svelte@3.53.1): + /svelte-check@2.9.2(@babel/core@7.21.4)(node-sass@7.0.3)(postcss@8.4.19)(svelte@3.53.1): resolution: {integrity: sha512-DRi8HhnCiqiGR2YF9ervPGvtoYrheE09cXieCTEqeTPOTJzfoa54Py8rovIBv4bH4n5HgZYIyTQ3DDLHQLl2uQ==} hasBin: true peerDependencies: @@ -18598,7 +19139,7 @@ packages: picocolors: 1.0.0 sade: 1.8.1 svelte: 3.53.1 - svelte-preprocess: 4.10.7(@babel/core@7.20.2)(node-sass@7.0.3)(postcss@8.4.19)(svelte@3.53.1)(typescript@4.9.3) + svelte-preprocess: 4.10.7(@babel/core@7.21.4)(node-sass@7.0.3)(postcss@8.4.19)(svelte@3.53.1)(typescript@4.9.3) typescript: 4.9.3 transitivePeerDependencies: - '@babel/core' @@ -18613,7 +19154,7 @@ packages: - sugarss dev: true - /svelte-check@2.9.2(@babel/core@7.20.2)(node-sass@7.0.3)(postcss@8.4.21)(svelte@3.53.1): + /svelte-check@2.9.2(@babel/core@7.21.4)(node-sass@7.0.3)(postcss@8.4.21)(svelte@3.53.1): resolution: {integrity: sha512-DRi8HhnCiqiGR2YF9ervPGvtoYrheE09cXieCTEqeTPOTJzfoa54Py8rovIBv4bH4n5HgZYIyTQ3DDLHQLl2uQ==} hasBin: true peerDependencies: @@ -18626,7 +19167,7 @@ packages: picocolors: 1.0.0 sade: 1.8.1 svelte: 3.53.1 - svelte-preprocess: 4.10.7(@babel/core@7.20.2)(node-sass@7.0.3)(postcss@8.4.21)(svelte@3.53.1)(typescript@4.9.3) + svelte-preprocess: 4.10.7(@babel/core@7.21.4)(node-sass@7.0.3)(postcss@8.4.21)(svelte@3.53.1)(typescript@4.9.3) typescript: 4.9.3 transitivePeerDependencies: - '@babel/core' @@ -18705,7 +19246,7 @@ packages: svelte-hmr: 0.14.12(svelte@3.53.1) dev: true - /svelte-preprocess@4.10.7(@babel/core@7.20.2)(node-sass@7.0.3)(postcss@8.4.19)(svelte@3.53.1)(typescript@4.9.3): + /svelte-preprocess@4.10.7(@babel/core@7.21.4)(node-sass@7.0.3)(postcss@8.4.19)(svelte@3.53.1)(typescript@4.9.3): resolution: {integrity: sha512-sNPBnqYD6FnmdBrUmBCaqS00RyCsCpj2BG58A1JBswNF7b0OKviwxqVrOL/CKyJrLSClrSeqQv5BXNg2RUbPOw==} engines: {node: '>= 9.11.2'} requiresBuild: true @@ -18746,7 +19287,7 @@ packages: typescript: optional: true dependencies: - '@babel/core': 7.20.2 + '@babel/core': 7.21.4 '@types/pug': 2.0.6 '@types/sass': 1.43.1 detect-indent: 6.1.0 @@ -18759,7 +19300,7 @@ packages: typescript: 4.9.3 dev: true - /svelte-preprocess@4.10.7(@babel/core@7.20.2)(node-sass@7.0.3)(postcss@8.4.21)(svelte@3.53.1)(typescript@4.9.3): + /svelte-preprocess@4.10.7(@babel/core@7.21.4)(node-sass@7.0.3)(postcss@8.4.21)(svelte@3.53.1)(typescript@4.9.3): resolution: {integrity: sha512-sNPBnqYD6FnmdBrUmBCaqS00RyCsCpj2BG58A1JBswNF7b0OKviwxqVrOL/CKyJrLSClrSeqQv5BXNg2RUbPOw==} engines: {node: '>= 9.11.2'} requiresBuild: true @@ -18800,7 +19341,7 @@ packages: typescript: optional: true dependencies: - '@babel/core': 7.20.2 + '@babel/core': 7.21.4 '@types/pug': 2.0.6 '@types/sass': 1.43.1 detect-indent: 6.1.0 @@ -18813,7 +19354,7 @@ packages: typescript: 4.9.3 dev: true - /svelte-preprocess@4.10.7(@babel/core@7.20.2)(node-sass@7.0.3)(postcss@8.4.21)(svelte@3.53.1)(typescript@4.9.5): + /svelte-preprocess@4.10.7(@babel/core@7.21.4)(node-sass@7.0.3)(postcss@8.4.21)(svelte@3.53.1)(typescript@4.9.5): resolution: {integrity: sha512-sNPBnqYD6FnmdBrUmBCaqS00RyCsCpj2BG58A1JBswNF7b0OKviwxqVrOL/CKyJrLSClrSeqQv5BXNg2RUbPOw==} engines: {node: '>= 9.11.2'} requiresBuild: true @@ -18854,7 +19395,7 @@ packages: typescript: optional: true dependencies: - '@babel/core': 7.20.2 + '@babel/core': 7.21.4 '@types/pug': 2.0.6 '@types/sass': 1.43.1 detect-indent: 6.1.0 @@ -19050,7 +19591,7 @@ packages: is-regex: 1.1.4 minimist: 1.2.8 object-inspect: 1.12.3 - resolve: 1.22.1 + resolve: 1.22.2 resumer: 0.0.0 string.prototype.trim: 1.2.7 through: 2.3.8 @@ -19110,8 +19651,8 @@ packages: supports-hyperlinks: 2.3.0 dev: true - /terser-webpack-plugin@5.3.6(webpack@5.75.0): - resolution: {integrity: sha512-kfLFk+PoLUQIbLmB1+PZDMRSZS99Mp+/MHqDNmMA6tOItzRt+Npe3E+fsMs5mfcM0wCtrrdU387UnV+vnSffXQ==} + /terser-webpack-plugin@5.3.7(webpack@5.80.0): + resolution: {integrity: sha512-AfKwIktyP7Cu50xNjXF/6Qb5lBNzYaWpU6YfoX3uZicTx0zTy0stDDCsvjDapKsSDvOeWo5MEq4TmdBy2cNoHw==} engines: {node: '>= 10.13.0'} peerDependencies: '@swc/core': '*' @@ -19126,20 +19667,20 @@ packages: uglify-js: optional: true dependencies: - '@jridgewell/trace-mapping': 0.3.17 + '@jridgewell/trace-mapping': 0.3.18 jest-worker: 27.5.1 - schema-utils: 3.1.1 + schema-utils: 3.1.2 serialize-javascript: 6.0.1 - terser: 5.16.5 - webpack: 5.75.0 + terser: 5.17.1 + webpack: 5.80.0 dev: true - /terser@5.16.5: - resolution: {integrity: sha512-qcwfg4+RZa3YvlFh0qjifnzBHjKGNbtDo9yivMqMFDy9Q6FSaQWSB/j1xKhsoUFJIqDOM3TsN6D5xbrMrFcHbg==} + /terser@5.17.1: + resolution: {integrity: sha512-hVl35zClmpisy6oaoKALOpS0rDYLxRFLHhRuDlEGTKey9qHjS1w9GMORjuwIMt70Wan4lwsLYyWDVnWgF+KUEw==} engines: {node: '>=10'} hasBin: true dependencies: - '@jridgewell/source-map': 0.3.2 + '@jridgewell/source-map': 0.3.3 acorn: 8.8.2 commander: 2.20.3 source-map-support: 0.5.21 @@ -19193,7 +19734,7 @@ packages: http-basic: 8.1.3 http-response-object: 3.0.2 promise: 8.3.0 - qs: 6.11.0 + qs: 6.11.1 dev: true /throat@6.0.1: @@ -19323,7 +19864,7 @@ packages: engines: {node: '>=0.8'} dependencies: psl: 1.9.0 - punycode: 2.3.0 + punycode: 2.1.1 dev: true /tough-cookie@4.1.2: @@ -19402,10 +19943,10 @@ packages: '@types/prettier': 2.7.2 '@types/resolve': 0.0.8 chalk: 2.4.2 - glob: 7.2.3 + glob: 7.2.0 mkdirp: 0.5.6 - prettier: 2.8.4 - resolve: 1.22.1 + prettier: 2.8.8 + resolve: 1.22.2 ts-essentials: 1.0.4 dev: true @@ -19418,10 +19959,10 @@ packages: peerDependencies: ts-jest: '>=20.0.0' dependencies: - ts-jest: 27.1.5(@babel/core@7.20.2)(@types/jest@27.5.2)(babel-jest@27.5.1)(jest@27.5.1)(typescript@4.9.3) + ts-jest: 27.1.5(@babel/core@7.21.4)(@types/jest@27.5.2)(babel-jest@27.5.1)(jest@27.5.1)(typescript@4.9.3) dev: true - /ts-jest@27.1.5(@babel/core@7.20.2)(@types/jest@27.5.2)(babel-jest@27.5.1)(jest@27.5.1)(typescript@4.9.3): + /ts-jest@27.1.5(@babel/core@7.21.4)(@types/jest@27.5.2)(babel-jest@27.5.1)(jest@27.5.1)(typescript@4.9.3): resolution: {integrity: sha512-Xv6jBQPoBEvBq/5i2TeSG9tt/nqkbpcurrEG1b+2yfBrcJelOZF9Ml6dmyMh7bcW9JyFbRYpR5rxROSlBLTZHA==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} hasBin: true @@ -19442,9 +19983,9 @@ packages: esbuild: optional: true dependencies: - '@babel/core': 7.20.2 + '@babel/core': 7.21.4 '@types/jest': 27.5.2 - babel-jest: 27.5.1(@babel/core@7.20.2) + babel-jest: 27.5.1(@babel/core@7.21.4) bs-logger: 0.2.6 fast-json-stable-stringify: 2.1.0 jest: 27.5.1 @@ -19457,7 +19998,7 @@ packages: yargs-parser: 20.2.4 dev: true - /ts-jest@27.1.5(@babel/core@7.20.2)(@types/jest@27.5.2)(babel-jest@27.5.1)(jest@27.5.1)(typescript@4.9.5): + /ts-jest@27.1.5(@babel/core@7.21.4)(@types/jest@27.5.2)(babel-jest@27.5.1)(jest@27.5.1)(typescript@4.9.5): resolution: {integrity: sha512-Xv6jBQPoBEvBq/5i2TeSG9tt/nqkbpcurrEG1b+2yfBrcJelOZF9Ml6dmyMh7bcW9JyFbRYpR5rxROSlBLTZHA==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} hasBin: true @@ -19478,9 +20019,9 @@ packages: esbuild: optional: true dependencies: - '@babel/core': 7.20.2 + '@babel/core': 7.21.4 '@types/jest': 27.5.2 - babel-jest: 27.5.1(@babel/core@7.20.2) + babel-jest: 27.5.1(@babel/core@7.21.4) bs-logger: 0.2.6 fast-json-stable-stringify: 2.1.0 jest: 27.5.1 @@ -19493,7 +20034,7 @@ packages: yargs-parser: 20.2.4 dev: true - /ts-loader@9.4.1(typescript@4.9.3)(webpack@5.75.0): + /ts-loader@9.4.1(typescript@4.9.3)(webpack@5.80.0): resolution: {integrity: sha512-384TYAqGs70rn9F0VBnh6BPTfhga7yFNdC5gXbQpDrBj9/KsT4iRkGqKXhziofHOlE2j6YEaiTYVGKKvPhGWvw==} engines: {node: '>=12.0.0'} peerDependencies: @@ -19505,10 +20046,10 @@ packages: micromatch: 4.0.5 semver: 7.3.8 typescript: 4.9.3 - webpack: 5.75.0 + webpack: 5.80.0 dev: true - /ts-loader@9.4.1(typescript@4.9.5)(webpack@5.75.0): + /ts-loader@9.4.1(typescript@4.9.5)(webpack@5.80.0): resolution: {integrity: sha512-384TYAqGs70rn9F0VBnh6BPTfhga7yFNdC5gXbQpDrBj9/KsT4iRkGqKXhziofHOlE2j6YEaiTYVGKKvPhGWvw==} engines: {node: '>=12.0.0'} peerDependencies: @@ -19520,7 +20061,7 @@ packages: micromatch: 4.0.5 semver: 7.3.8 typescript: 4.9.5 - webpack: 5.75.0 + webpack: 5.80.0 dev: true /ts-node@10.9.1(@types/node@12.20.55)(typescript@4.9.5): @@ -19687,7 +20228,7 @@ packages: hasBin: true dependencies: command-line-args: 4.0.7 - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.4(supports-color@9.3.1) fs-extra: 7.0.1 js-sha3: 0.8.0 lodash: 4.17.21 @@ -19706,13 +20247,13 @@ packages: dependencies: '@types/prettier': 2.7.2 command-line-args: 4.0.7 - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.4(supports-color@9.3.1) fs-extra: 7.0.1 - glob: 7.2.3 + glob: 7.2.0 js-sha3: 0.8.0 lodash: 4.17.21 mkdirp: 1.0.4 - prettier: 2.8.4 + prettier: 2.8.8 ts-essentials: 7.0.3(typescript@4.9.5) typescript: 4.9.5 transitivePeerDependencies: @@ -19795,9 +20336,9 @@ packages: dev: true optional: true - /undici@5.20.0: - resolution: {integrity: sha512-J3j60dYzuo6Eevbawwp1sdg16k5Tf768bxYK4TUJRH7cBM4kFCbf3mOnM/0E3vQYXvpxITbbWmBafaDbxLDz3g==} - engines: {node: '>=12.18'} + /undici@5.22.0: + resolution: {integrity: sha512-fR9RXCc+6Dxav4P9VV/sp5w3eFiSdOjJYsbtWfd4s5L5C4ogyuVpdKIVHeW0vV1MloM65/f7W45nR9ZxwVdyiA==} + engines: {node: '>=14.0'} dependencies: busboy: 1.6.0 dev: true @@ -19995,7 +20536,7 @@ packages: /uri-js@4.4.1: resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} dependencies: - punycode: 2.3.0 + punycode: 2.1.1 dev: true /urix@0.1.0: @@ -20057,14 +20598,16 @@ packages: /util-deprecate@1.0.2: resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} - /util.promisify@1.1.1: - resolution: {integrity: sha512-/s3UsZUrIfa6xDhr7zZhnE9SLQ5RIXyYfiVnMMyMDzOc8WhWN4Nbh36H842OyurKbCDAesZOJaVyvmSl6fhGQw==} + /util.promisify@1.1.2: + resolution: {integrity: sha512-PBdZ03m1kBnQ5cjjO0ZvJMJS+QsbyIcFwi4hY4U76OQsCO9JrOYjbCFgIF76ccFg9xnJo7ZHPkqyj1GqmdS7MA==} dependencies: call-bind: 1.0.2 define-properties: 1.2.0 for-each: 0.3.3 + has-proto: 1.0.1 has-symbols: 1.0.3 - object.getownpropertydescriptors: 2.1.5 + object.getownpropertydescriptors: 2.1.6 + safe-array-concat: 1.0.0 dev: true /util@0.12.5: @@ -20264,7 +20807,7 @@ packages: resolution: {integrity: sha512-BXq3jwIagosjgNVae6tkHzzIk6a8MHFtzAdwhnV5VlvPTFxDCvIttgSiHWjdGoTJvXtmRu5HacExfdarRcFhog==} dev: true - /vue-loader@15.10.1(css-loader@6.7.3)(lodash@4.17.21)(vue-template-compiler@2.7.14)(webpack@5.75.0): + /vue-loader@15.10.1(css-loader@6.7.3)(lodash@4.17.21)(vue-template-compiler@2.7.14)(webpack@5.80.0): resolution: {integrity: sha512-SaPHK1A01VrNthlix6h1hq4uJu7S/z0kdLUb6klubo738NeQoLbS6V9/d8Pv19tU0XdQKju3D1HSKuI8wJ5wMA==} peerDependencies: '@vue/compiler-sfc': ^3.0.8 @@ -20281,13 +20824,13 @@ packages: optional: true dependencies: '@vue/component-compiler-utils': 3.3.0(lodash@4.17.21) - css-loader: 6.7.3(webpack@5.75.0) + css-loader: 6.7.3(webpack@5.80.0) hash-sum: 1.0.2 loader-utils: 1.4.2 vue-hot-reload-api: 2.3.4 vue-style-loader: 4.1.3 vue-template-compiler: 2.7.14 - webpack: 5.75.0 + webpack: 5.80.0 transitivePeerDependencies: - arc-templates - atpl @@ -20374,7 +20917,7 @@ packages: resolution: {integrity: sha512-b2qkFyOM0kwqWFuQmgd4o+uHGU7T+2z3T+WQp8UBjADfEv2n4FEMffzBmCKNP0IGzOEEfYjvtcC62xaSKeQDrQ==} dependencies: '@vue/compiler-sfc': 2.7.14 - csstype: 3.1.1 + csstype: 3.1.2 dev: true /w3c-hr-time@1.0.2: @@ -20402,7 +20945,7 @@ packages: engines: {node: '>=10.13.0'} dependencies: glob-to-regexp: 0.4.1 - graceful-fs: 4.2.10 + graceful-fs: 4.2.11 dev: true /web-namespaces@2.0.1: @@ -20622,7 +21165,7 @@ packages: /web3-provider-engine@14.2.1: resolution: {integrity: sha512-iSv31h2qXkr9vrL6UZDm4leZMc32SjWJFGOp/D92JXfcEboCqraZyuExDkpxKw8ziTufXieNM7LSXNHzszYdJw==} dependencies: - async: 2.6.4 + async: 2.6.2 backoff: 2.5.0 clone: 2.1.2 cross-fetch: 2.2.6 @@ -20709,8 +21252,8 @@ packages: dev: true optional: true - /web3-utils@1.8.2: - resolution: {integrity: sha512-v7j6xhfLQfY7xQDrUP0BKbaNrmZ2/+egbqP9q3KYmOiPpnvAfol+32slgL0WX/5n8VPvKCK5EZ1HGrAVICSToA==} + /web3-utils@1.9.0: + resolution: {integrity: sha512-p++69rCNNfu2jM9n5+VD/g26l+qkEOQ1m6cfRQCbH8ZRrtquTmrirJMgTmyOoax5a5XRYOuws14aypCOs51pdQ==} engines: {node: '>=8.0.0'} dependencies: bn.js: 5.2.1 @@ -20759,8 +21302,8 @@ packages: engines: {node: '>=10.13.0'} dev: true - /webpack@5.75.0: - resolution: {integrity: sha512-piaIaoVJlqMsPtX/+3KTTO6jfvrSYgauFVdt8cr9LTHKmcq/AMd4mhzsiP7ZF/PGRNPGA8336jldh9l2Kt2ogQ==} + /webpack@5.80.0: + resolution: {integrity: sha512-OIMiq37XK1rWO8mH9ssfFKZsXg4n6klTEDL7S8/HqbAOBBaiy8ABvXvz0dDCXeEF9gqwxSvVk611zFPjS8hJxA==} engines: {node: '>=10.13.0'} hasBin: true peerDependencies: @@ -20770,27 +21313,27 @@ packages: optional: true dependencies: '@types/eslint-scope': 3.7.4 - '@types/estree': 0.0.51 - '@webassemblyjs/ast': 1.11.1 - '@webassemblyjs/wasm-edit': 1.11.1 - '@webassemblyjs/wasm-parser': 1.11.1 + '@types/estree': 1.0.1 + '@webassemblyjs/ast': 1.11.5 + '@webassemblyjs/wasm-edit': 1.11.5 + '@webassemblyjs/wasm-parser': 1.11.5 acorn: 8.8.2 acorn-import-assertions: 1.8.0(acorn@8.8.2) browserslist: 4.21.5 chrome-trace-event: 1.0.3 - enhanced-resolve: 5.12.0 - es-module-lexer: 0.9.3 + enhanced-resolve: 5.13.0 + es-module-lexer: 1.2.1 eslint-scope: 5.1.1 events: 3.3.0 glob-to-regexp: 0.4.1 - graceful-fs: 4.2.10 + graceful-fs: 4.2.11 json-parse-even-better-errors: 2.3.1 loader-runner: 4.3.0 mime-types: 2.1.35 neo-async: 2.6.2 - schema-utils: 3.1.1 + schema-utils: 3.1.2 tapable: 2.2.1 - terser-webpack-plugin: 5.3.6(webpack@5.75.0) + terser-webpack-plugin: 5.3.7(webpack@5.80.0) watchpack: 2.4.0 webpack-sources: 3.2.3 transitivePeerDependencies: @@ -21143,7 +21686,6 @@ packages: /yallist@3.1.1: resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} - dev: true /yallist@4.0.0: resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} @@ -21332,7 +21874,7 @@ packages: bn.js: 4.12.0 ethereumjs-util: 6.2.1 - github.com/taikoxyz/solidity-coverage/ceb49fd1f6041e4fcd26079dfb0d3b0f58c812e5(hardhat@2.13.0): + github.com/taikoxyz/solidity-coverage/ceb49fd1f6041e4fcd26079dfb0d3b0f58c812e5(hardhat@2.14.0): resolution: {tarball: https://codeload.github.com/taikoxyz/solidity-coverage/tar.gz/ceb49fd1f6041e4fcd26079dfb0d3b0f58c812e5} id: github.com/taikoxyz/solidity-coverage/ceb49fd1f6041e4fcd26079dfb0d3b0f58c812e5 name: solidity-coverage @@ -21351,7 +21893,7 @@ packages: ghost-testrpc: 0.0.2 global-modules: 2.0.0 globby: 10.0.2 - hardhat: 2.13.0(ts-node@10.9.1)(typescript@4.9.5) + hardhat: 2.14.0(ts-node@10.9.1)(typescript@4.9.5) jsonschema: 1.4.1 lodash: 4.17.21 mocha: 7.1.2 @@ -21359,9 +21901,9 @@ packages: pify: 4.0.1 recursive-readdir: 2.2.3 sc-istanbul: 0.4.6 - semver: 7.3.8 + semver: 7.5.0 shelljs: 0.8.5 - web3-utils: 1.8.2 + web3-utils: 1.9.0 transitivePeerDependencies: - supports-color dev: true From 913f17f98374aba29d990e929cbfc40b8ab77892 Mon Sep 17 00:00:00 2001 From: Daniel Wang <99078276+dantaik@users.noreply.github.com> Date: Sun, 23 Apr 2023 21:39:42 +0800 Subject: [PATCH 47/47] Update package.json --- packages/protocol/package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/protocol/package.json b/packages/protocol/package.json index 1ea33466ca5..6dbf211e931 100644 --- a/packages/protocol/package.json +++ b/packages/protocol/package.json @@ -12,8 +12,8 @@ "eslint": "pnpm exec eslint --ignore-path .eslintignore --ext .js,.ts .", "eslint:fix": "pnpm exec eslint --ignore-path .eslintignore --ext .js,.ts . --fix", "test": "forge test -vvv --gas-report --fuzz-seed $(date +%s) --match-path test/**/*.t.sol", - "snapshot": "forge snapshot --match-path test/**/*.t.sol", - "test:coverage": "forge coverage --report lcov", + "snapshot": "forge snapshot --match-path test/**/*.t.sol", + "test:coverage": "forge coverage --report lcov", "test:sim": "forge test -vvv --gas-report --fuzz-seed $(date +%s) --match-path test/**/*.sim.sol --block-gas-limit 30000000000 --memory-limit 1073741824", "generate:genesis": "ts-node ./utils/generate_genesis/main.ts", "test:genesis": "./test/genesis/generate_genesis.test.sh",