From 08096db14348a093a4d40d81363ee33f9c4e8ed6 Mon Sep 17 00:00:00 2001 From: PhilWindle Date: Wed, 8 Mar 2023 11:11:31 +0000 Subject: [PATCH 01/36] Initial work on synching world state --- .gitmodules | 3 + barretenberg | 1 + build_manifest.json | 14 + build_manifest.sh | 2 + yarn-project/.pnp.cjs | 276 ++++++++++++++++- yarn-project/data-archiver/package.json | 3 +- .../data-archiver/src/mock_rollup_source.ts | 34 ++ .../src/polling_rollup_emitter.ts | 63 ++++ yarn-project/data-archiver/src/rollup.ts | 4 + .../data-archiver/src/rollup_emitter.ts | 36 +++ .../data-archiver/src/rollup_source.ts | 7 + yarn-project/merkle-tree/.eslintrc.cjs | 6 + yarn-project/merkle-tree/Dockerfile | 14 + yarn-project/merkle-tree/README.md | 1 + yarn-project/merkle-tree/package.json | 42 +++ yarn-project/merkle-tree/src/hash_path.ts | 45 +++ yarn-project/merkle-tree/src/hasher.ts | 5 + yarn-project/merkle-tree/src/index.ts | 3 + yarn-project/merkle-tree/src/merkle_tree.ts | 290 ++++++++++++++++++ yarn-project/merkle-tree/src/pedersen.ts | 14 + yarn-project/merkle-tree/src/serialise.ts | 29 ++ yarn-project/merkle-tree/tsconfig.dest.json | 4 + yarn-project/merkle-tree/tsconfig.json | 9 + yarn-project/package.json | 4 +- yarn-project/world-state/.eslintrc.cjs | 6 + yarn-project/world-state/Dockerfile | 14 + yarn-project/world-state/README.md | 1 + yarn-project/world-state/package.json | 40 +++ yarn-project/world-state/src/index.ts | 1 + .../src/server_world_state_synchroniser.ts | 3 + .../src/world_state_synchroniser.ts | 17 + yarn-project/world-state/tsconfig.dest.json | 4 + yarn-project/world-state/tsconfig.json | 9 + yarn-project/yarn.lock | 202 +++++++++++- 34 files changed, 1197 insertions(+), 9 deletions(-) create mode 160000 barretenberg create mode 100644 yarn-project/data-archiver/src/mock_rollup_source.ts create mode 100644 yarn-project/data-archiver/src/polling_rollup_emitter.ts create mode 100644 yarn-project/data-archiver/src/rollup.ts create mode 100644 yarn-project/data-archiver/src/rollup_emitter.ts create mode 100644 yarn-project/data-archiver/src/rollup_source.ts create mode 100644 yarn-project/merkle-tree/.eslintrc.cjs create mode 100644 yarn-project/merkle-tree/Dockerfile create mode 100644 yarn-project/merkle-tree/README.md create mode 100644 yarn-project/merkle-tree/package.json create mode 100644 yarn-project/merkle-tree/src/hash_path.ts create mode 100644 yarn-project/merkle-tree/src/hasher.ts create mode 100644 yarn-project/merkle-tree/src/index.ts create mode 100644 yarn-project/merkle-tree/src/merkle_tree.ts create mode 100644 yarn-project/merkle-tree/src/pedersen.ts create mode 100644 yarn-project/merkle-tree/src/serialise.ts create mode 100644 yarn-project/merkle-tree/tsconfig.dest.json create mode 100644 yarn-project/merkle-tree/tsconfig.json create mode 100644 yarn-project/world-state/.eslintrc.cjs create mode 100644 yarn-project/world-state/Dockerfile create mode 100644 yarn-project/world-state/README.md create mode 100644 yarn-project/world-state/package.json create mode 100644 yarn-project/world-state/src/index.ts create mode 100644 yarn-project/world-state/src/server_world_state_synchroniser.ts create mode 100644 yarn-project/world-state/src/world_state_synchroniser.ts create mode 100644 yarn-project/world-state/tsconfig.dest.json create mode 100644 yarn-project/world-state/tsconfig.json diff --git a/.gitmodules b/.gitmodules index fc785e10ad1..241af58f6f0 100644 --- a/.gitmodules +++ b/.gitmodules @@ -7,3 +7,6 @@ [submodule "l1-contracts"] path = l1-contracts url = git@github.com:AztecProtocol/aztec3-l1-contracts.git +[submodule "barretenberg"] + path = barretenberg + url = git@github.com:AztecProtocol/barretenberg.git diff --git a/barretenberg b/barretenberg new file mode 160000 index 00000000000..f2fdebe037d --- /dev/null +++ b/barretenberg @@ -0,0 +1 @@ +Subproject commit f2fdebe037d4d2d90761f98e28b4b0d3af9a0f63 diff --git a/build_manifest.json b/build_manifest.json index 2eb8d214202..72b4b38cf88 100644 --- a/build_manifest.json +++ b/build_manifest.json @@ -108,6 +108,13 @@ "rebuildPatterns": ["^yarn-project/key-store/"], "dependencies": ["yarn-project-base"] }, + "merkle-tree": { + "buildDir": "yarn-project", + "projectDir": "yarn-project/merkle-tree", + "dockerfile": "merkle-tree/Dockerfile", + "rebuildPatterns": ["^yarn-project/merkle-tree/"], + "dependencies": ["yarn-project-base"] + }, "p2p": { "buildDir": "yarn-project", "projectDir": "yarn-project/p2p", @@ -142,5 +149,12 @@ "dockerfile": "wallet/Dockerfile", "rebuildPatterns": ["^yarn-project/wallet/"], "dependencies": ["yarn-project-base"] + }, + "world-state": { + "buildDir": "yarn-project", + "projectDir": "yarn-project/world-state", + "dockerfile": "world-state/Dockerfile", + "rebuildPatterns": ["^yarn-project/world-state/"], + "dependencies": ["yarn-project-base"] } } diff --git a/build_manifest.sh b/build_manifest.sh index 2b9b90735f8..976720005da 100755 --- a/build_manifest.sh +++ b/build_manifest.sh @@ -21,9 +21,11 @@ PROJECTS=( # ethereum.js:yarn-project # kernel-simulator:yarn-project # key-store:yarn-project + # merkle-tree:yarn-project # p2p:yarn-project # prover-client:yarn-project # public-client:yarn-project # sequencer-client:yarn-project # wallet:yarn-project + # world-state:yarn-project ) diff --git a/yarn-project/.pnp.cjs b/yarn-project/.pnp.cjs index bdef81645c5..460f8d40762 100755 --- a/yarn-project/.pnp.cjs +++ b/yarn-project/.pnp.cjs @@ -59,6 +59,10 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { "name": "@aztec/key-store",\ "reference": "workspace:key-store"\ },\ + {\ + "name": "@aztec/merkle-tree",\ + "reference": "workspace:merkle-tree"\ + },\ {\ "name": "@aztec/p2p",\ "reference": "workspace:p2p"\ @@ -82,6 +86,10 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { {\ "name": "@aztec/wallet",\ "reference": "workspace:wallet"\ + },\ + {\ + "name": "@aztec/world-state",\ + "reference": "workspace:world-state"\ }\ ],\ "enableTopLevelFallback": true,\ @@ -99,12 +107,14 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ["@aztec/ethereum.js", ["workspace:ethereum.js"]],\ ["@aztec/kernel-simulator", ["workspace:kernel-simulator"]],\ ["@aztec/key-store", ["workspace:key-store"]],\ + ["@aztec/merkle-tree", ["workspace:merkle-tree"]],\ ["@aztec/p2p", ["workspace:p2p"]],\ ["@aztec/prettier-config", ["workspace:prettier-config"]],\ ["@aztec/prover-client", ["workspace:prover-client"]],\ ["@aztec/public-client", ["workspace:public-client"]],\ ["@aztec/sequencer-client", ["workspace:sequencer-client"]],\ - ["@aztec/wallet", ["workspace:wallet"]]\ + ["@aztec/wallet", ["workspace:wallet"]],\ + ["@aztec/world-state", ["workspace:world-state"]]\ ],\ "fallbackPool": [\ ],\ @@ -248,10 +258,11 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ["@jest/globals", "npm:29.4.3"],\ ["@rushstack/eslint-patch", "npm:1.2.0"],\ ["@types/jest", "npm:29.4.0"],\ - ["@types/node", "npm:18.14.2"],\ + ["@types/node", "npm:18.14.6"],\ ["jest", "virtual:97973ff51783dc29efdf1c1cff3bd542763fb1d8ea565946db4f6425a5a443923944d5f46e5672160073e5b792b61ec2b3a0e9df4f007033f07c728780e0e4e7#npm:28.1.3"],\ + ["stream", "npm:0.0.2"],\ ["ts-jest", "virtual:97973ff51783dc29efdf1c1cff3bd542763fb1d8ea565946db4f6425a5a443923944d5f46e5672160073e5b792b61ec2b3a0e9df4f007033f07c728780e0e4e7#npm:28.0.8"],\ - ["ts-node", "virtual:97973ff51783dc29efdf1c1cff3bd542763fb1d8ea565946db4f6425a5a443923944d5f46e5672160073e5b792b61ec2b3a0e9df4f007033f07c728780e0e4e7#npm:10.9.1"],\ + ["ts-node", "virtual:38d2d6c68e96d8a78f52418a0df4cb2f70fe1f92cd7d8519601179397097eb20be3b9880bc073e8dc652670ca5674da223648eda37ddba4a8a5847fe6bdae5b5#npm:10.9.1"],\ ["tslib", "npm:2.5.0"],\ ["typescript", "patch:typescript@npm%3A4.9.5#~builtin::version=4.9.5&hash=23ec76"]\ ],\ @@ -348,6 +359,27 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { "linkType": "SOFT"\ }]\ ]],\ + ["@aztec/merkle-tree", [\ + ["workspace:merkle-tree", {\ + "packageLocation": "./merkle-tree/",\ + "packageDependencies": [\ + ["@aztec/merkle-tree", "workspace:merkle-tree"],\ + ["@aztec/eslint-config", "workspace:eslint-config"],\ + ["@jest/globals", "npm:29.4.3"],\ + ["@rushstack/eslint-patch", "npm:1.2.0"],\ + ["@types/jest", "npm:29.4.0"],\ + ["@types/levelup", "npm:5.1.2"],\ + ["@types/node", "npm:18.14.6"],\ + ["jest", "virtual:97973ff51783dc29efdf1c1cff3bd542763fb1d8ea565946db4f6425a5a443923944d5f46e5672160073e5b792b61ec2b3a0e9df4f007033f07c728780e0e4e7#npm:28.1.3"],\ + ["levelup", "npm:5.1.1"],\ + ["ts-jest", "virtual:97973ff51783dc29efdf1c1cff3bd542763fb1d8ea565946db4f6425a5a443923944d5f46e5672160073e5b792b61ec2b3a0e9df4f007033f07c728780e0e4e7#npm:28.0.8"],\ + ["ts-node", "virtual:38d2d6c68e96d8a78f52418a0df4cb2f70fe1f92cd7d8519601179397097eb20be3b9880bc073e8dc652670ca5674da223648eda37ddba4a8a5847fe6bdae5b5#npm:10.9.1"],\ + ["tslib", "npm:2.5.0"],\ + ["typescript", "patch:typescript@npm%3A4.9.5#~builtin::version=4.9.5&hash=23ec76"]\ + ],\ + "linkType": "SOFT"\ + }]\ + ]],\ ["@aztec/p2p", [\ ["workspace:p2p", {\ "packageLocation": "./p2p/",\ @@ -453,6 +485,25 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { "linkType": "SOFT"\ }]\ ]],\ + ["@aztec/world-state", [\ + ["workspace:world-state", {\ + "packageLocation": "./world-state/",\ + "packageDependencies": [\ + ["@aztec/world-state", "workspace:world-state"],\ + ["@aztec/eslint-config", "workspace:eslint-config"],\ + ["@jest/globals", "npm:29.4.3"],\ + ["@rushstack/eslint-patch", "npm:1.2.0"],\ + ["@types/jest", "npm:29.4.0"],\ + ["@types/node", "npm:18.14.2"],\ + ["jest", "virtual:97973ff51783dc29efdf1c1cff3bd542763fb1d8ea565946db4f6425a5a443923944d5f46e5672160073e5b792b61ec2b3a0e9df4f007033f07c728780e0e4e7#npm:28.1.3"],\ + ["ts-jest", "virtual:97973ff51783dc29efdf1c1cff3bd542763fb1d8ea565946db4f6425a5a443923944d5f46e5672160073e5b792b61ec2b3a0e9df4f007033f07c728780e0e4e7#npm:28.0.8"],\ + ["ts-node", "virtual:97973ff51783dc29efdf1c1cff3bd542763fb1d8ea565946db4f6425a5a443923944d5f46e5672160073e5b792b61ec2b3a0e9df4f007033f07c728780e0e4e7#npm:10.9.1"],\ + ["tslib", "npm:2.5.0"],\ + ["typescript", "patch:typescript@npm%3A4.9.5#~builtin::version=4.9.5&hash=23ec76"]\ + ],\ + "linkType": "SOFT"\ + }]\ + ]],\ ["@babel/code-frame", [\ ["npm:7.18.6", {\ "packageLocation": "./.yarn/cache/@babel-code-frame-npm-7.18.6-25229a7e34-195e2be317.zip/node_modules/@babel/code-frame/",\ @@ -1907,6 +1958,15 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { "linkType": "HARD"\ }]\ ]],\ + ["@types/abstract-leveldown", [\ + ["npm:7.2.1", {\ + "packageLocation": "./.yarn/cache/@types-abstract-leveldown-npm-7.2.1-d0cda6811c-20689e7d14.zip/node_modules/@types/abstract-leveldown/",\ + "packageDependencies": [\ + ["@types/abstract-leveldown", "npm:7.2.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ ["@types/babel__core", [\ ["npm:7.20.0", {\ "packageLocation": "./.yarn/cache/@types-babel__core-npm-7.20.0-cf2ab39970-49b601a0a7.zip/node_modules/@types/babel__core/",\ @@ -2011,6 +2071,27 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { "linkType": "HARD"\ }]\ ]],\ + ["@types/level-errors", [\ + ["npm:3.0.0", {\ + "packageLocation": "./.yarn/cache/@types-level-errors-npm-3.0.0-58ecd77a87-ad93926634.zip/node_modules/@types/level-errors/",\ + "packageDependencies": [\ + ["@types/level-errors", "npm:3.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["@types/levelup", [\ + ["npm:5.1.2", {\ + "packageLocation": "./.yarn/cache/@types-levelup-npm-5.1.2-d41edd2f8f-6740284488.zip/node_modules/@types/levelup/",\ + "packageDependencies": [\ + ["@types/levelup", "npm:5.1.2"],\ + ["@types/abstract-leveldown", "npm:7.2.1"],\ + ["@types/level-errors", "npm:3.0.0"],\ + ["@types/node", "npm:18.14.2"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ ["@types/node", [\ ["npm:18.14.2", {\ "packageLocation": "./.yarn/cache/@types-node-npm-18.14.2-ba0496d563-53c07e721f.zip/node_modules/@types/node/",\ @@ -2018,6 +2099,13 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ["@types/node", "npm:18.14.2"]\ ],\ "linkType": "HARD"\ + }],\ + ["npm:18.14.6", {\ + "packageLocation": "./.yarn/cache/@types-node-npm-18.14.6-7d0665d471-2f88f482ca.zip/node_modules/@types/node/",\ + "packageDependencies": [\ + ["@types/node", "npm:18.14.6"]\ + ],\ + "linkType": "HARD"\ }]\ ]],\ ["@types/prettier", [\ @@ -2265,6 +2353,21 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { "linkType": "HARD"\ }]\ ]],\ + ["abstract-leveldown", [\ + ["npm:7.2.0", {\ + "packageLocation": "./.yarn/cache/abstract-leveldown-npm-7.2.0-9da02e441b-d558111f2d.zip/node_modules/abstract-leveldown/",\ + "packageDependencies": [\ + ["abstract-leveldown", "npm:7.2.0"],\ + ["buffer", "npm:6.0.3"],\ + ["catering", "npm:2.1.1"],\ + ["is-buffer", "npm:2.0.5"],\ + ["level-concat-iterator", "npm:3.1.0"],\ + ["level-supports", "npm:2.1.0"],\ + ["queue-microtask", "npm:1.2.3"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ ["acorn", [\ ["npm:8.8.2", {\ "packageLocation": "./.yarn/cache/acorn-npm-8.8.2-9d518fd7d3-f790b99a1b.zip/node_modules/acorn/",\ @@ -2607,6 +2710,15 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { "linkType": "HARD"\ }]\ ]],\ + ["base64-js", [\ + ["npm:1.5.1", {\ + "packageLocation": "./.yarn/cache/base64-js-npm-1.5.1-b2f7275641-669632eb37.zip/node_modules/base64-js/",\ + "packageDependencies": [\ + ["base64-js", "npm:1.5.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ ["brace-expansion", [\ ["npm:1.1.11", {\ "packageLocation": "./.yarn/cache/brace-expansion-npm-1.1.11-fb95eb05ad-faf34a7bb0.zip/node_modules/brace-expansion/",\ @@ -2669,6 +2781,17 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { "linkType": "HARD"\ }]\ ]],\ + ["buffer", [\ + ["npm:6.0.3", {\ + "packageLocation": "./.yarn/cache/buffer-npm-6.0.3-cd90dfedfe-5ad23293d9.zip/node_modules/buffer/",\ + "packageDependencies": [\ + ["buffer", "npm:6.0.3"],\ + ["base64-js", "npm:1.5.1"],\ + ["ieee754", "npm:1.2.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ ["buffer-from", [\ ["npm:1.1.2", {\ "packageLocation": "./.yarn/cache/buffer-from-npm-1.1.2-03d2f20d7e-0448524a56.zip/node_modules/buffer-from/",\ @@ -2739,6 +2862,15 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { "linkType": "HARD"\ }]\ ]],\ + ["catering", [\ + ["npm:2.1.1", {\ + "packageLocation": "./.yarn/cache/catering-npm-2.1.1-b116dcdfef-205daefa69.zip/node_modules/catering/",\ + "packageDependencies": [\ + ["catering", "npm:2.1.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ ["chalk", [\ ["npm:2.4.2", {\ "packageLocation": "./.yarn/cache/chalk-npm-2.4.2-3ea16dd91e-ec3661d38f.zip/node_modules/chalk/",\ @@ -2992,6 +3124,17 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { "linkType": "HARD"\ }]\ ]],\ + ["deferred-leveldown", [\ + ["npm:7.0.0", {\ + "packageLocation": "./.yarn/cache/deferred-leveldown-npm-7.0.0-b22b14d332-1ed5eb73e3.zip/node_modules/deferred-leveldown/",\ + "packageDependencies": [\ + ["deferred-leveldown", "npm:7.0.0"],\ + ["abstract-leveldown", "npm:7.2.0"],\ + ["inherits", "npm:2.0.4"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ ["delegates", [\ ["npm:1.0.0", {\ "packageLocation": "./.yarn/cache/delegates-npm-1.0.0-9b1942d75f-a51744d9b5.zip/node_modules/delegates/",\ @@ -3073,6 +3216,15 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { "linkType": "HARD"\ }]\ ]],\ + ["emitter-component", [\ + ["npm:1.1.1", {\ + "packageLocation": "./.yarn/cache/emitter-component-npm-1.1.1-e7a14ded4b-10e907f507.zip/node_modules/emitter-component/",\ + "packageDependencies": [\ + ["emitter-component", "npm:1.1.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ ["emittery", [\ ["npm:0.10.2", {\ "packageLocation": "./.yarn/cache/emittery-npm-0.10.2-aac10498b5-ee3e21788b.zip/node_modules/emittery/",\ @@ -3822,6 +3974,15 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { "linkType": "HARD"\ }]\ ]],\ + ["ieee754", [\ + ["npm:1.2.1", {\ + "packageLocation": "./.yarn/cache/ieee754-npm-1.2.1-fb63b3caeb-5144c0c981.zip/node_modules/ieee754/",\ + "packageDependencies": [\ + ["ieee754", "npm:1.2.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ ["ignore", [\ ["npm:5.2.4", {\ "packageLocation": "./.yarn/cache/ignore-npm-5.2.4-fbe6e989e5-3d4c309c60.zip/node_modules/ignore/",\ @@ -3918,6 +4079,15 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { "linkType": "HARD"\ }]\ ]],\ + ["is-buffer", [\ + ["npm:2.0.5", {\ + "packageLocation": "./.yarn/cache/is-buffer-npm-2.0.5-17e563f277-764c9ad8b5.zip/node_modules/is-buffer/",\ + "packageDependencies": [\ + ["is-buffer", "npm:2.0.5"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ ["is-core-module", [\ ["npm:2.11.0", {\ "packageLocation": "./.yarn/cache/is-core-module-npm-2.11.0-70061e141a-f96fd490c6.zip/node_modules/is-core-module/",\ @@ -4824,6 +4994,60 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { "linkType": "HARD"\ }]\ ]],\ + ["level-concat-iterator", [\ + ["npm:3.1.0", {\ + "packageLocation": "./.yarn/cache/level-concat-iterator-npm-3.1.0-5b0693a58a-a15bc4c5fb.zip/node_modules/level-concat-iterator/",\ + "packageDependencies": [\ + ["level-concat-iterator", "npm:3.1.0"],\ + ["catering", "npm:2.1.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["level-errors", [\ + ["npm:3.0.1", {\ + "packageLocation": "./.yarn/cache/level-errors-npm-3.0.1-8ef4cc828f-fe4486c423.zip/node_modules/level-errors/",\ + "packageDependencies": [\ + ["level-errors", "npm:3.0.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["level-iterator-stream", [\ + ["npm:5.0.0", {\ + "packageLocation": "./.yarn/cache/level-iterator-stream-npm-5.0.0-29efe6efcb-3f5bbb9caf.zip/node_modules/level-iterator-stream/",\ + "packageDependencies": [\ + ["level-iterator-stream", "npm:5.0.0"],\ + ["inherits", "npm:2.0.4"],\ + ["readable-stream", "npm:3.6.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["level-supports", [\ + ["npm:2.1.0", {\ + "packageLocation": "./.yarn/cache/level-supports-npm-2.1.0-4f5c2d5fc4-f7b16aea7d.zip/node_modules/level-supports/",\ + "packageDependencies": [\ + ["level-supports", "npm:2.1.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["levelup", [\ + ["npm:5.1.1", {\ + "packageLocation": "./.yarn/cache/levelup-npm-5.1.1-42d16f81c1-3053cd3495.zip/node_modules/levelup/",\ + "packageDependencies": [\ + ["levelup", "npm:5.1.1"],\ + ["catering", "npm:2.1.1"],\ + ["deferred-leveldown", "npm:7.0.0"],\ + ["level-errors", "npm:3.0.1"],\ + ["level-iterator-stream", "npm:5.0.0"],\ + ["level-supports", "npm:2.1.0"],\ + ["queue-microtask", "npm:1.2.3"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ ["leven", [\ ["npm:3.1.0", {\ "packageLocation": "./.yarn/cache/leven-npm-3.1.0-b7697736a3-638401d534.zip/node_modules/leven/",\ @@ -5829,6 +6053,16 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { "linkType": "HARD"\ }]\ ]],\ + ["stream", [\ + ["npm:0.0.2", {\ + "packageLocation": "./.yarn/cache/stream-npm-0.0.2-2f332b5d35-43d89e176c.zip/node_modules/stream/",\ + "packageDependencies": [\ + ["stream", "npm:0.0.2"],\ + ["emitter-component", "npm:1.1.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ ["string-length", [\ ["npm:4.0.2", {\ "packageLocation": "./.yarn/cache/string-length-npm-4.0.2-675173c7a2-ce85533ef5.zip/node_modules/string-length/",\ @@ -6078,6 +6312,42 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ],\ "linkType": "SOFT"\ }],\ + ["virtual:38d2d6c68e96d8a78f52418a0df4cb2f70fe1f92cd7d8519601179397097eb20be3b9880bc073e8dc652670ca5674da223648eda37ddba4a8a5847fe6bdae5b5#npm:10.9.1", {\ + "packageLocation": "./.yarn/__virtual__/ts-node-virtual-c7e39369c2/0/cache/ts-node-npm-10.9.1-6c268be7f4-090adff130.zip/node_modules/ts-node/",\ + "packageDependencies": [\ + ["ts-node", "virtual:38d2d6c68e96d8a78f52418a0df4cb2f70fe1f92cd7d8519601179397097eb20be3b9880bc073e8dc652670ca5674da223648eda37ddba4a8a5847fe6bdae5b5#npm:10.9.1"],\ + ["@cspotcode/source-map-support", "npm:0.8.1"],\ + ["@swc/core", null],\ + ["@swc/wasm", null],\ + ["@tsconfig/node10", "npm:1.0.9"],\ + ["@tsconfig/node12", "npm:1.0.11"],\ + ["@tsconfig/node14", "npm:1.0.3"],\ + ["@tsconfig/node16", "npm:1.0.3"],\ + ["@types/node", "npm:18.14.6"],\ + ["@types/swc__core", null],\ + ["@types/swc__wasm", null],\ + ["@types/typescript", null],\ + ["acorn", "npm:8.8.2"],\ + ["acorn-walk", "npm:8.2.0"],\ + ["arg", "npm:4.1.3"],\ + ["create-require", "npm:1.1.1"],\ + ["diff", "npm:4.0.2"],\ + ["make-error", "npm:1.3.6"],\ + ["typescript", "patch:typescript@npm%3A4.9.5#~builtin::version=4.9.5&hash=23ec76"],\ + ["v8-compile-cache-lib", "npm:3.0.1"],\ + ["yn", "npm:3.1.1"]\ + ],\ + "packagePeers": [\ + "@swc/core",\ + "@swc/wasm",\ + "@types/node",\ + "@types/swc__core",\ + "@types/swc__wasm",\ + "@types/typescript",\ + "typescript"\ + ],\ + "linkType": "HARD"\ + }],\ ["virtual:97973ff51783dc29efdf1c1cff3bd542763fb1d8ea565946db4f6425a5a443923944d5f46e5672160073e5b792b61ec2b3a0e9df4f007033f07c728780e0e4e7#npm:10.9.1", {\ "packageLocation": "./.yarn/__virtual__/ts-node-virtual-b027fe8b90/0/cache/ts-node-npm-10.9.1-6c268be7f4-090adff130.zip/node_modules/ts-node/",\ "packageDependencies": [\ diff --git a/yarn-project/data-archiver/package.json b/yarn-project/data-archiver/package.json index 7c8eb3bc5cf..fb1e15990cc 100644 --- a/yarn-project/data-archiver/package.json +++ b/yarn-project/data-archiver/package.json @@ -24,6 +24,7 @@ "rootDir": "./src" }, "dependencies": { + "stream": "^0.0.2", "tslib": "^2.4.0" }, "devDependencies": { @@ -31,7 +32,7 @@ "@jest/globals": "^29.4.3", "@rushstack/eslint-patch": "^1.1.4", "@types/jest": "^29.4.0", - "@types/node": "^18.7.23", + "@types/node": "^18.14.6", "jest": "^28.1.3", "ts-jest": "^28.0.7", "ts-node": "^10.9.1", diff --git a/yarn-project/data-archiver/src/mock_rollup_source.ts b/yarn-project/data-archiver/src/mock_rollup_source.ts new file mode 100644 index 00000000000..c3bfeb40c0f --- /dev/null +++ b/yarn-project/data-archiver/src/mock_rollup_source.ts @@ -0,0 +1,34 @@ +import { Rollup } from './rollup.js'; +import { RollupSource } from './rollup_source.js'; + +const createMockRollup = (rollupId: number) => { + return { + rollupId, + commitments: [Buffer.alloc(32)], + } as Rollup; +}; + +export class MockRollupSource implements RollupSource { + private currentRollupId: number; + private rollups: Rollup[] = []; + constructor(private startRollupId: number) { + this.currentRollupId = startRollupId; + if (this.currentRollupId >= 0) { + this.rollups = [createMockRollup(this.currentRollupId)]; + } + } + public getRollups(from: number, take = 10): Promise { + if (from < this.startRollupId || from > this.currentRollupId + 1) { + throw new Error('Rollup not found'); + } + if (from === this.currentRollupId + 1) { + this.rollups.push(createMockRollup(this.currentRollupId)); + this.currentRollupId + 1; + } + return Promise.resolve(this.rollups.slice(from, take)); + } + + public getLatestRollupId(): Promise { + return Promise.resolve(this.currentRollupId); + } +} diff --git a/yarn-project/data-archiver/src/polling_rollup_emitter.ts b/yarn-project/data-archiver/src/polling_rollup_emitter.ts new file mode 100644 index 00000000000..ab4a75d3571 --- /dev/null +++ b/yarn-project/data-archiver/src/polling_rollup_emitter.ts @@ -0,0 +1,63 @@ +import { EventEmitter } from 'stream'; +import { Rollup } from './rollup.js'; +import { RollupEmitter, RollupRetriever } from './rollup_emitter.js'; + +export class PollingRollupEmitter extends EventEmitter implements RollupEmitter { + private running = false; + private runningPromise = Promise.resolve(); + private interruptPromise = Promise.resolve(); + private interruptResolve = () => {}; + constructor(private retriever: RollupRetriever, private pollingInterval = 10000) { + super(); + } + public getRollups(from: number, take?: number): Promise { + return this.retriever.getRollups(from, take); + } + + /** + * Starts emitting rollup blocks. + */ + public start(fromRollup = 0) { + this.running = true; + this.interruptPromise = new Promise(resolve => (this.interruptResolve = resolve)); + + const getAndEmitNewBlocks = async () => { + try { + const rollups = await this.getRollups(fromRollup); + for (const rollup of rollups) { + this.emit('rollup', rollup); + fromRollup = rollup.rollupId + 1; + } + } catch (error) { + console.log(error); + } + }; + + const poll = async () => { + while (this.running) { + await getAndEmitNewBlocks(); + await this.interruptableSleep(this.pollingInterval); + } + }; + this.runningPromise = poll(); + } + + async stop(): Promise { + this.running = false; + this.interruptResolve(); + await this.runningPromise; + } + + public getLatestRollupId(): Promise { + return this.retriever.getLatestRollupId(); + } + + private async interruptableSleep(timeInMs: number) { + let timeout!: NodeJS.Timeout; + const sleepPromise = new Promise(resolve => { + timeout = setTimeout(resolve, timeInMs); + }); + await Promise.race([sleepPromise, this.interruptPromise]); + clearTimeout(timeout); + } +} diff --git a/yarn-project/data-archiver/src/rollup.ts b/yarn-project/data-archiver/src/rollup.ts new file mode 100644 index 00000000000..afea10ebf01 --- /dev/null +++ b/yarn-project/data-archiver/src/rollup.ts @@ -0,0 +1,4 @@ +export interface Rollup { + rollupId: number; + commitments: Buffer[]; +} diff --git a/yarn-project/data-archiver/src/rollup_emitter.ts b/yarn-project/data-archiver/src/rollup_emitter.ts new file mode 100644 index 00000000000..b42f6f40a45 --- /dev/null +++ b/yarn-project/data-archiver/src/rollup_emitter.ts @@ -0,0 +1,36 @@ +import { EventEmitter } from 'stream'; +import { Rollup } from './rollup.js'; + +export interface RollupRetriever { + /** + * Returns up to `take` rollups from rollup id `from`. + * This does not guarantee all rollups are returned. It may return a subset, and the + * client should use `getLatestRollupId()` to determine if it needs to make further requests. + */ + getRollups(from: number, take?: number): Promise; + + getLatestRollupId(): Promise; +} + +export interface RollupEmitter extends EventEmitter { + /** + * Returns up to `take` rollups from rollup id `from`. + * This does not guarantee all rollups are returned. It may return a subset, and the + * client should use `getLatestRollupId()` to determine if it needs to make further requests. + */ + getRollups(from: number, take?: number): Promise; + + /** + * Starts emitting rollup blocks. + * All historical blocks must have been emitted before this function returns. + */ + start(fromRollup?: number): void; + + stop(): Promise; + + on(event: 'rollup', fn: (rollup: Rollup) => void): this; + + removeAllListeners(): this; + + getLatestRollupId(): Promise; +} diff --git a/yarn-project/data-archiver/src/rollup_source.ts b/yarn-project/data-archiver/src/rollup_source.ts new file mode 100644 index 00000000000..13c7f029344 --- /dev/null +++ b/yarn-project/data-archiver/src/rollup_source.ts @@ -0,0 +1,7 @@ +import { Rollup } from './rollup.js'; + +export interface RollupSource { + getRollups(from: number, take?: number): Promise; + + getLatestRollupId(): Promise; +} diff --git a/yarn-project/merkle-tree/.eslintrc.cjs b/yarn-project/merkle-tree/.eslintrc.cjs new file mode 100644 index 00000000000..9cf806b1500 --- /dev/null +++ b/yarn-project/merkle-tree/.eslintrc.cjs @@ -0,0 +1,6 @@ +require('@rushstack/eslint-patch/modern-module-resolution'); + +module.exports = { + extends: ['@aztec/eslint-config'], + parserOptions: { tsconfigRootDir: __dirname }, +}; diff --git a/yarn-project/merkle-tree/Dockerfile b/yarn-project/merkle-tree/Dockerfile new file mode 100644 index 00000000000..d3730b6bf3d --- /dev/null +++ b/yarn-project/merkle-tree/Dockerfile @@ -0,0 +1,14 @@ +FROM 278380418400.dkr.ecr.eu-west-2.amazonaws.com/yarn-project-base AS builder + +COPY merkle-tree merkle-tree +WORKDIR /usr/src/yarn-project/merkle-tree +RUN yarn build && yarn formatting && yarn test + +# Prune dev dependencies. See comment in base image. +RUN yarn cache clean +RUN yarn workspaces focus --production > /dev/null + +FROM node:18-alpine +COPY --from=builder /usr/src/yarn-project/merkle-tree /usr/src/yarn-project/merkle-tree +WORKDIR /usr/src/yarn-project/merkle-tree +ENTRYPOINT ["yarn"] \ No newline at end of file diff --git a/yarn-project/merkle-tree/README.md b/yarn-project/merkle-tree/README.md new file mode 100644 index 00000000000..a59fc047a5f --- /dev/null +++ b/yarn-project/merkle-tree/README.md @@ -0,0 +1 @@ +# Merkle Tree diff --git a/yarn-project/merkle-tree/package.json b/yarn-project/merkle-tree/package.json new file mode 100644 index 00000000000..d0b22b9f801 --- /dev/null +++ b/yarn-project/merkle-tree/package.json @@ -0,0 +1,42 @@ +{ + "name": "@aztec/merkle-tree", + "version": "0.0.0", + "type": "module", + "exports": "./dest/index.js", + "scripts": { + "build": "yarn clean && yarn formatting && tsc -b tsconfig.dest.json", + "build:dev": "tsc -b tsconfig.dest.json --watch", + "clean": "rm -rf ./dest .tsbuildinfo", + "formatting": "run -T prettier --check ./src && run -T eslint --max-warnings 0 ./src", + "test": "NODE_NO_WARNINGS=1 node --experimental-vm-modules $(yarn bin jest) --no-cache --passWithNoTests" + }, + "jest": { + "preset": "ts-jest/presets/default-esm", + "globals": { + "ts-jest": { + "useESM": true + } + }, + "moduleNameMapper": { + "^(\\.{1,2}/.*)\\.js$": "$1" + }, + "testRegex": "./src/.*\\.test\\.ts$", + "rootDir": "./src" + }, + "dependencies": { + "levelup": "^5.1.1", + "tslib": "^2.4.0" + }, + "devDependencies": { + "@aztec/eslint-config": "workspace:^", + "@jest/globals": "^29.4.3", + "@rushstack/eslint-patch": "^1.1.4", + "@types/jest": "^29.4.0", + "@types/levelup": "^5.1.2", + "@types/node": "^18.14.6", + "jest": "^28.1.3", + "ts-jest": "^28.0.7", + "ts-node": "^10.9.1", + "typescript": "^4.9.5" + } +} diff --git a/yarn-project/merkle-tree/src/hash_path.ts b/yarn-project/merkle-tree/src/hash_path.ts new file mode 100644 index 00000000000..2da32f5c43b --- /dev/null +++ b/yarn-project/merkle-tree/src/hash_path.ts @@ -0,0 +1,45 @@ +import { Pedersen } from './pedersen.js'; +import { deserializeArrayFromVector, serializeBufferArrayToVector } from './serialise.js'; + +export class HashPath { + public static ZERO(size: number, zeroElement: Buffer, pedersen: Pedersen) { + const bufs: Buffer[][] = []; + let current = zeroElement; + for (let i = 0; i < size; ++i) { + bufs.push([current, current]); + current = pedersen.compress(current, current); + } + return new HashPath(bufs); + } + + constructor(public data: Buffer[][] = []) {} + + public toBuffer() { + const elements = this.data.map(nodes => Buffer.concat([nodes[0], nodes[1]])); + return serializeBufferArrayToVector(elements); + } + + static fromBuffer(buf: Buffer, offset = 0) { + const { elem } = HashPath.deserialize(buf, offset); + return elem; + } + + static deserialize(buf: Buffer, offset = 0) { + const deserializePath = (buf: Buffer, offset: number) => ({ + elem: [buf.slice(offset, offset + 32), buf.slice(offset + 32, offset + 64)], + adv: 64, + }); + const { elem, adv } = deserializeArrayFromVector(deserializePath, buf, offset); + return { elem: new HashPath(elem), adv }; + } + + // For json serialization + public toString() { + return this.toBuffer().toString('hex'); + } + + // For json deserialization + public static fromString(repr: string) { + return HashPath.fromBuffer(Buffer.from(repr, 'hex')); + } +} diff --git a/yarn-project/merkle-tree/src/hasher.ts b/yarn-project/merkle-tree/src/hasher.ts new file mode 100644 index 00000000000..eddf0103c04 --- /dev/null +++ b/yarn-project/merkle-tree/src/hasher.ts @@ -0,0 +1,5 @@ +export interface Hasher { + compress(lhs: Uint8Array, rhs: Uint8Array): Buffer; + hashToField(data: Uint8Array): Buffer; + hashToTree(leaves: Buffer[]): Promise; +} diff --git a/yarn-project/merkle-tree/src/index.ts b/yarn-project/merkle-tree/src/index.ts new file mode 100644 index 00000000000..e6585505676 --- /dev/null +++ b/yarn-project/merkle-tree/src/index.ts @@ -0,0 +1,3 @@ +export * from './hash_path.js'; +export * from './hasher.js'; +export * from './merkle_tree.js'; diff --git a/yarn-project/merkle-tree/src/merkle_tree.ts b/yarn-project/merkle-tree/src/merkle_tree.ts new file mode 100644 index 00000000000..0429776f60d --- /dev/null +++ b/yarn-project/merkle-tree/src/merkle_tree.ts @@ -0,0 +1,290 @@ +import { LevelUp, LevelUpChain } from 'levelup'; +import { HashPath } from './hash_path.js'; +import { Hasher } from './hasher.js'; + +const MAX_DEPTH = 32; + +function keepNLsb(input: number, numBits: number) { + return numBits >= MAX_DEPTH ? input : input & ((1 << numBits) - 1); +} + +export class MerkleTree { + public static ZERO_ELEMENT = Buffer.from('0000000000000000000000000000000000000000000000000000000000000000', 'hex'); + private root!: Buffer; + private zeroHashes: Buffer[] = []; + + constructor( + private db: LevelUp, + private hasher: Hasher, + private name: string, + private depth: number, + private size: number = 0, + root?: Buffer, + private initialLeafValue = MerkleTree.ZERO_ELEMENT, + ) { + if (!(depth >= 1 && depth <= MAX_DEPTH)) { + throw Error('Bad depth'); + } + + // Compute the zero values at each layer. + let current = initialLeafValue; + for (let i = 0; i < depth; ++i) { + this.zeroHashes[i] = current; + current = hasher.compress(current, current); + } + + this.root = root ? root : current; + } + + static async new( + db: LevelUp, + hasher: Hasher, + name: string, + depth: number, + initialLeafValue = MerkleTree.ZERO_ELEMENT, + ) { + const tree = new MerkleTree(db, hasher, name, depth, 0, undefined, initialLeafValue); + await tree.writeMeta(); + + return tree; + } + + static async fromName(db: LevelUp, hasher: Hasher, name: string, initialLeafValue = MerkleTree.ZERO_ELEMENT) { + const meta: Buffer = await db.get(Buffer.from(name)); + const root = meta.slice(0, 32); + const depth = meta.readUInt32LE(32); + const size = meta.readUInt32LE(36); + return new MerkleTree(db, hasher, name, depth, size, root, initialLeafValue); + } + + public async syncFromDb() { + const meta: Buffer = await this.db.get(Buffer.from(this.name)); + this.root = meta.slice(0, 32); + this.depth = meta.readUInt32LE(32); + this.size = meta.readUInt32LE(36); + } + + private async writeMeta(batch?: LevelUpChain) { + const data = Buffer.alloc(40); + this.root.copy(data); + data.writeUInt32LE(this.depth, 32); + data.writeUInt32LE(this.size, 36); + if (batch) { + batch.put(this.name, data); + } else { + await this.db.put(this.name, data); + } + } + + public getRoot() { + return this.root; + } + + public getSize() { + return this.size; + } + + /** + * Returns a hash path for the element at the given index. + * The hash path is an array of pairs of hashes, with the lowest pair (leaf hashes) first, and the highest pair last. + */ + public async getHashPath(index: number) { + const path = new HashPath(); + + let data = await this.dbGet(this.root); + + for (let i = this.depth - 1; i >= 0; --i) { + if (!data) { + // This is an empty subtree. Fill in zero value. + path.data[i] = [this.zeroHashes[i], this.zeroHashes[i]]; + continue; + } + + if (data.length > 64) { + // Data is a subtree. Extract hash pair at height i. + const subtreeDepth = i + 1; + let layerSize = 2 ** subtreeDepth; + let offset = 0; + index = keepNLsb(index, subtreeDepth); + for (let j = 0; j < subtreeDepth; ++j) { + index -= index & 0x1; + const lhsOffset = offset + index * 32; + path.data[j] = [data.slice(lhsOffset, lhsOffset + 32), data.slice(lhsOffset + 32, lhsOffset + 64)]; + offset += layerSize * 32; + layerSize >>= 1; + index >>= 1; + } + break; + } + + const lhs = data.slice(0, 32); + const rhs = data.slice(32, 64); + path.data[i] = [lhs, rhs]; + const isRight = (index >> i) & 0x1; + data = await this.dbGet(isRight ? rhs : lhs); + } + + return path; + } + + public async updateElement(index: number, value: Buffer) { + return await this.updateLeafHash(index, value.equals(Buffer.alloc(32, 0)) ? this.initialLeafValue : value); + } + + public async updateLeafHash(index: number, leafHash: Buffer) { + const batch = this.db.batch(); + this.root = await this.updateElementInternal(this.root, leafHash, index, this.depth, batch); + + this.size = Math.max(this.size, index + 1); + + await this.writeMeta(batch); + await batch.write(); + } + + private async updateElementInternal( + root: Buffer, + value: Buffer, + index: number, + height: number, + batch: LevelUpChain, + ) { + if (height === 0) { + return value; + } + + const data = await this.dbGet(root); + const isRight = (index >> (height - 1)) & 0x1; + + let left = data ? data.slice(0, 32) : this.zeroHashes[height - 1]; + let right = data ? data.slice(32, 64) : this.zeroHashes[height - 1]; + const subtreeRoot = isRight ? right : left; + const newSubtreeRoot = await this.updateElementInternal( + subtreeRoot, + value, + keepNLsb(index, height - 1), + height - 1, + batch, + ); + + if (isRight) { + right = newSubtreeRoot; + } else { + left = newSubtreeRoot; + } + const newRoot = this.hasher.compress(left, right); + batch.put(newRoot, Buffer.concat([left, right])); + if (!root.equals(newRoot)) { + batch.del(root); + } + return newRoot; + } + + public async updateElements(index: number, values: Buffer[]) { + const zeroBuf = Buffer.alloc(32, 0); + return await this.updateLeafHashes( + index, + values.map(v => (v.equals(zeroBuf) ? this.initialLeafValue : v)), + ); + } + + /** + * Updates all the given values, starting at index. This is optimal when inserting multiple values, as it can + * compute a single subtree and insert it in one go. + * However it comes with restrictions: + * - The insertion index must be a multiple of the subtree size, which must be power of 2. + * - The insertion index must be >= the current size of the tree (inserting into an empty location). + * + * We cannot over extend the tree size, as these inserts are bulk inserts, and a subsequent update would involve + * a lot of complexity adjusting a previously inserted bulk insert. For this reason depending on the number of + * values to insert, it will be chunked into the fewest number of subtrees required to grow the tree be precisely + * that size. In normal operation (e.g. continuously inserting 64 values), we will be able to leverage single inserts. + * Only when synching creates a non power of 2 set of values will the chunking mechanism come into play. + * e.g. If we need insert 192 values, first a subtree of 128 is inserted, then a subtree of 64. + */ + public async updateLeafHashes(index: number, leafHashes: Buffer[]) { + while (leafHashes.length) { + const batch = this.db.batch(); + let subtreeDepth = Math.ceil(Math.log2(leafHashes.length)); + let subtreeSize = 2 ** subtreeDepth; + + // We need to reduce the size of the subtree being inserted until it is: + // a) Less than or equal in size to the number of values being inserted. + // b) Fits in a subtree, with a size that is a multiple of the insertion index. + while (leafHashes.length < subtreeSize || index % subtreeSize !== 0) { + subtreeSize >>= 1; + subtreeDepth--; + } + + const toInsert = leafHashes.slice(0, subtreeSize); + const hashes = await this.hasher.hashToTree(toInsert); + + this.root = await this.updateElementsInternal(this.root, hashes, index, this.depth, subtreeDepth, batch); + + // Slice off inserted values and adjust next insertion index. + leafHashes = leafHashes.slice(subtreeSize); + index += subtreeSize; + this.size = index; + + await this.writeMeta(batch); + await batch.write(); + } + } + + private async updateElementsInternal( + root: Buffer, + hashes: Buffer[], + index: number, + height: number, + subtreeHeight: number, + batch: LevelUpChain, + ) { + if (height === subtreeHeight) { + const root = hashes.pop()!; + batch.put(root, Buffer.concat(hashes)); + return root; + } + + // Do nothing if updating zero values. + if (hashes[hashes.length - 1].equals(this.zeroHashes[height - 1])) { + return root; + } + + const data = await this.dbGet(root); + const isRight = (index >> (height - 1)) & 0x1; + + if (data && data.length > 64) { + if (!root.equals(hashes[hashes.length - 1])) { + throw new Error('Attempting to update pre-existing subtree.'); + } + return root; + } + + let left = data ? data.slice(0, 32) : this.zeroHashes[height - 1]; + let right = data ? data.slice(32, 64) : this.zeroHashes[height - 1]; + const subtreeRoot = isRight ? right : left; + const newSubtreeRoot = await this.updateElementsInternal( + subtreeRoot, + hashes, + keepNLsb(index, height - 1), + height - 1, + subtreeHeight, + batch, + ); + + if (isRight) { + right = newSubtreeRoot; + } else { + left = newSubtreeRoot; + } + const newRoot = this.hasher.compress(left, right); + batch.put(newRoot, Buffer.concat([left, right])); + if (!root.equals(newRoot)) { + batch.del(root); + } + return newRoot; + } + + private async dbGet(key: Buffer): Promise { + return await this.db.get(key).catch(() => {}); + } +} diff --git a/yarn-project/merkle-tree/src/pedersen.ts b/yarn-project/merkle-tree/src/pedersen.ts new file mode 100644 index 00000000000..a10fa47ceed --- /dev/null +++ b/yarn-project/merkle-tree/src/pedersen.ts @@ -0,0 +1,14 @@ +/* eslint-disable */ +import { Hasher } from './hasher.js'; + +export class Pedersen implements Hasher { + public compress(lhs: Uint8Array, rhs: Uint8Array): Buffer { + return Buffer.alloc(32); + } + public hashToField(data: Uint8Array): Buffer { + return Buffer.alloc(32); + } + public hashToTree(leaves: Buffer[]): Promise { + return Promise.resolve([Buffer.alloc(32)]); + } +} diff --git a/yarn-project/merkle-tree/src/serialise.ts b/yarn-project/merkle-tree/src/serialise.ts new file mode 100644 index 00000000000..2025d82ee80 --- /dev/null +++ b/yarn-project/merkle-tree/src/serialise.ts @@ -0,0 +1,29 @@ +// For serializing an array of fixed length elements. +export function serializeBufferArrayToVector(arr: Buffer[]) { + const lengthBuf = Buffer.alloc(4); + lengthBuf.writeUInt32BE(arr.length, 0); + return Buffer.concat([lengthBuf, ...arr]); +} + +export function deserializeBufferFromVector(vector: Buffer, offset = 0) { + const length = vector.readUInt32BE(offset); + const adv = 4 + length; + return { elem: vector.slice(offset + 4, offset + adv), adv }; +} + +export function deserializeArrayFromVector( + deserialize: (buf: Buffer, offset: number) => { elem: T; adv: number }, + vector: Buffer, + offset = 0, +) { + let pos = offset; + const size = vector.readUInt32BE(pos); + pos += 4; + const arr = new Array(size); + for (let i = 0; i < size; ++i) { + const { elem, adv } = deserialize(vector, pos); + pos += adv; + arr[i] = elem; + } + return { elem: arr, adv: pos - offset }; +} diff --git a/yarn-project/merkle-tree/tsconfig.dest.json b/yarn-project/merkle-tree/tsconfig.dest.json new file mode 100644 index 00000000000..965aaa1c433 --- /dev/null +++ b/yarn-project/merkle-tree/tsconfig.dest.json @@ -0,0 +1,4 @@ +{ + "extends": ".", + "exclude": ["**/*.test.*", "**/fixtures/*"] +} diff --git a/yarn-project/merkle-tree/tsconfig.json b/yarn-project/merkle-tree/tsconfig.json new file mode 100644 index 00000000000..f67ddec9fd6 --- /dev/null +++ b/yarn-project/merkle-tree/tsconfig.json @@ -0,0 +1,9 @@ +{ + "extends": "..", + "compilerOptions": { + "outDir": "dest", + "rootDir": "src", + "tsBuildInfoFile": ".tsbuildinfo" + }, + "include": ["src"] +} diff --git a/yarn-project/package.json b/yarn-project/package.json index 26adc77f425..03789166f3d 100644 --- a/yarn-project/package.json +++ b/yarn-project/package.json @@ -14,12 +14,14 @@ "ethereum.js", "kernel-simulator", "key-store", + "merkle-tree", "p2p", "prettier-config", "prover-client", "public-client", "sequencer-client", - "wallet" + "wallet", + "world-state" ], "prettier": "./prettier-config", "devDependencies": { diff --git a/yarn-project/world-state/.eslintrc.cjs b/yarn-project/world-state/.eslintrc.cjs new file mode 100644 index 00000000000..9cf806b1500 --- /dev/null +++ b/yarn-project/world-state/.eslintrc.cjs @@ -0,0 +1,6 @@ +require('@rushstack/eslint-patch/modern-module-resolution'); + +module.exports = { + extends: ['@aztec/eslint-config'], + parserOptions: { tsconfigRootDir: __dirname }, +}; diff --git a/yarn-project/world-state/Dockerfile b/yarn-project/world-state/Dockerfile new file mode 100644 index 00000000000..42f12b1bbdd --- /dev/null +++ b/yarn-project/world-state/Dockerfile @@ -0,0 +1,14 @@ +FROM 278380418400.dkr.ecr.eu-west-2.amazonaws.com/yarn-project-base AS builder + +COPY world-state world-state +WORKDIR /usr/src/yarn-project/world-state +RUN yarn build && yarn formatting && yarn test + +# Prune dev dependencies. See comment in base image. +RUN yarn cache clean +RUN yarn workspaces focus --production > /dev/null + +FROM node:18-alpine +COPY --from=builder /usr/src/yarn-project/world-state /usr/src/yarn-project/world-state +WORKDIR /usr/src/yarn-project/world-state +ENTRYPOINT ["yarn"] \ No newline at end of file diff --git a/yarn-project/world-state/README.md b/yarn-project/world-state/README.md new file mode 100644 index 00000000000..39212748a09 --- /dev/null +++ b/yarn-project/world-state/README.md @@ -0,0 +1 @@ +# World State diff --git a/yarn-project/world-state/package.json b/yarn-project/world-state/package.json new file mode 100644 index 00000000000..137528ea1f3 --- /dev/null +++ b/yarn-project/world-state/package.json @@ -0,0 +1,40 @@ +{ + "name": "@aztec/world-state", + "version": "0.0.0", + "type": "module", + "exports": "./dest/index.js", + "scripts": { + "build": "yarn clean && yarn formatting && tsc -b tsconfig.dest.json", + "build:dev": "tsc -b tsconfig.dest.json --watch", + "clean": "rm -rf ./dest .tsbuildinfo", + "formatting": "run -T prettier --check ./src && run -T eslint --max-warnings 0 ./src", + "test": "NODE_NO_WARNINGS=1 node --experimental-vm-modules $(yarn bin jest) --no-cache --passWithNoTests" + }, + "jest": { + "preset": "ts-jest/presets/default-esm", + "globals": { + "ts-jest": { + "useESM": true + } + }, + "moduleNameMapper": { + "^(\\.{1,2}/.*)\\.js$": "$1" + }, + "testRegex": "./src/.*\\.test\\.ts$", + "rootDir": "./src" + }, + "dependencies": { + "tslib": "^2.4.0" + }, + "devDependencies": { + "@aztec/eslint-config": "workspace:^", + "@jest/globals": "^29.4.3", + "@rushstack/eslint-patch": "^1.1.4", + "@types/jest": "^29.4.0", + "@types/node": "^18.7.23", + "jest": "^28.1.3", + "ts-jest": "^28.0.7", + "ts-node": "^10.9.1", + "typescript": "^4.9.5" + } +} diff --git a/yarn-project/world-state/src/index.ts b/yarn-project/world-state/src/index.ts new file mode 100644 index 00000000000..d3bc46e2d86 --- /dev/null +++ b/yarn-project/world-state/src/index.ts @@ -0,0 +1 @@ +export class WorldState {} diff --git a/yarn-project/world-state/src/server_world_state_synchroniser.ts b/yarn-project/world-state/src/server_world_state_synchroniser.ts new file mode 100644 index 00000000000..9629fdbd8c6 --- /dev/null +++ b/yarn-project/world-state/src/server_world_state_synchroniser.ts @@ -0,0 +1,3 @@ +import { WorldStateSynchroniser } from './world_state_synchroniser.js'; + +export class ServerWorldStateSynchroniser implements WorldStateSynchroniser {} diff --git a/yarn-project/world-state/src/world_state_synchroniser.ts b/yarn-project/world-state/src/world_state_synchroniser.ts new file mode 100644 index 00000000000..9f08db423ae --- /dev/null +++ b/yarn-project/world-state/src/world_state_synchroniser.ts @@ -0,0 +1,17 @@ +export enum WorldStateRunningState { + IDLE, + SYNCHING, + RUNNING, + STOPPED, +} + +export interface WorldStateStatus { + state: WorldStateRunningState; + syncedToRollup: number; +} + +export interface WorldStateSynchroniser { + start(): Promise; + status(): Promise; + stop(): Promise; +} diff --git a/yarn-project/world-state/tsconfig.dest.json b/yarn-project/world-state/tsconfig.dest.json new file mode 100644 index 00000000000..965aaa1c433 --- /dev/null +++ b/yarn-project/world-state/tsconfig.dest.json @@ -0,0 +1,4 @@ +{ + "extends": ".", + "exclude": ["**/*.test.*", "**/fixtures/*"] +} diff --git a/yarn-project/world-state/tsconfig.json b/yarn-project/world-state/tsconfig.json new file mode 100644 index 00000000000..f67ddec9fd6 --- /dev/null +++ b/yarn-project/world-state/tsconfig.json @@ -0,0 +1,9 @@ +{ + "extends": "..", + "compilerOptions": { + "outDir": "dest", + "rootDir": "src", + "tsBuildInfoFile": ".tsbuildinfo" + }, + "include": ["src"] +} diff --git a/yarn-project/yarn.lock b/yarn-project/yarn.lock index 356d39f9950..6ed1a636ace 100644 --- a/yarn-project/yarn.lock +++ b/yarn-project/yarn.lock @@ -121,8 +121,9 @@ __metadata: "@jest/globals": ^29.4.3 "@rushstack/eslint-patch": ^1.1.4 "@types/jest": ^29.4.0 - "@types/node": ^18.7.23 + "@types/node": ^18.14.6 jest: ^28.1.3 + stream: ^0.0.2 ts-jest: ^28.0.7 ts-node: ^10.9.1 tslib: ^2.4.0 @@ -210,6 +211,25 @@ __metadata: languageName: unknown linkType: soft +"@aztec/merkle-tree@workspace:merkle-tree": + version: 0.0.0-use.local + resolution: "@aztec/merkle-tree@workspace:merkle-tree" + dependencies: + "@aztec/eslint-config": "workspace:^" + "@jest/globals": ^29.4.3 + "@rushstack/eslint-patch": ^1.1.4 + "@types/jest": ^29.4.0 + "@types/levelup": ^5.1.2 + "@types/node": ^18.14.6 + jest: ^28.1.3 + levelup: ^5.1.1 + ts-jest: ^28.0.7 + ts-node: ^10.9.1 + tslib: ^2.4.0 + typescript: ^4.9.5 + languageName: unknown + linkType: soft + "@aztec/p2p@workspace:p2p": version: 0.0.0-use.local resolution: "@aztec/p2p@workspace:p2p" @@ -303,6 +323,23 @@ __metadata: languageName: unknown linkType: soft +"@aztec/world-state@workspace:world-state": + version: 0.0.0-use.local + resolution: "@aztec/world-state@workspace:world-state" + dependencies: + "@aztec/eslint-config": "workspace:^" + "@jest/globals": ^29.4.3 + "@rushstack/eslint-patch": ^1.1.4 + "@types/jest": ^29.4.0 + "@types/node": ^18.7.23 + jest: ^28.1.3 + ts-jest: ^28.0.7 + ts-node: ^10.9.1 + tslib: ^2.4.0 + typescript: ^4.9.5 + languageName: unknown + linkType: soft + "@babel/code-frame@npm:^7.0.0, @babel/code-frame@npm:^7.12.13, @babel/code-frame@npm:^7.18.6": version: 7.18.6 resolution: "@babel/code-frame@npm:7.18.6" @@ -1318,6 +1355,13 @@ __metadata: languageName: node linkType: hard +"@types/abstract-leveldown@npm:*": + version: 7.2.1 + resolution: "@types/abstract-leveldown@npm:7.2.1" + checksum: 20689e7d144ce26d2384e2e151eed59046c95d573a6988da5e77e3076808eb4f435f474a0387af9ac786bfbfc7089e277dcfd9572ae902553d5c018e9b527a30 + languageName: node + linkType: hard + "@types/babel__core@npm:^7.1.14": version: 7.20.0 resolution: "@types/babel__core@npm:7.20.0" @@ -1410,6 +1454,24 @@ __metadata: languageName: node linkType: hard +"@types/level-errors@npm:*": + version: 3.0.0 + resolution: "@types/level-errors@npm:3.0.0" + checksum: ad9392663439306677ac9cb704f8fa0b64c300dfea4f3494369eb78a2e09c194156cbab2b52c71a361a09b735d54a2de65195dcadba0ec7db1d14a320198133e + languageName: node + linkType: hard + +"@types/levelup@npm:^5.1.2": + version: 5.1.2 + resolution: "@types/levelup@npm:5.1.2" + dependencies: + "@types/abstract-leveldown": "*" + "@types/level-errors": "*" + "@types/node": "*" + checksum: 6740284488b6806ba398bc38842fa789edd5667a342830c544a6b3611ebeed957a08d03dc8bde1e32fe03ac9c439341647c044c1ff0f73a26bcded9ca302a009 + languageName: node + linkType: hard + "@types/node@npm:*, @types/node@npm:^18.7.23": version: 18.14.2 resolution: "@types/node@npm:18.14.2" @@ -1417,6 +1479,13 @@ __metadata: languageName: node linkType: hard +"@types/node@npm:^18.14.6": + version: 18.14.6 + resolution: "@types/node@npm:18.14.6" + checksum: 2f88f482cabadc6dbddd627a1674239e68c3c9beab56eb4ae2309fb96fd17fc3a509d99b0309bafe13b58529574f49ecf3a583f2ebe2896dd32fe4be436dc96e + languageName: node + linkType: hard + "@types/prettier@npm:^2.1.5": version: 2.7.2 resolution: "@types/prettier@npm:2.7.2" @@ -1582,6 +1651,20 @@ __metadata: languageName: node linkType: hard +"abstract-leveldown@npm:^7.2.0": + version: 7.2.0 + resolution: "abstract-leveldown@npm:7.2.0" + dependencies: + buffer: ^6.0.3 + catering: ^2.0.0 + is-buffer: ^2.0.5 + level-concat-iterator: ^3.0.0 + level-supports: ^2.0.1 + queue-microtask: ^1.2.3 + checksum: d558111f2d123da95ac80b8ba3b9b0a5bc8cd87296e64b05dca693f5f4839aa0e2fc97bad56a101766f499824e2962611750f8a76bbac4a5db35801968fbbe02 + languageName: node + linkType: hard + "acorn-jsx@npm:^5.3.2": version: 5.3.2 resolution: "acorn-jsx@npm:5.3.2" @@ -1830,6 +1913,13 @@ __metadata: languageName: node linkType: hard +"base64-js@npm:^1.3.1": + version: 1.5.1 + resolution: "base64-js@npm:1.5.1" + checksum: 669632eb3745404c2f822a18fc3a0122d2f9a7a13f7fb8b5823ee19d1d2ff9ee5b52c53367176ea4ad093c332fd5ab4bd0ebae5a8e27917a4105a4cfc86b1005 + languageName: node + linkType: hard + "brace-expansion@npm:^1.1.7": version: 1.1.11 resolution: "brace-expansion@npm:1.1.11" @@ -1897,6 +1987,16 @@ __metadata: languageName: node linkType: hard +"buffer@npm:^6.0.3": + version: 6.0.3 + resolution: "buffer@npm:6.0.3" + dependencies: + base64-js: ^1.3.1 + ieee754: ^1.2.1 + checksum: 5ad23293d9a731e4318e420025800b42bf0d264004c0286c8cc010af7a270c7a0f6522e84f54b9ad65cbd6db20b8badbfd8d2ebf4f80fa03dab093b89e68c3f9 + languageName: node + linkType: hard + "cacache@npm:^16.1.0": version: 16.1.3 resolution: "cacache@npm:16.1.3" @@ -1951,6 +2051,13 @@ __metadata: languageName: node linkType: hard +"catering@npm:^2.0.0, catering@npm:^2.1.0": + version: 2.1.1 + resolution: "catering@npm:2.1.1" + checksum: 205daefa69c935b0c19f3d8f2e0a520dd69aebe9bda55902958003f7c9cff8f967dfb90071b421bd6eb618576f657a89d2bc0986872c9bc04bbd66655e9d4bd6 + languageName: node + linkType: hard + "chalk@npm:^2.0.0": version: 2.4.2 resolution: "chalk@npm:2.4.2" @@ -2159,6 +2266,16 @@ __metadata: languageName: node linkType: hard +"deferred-leveldown@npm:^7.0.0": + version: 7.0.0 + resolution: "deferred-leveldown@npm:7.0.0" + dependencies: + abstract-leveldown: ^7.2.0 + inherits: ^2.0.3 + checksum: 1ed5eb73e381aeb36d7153bf94dd957060b0294903660c1c8123a375e2b5cd5b3865428d7490aa1561c6ea08a5559563751e59e468d5786c99c765d2a868c658 + languageName: node + linkType: hard + "delegates@npm:^1.0.0": version: 1.0.0 resolution: "delegates@npm:1.0.0" @@ -2226,6 +2343,13 @@ __metadata: languageName: node linkType: hard +"emitter-component@npm:^1.1.1": + version: 1.1.1 + resolution: "emitter-component@npm:1.1.1" + checksum: 10e907f507a8c16a318e07595119e58b5c3267528d4e3b962ee9b14fd83c97599e7931ccb983ec551a8de8116955c1d6ae7d213c5b0c920b62c02b7cb8d7a4d7 + languageName: node + linkType: hard + "emittery@npm:^0.10.2": version: 0.10.2 resolution: "emittery@npm:0.10.2" @@ -2888,6 +3012,13 @@ __metadata: languageName: node linkType: hard +"ieee754@npm:^1.2.1": + version: 1.2.1 + resolution: "ieee754@npm:1.2.1" + checksum: 5144c0c9815e54ada181d80a0b810221a253562422e7c6c3a60b1901154184f49326ec239d618c416c1c5945a2e197107aee8d986a3dd836b53dffefd99b5e7e + languageName: node + linkType: hard + "ignore@npm:^5.2.0": version: 5.2.4 resolution: "ignore@npm:5.2.4" @@ -2948,7 +3079,7 @@ __metadata: languageName: node linkType: hard -"inherits@npm:2, inherits@npm:^2.0.3": +"inherits@npm:2, inherits@npm:^2.0.3, inherits@npm:^2.0.4": version: 2.0.4 resolution: "inherits@npm:2.0.4" checksum: 4a48a733847879d6cf6691860a6b1e3f0f4754176e4d71494c41f3475553768b10f84b5ce1d40fbd0e34e6bfbb864ee35858ad4dd2cf31e02fc4a154b724d7f1 @@ -2969,6 +3100,13 @@ __metadata: languageName: node linkType: hard +"is-buffer@npm:^2.0.5": + version: 2.0.5 + resolution: "is-buffer@npm:2.0.5" + checksum: 764c9ad8b523a9f5a32af29bdf772b08eb48c04d2ad0a7240916ac2688c983bf5f8504bf25b35e66240edeb9d9085461f9b5dae1f3d2861c6b06a65fe983de42 + languageName: node + linkType: hard + "is-core-module@npm:^2.9.0": version: 2.11.0 resolution: "is-core-module@npm:2.11.0" @@ -3764,6 +3902,53 @@ __metadata: languageName: node linkType: hard +"level-concat-iterator@npm:^3.0.0": + version: 3.1.0 + resolution: "level-concat-iterator@npm:3.1.0" + dependencies: + catering: ^2.1.0 + checksum: a15bc4c5fbbb30c1efa7fad06b72feaac84d90990b356b461593c198a833336f31f6daff8f40c3908fabd14cfd8856d1c5ecae9e1cb0575037b65fa607e760e9 + languageName: node + linkType: hard + +"level-errors@npm:^3.0.1": + version: 3.0.1 + resolution: "level-errors@npm:3.0.1" + checksum: fe4486c423e78ab509a8f7908b89a1692cc810dd47e02d9ceca50543b5be0ce3a4d555fb8f4d3c82122f56bd48c27e6175ca06da359b8e359ea2c7848209d8e7 + languageName: node + linkType: hard + +"level-iterator-stream@npm:^5.0.0": + version: 5.0.0 + resolution: "level-iterator-stream@npm:5.0.0" + dependencies: + inherits: ^2.0.4 + readable-stream: ^3.4.0 + checksum: 3f5bbb9caf6cf6d6c4735219194b85f903377d9da76d37db0691b836c8ea3a78e5233fb18c91f0ef8ca8faaa19bd59e46572ebe27ad2039c51cf83e6c974b9f1 + languageName: node + linkType: hard + +"level-supports@npm:^2.0.1": + version: 2.1.0 + resolution: "level-supports@npm:2.1.0" + checksum: f7b16aea7ddd13326ee4fbc2c1099bcaf8a74dc95346af9ebedea4e02518c6f7a438e829b79b7890d67489b59f615a9428369a0a065021797aa7cb6b6bd84d75 + languageName: node + linkType: hard + +"levelup@npm:^5.1.1": + version: 5.1.1 + resolution: "levelup@npm:5.1.1" + dependencies: + catering: ^2.0.0 + deferred-leveldown: ^7.0.0 + level-errors: ^3.0.1 + level-iterator-stream: ^5.0.0 + level-supports: ^2.0.1 + queue-microtask: ^1.2.3 + checksum: 3053cd3495f615874f1695a47bc7c1eaf432f4c1323b41d58770230b39f2b845100c6e6e912bcffdc504051a8540a39b5d05f3b54f65cfdcb43ce613f6182dd6 + languageName: node + linkType: hard + "leven@npm:^3.1.0": version: 3.1.0 resolution: "leven@npm:3.1.0" @@ -4380,7 +4565,7 @@ __metadata: languageName: node linkType: hard -"queue-microtask@npm:^1.2.2": +"queue-microtask@npm:^1.2.2, queue-microtask@npm:^1.2.3": version: 1.2.3 resolution: "queue-microtask@npm:1.2.3" checksum: b676f8c040cdc5b12723ad2f91414d267605b26419d5c821ff03befa817ddd10e238d22b25d604920340fd73efd8ba795465a0377c4adf45a4a41e4234e42dc4 @@ -4394,7 +4579,7 @@ __metadata: languageName: node linkType: hard -"readable-stream@npm:^3.6.0": +"readable-stream@npm:^3.4.0, readable-stream@npm:^3.6.0": version: 3.6.1 resolution: "readable-stream@npm:3.6.1" dependencies: @@ -4657,6 +4842,15 @@ __metadata: languageName: node linkType: hard +"stream@npm:^0.0.2": + version: 0.0.2 + resolution: "stream@npm:0.0.2" + dependencies: + emitter-component: ^1.1.1 + checksum: 43d89e176c282234d452754f9b55a82c74ea68345bf6176af32c4c213801f88df7984c83ec5a735457705dddf4668373edb9f0ec270a7491e1d881631a763978 + languageName: node + linkType: hard + "string-length@npm:^4.0.1": version: 4.0.2 resolution: "string-length@npm:4.0.2" From 6271d53e0389a5b7542298d842047b697aa10d89 Mon Sep 17 00:00:00 2001 From: PhilWindle Date: Wed, 8 Mar 2023 17:05:49 +0000 Subject: [PATCH 02/36] WIP --- yarn-project/.pnp.cjs | 48 ++++++++++ yarn-project/data-archiver/src/index.ts | 3 +- .../src/polling_rollup_emitter.ts | 36 ++----- .../data-archiver/src/rollup_emitter.ts | 4 +- .../data-archiver/src/running_promise.ts | 42 ++++++++ yarn-project/merkle-tree/src/index.ts | 1 + yarn-project/world-state/package.json | 6 ++ yarn-project/world-state/src/index.ts | 3 +- yarn-project/world-state/src/memory_fifo.ts | 95 +++++++++++++++++++ .../src/server_world_state_synchroniser.ts | 3 - .../world-state/src/synchroniser/index.ts | 2 + .../server_world_state_synchroniser.ts | 59 ++++++++++++ .../world_state_synchroniser.ts | 5 +- .../world-state/src/world-state-db/index.ts | 22 +++++ .../world-state-db/memory_world_state_db.ts | 40 ++++++++ yarn-project/yarn.lock | 48 +++++++++- yarn.lock | 4 + 17 files changed, 383 insertions(+), 38 deletions(-) create mode 100644 yarn-project/data-archiver/src/running_promise.ts create mode 100644 yarn-project/world-state/src/memory_fifo.ts delete mode 100644 yarn-project/world-state/src/server_world_state_synchroniser.ts create mode 100644 yarn-project/world-state/src/synchroniser/index.ts create mode 100644 yarn-project/world-state/src/synchroniser/server_world_state_synchroniser.ts rename yarn-project/world-state/src/{ => synchroniser}/world_state_synchroniser.ts (72%) create mode 100644 yarn-project/world-state/src/world-state-db/index.ts create mode 100644 yarn-project/world-state/src/world-state-db/memory_world_state_db.ts create mode 100644 yarn.lock diff --git a/yarn-project/.pnp.cjs b/yarn-project/.pnp.cjs index 460f8d40762..75edee312a2 100755 --- a/yarn-project/.pnp.cjs +++ b/yarn-project/.pnp.cjs @@ -490,12 +490,18 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { "packageLocation": "./world-state/",\ "packageDependencies": [\ ["@aztec/world-state", "workspace:world-state"],\ + ["@aztec/data-archiver", "workspace:data-archiver"],\ ["@aztec/eslint-config", "workspace:eslint-config"],\ + ["@aztec/merkle-tree", "workspace:merkle-tree"],\ ["@jest/globals", "npm:29.4.3"],\ ["@rushstack/eslint-patch", "npm:1.2.0"],\ ["@types/jest", "npm:29.4.0"],\ + ["@types/levelup", "npm:5.1.2"],\ + ["@types/memdown", "npm:3.0.1"],\ ["@types/node", "npm:18.14.2"],\ ["jest", "virtual:97973ff51783dc29efdf1c1cff3bd542763fb1d8ea565946db4f6425a5a443923944d5f46e5672160073e5b792b61ec2b3a0e9df4f007033f07c728780e0e4e7#npm:28.1.3"],\ + ["levelup", "npm:5.1.1"],\ + ["memdown", "npm:6.1.1"],\ ["ts-jest", "virtual:97973ff51783dc29efdf1c1cff3bd542763fb1d8ea565946db4f6425a5a443923944d5f46e5672160073e5b792b61ec2b3a0e9df4f007033f07c728780e0e4e7#npm:28.0.8"],\ ["ts-node", "virtual:97973ff51783dc29efdf1c1cff3bd542763fb1d8ea565946db4f6425a5a443923944d5f46e5672160073e5b792b61ec2b3a0e9df4f007033f07c728780e0e4e7#npm:10.9.1"],\ ["tslib", "npm:2.5.0"],\ @@ -2092,6 +2098,16 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { "linkType": "HARD"\ }]\ ]],\ + ["@types/memdown", [\ + ["npm:3.0.1", {\ + "packageLocation": "./.yarn/cache/@types-memdown-npm-3.0.1-57d57d174a-08085fff44.zip/node_modules/@types/memdown/",\ + "packageDependencies": [\ + ["@types/memdown", "npm:3.0.1"],\ + ["@types/abstract-leveldown", "npm:7.2.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ ["@types/node", [\ ["npm:18.14.2", {\ "packageLocation": "./.yarn/cache/@types-node-npm-18.14.2-ba0496d563-53c07e721f.zip/node_modules/@types/node/",\ @@ -3721,6 +3737,15 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { "linkType": "HARD"\ }]\ ]],\ + ["functional-red-black-tree", [\ + ["npm:1.0.1", {\ + "packageLocation": "./.yarn/cache/functional-red-black-tree-npm-1.0.1-ccfe924dcd-ca6c170f37.zip/node_modules/functional-red-black-tree/",\ + "packageDependencies": [\ + ["functional-red-black-tree", "npm:1.0.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ ["gauge", [\ ["npm:4.0.4", {\ "packageLocation": "./.yarn/cache/gauge-npm-4.0.4-8f878385e9-788b6bfe52.zip/node_modules/gauge/",\ @@ -5138,6 +5163,15 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { "linkType": "HARD"\ }]\ ]],\ + ["ltgt", [\ + ["npm:2.2.1", {\ + "packageLocation": "./.yarn/cache/ltgt-npm-2.2.1-443b5da86d-7e3874296f.zip/node_modules/ltgt/",\ + "packageDependencies": [\ + ["ltgt", "npm:2.2.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ ["make-dir", [\ ["npm:3.1.0", {\ "packageLocation": "./.yarn/cache/make-dir-npm-3.1.0-d1d7505142-484200020a.zip/node_modules/make-dir/",\ @@ -5192,6 +5226,20 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { "linkType": "HARD"\ }]\ ]],\ + ["memdown", [\ + ["npm:6.1.1", {\ + "packageLocation": "./.yarn/cache/memdown-npm-6.1.1-b0df54b245-a8c4186207.zip/node_modules/memdown/",\ + "packageDependencies": [\ + ["memdown", "npm:6.1.1"],\ + ["abstract-leveldown", "npm:7.2.0"],\ + ["buffer", "npm:6.0.3"],\ + ["functional-red-black-tree", "npm:1.0.1"],\ + ["inherits", "npm:2.0.4"],\ + ["ltgt", "npm:2.2.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ ["merge-stream", [\ ["npm:2.0.0", {\ "packageLocation": "./.yarn/cache/merge-stream-npm-2.0.0-2ac83efea5-6fa4dcc8d8.zip/node_modules/merge-stream/",\ diff --git a/yarn-project/data-archiver/src/index.ts b/yarn-project/data-archiver/src/index.ts index cdf6a0106df..6535ebf1430 100644 --- a/yarn-project/data-archiver/src/index.ts +++ b/yarn-project/data-archiver/src/index.ts @@ -1 +1,2 @@ -export class DataArchiver {} +export * from './rollup_emitter.js'; +export * from './rollup.js'; diff --git a/yarn-project/data-archiver/src/polling_rollup_emitter.ts b/yarn-project/data-archiver/src/polling_rollup_emitter.ts index ab4a75d3571..0192807c2bf 100644 --- a/yarn-project/data-archiver/src/polling_rollup_emitter.ts +++ b/yarn-project/data-archiver/src/polling_rollup_emitter.ts @@ -1,12 +1,10 @@ import { EventEmitter } from 'stream'; import { Rollup } from './rollup.js'; import { RollupEmitter, RollupRetriever } from './rollup_emitter.js'; +import { RunningPromise } from './running_promise.js'; export class PollingRollupEmitter extends EventEmitter implements RollupEmitter { - private running = false; - private runningPromise = Promise.resolve(); - private interruptPromise = Promise.resolve(); - private interruptResolve = () => {}; + private runningPromise?: RunningPromise; constructor(private retriever: RollupRetriever, private pollingInterval = 10000) { super(); } @@ -17,10 +15,7 @@ export class PollingRollupEmitter extends EventEmitter implements RollupEmitter /** * Starts emitting rollup blocks. */ - public start(fromRollup = 0) { - this.running = true; - this.interruptPromise = new Promise(resolve => (this.interruptResolve = resolve)); - + public async start(fromRollup = 0, syncInitial = true) { const getAndEmitNewBlocks = async () => { try { const rollups = await this.getRollups(fromRollup); @@ -32,32 +27,19 @@ export class PollingRollupEmitter extends EventEmitter implements RollupEmitter console.log(error); } }; + if (syncInitial) { + await getAndEmitNewBlocks(); + } - const poll = async () => { - while (this.running) { - await getAndEmitNewBlocks(); - await this.interruptableSleep(this.pollingInterval); - } - }; - this.runningPromise = poll(); + this.runningPromise = new RunningPromise(getAndEmitNewBlocks, this.pollingInterval); + this.runningPromise!.start(); } async stop(): Promise { - this.running = false; - this.interruptResolve(); - await this.runningPromise; + await this.runningPromise?.stop(); } public getLatestRollupId(): Promise { return this.retriever.getLatestRollupId(); } - - private async interruptableSleep(timeInMs: number) { - let timeout!: NodeJS.Timeout; - const sleepPromise = new Promise(resolve => { - timeout = setTimeout(resolve, timeInMs); - }); - await Promise.race([sleepPromise, this.interruptPromise]); - clearTimeout(timeout); - } } diff --git a/yarn-project/data-archiver/src/rollup_emitter.ts b/yarn-project/data-archiver/src/rollup_emitter.ts index b42f6f40a45..5f81c91adaf 100644 --- a/yarn-project/data-archiver/src/rollup_emitter.ts +++ b/yarn-project/data-archiver/src/rollup_emitter.ts @@ -22,9 +22,9 @@ export interface RollupEmitter extends EventEmitter { /** * Starts emitting rollup blocks. - * All historical blocks must have been emitted before this function returns. + * If syncInitial == true, all blocks from `fromRollup` will be emitted before the function ends */ - start(fromRollup?: number): void; + start(fromRollup?: number, syncInitial?: boolean): void; stop(): Promise; diff --git a/yarn-project/data-archiver/src/running_promise.ts b/yarn-project/data-archiver/src/running_promise.ts new file mode 100644 index 00000000000..ea8b594ce73 --- /dev/null +++ b/yarn-project/data-archiver/src/running_promise.ts @@ -0,0 +1,42 @@ +export class RunningPromise { + private running = false; + private runningPromise = Promise.resolve(); + private interruptPromise = Promise.resolve(); + private interruptResolve = () => {}; + constructor(private fn: () => Promise, private pollingInterval = 10000) {} + + /** + * Starts the running promise + */ + public start() { + this.running = true; + this.interruptPromise = new Promise(resolve => (this.interruptResolve = resolve)); + + const poll = async () => { + while (this.running) { + await this.fn(); + await this.interruptableSleep(this.pollingInterval); + } + }; + this.runningPromise = poll(); + } + + async stop(): Promise { + this.running = false; + this.interruptResolve(); + await this.runningPromise; + } + + private async interruptableSleep(timeInMs: number) { + let timeout!: NodeJS.Timeout; + const sleepPromise = new Promise(resolve => { + timeout = setTimeout(resolve, timeInMs); + }); + await Promise.race([sleepPromise, this.interruptPromise]); + clearTimeout(timeout); + } + + public isRunning() { + return this.running; + } +} diff --git a/yarn-project/merkle-tree/src/index.ts b/yarn-project/merkle-tree/src/index.ts index e6585505676..f0b933c236c 100644 --- a/yarn-project/merkle-tree/src/index.ts +++ b/yarn-project/merkle-tree/src/index.ts @@ -1,3 +1,4 @@ export * from './hash_path.js'; export * from './hasher.js'; export * from './merkle_tree.js'; +export * from './pedersen.js'; diff --git a/yarn-project/world-state/package.json b/yarn-project/world-state/package.json index 137528ea1f3..4e9bb689ff5 100644 --- a/yarn-project/world-state/package.json +++ b/yarn-project/world-state/package.json @@ -24,6 +24,10 @@ "rootDir": "./src" }, "dependencies": { + "@aztec/data-archiver": "workspace:^", + "@aztec/merkle-tree": "workspace:^", + "levelup": "^5.1.1", + "memdown": "^6.1.1", "tslib": "^2.4.0" }, "devDependencies": { @@ -31,6 +35,8 @@ "@jest/globals": "^29.4.3", "@rushstack/eslint-patch": "^1.1.4", "@types/jest": "^29.4.0", + "@types/levelup": "^5.1.2", + "@types/memdown": "^3.0.0", "@types/node": "^18.7.23", "jest": "^28.1.3", "ts-jest": "^28.0.7", diff --git a/yarn-project/world-state/src/index.ts b/yarn-project/world-state/src/index.ts index d3bc46e2d86..2d348b5a90c 100644 --- a/yarn-project/world-state/src/index.ts +++ b/yarn-project/world-state/src/index.ts @@ -1 +1,2 @@ -export class WorldState {} +export * from './synchroniser/index.js'; +export * from './world-state-db/index.js'; diff --git a/yarn-project/world-state/src/memory_fifo.ts b/yarn-project/world-state/src/memory_fifo.ts new file mode 100644 index 00000000000..7e333661365 --- /dev/null +++ b/yarn-project/world-state/src/memory_fifo.ts @@ -0,0 +1,95 @@ +/** + * A simple fifo queue. It can grow unbounded. It can have multiple producers and consumers. + * Putting an item onto the queue always succeeds, unless either end() or cancel() has been called in which case + * the item being pushed is simply discarded. + */ +export class MemoryFifo { + private waiting: ((item: T | null) => void)[] = []; + private items: T[] = []; + private flushing = false; + + public length() { + return this.items.length; + } + + /** + * Returns next item within the queue, or blocks until and item has been put into the queue. + * If given a timeout, the promise will reject if no item is received after `timeout` seconds. + * If the queue is flushing, `null` is returned. + */ + public get(timeout?: number): Promise { + if (this.items.length) { + return Promise.resolve(this.items.shift()!); + } + + if (this.items.length === 0 && this.flushing) { + return Promise.resolve(null); + } + + return new Promise((resolve, reject) => { + this.waiting.push(resolve); + + if (timeout) { + setTimeout(() => { + const index = this.waiting.findIndex(r => r === resolve); + if (index > -1) { + this.waiting.splice(index, 1); + const err = new Error('Timeout getting item from queue.'); + reject(err); + } + }, timeout * 1000); + } + }); + } + + /** + * Put an item onto back of the queue. + */ + public put(item: T) { + if (this.flushing) { + return; + } else if (this.waiting.length) { + this.waiting.shift()!(item); + } else { + this.items.push(item); + } + } + + /** + * Once ended, no further items are added to queue. Consumers will consume remaining items within the queue. + * The queue is not reusable after calling `end()`. + * Any consumers waiting for an item receive null. + */ + public end() { + this.flushing = true; + this.waiting.forEach(resolve => resolve(null)); + } + + /** + * Once cancelled, all items are discarded from the queue, and no further items are added to the queue. + * The queue is not reusable after calling `cancel()`. + * Any consumers waiting for an item receive null. + */ + public cancel() { + this.flushing = true; + this.items = []; + this.waiting.forEach(resolve => resolve(null)); + } + + /** + * Helper method that can be used to continously consume and process items on the queue. + */ + public async process(handler: (item: T) => Promise) { + try { + while (true) { + const item = await this.get(); + if (item === null) { + break; + } + await handler(item); + } + } catch (err) { + console.error('Queue handler exception:', err); + } + } +} diff --git a/yarn-project/world-state/src/server_world_state_synchroniser.ts b/yarn-project/world-state/src/server_world_state_synchroniser.ts deleted file mode 100644 index 9629fdbd8c6..00000000000 --- a/yarn-project/world-state/src/server_world_state_synchroniser.ts +++ /dev/null @@ -1,3 +0,0 @@ -import { WorldStateSynchroniser } from './world_state_synchroniser.js'; - -export class ServerWorldStateSynchroniser implements WorldStateSynchroniser {} diff --git a/yarn-project/world-state/src/synchroniser/index.ts b/yarn-project/world-state/src/synchroniser/index.ts new file mode 100644 index 00000000000..b875061d458 --- /dev/null +++ b/yarn-project/world-state/src/synchroniser/index.ts @@ -0,0 +1,2 @@ +export * from './server_world_state_synchroniser.js'; +export * from './world_state_synchroniser.js'; diff --git a/yarn-project/world-state/src/synchroniser/server_world_state_synchroniser.ts b/yarn-project/world-state/src/synchroniser/server_world_state_synchroniser.ts new file mode 100644 index 00000000000..58a5510b44a --- /dev/null +++ b/yarn-project/world-state/src/synchroniser/server_world_state_synchroniser.ts @@ -0,0 +1,59 @@ +import { WorldStateRunningState, WorldStateStatus, WorldStateSynchroniser } from './world_state_synchroniser.js'; +import { RollupEmitter, Rollup } from '@aztec/data-archiver'; +import { BatchUpdate, TreeInfo, WorldStateDB, WorldStateTreeId } from '../world-state-db/index.js'; +import { MemoryFifo } from '../memory_fifo.js'; + +export class ServerWorldStateSynchroniser implements WorldStateSynchroniser { + private queue: MemoryFifo<() => Promise> = new MemoryFifo<() => Promise>(); + private queuePromise?: Promise; + private currentRollupId = 0; + + constructor(private worldStateDb: WorldStateDB, private rollupEmitter: RollupEmitter) {} + + public start() { + this.queuePromise = this.queue.process(fn => { + return fn(); + }); + this.rollupEmitter.on('rollup', (rollup: Rollup) => this.synchronise(() => this.handleRollup(rollup))); + this.rollupEmitter.start(this.currentRollupId, true); + } + + public async stop() { + // first stop the emitter + await this.rollupEmitter.stop(); + // now wait for the rollup queue to complete + this.queue.end(); + await this.queuePromise; + } + + public status(): Promise { + const status = { + syncedToRollup: this.currentRollupId, + state: WorldStateRunningState.IDLE, + } as WorldStateStatus; + return Promise.resolve(status); + } + + public async getTreeInfo(): Promise { + return await this.synchronise(async () => { + return await this.worldStateDb.getTreeInfo(); + }); + } + + private async synchronise(fn: () => Promise): Promise { + return await new Promise(resolve => { + this.queue.put(async () => { + const result = await fn(); + resolve(result); + }); + }); + } + + private async handleRollup(rollup: Rollup) { + const update = { + treeId: WorldStateTreeId.CONTRACT_TREE, + elements: rollup.commitments, + } as BatchUpdate; + await this.worldStateDb.insertElements([update]); + } +} diff --git a/yarn-project/world-state/src/world_state_synchroniser.ts b/yarn-project/world-state/src/synchroniser/world_state_synchroniser.ts similarity index 72% rename from yarn-project/world-state/src/world_state_synchroniser.ts rename to yarn-project/world-state/src/synchroniser/world_state_synchroniser.ts index 9f08db423ae..97d2eb03432 100644 --- a/yarn-project/world-state/src/world_state_synchroniser.ts +++ b/yarn-project/world-state/src/synchroniser/world_state_synchroniser.ts @@ -1,3 +1,5 @@ +import { TreeInfo } from '../world-state-db/index.js'; + export enum WorldStateRunningState { IDLE, SYNCHING, @@ -11,7 +13,8 @@ export interface WorldStateStatus { } export interface WorldStateSynchroniser { - start(): Promise; + start(): void; status(): Promise; stop(): Promise; + getTreeInfo(): Promise; } diff --git a/yarn-project/world-state/src/world-state-db/index.ts b/yarn-project/world-state/src/world-state-db/index.ts new file mode 100644 index 00000000000..98826044d53 --- /dev/null +++ b/yarn-project/world-state/src/world-state-db/index.ts @@ -0,0 +1,22 @@ +import { HashPath } from '@aztec/merkle-tree'; + +export enum WorldStateTreeId { + CONTRACT_TREE = 0, +} + +export interface TreeInfo { + treeId: WorldStateTreeId; + root: Buffer; + size: number; +} + +export interface BatchUpdate { + treeId: WorldStateTreeId; + elements: Buffer[]; +} + +export interface WorldStateDB { + getTreeInfo(): Promise; + insertElements(batches: BatchUpdate[]): Promise; + getHashPath(treeId: WorldStateTreeId, index: number): Promise; +} diff --git a/yarn-project/world-state/src/world-state-db/memory_world_state_db.ts b/yarn-project/world-state/src/world-state-db/memory_world_state_db.ts new file mode 100644 index 00000000000..5206b0723ed --- /dev/null +++ b/yarn-project/world-state/src/world-state-db/memory_world_state_db.ts @@ -0,0 +1,40 @@ +import { default as LevelUp } from 'levelup'; +import { MemDown } from 'memdown'; +import { BatchUpdate, TreeInfo, WorldStateDB, WorldStateTreeId } from './index.js'; +import { MerkleTree, Pedersen, HashPath } from '@aztec/merkle-tree'; + +export class MemoryWorldStateDb implements WorldStateDB { + private trees: MerkleTree[] = []; + + constructor() { + const db = new LevelUp(MemDown()); + const hasher = new Pedersen(); + this.trees = [new MerkleTree(db, hasher, `${WorldStateTreeId[WorldStateTreeId.CONTRACT_TREE]}`, 32)]; + } + + public getTreeInfo() { + const treeInfo = { + treeId: WorldStateTreeId.CONTRACT_TREE, + root: this.trees[WorldStateTreeId.CONTRACT_TREE].getRoot(), + size: this.trees[WorldStateTreeId.CONTRACT_TREE].getSize(), + } as TreeInfo; + return Promise.resolve([treeInfo]); + } + + public getHashPath(treeId: WorldStateTreeId, index: number): Promise { + return this.trees[treeId].getHashPath(index); + } + + public async insertElements(batches: BatchUpdate[]): Promise { + const results: TreeInfo[] = []; + for (const batch of batches) { + await this.trees[batch.treeId].updateElements(this.trees[batch.treeId].getSize(), batch.elements); + results.push({ + treeId: batch.treeId, + size: this.trees[batch.treeId].getSize(), + root: this.trees[batch.treeId].getRoot(), + } as TreeInfo); + } + return results; + } +} diff --git a/yarn-project/yarn.lock b/yarn-project/yarn.lock index 6ed1a636ace..5915b409d2b 100644 --- a/yarn-project/yarn.lock +++ b/yarn-project/yarn.lock @@ -113,7 +113,7 @@ __metadata: languageName: unknown linkType: soft -"@aztec/data-archiver@workspace:data-archiver": +"@aztec/data-archiver@workspace:^, @aztec/data-archiver@workspace:data-archiver": version: 0.0.0-use.local resolution: "@aztec/data-archiver@workspace:data-archiver" dependencies: @@ -211,7 +211,7 @@ __metadata: languageName: unknown linkType: soft -"@aztec/merkle-tree@workspace:merkle-tree": +"@aztec/merkle-tree@workspace:^, @aztec/merkle-tree@workspace:merkle-tree": version: 0.0.0-use.local resolution: "@aztec/merkle-tree@workspace:merkle-tree" dependencies: @@ -327,12 +327,18 @@ __metadata: version: 0.0.0-use.local resolution: "@aztec/world-state@workspace:world-state" dependencies: + "@aztec/data-archiver": "workspace:^" "@aztec/eslint-config": "workspace:^" + "@aztec/merkle-tree": "workspace:^" "@jest/globals": ^29.4.3 "@rushstack/eslint-patch": ^1.1.4 "@types/jest": ^29.4.0 + "@types/levelup": ^5.1.2 + "@types/memdown": ^3.0.0 "@types/node": ^18.7.23 jest: ^28.1.3 + levelup: ^5.1.1 + memdown: ^6.1.1 ts-jest: ^28.0.7 ts-node: ^10.9.1 tslib: ^2.4.0 @@ -1472,6 +1478,15 @@ __metadata: languageName: node linkType: hard +"@types/memdown@npm:^3.0.0": + version: 3.0.1 + resolution: "@types/memdown@npm:3.0.1" + dependencies: + "@types/abstract-leveldown": "*" + checksum: 08085fff44f1868d352ec3be81890cfd0034ad1086f3dbc8bbfc412d55434bb6f5bbd512a22a92f2f9c416ccb0784815ecaa0a6fada4478c9a39db3f0f7a1a43 + languageName: node + linkType: hard + "@types/node@npm:*, @types/node@npm:^18.7.23": version: 18.14.2 resolution: "@types/node@npm:18.14.2" @@ -2789,6 +2804,13 @@ __metadata: languageName: node linkType: hard +"functional-red-black-tree@npm:^1.0.1": + version: 1.0.1 + resolution: "functional-red-black-tree@npm:1.0.1" + checksum: ca6c170f37640e2d94297da8bb4bf27a1d12bea3e00e6a3e007fd7aa32e37e000f5772acf941b4e4f3cf1c95c3752033d0c509af157ad8f526e7f00723b9eb9f + languageName: node + linkType: hard + "gauge@npm:^4.0.3": version: 4.0.4 resolution: "gauge@npm:4.0.4" @@ -3079,7 +3101,7 @@ __metadata: languageName: node linkType: hard -"inherits@npm:2, inherits@npm:^2.0.3, inherits@npm:^2.0.4": +"inherits@npm:2, inherits@npm:^2.0.1, inherits@npm:^2.0.3, inherits@npm:^2.0.4": version: 2.0.4 resolution: "inherits@npm:2.0.4" checksum: 4a48a733847879d6cf6691860a6b1e3f0f4754176e4d71494c41f3475553768b10f84b5ce1d40fbd0e34e6bfbb864ee35858ad4dd2cf31e02fc4a154b724d7f1 @@ -4030,6 +4052,13 @@ __metadata: languageName: node linkType: hard +"ltgt@npm:^2.2.0": + version: 2.2.1 + resolution: "ltgt@npm:2.2.1" + checksum: 7e3874296f7538bc8087b428ac4208008d7b76916354b34a08818ca7c83958c1df10ec427eeeaad895f6b81e41e24745b18d30f89abcc21d228b94f6961d50a2 + languageName: node + linkType: hard + "make-dir@npm:^3.0.0": version: 3.1.0 resolution: "make-dir@npm:3.1.0" @@ -4079,6 +4108,19 @@ __metadata: languageName: node linkType: hard +"memdown@npm:^6.1.1": + version: 6.1.1 + resolution: "memdown@npm:6.1.1" + dependencies: + abstract-leveldown: ^7.2.0 + buffer: ^6.0.3 + functional-red-black-tree: ^1.0.1 + inherits: ^2.0.1 + ltgt: ^2.2.0 + checksum: a8c418620781a396e650834ab18022c1ae13060b3ca47dc80152eff45caf0e4780598610fd0f9b5a50ebdf195e686ed53fadbae1272addfafad98d598a165a4b + languageName: node + linkType: hard + "merge-stream@npm:^2.0.0": version: 2.0.0 resolution: "merge-stream@npm:2.0.0" diff --git a/yarn.lock b/yarn.lock new file mode 100644 index 00000000000..fb57ccd13af --- /dev/null +++ b/yarn.lock @@ -0,0 +1,4 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + From 24de9a7630857b0009711aa9ca6e58d3351009dd Mon Sep 17 00:00:00 2001 From: PhilWindle Date: Tue, 14 Mar 2023 12:20:58 +0000 Subject: [PATCH 03/36] WIP --- .../src/polling_rollup_emitter.ts | 5 +- .../data-archiver/src/rollup_emitter.ts | 11 - yarn-project/merkle-tree/src/bigint_buffer.ts | 51 +++ yarn-project/merkle-tree/src/index.ts | 5 +- yarn-project/merkle-tree/src/indexed_tree.ts | 118 +++++++ yarn-project/merkle-tree/src/merkle_tree.ts | 312 ++--------------- .../src/{hash_path.ts => sibling_path.ts} | 23 +- .../merkle-tree/src/standard_tree.test.ts | 328 ++++++++++++++++++ yarn-project/merkle-tree/src/standard_tree.ts | 189 ++++++++++ .../src/rollup_block_downloader.ts | 68 ++++ yarn-project/world-state/src/semaphore.ts | 20 ++ yarn-project/world-state/src/serial_queue.ts | 49 +++ yarn-project/world-state/src/sleep.ts | 26 ++ .../server_world_state_synchroniser.ts | 61 ++-- .../synchroniser/world_state_synchroniser.ts | 3 - .../world-state/src/world-state-db/index.ts | 6 - .../world-state-db/memory_world_state_db.ts | 102 ++++-- 17 files changed, 1002 insertions(+), 375 deletions(-) create mode 100644 yarn-project/merkle-tree/src/bigint_buffer.ts create mode 100644 yarn-project/merkle-tree/src/indexed_tree.ts rename yarn-project/merkle-tree/src/{hash_path.ts => sibling_path.ts} (59%) create mode 100644 yarn-project/merkle-tree/src/standard_tree.test.ts create mode 100644 yarn-project/merkle-tree/src/standard_tree.ts create mode 100644 yarn-project/world-state/src/rollup_block_downloader.ts create mode 100644 yarn-project/world-state/src/semaphore.ts create mode 100644 yarn-project/world-state/src/serial_queue.ts create mode 100644 yarn-project/world-state/src/sleep.ts diff --git a/yarn-project/data-archiver/src/polling_rollup_emitter.ts b/yarn-project/data-archiver/src/polling_rollup_emitter.ts index 0192807c2bf..b5032269c3a 100644 --- a/yarn-project/data-archiver/src/polling_rollup_emitter.ts +++ b/yarn-project/data-archiver/src/polling_rollup_emitter.ts @@ -1,11 +1,12 @@ import { EventEmitter } from 'stream'; import { Rollup } from './rollup.js'; -import { RollupEmitter, RollupRetriever } from './rollup_emitter.js'; +import { RollupEmitter } from './rollup_emitter.js'; +import { RollupSource } from './rollup_source.js'; import { RunningPromise } from './running_promise.js'; export class PollingRollupEmitter extends EventEmitter implements RollupEmitter { private runningPromise?: RunningPromise; - constructor(private retriever: RollupRetriever, private pollingInterval = 10000) { + constructor(private retriever: RollupSource, private pollingInterval = 10000) { super(); } public getRollups(from: number, take?: number): Promise { diff --git a/yarn-project/data-archiver/src/rollup_emitter.ts b/yarn-project/data-archiver/src/rollup_emitter.ts index 5f81c91adaf..8d08e35aaeb 100644 --- a/yarn-project/data-archiver/src/rollup_emitter.ts +++ b/yarn-project/data-archiver/src/rollup_emitter.ts @@ -1,17 +1,6 @@ import { EventEmitter } from 'stream'; import { Rollup } from './rollup.js'; -export interface RollupRetriever { - /** - * Returns up to `take` rollups from rollup id `from`. - * This does not guarantee all rollups are returned. It may return a subset, and the - * client should use `getLatestRollupId()` to determine if it needs to make further requests. - */ - getRollups(from: number, take?: number): Promise; - - getLatestRollupId(): Promise; -} - export interface RollupEmitter extends EventEmitter { /** * Returns up to `take` rollups from rollup id `from`. diff --git a/yarn-project/merkle-tree/src/bigint_buffer.ts b/yarn-project/merkle-tree/src/bigint_buffer.ts new file mode 100644 index 00000000000..b04faaaf864 --- /dev/null +++ b/yarn-project/merkle-tree/src/bigint_buffer.ts @@ -0,0 +1,51 @@ +/** + * Convert a little-endian buffer into a BigInt. + * @param buf The little-endian buffer to convert + * @returns A BigInt with the little-endian representation of buf. + */ +export function toBigIntLE(buf: Buffer): bigint { + const reversed = Buffer.from(buf); + reversed.reverse(); + const hex = reversed.toString('hex'); + if (hex.length === 0) { + return BigInt(0); + } + return BigInt(`0x${hex}`); +} + +/** + * Convert a big-endian buffer into a BigInt + * @param buf The big-endian buffer to convert. + * @returns A BigInt with the big-endian representation of buf. + */ +export function toBigIntBE(buf: Buffer): bigint { + const hex = buf.toString('hex'); + if (hex.length === 0) { + return BigInt(0); + } + return BigInt(`0x${hex}`); +} + +/** + * Convert a BigInt to a little-endian buffer. + * @param num The BigInt to convert. + * @param width The number of bytes that the resulting buffer should be. + * @returns A little-endian buffer representation of num. + */ +export function toBufferLE(num: bigint, width: number): Buffer { + const hex = num.toString(16); + const buffer = Buffer.from(hex.padStart(width * 2, '0').slice(0, width * 2), 'hex'); + buffer.reverse(); + return buffer; +} + +/** + * Convert a BigInt to a big-endian buffer. + * @param num The BigInt to convert. + * @param width The number of bytes that the resulting buffer should be. + * @returns A big-endian buffer representation of num. + */ +export function toBufferBE(num: bigint, width: number): Buffer { + const hex = num.toString(16); + return Buffer.from(hex.padStart(width * 2, '0').slice(0, width * 2), 'hex'); +} diff --git a/yarn-project/merkle-tree/src/index.ts b/yarn-project/merkle-tree/src/index.ts index f0b933c236c..ad75bd4cb2a 100644 --- a/yarn-project/merkle-tree/src/index.ts +++ b/yarn-project/merkle-tree/src/index.ts @@ -1,4 +1,5 @@ -export * from './hash_path.js'; +export * from './sibling_path.js'; export * from './hasher.js'; -export * from './merkle_tree.js'; +export * from './standard_tree.js'; export * from './pedersen.js'; +export * from './merkle_tree.js'; diff --git a/yarn-project/merkle-tree/src/indexed_tree.ts b/yarn-project/merkle-tree/src/indexed_tree.ts new file mode 100644 index 00000000000..9c45de3e48e --- /dev/null +++ b/yarn-project/merkle-tree/src/indexed_tree.ts @@ -0,0 +1,118 @@ +import { toBigIntBE, toBufferBE } from './bigint_buffer.js'; +import { MerkleTree } from './merkle_tree.js'; +import { SiblingPath } from './sibling_path.js'; +import { StandardMerkleTree } from './standard_tree.js'; + +interface LeafData { + value: bigint; + nextIndex: bigint; + nextValue: bigint; +} + +const encodeTreeValue = (leafData: LeafData) => { + const valueAsBuffer = toBufferBE(leafData.value, 32); + const indexAsBuffer = toBufferBE(leafData.nextIndex, 32); + const nextValueAsBuffer = toBufferBE(leafData.nextValue, 32); + return Buffer.concat([valueAsBuffer, indexAsBuffer, nextValueAsBuffer]); +}; + +export class IndexedTree implements MerkleTree { + private leaves: LeafData[] = []; + constructor(private underlying: StandardMerkleTree) {} + + public static async new( + db: LevelUp, + hasher: Hasher, + name: string, + depth: number, + initialLeafValue = StandardMerkleTree.ZERO_ELEMENT, + ) { + const underlying = await StandardMerkleTree.new(db, hasher, name, depth, initialLeafValue); + const tree = new IndexedTree(underlying); + await tree.init(); + return tree; + } + + public getRoot(): Buffer { + return this.underlying.getRoot(); + } + public getNumLeaves(): bigint { + return this.underlying.getNumLeaves(); + } + public async appendLeaves(leaves: Buffer[]): Promise { + for (const leaf of leaves) { + await this.appendLeaf(leaf); + } + } + public async commit(): Promise { + return await this.underlying.commit(); + } + public async rollback(): Promise { + return await this.underlying.rollback(); + } + public async getSiblingPath(index: bigint): Promise { + return await this.underlying.getSiblingPath(index); + } + private async appendLeaf(leaf: Buffer): Promise { + const newValue = toBigIntBE(leaf); + const indexOfPrevious = this.findIndexOfPreviousValue(newValue); + const newLeaf = { + value: newValue, + nextIndex: this.leaves[indexOfPrevious.index].nextIndex, + nextValue: this.leaves[indexOfPrevious.index].nextValue, + } as LeafData; + + if (!indexOfPrevious.alreadyPresent) { + this.leaves[indexOfPrevious.index].nextIndex = BigInt(this.leaves.length); + this.leaves[indexOfPrevious.index].nextValue = newLeaf.value; + this.leaves.push(newLeaf); + } + + const oldTreeValue = encodeTreeValue(this.leaves[indexOfPrevious.index]); + const newTreeValue = encodeTreeValue(newLeaf); + await this.underlying.updateLeaf(oldTreeValue, BigInt(indexOfPrevious.index)); + await this.underlying.appendLeaves([newTreeValue]); + } + private findIndexOfPreviousValue(newValue: bigint) { + const numLeaves = this.underlying.getNumLeaves(); + const diff: bigint[] = []; + for (let i = 0; i < numLeaves; i++) { + const stored = this.leaves[i]; + if (stored.value > newValue) { + diff.push(newValue); + } else if (stored.value === newValue) { + return { index: i, alreadyPresent: true }; + } else { + diff.push(newValue - stored.value); + } + } + const minIndex = this.findMinIndex(diff); + return { index: minIndex, alreadyPresent: false }; + } + + private findMinIndex(values: bigint[]) { + if (!values.length) { + return 0; + } + let min = values[0]; + let minIndex = 0; + for (let i = 1; i < values.length; i++) { + if (min > values[i]) { + min = values[i]; + minIndex = i; + } + } + return minIndex; + } + + private async init() { + const initialLeaf = { + value: 0n, + nextIndex: 0n, + nextValue: 0n, + } as LeafData; + this.leaves.push(initialLeaf); + const initialData = encodeTreeValue(initialLeaf); + await this.underlying.appendLeaves(initialData); + } +} diff --git a/yarn-project/merkle-tree/src/merkle_tree.ts b/yarn-project/merkle-tree/src/merkle_tree.ts index 0429776f60d..e1794c9b61d 100644 --- a/yarn-project/merkle-tree/src/merkle_tree.ts +++ b/yarn-project/merkle-tree/src/merkle_tree.ts @@ -1,290 +1,38 @@ -import { LevelUp, LevelUpChain } from 'levelup'; -import { HashPath } from './hash_path.js'; -import { Hasher } from './hasher.js'; +import { SiblingPath } from './sibling_path.js'; -const MAX_DEPTH = 32; - -function keepNLsb(input: number, numBits: number) { - return numBits >= MAX_DEPTH ? input : input & ((1 << numBits) - 1); +export enum MerkleTreeId { + CONTRACT_TREE = 0, + CONTRACT_TREE_ROOTS_TREE = 1, + NULLIFIER_TREE = 2, } -export class MerkleTree { - public static ZERO_ELEMENT = Buffer.from('0000000000000000000000000000000000000000000000000000000000000000', 'hex'); - private root!: Buffer; - private zeroHashes: Buffer[] = []; - - constructor( - private db: LevelUp, - private hasher: Hasher, - private name: string, - private depth: number, - private size: number = 0, - root?: Buffer, - private initialLeafValue = MerkleTree.ZERO_ELEMENT, - ) { - if (!(depth >= 1 && depth <= MAX_DEPTH)) { - throw Error('Bad depth'); - } - - // Compute the zero values at each layer. - let current = initialLeafValue; - for (let i = 0; i < depth; ++i) { - this.zeroHashes[i] = current; - current = hasher.compress(current, current); - } - - this.root = root ? root : current; - } - - static async new( - db: LevelUp, - hasher: Hasher, - name: string, - depth: number, - initialLeafValue = MerkleTree.ZERO_ELEMENT, - ) { - const tree = new MerkleTree(db, hasher, name, depth, 0, undefined, initialLeafValue); - await tree.writeMeta(); - - return tree; - } - - static async fromName(db: LevelUp, hasher: Hasher, name: string, initialLeafValue = MerkleTree.ZERO_ELEMENT) { - const meta: Buffer = await db.get(Buffer.from(name)); - const root = meta.slice(0, 32); - const depth = meta.readUInt32LE(32); - const size = meta.readUInt32LE(36); - return new MerkleTree(db, hasher, name, depth, size, root, initialLeafValue); - } - - public async syncFromDb() { - const meta: Buffer = await this.db.get(Buffer.from(this.name)); - this.root = meta.slice(0, 32); - this.depth = meta.readUInt32LE(32); - this.size = meta.readUInt32LE(36); - } - - private async writeMeta(batch?: LevelUpChain) { - const data = Buffer.alloc(40); - this.root.copy(data); - data.writeUInt32LE(this.depth, 32); - data.writeUInt32LE(this.size, 36); - if (batch) { - batch.put(this.name, data); - } else { - await this.db.put(this.name, data); - } - } - - public getRoot() { - return this.root; - } - - public getSize() { - return this.size; - } - - /** - * Returns a hash path for the element at the given index. - * The hash path is an array of pairs of hashes, with the lowest pair (leaf hashes) first, and the highest pair last. - */ - public async getHashPath(index: number) { - const path = new HashPath(); - - let data = await this.dbGet(this.root); - - for (let i = this.depth - 1; i >= 0; --i) { - if (!data) { - // This is an empty subtree. Fill in zero value. - path.data[i] = [this.zeroHashes[i], this.zeroHashes[i]]; - continue; - } - - if (data.length > 64) { - // Data is a subtree. Extract hash pair at height i. - const subtreeDepth = i + 1; - let layerSize = 2 ** subtreeDepth; - let offset = 0; - index = keepNLsb(index, subtreeDepth); - for (let j = 0; j < subtreeDepth; ++j) { - index -= index & 0x1; - const lhsOffset = offset + index * 32; - path.data[j] = [data.slice(lhsOffset, lhsOffset + 32), data.slice(lhsOffset + 32, lhsOffset + 64)]; - offset += layerSize * 32; - layerSize >>= 1; - index >>= 1; - } - break; - } - - const lhs = data.slice(0, 32); - const rhs = data.slice(32, 64); - path.data[i] = [lhs, rhs]; - const isRight = (index >> i) & 0x1; - data = await this.dbGet(isRight ? rhs : lhs); - } - - return path; - } - - public async updateElement(index: number, value: Buffer) { - return await this.updateLeafHash(index, value.equals(Buffer.alloc(32, 0)) ? this.initialLeafValue : value); - } - - public async updateLeafHash(index: number, leafHash: Buffer) { - const batch = this.db.batch(); - this.root = await this.updateElementInternal(this.root, leafHash, index, this.depth, batch); - - this.size = Math.max(this.size, index + 1); - - await this.writeMeta(batch); - await batch.write(); - } - - private async updateElementInternal( - root: Buffer, - value: Buffer, - index: number, - height: number, - batch: LevelUpChain, - ) { - if (height === 0) { - return value; - } - - const data = await this.dbGet(root); - const isRight = (index >> (height - 1)) & 0x1; - - let left = data ? data.slice(0, 32) : this.zeroHashes[height - 1]; - let right = data ? data.slice(32, 64) : this.zeroHashes[height - 1]; - const subtreeRoot = isRight ? right : left; - const newSubtreeRoot = await this.updateElementInternal( - subtreeRoot, - value, - keepNLsb(index, height - 1), - height - 1, - batch, - ); - - if (isRight) { - right = newSubtreeRoot; - } else { - left = newSubtreeRoot; - } - const newRoot = this.hasher.compress(left, right); - batch.put(newRoot, Buffer.concat([left, right])); - if (!root.equals(newRoot)) { - batch.del(root); - } - return newRoot; - } - - public async updateElements(index: number, values: Buffer[]) { - const zeroBuf = Buffer.alloc(32, 0); - return await this.updateLeafHashes( - index, - values.map(v => (v.equals(zeroBuf) ? this.initialLeafValue : v)), - ); - } - - /** - * Updates all the given values, starting at index. This is optimal when inserting multiple values, as it can - * compute a single subtree and insert it in one go. - * However it comes with restrictions: - * - The insertion index must be a multiple of the subtree size, which must be power of 2. - * - The insertion index must be >= the current size of the tree (inserting into an empty location). - * - * We cannot over extend the tree size, as these inserts are bulk inserts, and a subsequent update would involve - * a lot of complexity adjusting a previously inserted bulk insert. For this reason depending on the number of - * values to insert, it will be chunked into the fewest number of subtrees required to grow the tree be precisely - * that size. In normal operation (e.g. continuously inserting 64 values), we will be able to leverage single inserts. - * Only when synching creates a non power of 2 set of values will the chunking mechanism come into play. - * e.g. If we need insert 192 values, first a subtree of 128 is inserted, then a subtree of 64. - */ - public async updateLeafHashes(index: number, leafHashes: Buffer[]) { - while (leafHashes.length) { - const batch = this.db.batch(); - let subtreeDepth = Math.ceil(Math.log2(leafHashes.length)); - let subtreeSize = 2 ** subtreeDepth; - - // We need to reduce the size of the subtree being inserted until it is: - // a) Less than or equal in size to the number of values being inserted. - // b) Fits in a subtree, with a size that is a multiple of the insertion index. - while (leafHashes.length < subtreeSize || index % subtreeSize !== 0) { - subtreeSize >>= 1; - subtreeDepth--; - } - - const toInsert = leafHashes.slice(0, subtreeSize); - const hashes = await this.hasher.hashToTree(toInsert); - - this.root = await this.updateElementsInternal(this.root, hashes, index, this.depth, subtreeDepth, batch); - - // Slice off inserted values and adjust next insertion index. - leafHashes = leafHashes.slice(subtreeSize); - index += subtreeSize; - this.size = index; - - await this.writeMeta(batch); - await batch.write(); - } - } - - private async updateElementsInternal( - root: Buffer, - hashes: Buffer[], - index: number, - height: number, - subtreeHeight: number, - batch: LevelUpChain, - ) { - if (height === subtreeHeight) { - const root = hashes.pop()!; - batch.put(root, Buffer.concat(hashes)); - return root; - } - - // Do nothing if updating zero values. - if (hashes[hashes.length - 1].equals(this.zeroHashes[height - 1])) { - return root; - } - - const data = await this.dbGet(root); - const isRight = (index >> (height - 1)) & 0x1; +export interface TreeInfo { + treeId: MerkleTreeId; + root: Buffer; + size: bigint; +} - if (data && data.length > 64) { - if (!root.equals(hashes[hashes.length - 1])) { - throw new Error('Attempting to update pre-existing subtree.'); - } - return root; - } +export interface BatchUpdate { + treeId: MerkleTreeId; + elements: Buffer[]; +} - let left = data ? data.slice(0, 32) : this.zeroHashes[height - 1]; - let right = data ? data.slice(32, 64) : this.zeroHashes[height - 1]; - const subtreeRoot = isRight ? right : left; - const newSubtreeRoot = await this.updateElementsInternal( - subtreeRoot, - hashes, - keepNLsb(index, height - 1), - height - 1, - subtreeHeight, - batch, - ); +export interface SiblingPathSource { + getSiblingPath(index: bigint): Promise; +} - if (isRight) { - right = newSubtreeRoot; - } else { - left = newSubtreeRoot; - } - const newRoot = this.hasher.compress(left, right); - batch.put(newRoot, Buffer.concat([left, right])); - if (!root.equals(newRoot)) { - batch.del(root); - } - return newRoot; - } +export interface MerkleTree extends SiblingPathSource { + getRoot(): Buffer; + getNumLeaves(): bigint; + appendLeaves(leaves: Buffer[]): Promise; + commit(): Promise; + rollback(): Promise; +} - private async dbGet(key: Buffer): Promise { - return await this.db.get(key).catch(() => {}); - } +export interface MerkleTreeDb { + getTreeInfo(treeId: MerkleTreeId): Promise; + appendLeaves(treeId: MerkleTreeId, leaves: Buffer[]): Promise; + getSiblingPath(treeId: MerkleTreeId, index: bigint): Promise; + commit(): Promise; + rollback(): Promise; } diff --git a/yarn-project/merkle-tree/src/hash_path.ts b/yarn-project/merkle-tree/src/sibling_path.ts similarity index 59% rename from yarn-project/merkle-tree/src/hash_path.ts rename to yarn-project/merkle-tree/src/sibling_path.ts index 2da32f5c43b..f751b3c1a1c 100644 --- a/yarn-project/merkle-tree/src/hash_path.ts +++ b/yarn-project/merkle-tree/src/sibling_path.ts @@ -1,36 +1,35 @@ import { Pedersen } from './pedersen.js'; import { deserializeArrayFromVector, serializeBufferArrayToVector } from './serialise.js'; -export class HashPath { +export class SiblingPath { public static ZERO(size: number, zeroElement: Buffer, pedersen: Pedersen) { - const bufs: Buffer[][] = []; + const bufs: Buffer[] = []; let current = zeroElement; for (let i = 0; i < size; ++i) { - bufs.push([current, current]); + bufs.push(current); current = pedersen.compress(current, current); } - return new HashPath(bufs); + return new SiblingPath(bufs); } - constructor(public data: Buffer[][] = []) {} + constructor(public data: Buffer[] = []) {} public toBuffer() { - const elements = this.data.map(nodes => Buffer.concat([nodes[0], nodes[1]])); - return serializeBufferArrayToVector(elements); + return serializeBufferArrayToVector(this.data); } static fromBuffer(buf: Buffer, offset = 0) { - const { elem } = HashPath.deserialize(buf, offset); + const { elem } = SiblingPath.deserialize(buf, offset); return elem; } static deserialize(buf: Buffer, offset = 0) { const deserializePath = (buf: Buffer, offset: number) => ({ - elem: [buf.slice(offset, offset + 32), buf.slice(offset + 32, offset + 64)], - adv: 64, + elem: [buf.slice(offset, offset + 32)], + adv: 32, }); const { elem, adv } = deserializeArrayFromVector(deserializePath, buf, offset); - return { elem: new HashPath(elem), adv }; + return { elem: new SiblingPath(elem), adv }; } // For json serialization @@ -40,6 +39,6 @@ export class HashPath { // For json deserialization public static fromString(repr: string) { - return HashPath.fromBuffer(Buffer.from(repr, 'hex')); + return SiblingPath.fromBuffer(Buffer.from(repr, 'hex')); } } diff --git a/yarn-project/merkle-tree/src/standard_tree.test.ts b/yarn-project/merkle-tree/src/standard_tree.test.ts new file mode 100644 index 00000000000..01ecd04c5ff --- /dev/null +++ b/yarn-project/merkle-tree/src/standard_tree.test.ts @@ -0,0 +1,328 @@ +import { default as levelup } from 'levelup'; +import { default as memdown } from 'memdown'; +import { SiblingPath, StandardMerkleTree } from './index.js'; +import { SinglePedersen } from '../crypto/index.js'; +import { BarretenbergWasm } from '../wasm/index.js'; + +// const expectSameTrees = async (tree1: MerkleTree, tree2: MerkleTree) => { +// const size = tree1.getNumLeaves(); +// expect(size).toBe(tree2.getNumLeaves()); +// expect(tree1.getRoot().toString('hex')).toBe(tree2.getRoot().toString('hex')); + +// for (let i = 0; i < size; ++i) { +// const siblingPath1 = await tree1.getSiblingPath(BigInt(i)); +// const siblingPath2 = await tree2.getSiblingPath(BigInt(i)); +// expect(siblingPath2).toStrictEqual(siblingPath1); +// } +// }; + +describe('merkle_tree', () => { + let barretenberg!: BarretenbergWasm; + let pedersen!: SinglePedersen; + const values: Buffer[] = []; + + beforeAll(async () => { + barretenberg = new BarretenbergWasm(); + await barretenberg.init(); + pedersen = new SinglePedersen(barretenberg); + + for (let i = 0; i < 32; ++i) { + const v = Buffer.alloc(32, 0); + v.writeUInt32BE(i, 28); + values[i] = v; + } + }); + + it('should have correct root', async () => { + const db = levelup(memdown()); + + const e00 = StandardMerkleTree.ZERO_ELEMENT; + const e01 = values[1]; + const e02 = values[2]; + const e03 = values[3]; + const e10 = pedersen.compress(e00, e01); + const e11 = pedersen.compress(e02, e03); + const root = pedersen.compress(e10, e11); + + const tree = await StandardMerkleTree.new(db, pedersen, 'test', 2); + + await tree.appendLeaves(values.slice(0, 4)); + + expect(await tree.getSiblingPath(0n)).toEqual(new SiblingPath([e01, e11])); + expect(await tree.getSiblingPath(1n)).toEqual(new SiblingPath([e00, e11])); + + expect(await tree.getSiblingPath(0n)).toEqual(new SiblingPath([e02, e10])); + expect(await tree.getSiblingPath(1n)).toEqual(new SiblingPath([e03, e10])); + expect(tree.getRoot()).toEqual(root); + expect(tree.getNumLeaves()).toBe(4); + + // Lifted from memory_tree.test.cpp to ensure consistency. + expect(root.toString('hex')).toEqual('0bf2e78afd70f72b0e6eafb03c41faef167a82441b05e517cdf35d813302061f'); + }); + + // it('should have correct empty tree root for depth 32', async () => { + // const db = levelup(memdown()); + // const tree = await MerkleTree.new(db, pedersen, 'test', 32); + // const root = tree.getRoot(); + // expect(root.toString('hex')).toEqual('18ceb5cd201e1cee669a5c3ad96d3c4e933a365b37046fc3178264bede32c68d'); + // }); + + // it('should have same result when setting same values', async () => { + // const db = levelup(memdown()); + // const tree = await MerkleTree.new(db, pedersen, 'test', 10); + + // for (let i = 0; i < values.length; ++i) { + // await tree.updateElement(i, values[i]); + // } + // const root1 = tree.getRoot(); + + // for (let i = 0; i < values.length; ++i) { + // await tree.updateElement(i, values[i]); + // } + // const root2 = tree.getRoot(); + + // expect(root1).toEqual(root2); + // }); + + // it('should get same result when using subtree insertion', async () => { + // const values: Buffer[] = []; + // for (let i = 0; i < 32 * 8; ++i) { + // const v = Buffer.alloc(32, 0); + // v.writeUInt32BE(i, 28); + // values[i] = v; + // } + + // // Create reference tree. + // const db1 = levelup(memdown()); + // const tree1 = await MerkleTree.new(db1, pedersen, 'test', 10); + + // for (let i = 0; i < values.length; ++i) { + // await tree1.updateElement(i, values[i]); + // } + + // // Create tree from subtrees. + // const db2 = levelup(memdown()); + // const tree2 = await MerkleTree.new(db2, pedersen, 'test', 10); + + // for (let i = 0; i < values.length; i += 32) { + // await tree2.updateElements(i, values.slice(i, i + 32)); + // } + + // await expectSameTrees(tree1, tree2); + // }); + // it('should support batch insertion of a single element', async () => { + // const values: Buffer[] = []; + // for (let i = 0; i < 32 * 2; ++i) { + // const v = Buffer.alloc(32, 0); + // v.writeUInt32BE(i, 28); + // values[i] = v; + // } + + // // Create reference tree. + // const db1 = levelup(memdown()); + // const tree1 = await MerkleTree.new(db1, pedersen, 'test', 10); + + // for (let i = 0; i < values.length; ++i) { + // await tree1.updateElement(i, values[i]); + // } + + // // Create tree from subtrees. + // const db2 = levelup(memdown()); + // const tree2 = await MerkleTree.new(db2, pedersen, 'test', 10); + + // for (let i = 0; i < values.length; i++) { + // await tree2.updateElements(i, values.slice(i, i + 1)); + // } + + // await expectSameTrees(tree1, tree2); + // }); + + // it('should update elements without over extending tree size', async () => { + // // Create reference tree from 12 values. + // const db1 = levelup(memdown()); + // const tree1 = await MerkleTree.new(db1, pedersen, 'test', 10); + + // for (let i = 0; i < 29; ++i) { + // await tree1.updateElement(i, values[i]); + // } + + // const db2 = levelup(memdown()); + // const tree2 = await MerkleTree.new(db2, pedersen, 'test', 10); + + // // Results in subtree insertion of 4, 2 and 1. + // await tree2.updateElements(0, values.slice(0, 7)); + // // Results in subtree insertion of 16, 4 and 2. + // await tree2.updateElements(7, values.slice(7, 29)); + + // await expectSameTrees(tree1, tree2); + // }); + + // it('should update elements, simulating escape hatch behaviour', async () => { + // // Create reference tree. + // const db1 = levelup(memdown()); + // const tree1 = await MerkleTree.new(db1, pedersen, 'test', 10); + + // for (let i = 0; i < 10; ++i) { + // await tree1.updateElement(i, values[i]); + // } + // for (let i = 16; i < 24; ++i) { + // await tree1.updateElement(i, values[i]); + // } + + // // Create tree from 4 rollup, 1 escape, 4 rollup. + // const db2 = levelup(memdown()); + // const tree2 = await MerkleTree.new(db2, pedersen, 'test', 10); + + // await tree2.updateElements(0, values.slice(0, 8)); + // await tree2.updateElements(8, values.slice(8, 10)); + // await tree2.updateElements(16, values.slice(16, 24)); + + // await expectSameTrees(tree1, tree2); + // }); + + // it('should update 0 values elements', async () => { + // const values: Buffer[] = Array(6).fill(Buffer.alloc(32, 0)); + + // // Create reference tree. + // const db1 = levelup(memdown()); + // const tree1 = await MerkleTree.new(db1, pedersen, 'test', 10); + + // for (let i = 0; i < 6; ++i) { + // await tree1.updateElement(i, values[i]); + // } + + // // Create tree from 8 rollup, 1 escape, 8 rollup. + // const db2 = levelup(memdown()); + // const tree2 = await MerkleTree.new(db2, pedersen, 'test', 10); + + // await tree2.updateElements(0, values.slice(0, 6)); + // expect(tree2.getSize()).toEqual(6); + + // await expectSameTrees(tree1, tree2); + // }); + + // it('should allow inserting same subtree twice', async () => { + // const values: Buffer[] = []; + // for (let i = 0; i < 64; ++i) { + // const v = Buffer.alloc(64, 0); + // v.writeUInt32LE(i, 0); + // values[i] = v; + // } + + // // Create reference tree. + // const db1 = levelup(memdown()); + // const tree1 = await MerkleTree.new(db1, pedersen, 'test', 10); + // await tree1.updateElements(0, values); + + // // Create another tree + // const db2 = levelup(memdown()); + // const tree2 = await MerkleTree.new(db2, pedersen, 'test', 10); + // await tree2.updateElements(0, values); + // await tree2.updateElements(0, values); + + // await expectSameTrees(tree1, tree2); + // }); + + // it('should allow inserting of larger subtree over smaller subtree', async () => { + // const treeSize = 65; + // const values: Buffer[] = []; + // for (let i = 0; i < treeSize; ++i) { + // const v = Buffer.alloc(64, 0); + // v.writeUInt32LE(i, 0); + // values[i] = v; + // } + + // // Create reference tree. + // const db1 = levelup(memdown()); + // const tree1 = await MerkleTree.new(db1, pedersen, 'test', 10); + // await tree1.updateElements(0, values); + + // // Create another tree + // const db2 = levelup(memdown()); + // const tree2 = await MerkleTree.new(db2, pedersen, 'test', 10); + + // // insert partial values to another tree + // await tree2.updateElements(0, values.slice(0, treeSize - 7)); + + // // insert exsiting values plus new values to another tree + // await tree2.updateElements(0, values); + + // await expectSameTrees(tree1, tree2); + // }); + + // it('should be able to restore from previous data', async () => { + // const levelDown = memdown(); + // const db = levelup(levelDown); + // const tree = await MerkleTree.new(db, pedersen, 'test', 10); + // for (let i = 0; i < 4; ++i) { + // await tree.updateElement(i, values[i]); + // } + + // const db2 = levelup(levelDown); + // const tree2 = await MerkleTree.fromName(db2, pedersen, 'test'); + + // expect(tree.getRoot()).toEqual(tree2.getRoot()); + // for (let i = 0; i < 4; ++i) { + // expect(await tree.getHashPath(i)).toEqual(await tree2.getHashPath(i)); + // } + // }); + + // it('should throw an error if previous data does not exist for the given name', async () => { + // const db = levelup(memdown()); + // await expect( + // (async () => { + // await MerkleTree.fromName(db, pedersen, 'a_whole_new_tree'); + // })(), + // ).rejects.toThrow(); + // }); + + // it('should be able to sync the latest status from db', async () => { + // const levelDown = memdown(); + + // const db1 = levelup(levelDown); + // const tree1 = await MerkleTree.new(db1, pedersen, 'test', 10); + + // const db2 = levelup(levelDown); + // const tree2 = await MerkleTree.new(db2, pedersen, 'test', 10); + + // expect(tree1.getRoot()).toEqual(tree2.getRoot()); + // expect(tree1.getSize()).toBe(0); + // expect(tree2.getSize()).toBe(0); + + // for (let i = 0; i < 4; ++i) { + // await tree1.updateElement(i, values[i]); + // } + + // const newRoot = tree1.getRoot(); + // expect(tree1.getSize()).toBe(4); + // expect(tree2.getRoot()).not.toEqual(newRoot); + // expect(tree2.getSize()).toBe(0); + + // await tree2.syncFromDb(); + + // expect(tree2.getRoot()).toEqual(newRoot); + // expect(tree2.getSize()).toBe(4); + // }); + + // it('should serialize hash path data to a buffer and be able to deserialize it back', async () => { + // const db = levelup(memdown()); + // const tree = await MerkleTree.new(db, pedersen, 'test', 10); + // await tree.updateElement(0, values[0]); + + // const hashPath = await tree.getHashPath(0); + // const buf = hashPath.toBuffer(); + // const recovered = HashPath.fromBuffer(buf); + // expect(recovered).toEqual(hashPath); + // const deserialized = HashPath.deserialize(buf); + // expect(deserialized.elem).toEqual(hashPath); + // expect(deserialized.adv).toBe(4 + 10 * 64); + + // const dummyData = Buffer.alloc(23, 1); + // const paddedBuf = Buffer.concat([dummyData, buf]); + // const recovered2 = HashPath.fromBuffer(paddedBuf, 23); + // expect(recovered2).toEqual(hashPath); + // const deserialized2 = HashPath.deserialize(buf); + // expect(deserialized2.elem).toEqual(hashPath); + // expect(deserialized2.adv).toBe(4 + 10 * 64); + // }); +}); diff --git a/yarn-project/merkle-tree/src/standard_tree.ts b/yarn-project/merkle-tree/src/standard_tree.ts new file mode 100644 index 00000000000..55a31d7c7d6 --- /dev/null +++ b/yarn-project/merkle-tree/src/standard_tree.ts @@ -0,0 +1,189 @@ +import { LevelUp, LevelUpChain } from 'levelup'; +import { SiblingPath } from './sibling_path.js'; +import { Hasher } from './hasher.js'; +import { MerkleTree } from './merkle_tree.js'; +import { toBufferLE, toBigIntLE } from './bigint_buffer.js'; + +const MAX_DEPTH = 32; + +const indexToKeyHash = (name: string, level: number, index: bigint) => Buffer.from(`${name}-${level}-${index}`); +const encodeMeta = (root: Buffer, depth: number, size: bigint) => { + const data = Buffer.alloc(36); + root.copy(data); + data.writeUInt32LE(depth, 32); + return Buffer.concat(data, toBufferLE(size, 32)); +}; +const decodeMeta = (meta: Buffer) => { + const root = meta.slice(0, 32); + const depth = meta.readUInt32LE(32); + const size = toBigIntLE(data.slice(36)); + return { + root, + depth, + size, + }; +}; + +export class StandardMerkleTree implements MerkleTree { + public static ZERO_ELEMENT = Buffer.from('0000000000000000000000000000000000000000000000000000000000000000', 'hex'); + private root!: Buffer; + private zeroHashes: Buffer[] = []; + private cache: { [key: string]: Buffer } = {}; + private cachedSize?: bigint; + + constructor( + private db: LevelUp, + private hasher: Hasher, + private name: string, + private depth: number, + private size: bigint = 0n, + root?: Buffer, + initialLeafValue = StandardMerkleTree.ZERO_ELEMENT, + ) { + if (!(depth >= 1 && depth <= MAX_DEPTH)) { + throw Error('Bad depth'); + } + + // Compute the zero values at each layer. + let current = initialLeafValue; + for (let i = 0; i < depth; ++i) { + this.zeroHashes[i] = current; + current = hasher.compress(current, current); + } + + this.root = root ? root : current; + } + + static async new( + db: LevelUp, + hasher: Hasher, + name: string, + depth: number, + initialLeafValue = StandardMerkleTree.ZERO_ELEMENT, + ) { + const tree = new StandardMerkleTree(db, hasher, name, depth, 0n, undefined, initialLeafValue); + await tree.writeMeta(); + return tree; + } + + static async fromName(db: LevelUp, hasher: Hasher, name: string, initialLeafValue = StandardMerkleTree.ZERO_ELEMENT) { + const meta: Buffer = await db.get(Buffer.from(name)); + const { root, depth, size } = decodeMeta(meta); + return new StandardMerkleTree(db, hasher, name, depth, size, root, initialLeafValue); + } + + public async syncFromDb() { + const meta: Buffer = await this.db.get(Buffer.from(this.name)); + const { root, depth, size } = decodeMeta(meta); + this.root = root; + this.depth = depth; + this.size = size; + this.clearCache(); + } + + public getRoot() { + return this.cache[indexToKeyHash(this.name, 0, 0n)] ?? this.root; + } + + public getNumLeaves() { + return this.cachedSize ?? this.size; + } + + /** + * Returns a sibling path for the element at the given index. + * The sibling path is an array of sibling hashes, with the lowest hash (leaf hash) first, and the highest hash last. + */ + public async getSiblingPath(index: bigint) { + const path = new SiblingPath(); + let level = this.depth; + while (level >= 0) { + const isRight = (index >> BigInt(level)) & 0x01n; + const sibling = await this.getLatestValueAtIndex(level, isRight ? index - 1n : index + 1n); + path.data.push(sibling); + level -= 1; + } + return path; + } + + public async appendLeaves(leaves: Buffer[]): Promise { + const numLeaves = this.getNumLeaves(); + for (let i = 0; i < leaves.length; i++) { + const index = numLeaves + BigInt(i); + await this.addLeafToCacheAndHashToRoot(leaves[i], index); + } + this.cachedSize = numLeaves + BigInt(leaves.length); + } + + public async updateLeaf(leaf: Buffer, index: bigint) { + await this.addLeafToCacheAndHashToRoot(leaf, index); + const numLeaves = this.getNumLeaves(); + if (index >= numLeaves) { + this.cachedSize = index + 1n; + } + } + + public async commit(): Promise { + const batch = this.db.batch(); + const keys = Object.getOwnPropertyNames(this.cache); + for (const key of keys) { + batch.put(key, this.cache[key]); + } + await this.writeMeta(batch); + await batch.write(); + this.size = this.cachedSize ?? this.size; + this.clearCache(); + } + + public rollback(): Promise { + this.clearCache(); + return Promise.resolve(); + } + + private clearCache() { + this.cache = {}; + this.cachedSize = undefined; + } + + private async addLeafToCacheAndHashToRoot(leaf: Buffer, index: bigint) { + const key = indexToKeyHash(this.name, this.depth, index); + let current = leaf; + this.cache[key] = current; + let level = this.depth; + while (level >= 0) { + const isRight = index & 0x01n; + const sibling = await this.getLatestValueAtIndex(level, isRight ? index - 1n : index + 1n); + const lhs = isRight ? sibling : current; + const rhs = isRight ? current : sibling; + current = this.hasher.compress(lhs, rhs); + level -= 1; + index >>= 1n; + this.cache[indexToKeyHash(this.name, level, index)] = current; + } + this.root = this.cache[indexToKeyHash(this.name, 0, 0n)]; + } + + private async getLatestValueAtIndex(level: number, index: bigint): Promise { + const key = indexToKeyHash(this.name, level, index); + if (this.cache[key] !== undefined) { + return this.cache[key]; + } + const comitted = await this.dbGet(key); + if (comitted !== undefined) { + return comitted; + } + return this.zeroHashes[level]; + } + + private async dbGet(key: Buffer): Promise { + return await this.db.get(key).catch(() => {}); + } + + private async writeMeta(batch?: LevelUpChain) { + const data = encodeMeta(this.getRoot(), this.depth, this.getNumLeaves()); + if (batch) { + batch.put(this.name, data); + } else { + await this.db.put(this.name, data); + } + } +} diff --git a/yarn-project/world-state/src/rollup_block_downloader.ts b/yarn-project/world-state/src/rollup_block_downloader.ts new file mode 100644 index 00000000000..d97b3f6d6ed --- /dev/null +++ b/yarn-project/world-state/src/rollup_block_downloader.ts @@ -0,0 +1,68 @@ +import { RollupSource, Rollup } from '@aztec/data-archiver'; +import { MemoryFifo } from './memory_fifo.js'; +import { Semaphore } from './semaphore.js'; +import { InterruptableSleep } from './sleep.js'; + +export class RollupBlockDownloader { + private runningPromise?: Promise; + private running = false; + private from = 0; + private interruptableSleep = new InterruptableSleep(); + private semaphore: Semaphore; + private queue = new MemoryFifo(); + + constructor(private rollupProvider: RollupSource, maxQueueSize: number) { + this.semaphore = new Semaphore(maxQueueSize); + } + + public start(from = 0) { + this.from = from; + + if (this.running) { + this.interruptableSleep.interrupt(); + return; + } + + this.running = true; + + const fn = async () => { + while (this.running) { + try { + const blocks = await this.rollupProvider.getBlocks(this.from, 10); + + if (!blocks.length) { + await this.interruptableSleep.sleep(10000); + continue; + } + + // Blocks if there are maxQueueSize results in the queue, until released after the callback. + await this.semaphore.acquire(); + + this.queue.put(blocks); + this.from += blocks.length; + } catch (err) { + console.log(err); + await this.interruptableSleep.sleep(10000); + } + } + }; + + this.runningPromise = fn(); + } + + public async stop() { + this.running = false; + this.interruptableSleep.interrupt(); + this.queue.cancel(); + await this.runningPromise; + } + + public async getBlocks() { + const blocks = await this.queue.get(); + if (!blocks) { + return []; + } + this.semaphore.release(); + return blocks; + } +} diff --git a/yarn-project/world-state/src/semaphore.ts b/yarn-project/world-state/src/semaphore.ts new file mode 100644 index 00000000000..2db1a851d47 --- /dev/null +++ b/yarn-project/world-state/src/semaphore.ts @@ -0,0 +1,20 @@ +import { MemoryFifo } from './memory_fifo.js'; + +/** + * Allows the acquiring of up to `size` tokens before calls to acquire block, waiting for a call to release(). + */ +export class Semaphore { + private readonly queue = new MemoryFifo(); + + constructor(size: number) { + new Array(size).fill(true).map(() => this.queue.put(true)); + } + + public async acquire() { + await this.queue.get(); + } + + public release() { + this.queue.put(true); + } +} diff --git a/yarn-project/world-state/src/serial_queue.ts b/yarn-project/world-state/src/serial_queue.ts new file mode 100644 index 00000000000..01a6886cd8e --- /dev/null +++ b/yarn-project/world-state/src/serial_queue.ts @@ -0,0 +1,49 @@ +import { MemoryFifo } from '@aztec/barretenberg/fifo'; + +/** + * A more specialised fifo queue that enqueues functions to execute. Enqueued functions are executed in serial. + */ +export class SerialQueue { + private readonly queue = new MemoryFifo<() => Promise>(); + private runningPromise!: Promise; + + public start() { + this.runningPromise = this.queue.process(fn => fn()); + } + + public length() { + return this.queue.length(); + } + + public cancel() { + this.queue.cancel(); + return this.runningPromise; + } + + public end() { + this.queue.end(); + return this.runningPromise; + } + + /** + * Enqueues fn for execution on the serial queue. + * Returns the result of the function after execution. + */ + public put(fn: () => Promise): Promise { + return new Promise((resolve, reject) => { + this.queue.put(async () => { + try { + const res = await fn(); + resolve(res); + } catch (e) { + reject(e); + } + }); + }); + } + + // Awaiting this ensures the queue is empty before resuming. + public async syncPoint() { + await this.put(async () => {}); + } +} diff --git a/yarn-project/world-state/src/sleep.ts b/yarn-project/world-state/src/sleep.ts new file mode 100644 index 00000000000..229e103a2d7 --- /dev/null +++ b/yarn-project/world-state/src/sleep.ts @@ -0,0 +1,26 @@ +export class InterruptableSleep { + private interruptResolve: (shouldThrow: boolean) => void = () => {}; + private interruptPromise = new Promise(resolve => (this.interruptResolve = resolve)); + private timeouts: NodeJS.Timeout[] = []; + + public async sleep(ms: number) { + let timeout!: NodeJS.Timeout; + const promise = new Promise(resolve => (timeout = setTimeout(() => resolve(false), ms))); + this.timeouts.push(timeout); + const shouldThrow = await Promise.race([promise, this.interruptPromise]); + clearTimeout(timeout); + this.timeouts.splice(this.timeouts.indexOf(timeout), 1); + if (shouldThrow) { + throw new Error('Interrupted.'); + } + } + + public interrupt(sleepShouldThrow = false) { + this.interruptResolve(sleepShouldThrow); + this.interruptPromise = new Promise(resolve => (this.interruptResolve = resolve)); + } +} + +export function sleep(ms: number) { + return new Promise(resolve => setTimeout(resolve, ms)); +} diff --git a/yarn-project/world-state/src/synchroniser/server_world_state_synchroniser.ts b/yarn-project/world-state/src/synchroniser/server_world_state_synchroniser.ts index 58a5510b44a..8c56f648ce2 100644 --- a/yarn-project/world-state/src/synchroniser/server_world_state_synchroniser.ts +++ b/yarn-project/world-state/src/synchroniser/server_world_state_synchroniser.ts @@ -1,29 +1,36 @@ import { WorldStateRunningState, WorldStateStatus, WorldStateSynchroniser } from './world_state_synchroniser.js'; -import { RollupEmitter, Rollup } from '@aztec/data-archiver'; -import { BatchUpdate, TreeInfo, WorldStateDB, WorldStateTreeId } from '../world-state-db/index.js'; -import { MemoryFifo } from '../memory_fifo.js'; +import { RollupSource, Rollup } from '@aztec/data-archiver'; +import { BatchUpdate, WorldStateTreeId } from '../world-state-db/index.js'; +import { MerkleTreeDb } from '@aztec/merkle-tree'; +import { RollupBlockDownloader } from '../rollup_block_downloader.js'; export class ServerWorldStateSynchroniser implements WorldStateSynchroniser { - private queue: MemoryFifo<() => Promise> = new MemoryFifo<() => Promise>(); - private queuePromise?: Promise; private currentRollupId = 0; + private rollupDownloader: RollupBlockDownloader; + private runningPromise: Promise = Promise.resolve(); + private running = false; - constructor(private worldStateDb: WorldStateDB, private rollupEmitter: RollupEmitter) {} + constructor(private merkleTreeDb: MerkleTreeDb, rollupSource: RollupSource, maxQueueSize = 1000) { + this.rollupDownloader = new RollupBlockDownloader(rollupSource, maxQueueSize); + } - public start() { - this.queuePromise = this.queue.process(fn => { - return fn(); - }); - this.rollupEmitter.on('rollup', (rollup: Rollup) => this.synchronise(() => this.handleRollup(rollup))); - this.rollupEmitter.start(this.currentRollupId, true); + public start(from = 0) { + this.running = true; + const blockProcess = async () => { + while (this.running) { + const blocks = await this.rollupDownloader.getBlocks(); + await this.handleRollups(blocks); + } + }; + this.runningPromise = blockProcess(); + + this.rollupDownloader.start(from); } public async stop() { - // first stop the emitter - await this.rollupEmitter.stop(); - // now wait for the rollup queue to complete - this.queue.end(); - await this.queuePromise; + await this.rollupDownloader.stop(); + this.running = false; + await this.runningPromise; } public status(): Promise { @@ -34,19 +41,10 @@ export class ServerWorldStateSynchroniser implements WorldStateSynchroniser { return Promise.resolve(status); } - public async getTreeInfo(): Promise { - return await this.synchronise(async () => { - return await this.worldStateDb.getTreeInfo(); - }); - } - - private async synchronise(fn: () => Promise): Promise { - return await new Promise(resolve => { - this.queue.put(async () => { - const result = await fn(); - resolve(result); - }); - }); + private async handleRollups(rollups: Rollup[]) { + for (const rollup of rollups) { + await this.handleRollup(rollup); + } } private async handleRollup(rollup: Rollup) { @@ -54,6 +52,7 @@ export class ServerWorldStateSynchroniser implements WorldStateSynchroniser { treeId: WorldStateTreeId.CONTRACT_TREE, elements: rollup.commitments, } as BatchUpdate; - await this.worldStateDb.insertElements([update]); + await this.merkleTreeDb.insertElements([update]); + this.currentRollupId = rollup.rollupId; } } diff --git a/yarn-project/world-state/src/synchroniser/world_state_synchroniser.ts b/yarn-project/world-state/src/synchroniser/world_state_synchroniser.ts index 97d2eb03432..eef86c66410 100644 --- a/yarn-project/world-state/src/synchroniser/world_state_synchroniser.ts +++ b/yarn-project/world-state/src/synchroniser/world_state_synchroniser.ts @@ -1,5 +1,3 @@ -import { TreeInfo } from '../world-state-db/index.js'; - export enum WorldStateRunningState { IDLE, SYNCHING, @@ -16,5 +14,4 @@ export interface WorldStateSynchroniser { start(): void; status(): Promise; stop(): Promise; - getTreeInfo(): Promise; } diff --git a/yarn-project/world-state/src/world-state-db/index.ts b/yarn-project/world-state/src/world-state-db/index.ts index 98826044d53..82f15b99efc 100644 --- a/yarn-project/world-state/src/world-state-db/index.ts +++ b/yarn-project/world-state/src/world-state-db/index.ts @@ -14,9 +14,3 @@ export interface BatchUpdate { treeId: WorldStateTreeId; elements: Buffer[]; } - -export interface WorldStateDB { - getTreeInfo(): Promise; - insertElements(batches: BatchUpdate[]): Promise; - getHashPath(treeId: WorldStateTreeId, index: number): Promise; -} diff --git a/yarn-project/world-state/src/world-state-db/memory_world_state_db.ts b/yarn-project/world-state/src/world-state-db/memory_world_state_db.ts index 5206b0723ed..3a7da3f89f6 100644 --- a/yarn-project/world-state/src/world-state-db/memory_world_state_db.ts +++ b/yarn-project/world-state/src/world-state-db/memory_world_state_db.ts @@ -1,40 +1,90 @@ import { default as LevelUp } from 'levelup'; -import { MemDown } from 'memdown'; -import { BatchUpdate, TreeInfo, WorldStateDB, WorldStateTreeId } from './index.js'; -import { MerkleTree, Pedersen, HashPath } from '@aztec/merkle-tree'; +import { + StandardMerkleTree, + Pedersen, + SiblingPath, + MerkleTreeDb, + MerkleTreeId, + TreeInfo, + IndexedTree, +} from '@aztec/merkle-tree'; +import { SerialQueue } from '../serial_queue.js'; -export class MemoryWorldStateDb implements WorldStateDB { +export class MerkleTrees implements MerkleTreeDb { private trees: MerkleTree[] = []; + private jobQueue = new SerialQueue(); - constructor() { - const db = new LevelUp(MemDown()); + constructor(db: LevelUp) { const hasher = new Pedersen(); - this.trees = [new MerkleTree(db, hasher, `${WorldStateTreeId[WorldStateTreeId.CONTRACT_TREE]}`, 32)]; + const contractTree = StandardMerkleTree.new(db, hasher, `${MerkleTreeId[MerkleTreeId.CONTRACT_TREE]}`, 32); + const contractTreeRootsTree = StandardMerkleTree.new( + db, + hasher, + `${MerkleTreeId[MerkleTreeId.CONTRACT_TREE_ROOTS_TREE]}`, + 7, + ); + const nullifierTree = IndexedTree.new(db, hasher, `${MerkleTreeId[MerkleTreeId.NULLIFIER_TREE]}`, 32); + this.trees = [contractTree, contractTreeRootsTree, nullifierTree]; + this.jobQueue.start(); } - public getTreeInfo() { - const treeInfo = { - treeId: WorldStateTreeId.CONTRACT_TREE, - root: this.trees[WorldStateTreeId.CONTRACT_TREE].getRoot(), - size: this.trees[WorldStateTreeId.CONTRACT_TREE].getSize(), - } as TreeInfo; - return Promise.resolve([treeInfo]); + public async stop() { + await this.jobQueue.end(); } - public getHashPath(treeId: WorldStateTreeId, index: number): Promise { - return this.trees[treeId].getHashPath(index); + public async getTreeInfo() { + return await this.synchronise(() => this._getTreeInfo()); } - public async insertElements(batches: BatchUpdate[]): Promise { - const results: TreeInfo[] = []; - for (const batch of batches) { - await this.trees[batch.treeId].updateElements(this.trees[batch.treeId].getSize(), batch.elements); - results.push({ - treeId: batch.treeId, - size: this.trees[batch.treeId].getSize(), - root: this.trees[batch.treeId].getRoot(), - } as TreeInfo); + public async getSiblingPath(treeId: MerkleTreeId, index: number): Promise { + return await this.synchronise(() => this._getSiblingPath(treeId, index)); + } + + public async appendLeaves(treeId: MerkleTreeId, leaves: Buffer[]): Promise { + return await this.synchronise(() => this._appendLeaves(treeId, leaves)); + } + + public async commit() { + return await this.synchronise(() => this._commit()); + } + + public async rollback() { + return await this.synchronise(() => this._rollback()); + } + + private async synchronise(fn: () => Promise): Promise { + return await this.jobQueue.put(fn); + } + + private _getTreeInfo() { + return Promise.resolve( + this.trees.map((tree, index) => { + return { + treeId: MerkleTreeId[index], + root: tree.getRoot(), + size: tree.getSize(), + } as TreeInfo; + }), + ); + } + + private _getSiblingPath(treeId: MerkleTreeId, index: number): Promise { + return Promise.resolve(this.trees[treeId].getHashPath(index)); + } + + private async _appendLeaves(treeId: MerkleTreeId, leaves: Buffer[]) { + return await this.trees[treeId].appendLeaves(leaves); + } + + private async _commit() { + for (const tree of this.trees) { + await tree.commit(); + } + } + + private async _rollback() { + for (const tree of this.trees) { + await tree.rollback(); } - return results; } } From 0f0d8376371d38bcd5328ad2eff5183dfd7d2413 Mon Sep 17 00:00:00 2001 From: PhilWindle Date: Thu, 16 Mar 2023 11:39:54 +0000 Subject: [PATCH 04/36] WIP --- bootstrap.sh | 2 + yarn-project/.pnp.cjs | 90 ++++- yarn-project/merkle-tree/package.json | 6 +- .../merkle-tree/src/indexed_tree.test.ts | 150 +++++++ yarn-project/merkle-tree/src/indexed_tree.ts | 164 ++++++-- yarn-project/merkle-tree/src/pedersen.ts | 5 +- yarn-project/merkle-tree/src/sibling_path.ts | 2 +- .../merkle-tree/src/standard_tree.test.ts | 377 +++--------------- yarn-project/merkle-tree/src/standard_tree.ts | 47 ++- yarn-project/merkle-tree/src/test_suite.ts | 136 +++++++ yarn-project/yarn.lock | 48 ++- 11 files changed, 654 insertions(+), 373 deletions(-) create mode 100644 yarn-project/merkle-tree/src/indexed_tree.test.ts create mode 100644 yarn-project/merkle-tree/src/test_suite.ts diff --git a/bootstrap.sh b/bootstrap.sh index 025a8e60e08..17c5ff56b62 100755 --- a/bootstrap.sh +++ b/bootstrap.sh @@ -52,11 +52,13 @@ PROJECTS=( # "yarn-project/ethereum.js:yarn build" # "yarn-project/kernel-simulator:yarn build" "yarn-project/key-store:yarn build" + "yarn-project/merkle-tree:yarn build" # "yarn-project/p2p:yarn build" # "yarn-project/prover-client:yarn build" # "yarn-project/public-client:yarn build" # "yarn-project/sequencer-client:yarn build" # "yarn-project/wallet:yarn build" + "yarn-project/world-state:yarn build" ) for E in "${PROJECTS[@]}"; do diff --git a/yarn-project/.pnp.cjs b/yarn-project/.pnp.cjs index 75edee312a2..c0d21cb6e84 100755 --- a/yarn-project/.pnp.cjs +++ b/yarn-project/.pnp.cjs @@ -369,11 +369,15 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ["@rushstack/eslint-patch", "npm:1.2.0"],\ ["@types/jest", "npm:29.4.0"],\ ["@types/levelup", "npm:5.1.2"],\ - ["@types/node", "npm:18.14.6"],\ + ["@types/memdown", "npm:3.0.1"],\ + ["@types/node", "npm:18.15.3"],\ + ["@types/sha256", "npm:0.2.0"],\ ["jest", "virtual:97973ff51783dc29efdf1c1cff3bd542763fb1d8ea565946db4f6425a5a443923944d5f46e5672160073e5b792b61ec2b3a0e9df4f007033f07c728780e0e4e7#npm:28.1.3"],\ ["levelup", "npm:5.1.1"],\ + ["memdown", "npm:6.1.1"],\ + ["sha256", "npm:0.2.0"],\ ["ts-jest", "virtual:97973ff51783dc29efdf1c1cff3bd542763fb1d8ea565946db4f6425a5a443923944d5f46e5672160073e5b792b61ec2b3a0e9df4f007033f07c728780e0e4e7#npm:28.0.8"],\ - ["ts-node", "virtual:38d2d6c68e96d8a78f52418a0df4cb2f70fe1f92cd7d8519601179397097eb20be3b9880bc073e8dc652670ca5674da223648eda37ddba4a8a5847fe6bdae5b5#npm:10.9.1"],\ + ["ts-node", "virtual:143d6f8bd62e4ed920fe63ed2b9dc3bf768b2c61d2ba902bf351487f18e424ff20bee9689f34e49608dd511dd13e5668e7b5bd8206eb5805058ee35f6e5ff80a#npm:10.9.1"],\ ["tslib", "npm:2.5.0"],\ ["typescript", "patch:typescript@npm%3A4.9.5#~builtin::version=4.9.5&hash=23ec76"]\ ],\ @@ -2122,6 +2126,13 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ["@types/node", "npm:18.14.6"]\ ],\ "linkType": "HARD"\ + }],\ + ["npm:18.15.3", {\ + "packageLocation": "./.yarn/cache/@types-node-npm-18.15.3-d092b0c75c-31b1d92475.zip/node_modules/@types/node/",\ + "packageDependencies": [\ + ["@types/node", "npm:18.15.3"]\ + ],\ + "linkType": "HARD"\ }]\ ]],\ ["@types/prettier", [\ @@ -2142,6 +2153,16 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { "linkType": "HARD"\ }]\ ]],\ + ["@types/sha256", [\ + ["npm:0.2.0", {\ + "packageLocation": "./.yarn/cache/@types-sha256-npm-0.2.0-2a77a42bd9-f3c8e0dcaf.zip/node_modules/@types/sha256/",\ + "packageDependencies": [\ + ["@types/sha256", "npm:0.2.0"],\ + ["@types/node", "npm:18.14.2"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ ["@types/stack-utils", [\ ["npm:2.0.1", {\ "packageLocation": "./.yarn/cache/@types-stack-utils-npm-2.0.1-867718ab70-205fdbe332.zip/node_modules/@types/stack-utils/",\ @@ -3053,6 +3074,15 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { "linkType": "HARD"\ }]\ ]],\ + ["convert-hex", [\ + ["npm:0.1.0", {\ + "packageLocation": "./.yarn/cache/convert-hex-npm-0.1.0-7b71cf6bf1-eacb880dbc.zip/node_modules/convert-hex/",\ + "packageDependencies": [\ + ["convert-hex", "npm:0.1.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ ["convert-source-map", [\ ["npm:1.9.0", {\ "packageLocation": "./.yarn/cache/convert-source-map-npm-1.9.0-e294555f4b-dc55a1f28d.zip/node_modules/convert-source-map/",\ @@ -3069,6 +3099,15 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { "linkType": "HARD"\ }]\ ]],\ + ["convert-string", [\ + ["npm:0.1.0", {\ + "packageLocation": "./.yarn/cache/convert-string-npm-0.1.0-07683370fc-a1775cb186.zip/node_modules/convert-string/",\ + "packageDependencies": [\ + ["convert-string", "npm:0.1.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ ["create-require", [\ ["npm:1.1.1", {\ "packageLocation": "./.yarn/cache/create-require-npm-1.1.1-839884ca2e-a9a1503d43.zip/node_modules/create-require/",\ @@ -5974,6 +6013,17 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { "linkType": "HARD"\ }]\ ]],\ + ["sha256", [\ + ["npm:0.2.0", {\ + "packageLocation": "./.yarn/cache/sha256-npm-0.2.0-fddf7c695f-bed2d65072.zip/node_modules/sha256/",\ + "packageDependencies": [\ + ["sha256", "npm:0.2.0"],\ + ["convert-hex", "npm:0.1.0"],\ + ["convert-string", "npm:0.1.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ ["shebang-command", [\ ["npm:2.0.0", {\ "packageLocation": "./.yarn/cache/shebang-command-npm-2.0.0-eb2b01921d-6b52fe8727.zip/node_modules/shebang-command/",\ @@ -6360,6 +6410,42 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ],\ "linkType": "SOFT"\ }],\ + ["virtual:143d6f8bd62e4ed920fe63ed2b9dc3bf768b2c61d2ba902bf351487f18e424ff20bee9689f34e49608dd511dd13e5668e7b5bd8206eb5805058ee35f6e5ff80a#npm:10.9.1", {\ + "packageLocation": "./.yarn/__virtual__/ts-node-virtual-0a544075d6/0/cache/ts-node-npm-10.9.1-6c268be7f4-090adff130.zip/node_modules/ts-node/",\ + "packageDependencies": [\ + ["ts-node", "virtual:143d6f8bd62e4ed920fe63ed2b9dc3bf768b2c61d2ba902bf351487f18e424ff20bee9689f34e49608dd511dd13e5668e7b5bd8206eb5805058ee35f6e5ff80a#npm:10.9.1"],\ + ["@cspotcode/source-map-support", "npm:0.8.1"],\ + ["@swc/core", null],\ + ["@swc/wasm", null],\ + ["@tsconfig/node10", "npm:1.0.9"],\ + ["@tsconfig/node12", "npm:1.0.11"],\ + ["@tsconfig/node14", "npm:1.0.3"],\ + ["@tsconfig/node16", "npm:1.0.3"],\ + ["@types/node", "npm:18.15.3"],\ + ["@types/swc__core", null],\ + ["@types/swc__wasm", null],\ + ["@types/typescript", null],\ + ["acorn", "npm:8.8.2"],\ + ["acorn-walk", "npm:8.2.0"],\ + ["arg", "npm:4.1.3"],\ + ["create-require", "npm:1.1.1"],\ + ["diff", "npm:4.0.2"],\ + ["make-error", "npm:1.3.6"],\ + ["typescript", "patch:typescript@npm%3A4.9.5#~builtin::version=4.9.5&hash=23ec76"],\ + ["v8-compile-cache-lib", "npm:3.0.1"],\ + ["yn", "npm:3.1.1"]\ + ],\ + "packagePeers": [\ + "@swc/core",\ + "@swc/wasm",\ + "@types/node",\ + "@types/swc__core",\ + "@types/swc__wasm",\ + "@types/typescript",\ + "typescript"\ + ],\ + "linkType": "HARD"\ + }],\ ["virtual:38d2d6c68e96d8a78f52418a0df4cb2f70fe1f92cd7d8519601179397097eb20be3b9880bc073e8dc652670ca5674da223648eda37ddba4a8a5847fe6bdae5b5#npm:10.9.1", {\ "packageLocation": "./.yarn/__virtual__/ts-node-virtual-c7e39369c2/0/cache/ts-node-npm-10.9.1-6c268be7f4-090adff130.zip/node_modules/ts-node/",\ "packageDependencies": [\ diff --git a/yarn-project/merkle-tree/package.json b/yarn-project/merkle-tree/package.json index d0b22b9f801..1fec0ddc593 100644 --- a/yarn-project/merkle-tree/package.json +++ b/yarn-project/merkle-tree/package.json @@ -25,6 +25,8 @@ }, "dependencies": { "levelup": "^5.1.1", + "memdown": "^6.1.1", + "sha256": "^0.2.0", "tslib": "^2.4.0" }, "devDependencies": { @@ -33,7 +35,9 @@ "@rushstack/eslint-patch": "^1.1.4", "@types/jest": "^29.4.0", "@types/levelup": "^5.1.2", - "@types/node": "^18.14.6", + "@types/memdown": "^3.0.1", + "@types/node": "^18.15.3", + "@types/sha256": "^0.2.0", "jest": "^28.1.3", "ts-jest": "^28.0.7", "ts-node": "^10.9.1", diff --git a/yarn-project/merkle-tree/src/indexed_tree.test.ts b/yarn-project/merkle-tree/src/indexed_tree.test.ts new file mode 100644 index 00000000000..dd041d7e41b --- /dev/null +++ b/yarn-project/merkle-tree/src/indexed_tree.test.ts @@ -0,0 +1,150 @@ +import { default as levelup } from 'levelup'; +import { default as memdown } from 'memdown'; +import { toBufferBE } from './bigint_buffer.js'; +import { Hasher, Pedersen, SiblingPath } from './index.js'; +import { IndexedTree } from './indexed_tree.js'; +import { merkleTreeTestSuite } from './test_suite.js'; + +const createDb = async (levelUp: levelup.LevelUp, hasher: Hasher, name: string, depth: number) => { + return await IndexedTree.new(levelUp, hasher, name, depth); +}; + +const createFromName = async (levelUp: levelup.LevelUp, hasher: Hasher, name: string) => { + return await IndexedTree.fromName(levelUp, hasher, name); +}; + +const createIndexedTreeLeaf = (value: number, nextIndex: number, nextValue: number) => { + return Buffer.concat([ + toBufferBE(BigInt(value), 32), + toBufferBE(BigInt(nextIndex), 32), + toBufferBE(BigInt(nextValue), 32), + ]); +}; + +merkleTreeTestSuite('IndexedMerkleTree', createDb, createFromName); + +describe('IndexedMerkleTreeSpecific', () => { + const pedersen = new Pedersen(); + + it('produces the correct roots and sibling paths', async () => { + // Create a depth-3 indexed merkle tree + const db = levelup(memdown()); + const tree = await createDb(db, pedersen, 'test', 3); + + /** + * Intial state: + * + * index 0 1 2 3 4 5 6 7 + * --------------------------------------------------------------------- + * val 0 0 0 0 0 0 0 0 + * nextIdx 0 0 0 0 0 0 0 0 + * nextVal 0 0 0 0 0 0 0 0 + */ + + const zeroTreeLeafHash = pedersen.hashToField(createIndexedTreeLeaf(0, 0, 0)); + const level1ZeroHash = pedersen.compress(zeroTreeLeafHash, zeroTreeLeafHash); + const level2ZeroHash = pedersen.compress(level1ZeroHash, level1ZeroHash); + let root = pedersen.compress(level2ZeroHash, level2ZeroHash); + + expect(tree.getRoot()).toEqual(root); + expect(tree.getNumLeaves()).toEqual(1n); + expect(await tree.getSiblingPath(0n)).toEqual(new SiblingPath([zeroTreeLeafHash, level1ZeroHash, level2ZeroHash])); + + /** + * Add new value 30: + * + * index 0 1 2 3 4 5 6 7 + * --------------------------------------------------------------------- + * val 0 30 0 0 0 0 0 0 + * nextIdx 1 0 0 0 0 0 0 0 + * nextVal 30 0 0 0 0 0 0 0 + */ + let index0Hash = pedersen.hashToField(createIndexedTreeLeaf(0, 1, 30)); + let index1Hash = pedersen.hashToField(createIndexedTreeLeaf(30, 0, 0)); + let e10 = pedersen.compress(index0Hash, index1Hash); + let e20 = pedersen.compress(e10, level1ZeroHash); + root = pedersen.compress(e20, level2ZeroHash); + + await tree.appendLeaves([toBufferBE(30n, 32)]); + + expect(tree.getRoot()).toEqual(root); + expect(tree.getNumLeaves()).toEqual(2n); + expect(await tree.getSiblingPath(1n)).toEqual(new SiblingPath([index0Hash, level1ZeroHash, level2ZeroHash])); + + /** + * Add new value 10: + * + * index 0 1 2 3 4 5 6 7 + * --------------------------------------------------------------------- + * val 0 30 10 0 0 0 0 0 + * nextIdx 2 0 1 0 0 0 0 0 + * nextVal 10 0 30 0 0 0 0 0 + */ + index0Hash = pedersen.hashToField(createIndexedTreeLeaf(0, 2, 10)); + let index2Hash = pedersen.hashToField(createIndexedTreeLeaf(10, 1, 30)); + e10 = pedersen.compress(index0Hash, index1Hash); + let e11 = pedersen.compress(index2Hash, zeroTreeLeafHash); + e20 = pedersen.compress(e10, e11); + root = pedersen.compress(e20, level2ZeroHash); + + await tree.appendLeaves([toBufferBE(10n, 32)]); + + expect(tree.getRoot()).toEqual(root); + expect(tree.getNumLeaves()).toEqual(3n); + expect(await tree.getSiblingPath(2n)).toEqual(new SiblingPath([zeroTreeLeafHash, e10, level2ZeroHash])); + + /** + * Add new value 20: + * + * index 0 1 2 3 4 5 6 7 + * --------------------------------------------------------------------- + * val 0 30 10 20 0 0 0 0 + * nextIdx 2 0 3 1 0 0 0 0 + * nextVal 10 0 20 30 0 0 0 0 + */ + e10 = pedersen.compress(index0Hash, index1Hash); + index2Hash = pedersen.hashToField(createIndexedTreeLeaf(10, 3, 20)); + const index3Hash = pedersen.hashToField(createIndexedTreeLeaf(20, 1, 30)); + e11 = pedersen.compress(index2Hash, index3Hash); + e20 = pedersen.compress(e10, e11); + root = pedersen.compress(e20, level2ZeroHash); + + await tree.appendLeaves([toBufferBE(20n, 32)]); + + expect(tree.getRoot()).toEqual(root); + expect(tree.getNumLeaves()).toEqual(4n); + expect(await tree.getSiblingPath(3n)).toEqual(new SiblingPath([index2Hash, e10, level2ZeroHash])); + + /** + * Add new value 50: + * + * index 0 1 2 3 4 5 6 7 + * --------------------------------------------------------------------- + * val 0 30 10 20 50 0 0 0 + * nextIdx 2 4 3 1 0 0 0 0 + * nextVal 10 50 20 30 0 0 0 0 + */ + index1Hash = pedersen.hashToField(createIndexedTreeLeaf(30, 4, 50)); + const index4Hash = pedersen.hashToField(createIndexedTreeLeaf(50, 0, 0)); + e10 = pedersen.compress(index0Hash, index1Hash); + e20 = pedersen.compress(e10, e11); + const e12 = pedersen.compress(index4Hash, zeroTreeLeafHash); + const e21 = pedersen.compress(e12, level1ZeroHash); + root = pedersen.compress(e20, e21); + + await tree.appendLeaves([toBufferBE(50n, 32)]); + + expect(tree.getRoot()).toEqual(root); + expect(tree.getNumLeaves()).toEqual(5n); + + // check all hash paths + expect(await tree.getSiblingPath(0n)).toEqual(new SiblingPath([index1Hash, e11, e21])); + expect(await tree.getSiblingPath(1n)).toEqual(new SiblingPath([index0Hash, e11, e21])); + expect(await tree.getSiblingPath(2n)).toEqual(new SiblingPath([index3Hash, e10, e21])); + expect(await tree.getSiblingPath(3n)).toEqual(new SiblingPath([index2Hash, e10, e21])); + expect(await tree.getSiblingPath(4n)).toEqual(new SiblingPath([zeroTreeLeafHash, level1ZeroHash, e20])); + expect(await tree.getSiblingPath(5n)).toEqual(new SiblingPath([index4Hash, level1ZeroHash, e20])); + expect(await tree.getSiblingPath(6n)).toEqual(new SiblingPath([zeroTreeLeafHash, e12, e20])); + expect(await tree.getSiblingPath(7n)).toEqual(new SiblingPath([zeroTreeLeafHash, e12, e20])); + }); +}); diff --git a/yarn-project/merkle-tree/src/indexed_tree.ts b/yarn-project/merkle-tree/src/indexed_tree.ts index 9c45de3e48e..ca119942667 100644 --- a/yarn-project/merkle-tree/src/indexed_tree.ts +++ b/yarn-project/merkle-tree/src/indexed_tree.ts @@ -1,7 +1,13 @@ +import { LevelUp } from 'levelup'; import { toBigIntBE, toBufferBE } from './bigint_buffer.js'; import { MerkleTree } from './merkle_tree.js'; import { SiblingPath } from './sibling_path.js'; import { StandardMerkleTree } from './standard_tree.js'; +import { Hasher } from './hasher.js'; + +const indexToKeyLeaf = (name: string, index: bigint) => { + return `${name}:leaf:${index}`; +}; interface LeafData { value: bigint; @@ -16,23 +22,53 @@ const encodeTreeValue = (leafData: LeafData) => { return Buffer.concat([valueAsBuffer, indexAsBuffer, nextValueAsBuffer]); }; +const decodeTreeValue = (buf: Buffer) => { + const value = toBigIntBE(buf.subarray(0, 32)); + const nextIndex = toBigIntBE(buf.subarray(32, 64)); + const nextValue = toBigIntBE(buf.subarray(64, 96)); + return { + value, + nextIndex, + nextValue, + } as LeafData; +}; + +const initialLeaf: LeafData = { + value: 0n, + nextIndex: 0n, + nextValue: 0n, +}; + export class IndexedTree implements MerkleTree { private leaves: LeafData[] = []; - constructor(private underlying: StandardMerkleTree) {} - - public static async new( - db: LevelUp, - hasher: Hasher, - name: string, - depth: number, - initialLeafValue = StandardMerkleTree.ZERO_ELEMENT, - ) { - const underlying = await StandardMerkleTree.new(db, hasher, name, depth, initialLeafValue); - const tree = new IndexedTree(underlying); + private cachedLeaves: { [key: number]: LeafData } = {}; + constructor(private underlying: StandardMerkleTree, private hasher: Hasher, private db: LevelUp) {} + + public static async new(db: LevelUp, hasher: Hasher, name: string, depth: number) { + const underlying = await StandardMerkleTree.new( + db, + hasher, + name, + depth, + hasher.hashToField(encodeTreeValue(initialLeaf)), + ); + const tree = new IndexedTree(underlying, hasher, db); await tree.init(); return tree; } + static async fromName(db: LevelUp, hasher: Hasher, name: string) { + const underlying = await StandardMerkleTree.fromName( + db, + hasher, + name, + hasher.hashToField(encodeTreeValue(initialLeaf)), + ); + const tree = new IndexedTree(underlying, hasher, db); + await tree.initFromDb(); + return tree; + } + public getRoot(): Buffer { return this.underlying.getRoot(); } @@ -45,10 +81,12 @@ export class IndexedTree implements MerkleTree { } } public async commit(): Promise { - return await this.underlying.commit(); + await this.underlying.commit(); + await this.commitLeaves(); } public async rollback(): Promise { - return await this.underlying.rollback(); + await this.underlying.rollback(); + this.rollbackLeaves(); } public async getSiblingPath(index: bigint): Promise { return await this.underlying.getSiblingPath(index); @@ -56,28 +94,35 @@ export class IndexedTree implements MerkleTree { private async appendLeaf(leaf: Buffer): Promise { const newValue = toBigIntBE(leaf); const indexOfPrevious = this.findIndexOfPreviousValue(newValue); + const previousLeafCopy = this.getLatestLeafDataCopy(indexOfPrevious.index); + if (previousLeafCopy === undefined) { + throw new Error(`Previous leaf not found!`); + } const newLeaf = { value: newValue, - nextIndex: this.leaves[indexOfPrevious.index].nextIndex, - nextValue: this.leaves[indexOfPrevious.index].nextValue, + nextIndex: previousLeafCopy.nextIndex, + nextValue: previousLeafCopy.nextValue, } as LeafData; - - if (!indexOfPrevious.alreadyPresent) { - this.leaves[indexOfPrevious.index].nextIndex = BigInt(this.leaves.length); - this.leaves[indexOfPrevious.index].nextValue = newLeaf.value; - this.leaves.push(newLeaf); + if (indexOfPrevious.alreadyPresent) { + return; } - - const oldTreeValue = encodeTreeValue(this.leaves[indexOfPrevious.index]); + // insert a new leaf at the highest index and update the values of our previous leaf copy + const currentSize = this.underlying.getNumLeaves(); + previousLeafCopy.nextIndex = BigInt(currentSize); + previousLeafCopy.nextValue = newLeaf.value; + this.cachedLeaves[Number(currentSize)] = newLeaf; + this.cachedLeaves[Number(indexOfPrevious.index)] = previousLeafCopy; + const previousTreeValue = encodeTreeValue(previousLeafCopy); const newTreeValue = encodeTreeValue(newLeaf); - await this.underlying.updateLeaf(oldTreeValue, BigInt(indexOfPrevious.index)); - await this.underlying.appendLeaves([newTreeValue]); + await this.underlying.updateLeaf(this.hasher.hashToField(previousTreeValue), BigInt(indexOfPrevious.index)); + await this.underlying.appendLeaves([this.hasher.hashToField(newTreeValue)]); } + private findIndexOfPreviousValue(newValue: bigint) { const numLeaves = this.underlying.getNumLeaves(); const diff: bigint[] = []; for (let i = 0; i < numLeaves; i++) { - const stored = this.leaves[i]; + const stored = this.getLatestLeafDataCopy(i)!; if (stored.value > newValue) { diff.push(newValue); } else if (stored.value === newValue) { @@ -94,11 +139,9 @@ export class IndexedTree implements MerkleTree { if (!values.length) { return 0; } - let min = values[0]; let minIndex = 0; for (let i = 1; i < values.length; i++) { - if (min > values[i]) { - min = values[i]; + if (values[minIndex] > values[i]) { minIndex = i; } } @@ -106,13 +149,64 @@ export class IndexedTree implements MerkleTree { } private async init() { - const initialLeaf = { - value: 0n, - nextIndex: 0n, - nextValue: 0n, - } as LeafData; this.leaves.push(initialLeaf); - const initialData = encodeTreeValue(initialLeaf); - await this.underlying.appendLeaves(initialData); + await this.underlying.appendLeaves([this.hasher.hashToField(encodeTreeValue(initialLeaf))]); + await this.commit(); + } + + private async initFromDb(startingIndex = 0n) { + const values: LeafData[] = []; + const promise = new Promise((resolve, reject) => { + this.db + .createReadStream({ + gte: indexToKeyLeaf(this.underlying.getName(), startingIndex), + lte: indexToKeyLeaf(this.underlying.getName(), 2n ** BigInt(this.underlying.getDepth())), + }) + .on('data', function (data) { + const index = Number(data.key); + values[index] = decodeTreeValue(data.value); + }) + .on('close', function () {}) + .on('end', function () { + resolve(); + }) + .on('error', function () { + console.log('stream error'); + reject(); + }); + }); + await promise; + this.leaves = values; + } + + private async commitLeaves() { + const batch = this.db.batch(); + const keys = Object.getOwnPropertyNames(this.cachedLeaves); + for (const key of keys) { + const index = Number(key); + batch.put(key, this.cachedLeaves[index]); + this.leaves[index] = this.cachedLeaves[index]; + } + await batch.write(); + this.clearCache(); + } + + private rollbackLeaves() { + this.clearCache(); + } + + private clearCache() { + this.cachedLeaves = {}; + } + + private getLatestLeafDataCopy(index: number) { + const leaf = this.cachedLeaves[index] ?? this.leaves[index]; + return leaf + ? ({ + value: leaf.value, + nextIndex: leaf.nextIndex, + nextValue: leaf.nextValue, + } as LeafData) + : undefined; } } diff --git a/yarn-project/merkle-tree/src/pedersen.ts b/yarn-project/merkle-tree/src/pedersen.ts index a10fa47ceed..d6dce6ea5b7 100644 --- a/yarn-project/merkle-tree/src/pedersen.ts +++ b/yarn-project/merkle-tree/src/pedersen.ts @@ -1,12 +1,13 @@ /* eslint-disable */ import { Hasher } from './hasher.js'; +import { default as sha256 } from 'sha256'; export class Pedersen implements Hasher { public compress(lhs: Uint8Array, rhs: Uint8Array): Buffer { - return Buffer.alloc(32); + return Buffer.from(sha256(Buffer.concat([lhs, rhs])), 'hex'); } public hashToField(data: Uint8Array): Buffer { - return Buffer.alloc(32); + return Buffer.from(sha256(Buffer.from(data)), 'hex'); } public hashToTree(leaves: Buffer[]): Promise { return Promise.resolve([Buffer.alloc(32)]); diff --git a/yarn-project/merkle-tree/src/sibling_path.ts b/yarn-project/merkle-tree/src/sibling_path.ts index f751b3c1a1c..ebedb51f122 100644 --- a/yarn-project/merkle-tree/src/sibling_path.ts +++ b/yarn-project/merkle-tree/src/sibling_path.ts @@ -25,7 +25,7 @@ export class SiblingPath { static deserialize(buf: Buffer, offset = 0) { const deserializePath = (buf: Buffer, offset: number) => ({ - elem: [buf.slice(offset, offset + 32)], + elem: buf.slice(offset, offset + 32), adv: 32, }); const { elem, adv } = deserializeArrayFromVector(deserializePath, buf, offset); diff --git a/yarn-project/merkle-tree/src/standard_tree.test.ts b/yarn-project/merkle-tree/src/standard_tree.test.ts index 01ecd04c5ff..81a644d22f0 100644 --- a/yarn-project/merkle-tree/src/standard_tree.test.ts +++ b/yarn-project/merkle-tree/src/standard_tree.test.ts @@ -1,328 +1,79 @@ import { default as levelup } from 'levelup'; import { default as memdown } from 'memdown'; -import { SiblingPath, StandardMerkleTree } from './index.js'; -import { SinglePedersen } from '../crypto/index.js'; -import { BarretenbergWasm } from '../wasm/index.js'; +import { Hasher, Pedersen, SiblingPath, StandardMerkleTree } from './index.js'; +import { merkleTreeTestSuite } from './test_suite.js'; -// const expectSameTrees = async (tree1: MerkleTree, tree2: MerkleTree) => { -// const size = tree1.getNumLeaves(); -// expect(size).toBe(tree2.getNumLeaves()); -// expect(tree1.getRoot().toString('hex')).toBe(tree2.getRoot().toString('hex')); +const createDb = async (levelUp: levelup.LevelUp, hasher: Hasher, name: string, depth: number) => { + return await StandardMerkleTree.new(levelUp, hasher, name, depth); +}; -// for (let i = 0; i < size; ++i) { -// const siblingPath1 = await tree1.getSiblingPath(BigInt(i)); -// const siblingPath2 = await tree2.getSiblingPath(BigInt(i)); -// expect(siblingPath2).toStrictEqual(siblingPath1); -// } -// }; +const createFromName = async (levelUp: levelup.LevelUp, hasher: Hasher, name: string) => { + return await StandardMerkleTree.fromName(levelUp, hasher, name); +}; -describe('merkle_tree', () => { - let barretenberg!: BarretenbergWasm; - let pedersen!: SinglePedersen; - const values: Buffer[] = []; +merkleTreeTestSuite('StandardMerkleTree', createDb, createFromName); - beforeAll(async () => { - barretenberg = new BarretenbergWasm(); - await barretenberg.init(); - pedersen = new SinglePedersen(barretenberg); +describe('StandardMerkleTreeSpecific', () => { + const pedersen = new Pedersen(); + const values: Buffer[] = []; - for (let i = 0; i < 32; ++i) { - const v = Buffer.alloc(32, 0); + beforeAll(() => { + for (let i = 0; i < 4; ++i) { + const v = Buffer.alloc(32, i + 1); v.writeUInt32BE(i, 28); values[i] = v; } }); - - it('should have correct root', async () => { + it('should have correct root and sibling paths', async () => { const db = levelup(memdown()); - - const e00 = StandardMerkleTree.ZERO_ELEMENT; - const e01 = values[1]; - const e02 = values[2]; - const e03 = values[3]; - const e10 = pedersen.compress(e00, e01); - const e11 = pedersen.compress(e02, e03); - const root = pedersen.compress(e10, e11); - - const tree = await StandardMerkleTree.new(db, pedersen, 'test', 2); - - await tree.appendLeaves(values.slice(0, 4)); - - expect(await tree.getSiblingPath(0n)).toEqual(new SiblingPath([e01, e11])); - expect(await tree.getSiblingPath(1n)).toEqual(new SiblingPath([e00, e11])); - - expect(await tree.getSiblingPath(0n)).toEqual(new SiblingPath([e02, e10])); - expect(await tree.getSiblingPath(1n)).toEqual(new SiblingPath([e03, e10])); - expect(tree.getRoot()).toEqual(root); - expect(tree.getNumLeaves()).toBe(4); - + const tree = await createDb(db, pedersen, 'test', 2); + + const zeroTreeLeafHash = StandardMerkleTree.ZERO_ELEMENT; + const level1ZeroHash = pedersen.compress(zeroTreeLeafHash, zeroTreeLeafHash); + expect(tree.getNumLeaves()).toEqual(0n); + expect(tree.getRoot()).toEqual(pedersen.compress(level1ZeroHash, level1ZeroHash)); + expect(await tree.getSiblingPath(0n)).toEqual(new SiblingPath([zeroTreeLeafHash, level1ZeroHash])); + + await tree.appendLeaves([values[0]]); + expect(tree.getNumLeaves()).toEqual(1n); + expect(tree.getRoot()).toEqual(pedersen.compress(pedersen.compress(values[0], zeroTreeLeafHash), level1ZeroHash)); + expect(await tree.getSiblingPath(0n)).toEqual(new SiblingPath([zeroTreeLeafHash, level1ZeroHash])); + + await tree.appendLeaves([values[1]]); + expect(tree.getNumLeaves()).toEqual(2n); + expect(tree.getRoot()).toEqual(pedersen.compress(pedersen.compress(values[0], values[1]), level1ZeroHash)); + expect(await tree.getSiblingPath(1n)).toEqual(new SiblingPath([values[0], level1ZeroHash])); + + await tree.appendLeaves([values[2]]); + expect(tree.getNumLeaves()).toEqual(3n); + expect(tree.getRoot()).toEqual( + pedersen.compress(pedersen.compress(values[0], values[1]), pedersen.compress(values[2], zeroTreeLeafHash)), + ); + expect(await tree.getSiblingPath(2n)).toEqual( + new SiblingPath([zeroTreeLeafHash, pedersen.compress(values[0], values[1])]), + ); + + await tree.appendLeaves([values[3]]); + expect(tree.getNumLeaves()).toEqual(4n); + expect(tree.getRoot()).toEqual( + pedersen.compress(pedersen.compress(values[0], values[1]), pedersen.compress(values[2], values[3])), + ); + expect(await tree.getSiblingPath(3n)).toEqual( + new SiblingPath([values[2], pedersen.compress(values[0], values[1])]), + ); // Lifted from memory_tree.test.cpp to ensure consistency. - expect(root.toString('hex')).toEqual('0bf2e78afd70f72b0e6eafb03c41faef167a82441b05e517cdf35d813302061f'); + //expect(root.toString('hex')).toEqual('0bf2e78afd70f72b0e6eafb03c41faef167a82441b05e517cdf35d813302061f'); + expect(await tree.getSiblingPath(0n)).toEqual( + new SiblingPath([values[1], pedersen.compress(values[2], values[3])]), + ); + expect(await tree.getSiblingPath(1n)).toEqual( + new SiblingPath([values[0], pedersen.compress(values[2], values[3])]), + ); + expect(await tree.getSiblingPath(2n)).toEqual( + new SiblingPath([values[3], pedersen.compress(values[0], values[1])]), + ); + expect(await tree.getSiblingPath(3n)).toEqual( + new SiblingPath([values[2], pedersen.compress(values[0], values[1])]), + ); }); - - // it('should have correct empty tree root for depth 32', async () => { - // const db = levelup(memdown()); - // const tree = await MerkleTree.new(db, pedersen, 'test', 32); - // const root = tree.getRoot(); - // expect(root.toString('hex')).toEqual('18ceb5cd201e1cee669a5c3ad96d3c4e933a365b37046fc3178264bede32c68d'); - // }); - - // it('should have same result when setting same values', async () => { - // const db = levelup(memdown()); - // const tree = await MerkleTree.new(db, pedersen, 'test', 10); - - // for (let i = 0; i < values.length; ++i) { - // await tree.updateElement(i, values[i]); - // } - // const root1 = tree.getRoot(); - - // for (let i = 0; i < values.length; ++i) { - // await tree.updateElement(i, values[i]); - // } - // const root2 = tree.getRoot(); - - // expect(root1).toEqual(root2); - // }); - - // it('should get same result when using subtree insertion', async () => { - // const values: Buffer[] = []; - // for (let i = 0; i < 32 * 8; ++i) { - // const v = Buffer.alloc(32, 0); - // v.writeUInt32BE(i, 28); - // values[i] = v; - // } - - // // Create reference tree. - // const db1 = levelup(memdown()); - // const tree1 = await MerkleTree.new(db1, pedersen, 'test', 10); - - // for (let i = 0; i < values.length; ++i) { - // await tree1.updateElement(i, values[i]); - // } - - // // Create tree from subtrees. - // const db2 = levelup(memdown()); - // const tree2 = await MerkleTree.new(db2, pedersen, 'test', 10); - - // for (let i = 0; i < values.length; i += 32) { - // await tree2.updateElements(i, values.slice(i, i + 32)); - // } - - // await expectSameTrees(tree1, tree2); - // }); - // it('should support batch insertion of a single element', async () => { - // const values: Buffer[] = []; - // for (let i = 0; i < 32 * 2; ++i) { - // const v = Buffer.alloc(32, 0); - // v.writeUInt32BE(i, 28); - // values[i] = v; - // } - - // // Create reference tree. - // const db1 = levelup(memdown()); - // const tree1 = await MerkleTree.new(db1, pedersen, 'test', 10); - - // for (let i = 0; i < values.length; ++i) { - // await tree1.updateElement(i, values[i]); - // } - - // // Create tree from subtrees. - // const db2 = levelup(memdown()); - // const tree2 = await MerkleTree.new(db2, pedersen, 'test', 10); - - // for (let i = 0; i < values.length; i++) { - // await tree2.updateElements(i, values.slice(i, i + 1)); - // } - - // await expectSameTrees(tree1, tree2); - // }); - - // it('should update elements without over extending tree size', async () => { - // // Create reference tree from 12 values. - // const db1 = levelup(memdown()); - // const tree1 = await MerkleTree.new(db1, pedersen, 'test', 10); - - // for (let i = 0; i < 29; ++i) { - // await tree1.updateElement(i, values[i]); - // } - - // const db2 = levelup(memdown()); - // const tree2 = await MerkleTree.new(db2, pedersen, 'test', 10); - - // // Results in subtree insertion of 4, 2 and 1. - // await tree2.updateElements(0, values.slice(0, 7)); - // // Results in subtree insertion of 16, 4 and 2. - // await tree2.updateElements(7, values.slice(7, 29)); - - // await expectSameTrees(tree1, tree2); - // }); - - // it('should update elements, simulating escape hatch behaviour', async () => { - // // Create reference tree. - // const db1 = levelup(memdown()); - // const tree1 = await MerkleTree.new(db1, pedersen, 'test', 10); - - // for (let i = 0; i < 10; ++i) { - // await tree1.updateElement(i, values[i]); - // } - // for (let i = 16; i < 24; ++i) { - // await tree1.updateElement(i, values[i]); - // } - - // // Create tree from 4 rollup, 1 escape, 4 rollup. - // const db2 = levelup(memdown()); - // const tree2 = await MerkleTree.new(db2, pedersen, 'test', 10); - - // await tree2.updateElements(0, values.slice(0, 8)); - // await tree2.updateElements(8, values.slice(8, 10)); - // await tree2.updateElements(16, values.slice(16, 24)); - - // await expectSameTrees(tree1, tree2); - // }); - - // it('should update 0 values elements', async () => { - // const values: Buffer[] = Array(6).fill(Buffer.alloc(32, 0)); - - // // Create reference tree. - // const db1 = levelup(memdown()); - // const tree1 = await MerkleTree.new(db1, pedersen, 'test', 10); - - // for (let i = 0; i < 6; ++i) { - // await tree1.updateElement(i, values[i]); - // } - - // // Create tree from 8 rollup, 1 escape, 8 rollup. - // const db2 = levelup(memdown()); - // const tree2 = await MerkleTree.new(db2, pedersen, 'test', 10); - - // await tree2.updateElements(0, values.slice(0, 6)); - // expect(tree2.getSize()).toEqual(6); - - // await expectSameTrees(tree1, tree2); - // }); - - // it('should allow inserting same subtree twice', async () => { - // const values: Buffer[] = []; - // for (let i = 0; i < 64; ++i) { - // const v = Buffer.alloc(64, 0); - // v.writeUInt32LE(i, 0); - // values[i] = v; - // } - - // // Create reference tree. - // const db1 = levelup(memdown()); - // const tree1 = await MerkleTree.new(db1, pedersen, 'test', 10); - // await tree1.updateElements(0, values); - - // // Create another tree - // const db2 = levelup(memdown()); - // const tree2 = await MerkleTree.new(db2, pedersen, 'test', 10); - // await tree2.updateElements(0, values); - // await tree2.updateElements(0, values); - - // await expectSameTrees(tree1, tree2); - // }); - - // it('should allow inserting of larger subtree over smaller subtree', async () => { - // const treeSize = 65; - // const values: Buffer[] = []; - // for (let i = 0; i < treeSize; ++i) { - // const v = Buffer.alloc(64, 0); - // v.writeUInt32LE(i, 0); - // values[i] = v; - // } - - // // Create reference tree. - // const db1 = levelup(memdown()); - // const tree1 = await MerkleTree.new(db1, pedersen, 'test', 10); - // await tree1.updateElements(0, values); - - // // Create another tree - // const db2 = levelup(memdown()); - // const tree2 = await MerkleTree.new(db2, pedersen, 'test', 10); - - // // insert partial values to another tree - // await tree2.updateElements(0, values.slice(0, treeSize - 7)); - - // // insert exsiting values plus new values to another tree - // await tree2.updateElements(0, values); - - // await expectSameTrees(tree1, tree2); - // }); - - // it('should be able to restore from previous data', async () => { - // const levelDown = memdown(); - // const db = levelup(levelDown); - // const tree = await MerkleTree.new(db, pedersen, 'test', 10); - // for (let i = 0; i < 4; ++i) { - // await tree.updateElement(i, values[i]); - // } - - // const db2 = levelup(levelDown); - // const tree2 = await MerkleTree.fromName(db2, pedersen, 'test'); - - // expect(tree.getRoot()).toEqual(tree2.getRoot()); - // for (let i = 0; i < 4; ++i) { - // expect(await tree.getHashPath(i)).toEqual(await tree2.getHashPath(i)); - // } - // }); - - // it('should throw an error if previous data does not exist for the given name', async () => { - // const db = levelup(memdown()); - // await expect( - // (async () => { - // await MerkleTree.fromName(db, pedersen, 'a_whole_new_tree'); - // })(), - // ).rejects.toThrow(); - // }); - - // it('should be able to sync the latest status from db', async () => { - // const levelDown = memdown(); - - // const db1 = levelup(levelDown); - // const tree1 = await MerkleTree.new(db1, pedersen, 'test', 10); - - // const db2 = levelup(levelDown); - // const tree2 = await MerkleTree.new(db2, pedersen, 'test', 10); - - // expect(tree1.getRoot()).toEqual(tree2.getRoot()); - // expect(tree1.getSize()).toBe(0); - // expect(tree2.getSize()).toBe(0); - - // for (let i = 0; i < 4; ++i) { - // await tree1.updateElement(i, values[i]); - // } - - // const newRoot = tree1.getRoot(); - // expect(tree1.getSize()).toBe(4); - // expect(tree2.getRoot()).not.toEqual(newRoot); - // expect(tree2.getSize()).toBe(0); - - // await tree2.syncFromDb(); - - // expect(tree2.getRoot()).toEqual(newRoot); - // expect(tree2.getSize()).toBe(4); - // }); - - // it('should serialize hash path data to a buffer and be able to deserialize it back', async () => { - // const db = levelup(memdown()); - // const tree = await MerkleTree.new(db, pedersen, 'test', 10); - // await tree.updateElement(0, values[0]); - - // const hashPath = await tree.getHashPath(0); - // const buf = hashPath.toBuffer(); - // const recovered = HashPath.fromBuffer(buf); - // expect(recovered).toEqual(hashPath); - // const deserialized = HashPath.deserialize(buf); - // expect(deserialized.elem).toEqual(hashPath); - // expect(deserialized.adv).toBe(4 + 10 * 64); - - // const dummyData = Buffer.alloc(23, 1); - // const paddedBuf = Buffer.concat([dummyData, buf]); - // const recovered2 = HashPath.fromBuffer(paddedBuf, 23); - // expect(recovered2).toEqual(hashPath); - // const deserialized2 = HashPath.deserialize(buf); - // expect(deserialized2.elem).toEqual(hashPath); - // expect(deserialized2.adv).toBe(4 + 10 * 64); - // }); }); diff --git a/yarn-project/merkle-tree/src/standard_tree.ts b/yarn-project/merkle-tree/src/standard_tree.ts index 55a31d7c7d6..714a4ba1ead 100644 --- a/yarn-project/merkle-tree/src/standard_tree.ts +++ b/yarn-project/merkle-tree/src/standard_tree.ts @@ -6,17 +6,17 @@ import { toBufferLE, toBigIntLE } from './bigint_buffer.js'; const MAX_DEPTH = 32; -const indexToKeyHash = (name: string, level: number, index: bigint) => Buffer.from(`${name}-${level}-${index}`); +const indexToKeyHash = (name: string, level: number, index: bigint) => `${name}:${level}:${index}`; const encodeMeta = (root: Buffer, depth: number, size: bigint) => { const data = Buffer.alloc(36); root.copy(data); data.writeUInt32LE(depth, 32); - return Buffer.concat(data, toBufferLE(size, 32)); + return Buffer.concat([data, toBufferLE(size, 32)]); }; const decodeMeta = (meta: Buffer) => { - const root = meta.slice(0, 32); + const root = meta.subarray(0, 32); const depth = meta.readUInt32LE(32); - const size = toBigIntLE(data.slice(36)); + const size = toBigIntLE(meta.subarray(36)); return { root, depth, @@ -46,7 +46,7 @@ export class StandardMerkleTree implements MerkleTree { // Compute the zero values at each layer. let current = initialLeafValue; - for (let i = 0; i < depth; ++i) { + for (let i = depth - 1; i >= 0; --i) { this.zeroHashes[i] = current; current = hasher.compress(current, current); } @@ -67,13 +67,16 @@ export class StandardMerkleTree implements MerkleTree { } static async fromName(db: LevelUp, hasher: Hasher, name: string, initialLeafValue = StandardMerkleTree.ZERO_ELEMENT) { - const meta: Buffer = await db.get(Buffer.from(name)); + const meta: Buffer = await db.get(name); const { root, depth, size } = decodeMeta(meta); return new StandardMerkleTree(db, hasher, name, depth, size, root, initialLeafValue); } public async syncFromDb() { - const meta: Buffer = await this.db.get(Buffer.from(this.name)); + const meta: Buffer | undefined = await this.dbGet(this.name); + if (!meta) { + return; + } const { root, depth, size } = decodeMeta(meta); this.root = root; this.depth = depth; @@ -89,6 +92,14 @@ export class StandardMerkleTree implements MerkleTree { return this.cachedSize ?? this.size; } + public getName() { + return this.name; + } + + public getDepth() { + return this.depth; + } + /** * Returns a sibling path for the element at the given index. * The sibling path is an array of sibling hashes, with the lowest hash (leaf hash) first, and the highest hash last. @@ -96,11 +107,12 @@ export class StandardMerkleTree implements MerkleTree { public async getSiblingPath(index: bigint) { const path = new SiblingPath(); let level = this.depth; - while (level >= 0) { - const isRight = (index >> BigInt(level)) & 0x01n; + while (level > 0) { + const isRight = index & 0x01n; const sibling = await this.getLatestValueAtIndex(level, isRight ? index - 1n : index + 1n); path.data.push(sibling); level -= 1; + index >>= 1n; } return path; } @@ -128,9 +140,10 @@ export class StandardMerkleTree implements MerkleTree { for (const key of keys) { batch.put(key, this.cache[key]); } + this.size = this.getNumLeaves(); + this.root = this.getRoot(); await this.writeMeta(batch); await batch.write(); - this.size = this.cachedSize ?? this.size; this.clearCache(); } @@ -149,7 +162,7 @@ export class StandardMerkleTree implements MerkleTree { let current = leaf; this.cache[key] = current; let level = this.depth; - while (level >= 0) { + while (level > 0) { const isRight = index & 0x01n; const sibling = await this.getLatestValueAtIndex(level, isRight ? index - 1n : index + 1n); const lhs = isRight ? sibling : current; @@ -157,12 +170,12 @@ export class StandardMerkleTree implements MerkleTree { current = this.hasher.compress(lhs, rhs); level -= 1; index >>= 1n; - this.cache[indexToKeyHash(this.name, level, index)] = current; + const cacheKey = indexToKeyHash(this.name, level, index); + this.cache[cacheKey] = current; } - this.root = this.cache[indexToKeyHash(this.name, 0, 0n)]; } - private async getLatestValueAtIndex(level: number, index: bigint): Promise { + private async getLatestValueAtIndex(level: number, index: bigint): Promise { const key = indexToKeyHash(this.name, level, index); if (this.cache[key] !== undefined) { return this.cache[key]; @@ -171,14 +184,14 @@ export class StandardMerkleTree implements MerkleTree { if (comitted !== undefined) { return comitted; } - return this.zeroHashes[level]; + return this.zeroHashes[level - 1]; } - private async dbGet(key: Buffer): Promise { + private async dbGet(key: string): Promise { return await this.db.get(key).catch(() => {}); } - private async writeMeta(batch?: LevelUpChain) { + private async writeMeta(batch?: LevelUpChain) { const data = encodeMeta(this.getRoot(), this.depth, this.getNumLeaves()); if (batch) { batch.put(this.name, data); diff --git a/yarn-project/merkle-tree/src/test_suite.ts b/yarn-project/merkle-tree/src/test_suite.ts new file mode 100644 index 00000000000..4bbd2af7cbf --- /dev/null +++ b/yarn-project/merkle-tree/src/test_suite.ts @@ -0,0 +1,136 @@ +import { default as levelup } from 'levelup'; +import { default as memdown } from 'memdown'; +import { Hasher, MerkleTree, Pedersen, SiblingPath } from './index.js'; + +const expectSameTrees = async (tree1: MerkleTree, tree2: MerkleTree) => { + const size = tree1.getNumLeaves(); + expect(size).toBe(tree2.getNumLeaves()); + expect(tree1.getRoot().toString('hex')).toBe(tree2.getRoot().toString('hex')); + + for (let i = 0; i < size; ++i) { + const siblingPath1 = await tree1.getSiblingPath(BigInt(i)); + const siblingPath2 = await tree2.getSiblingPath(BigInt(i)); + expect(siblingPath2).toStrictEqual(siblingPath1); + } +}; + +export const merkleTreeTestSuite = ( + testName: string, + createDb: (levelup: levelup.LevelUp, hasher: Hasher, name: string, depth: number) => Promise, + createFromName: (levelup: levelup.LevelUp, hasher: Hasher, name: string) => Promise, +) => { + describe(testName, () => { + const pedersen = new Pedersen(); + const values: Buffer[] = []; + + beforeAll(() => { + for (let i = 0; i < 32; ++i) { + const v = Buffer.alloc(32, i + 1); + v.writeUInt32BE(i, 28); + values[i] = v; + } + }); + + // it('should have correct empty tree root for depth 32', async () => { + // const db = levelup(memdown()); + // const tree = await StandardMerkleTree.new(db, pedersen, 'test', 32); + // const root = tree.getRoot(); + // expect(root.toString('hex')).toEqual('18ceb5cd201e1cee669a5c3ad96d3c4e933a365b37046fc3178264bede32c68d'); + // }); + + it('should revert changes on rollback', async () => { + const levelDownEmpty = memdown(); + const dbEmpty = levelup(levelDownEmpty); + const emptyTree = await createDb(dbEmpty, pedersen, 'test', 10); + + const levelDown = memdown(); + const db = levelup(levelDown); + const tree = await createDb(db, pedersen, 'test2', 10); + await tree.appendLeaves(values.slice(0, 4)); + + const firstRoot = tree.getRoot(); + + expect(firstRoot).not.toEqual(emptyTree.getRoot()); + + await tree.rollback(); + + await expectSameTrees(tree, emptyTree); + + // append the leaves again + await tree.appendLeaves(values.slice(0, 4)); + + expect(tree.getRoot()).toEqual(firstRoot); + + expect(firstRoot).not.toEqual(emptyTree.getRoot()); + + await tree.rollback(); + + await expectSameTrees(tree, emptyTree); + }); + + it('should not revert changes after commit', async () => { + const levelDownEmpty = memdown(); + const dbEmpty = levelup(levelDownEmpty); + const emptyTree = await createDb(dbEmpty, pedersen, 'test', 10); + + const levelDown = memdown(); + const db = levelup(levelDown); + const tree = await createDb(db, pedersen, 'test2', 10); + await tree.appendLeaves(values.slice(0, 4)); + + expect(tree.getRoot()).not.toEqual(emptyTree.getRoot()); + + await tree.commit(); + await tree.rollback(); + + expect(tree.getRoot()).not.toEqual(emptyTree.getRoot()); + }); + + it('should be able to restore from previous committed data', async () => { + const levelDown = memdown(); + const db = levelup(levelDown); + const tree = await createDb(db, pedersen, 'test', 10); + await tree.appendLeaves(values.slice(0, 4)); + await tree.commit(); + + const db2 = levelup(levelDown); + const tree2 = await createFromName(db2, pedersen, 'test'); + + expect(tree.getRoot()).toEqual(tree2.getRoot()); + for (let i = 0; i < 4; ++i) { + expect(await tree.getSiblingPath(BigInt(i))).toEqual(await tree2.getSiblingPath(BigInt(i))); + } + }); + + it('should throw an error if previous data does not exist for the given name', async () => { + const db = levelup(memdown()); + await expect( + (async () => { + await createFromName(db, pedersen, 'a_whole_new_tree'); + })(), + ).rejects.toThrow(); + }); + + it('should serialize sibling path data to a buffer and be able to deserialize it back', async () => { + const db = levelup(memdown()); + const tree = await createDb(db, pedersen, 'test', 10); + await tree.appendLeaves(values.slice(0, 1)); + + const siblingPath = await tree.getSiblingPath(0n); + const buf = siblingPath.toBuffer(); + const recovered = SiblingPath.fromBuffer(buf); + expect(recovered).toEqual(siblingPath); + const deserialized = SiblingPath.deserialize(buf); + expect(deserialized.elem).toEqual(siblingPath); + expect(deserialized.adv).toBe(4 + 10 * 32); + + const dummyData = Buffer.alloc(23, 1); + const paddedBuf = Buffer.concat([dummyData, buf]); + const recovered2 = SiblingPath.fromBuffer(paddedBuf, 23); + expect(recovered2).toEqual(siblingPath); + const deserialized2 = SiblingPath.deserialize(buf); + expect(deserialized2.elem).toEqual(siblingPath); + expect(deserialized2.adv).toBe(4 + 10 * 32); + }); + }); +}; diff --git a/yarn-project/yarn.lock b/yarn-project/yarn.lock index 5915b409d2b..f4f8a4aea48 100644 --- a/yarn-project/yarn.lock +++ b/yarn-project/yarn.lock @@ -220,9 +220,13 @@ __metadata: "@rushstack/eslint-patch": ^1.1.4 "@types/jest": ^29.4.0 "@types/levelup": ^5.1.2 - "@types/node": ^18.14.6 + "@types/memdown": ^3.0.1 + "@types/node": ^18.15.3 + "@types/sha256": ^0.2.0 jest: ^28.1.3 levelup: ^5.1.1 + memdown: ^6.1.1 + sha256: ^0.2.0 ts-jest: ^28.0.7 ts-node: ^10.9.1 tslib: ^2.4.0 @@ -1478,7 +1482,7 @@ __metadata: languageName: node linkType: hard -"@types/memdown@npm:^3.0.0": +"@types/memdown@npm:^3.0.0, @types/memdown@npm:^3.0.1": version: 3.0.1 resolution: "@types/memdown@npm:3.0.1" dependencies: @@ -1501,6 +1505,13 @@ __metadata: languageName: node linkType: hard +"@types/node@npm:^18.15.3": + version: 18.15.3 + resolution: "@types/node@npm:18.15.3" + checksum: 31b1d92475a82c30de29aa6c0771b18a276552d191283b4423ba2d61b3f01159bf0d02576c0b7cc834b043997893800db6bb47f246083ed85aa45e79c80875d7 + languageName: node + linkType: hard + "@types/prettier@npm:^2.1.5": version: 2.7.2 resolution: "@types/prettier@npm:2.7.2" @@ -1515,6 +1526,15 @@ __metadata: languageName: node linkType: hard +"@types/sha256@npm:^0.2.0": + version: 0.2.0 + resolution: "@types/sha256@npm:0.2.0" + dependencies: + "@types/node": "*" + checksum: f3c8e0dcaf11d833292b7dd19db567ef41b23036b2fb9ea7335cba100aac8c56e1346171fae6c63885f6c0e1048550506fd165628bc0001902fea010a16d3842 + languageName: node + linkType: hard + "@types/stack-utils@npm:^2.0.0": version: 2.0.1 resolution: "@types/stack-utils@npm:2.0.1" @@ -2216,6 +2236,13 @@ __metadata: languageName: node linkType: hard +"convert-hex@npm:~0.1.0": + version: 0.1.0 + resolution: "convert-hex@npm:0.1.0" + checksum: eacb880dbc45a36a0e6b5f5674f7e57bdce59bbf5a3ebfba980f694e2be81f1b2c81c9c89834f8054f23cc9c21d1fd210265e2000287a1cd0426657797b2f462 + languageName: node + linkType: hard + "convert-source-map@npm:^1.4.0, convert-source-map@npm:^1.6.0, convert-source-map@npm:^1.7.0": version: 1.9.0 resolution: "convert-source-map@npm:1.9.0" @@ -2230,6 +2257,13 @@ __metadata: languageName: node linkType: hard +"convert-string@npm:~0.1.0": + version: 0.1.0 + resolution: "convert-string@npm:0.1.0" + checksum: a1775cb186d2fbf175486f02e3f7cc68c75e7a0c7609bf434d2a933e801b3a0499ab57de4230919ec824351dc344055bf639a1db5e44a976787145817106d9aa + languageName: node + linkType: hard + "create-require@npm:^1.1.0": version: 1.1.1 resolution: "create-require@npm:1.1.1" @@ -4777,6 +4811,16 @@ __metadata: languageName: node linkType: hard +"sha256@npm:^0.2.0": + version: 0.2.0 + resolution: "sha256@npm:0.2.0" + dependencies: + convert-hex: ~0.1.0 + convert-string: ~0.1.0 + checksum: bed2d6507279e34ad2c517d18fbe871900244aca425a298d6ba10115e9beb49a8028296aeff5441b6db4902503a47198138e23ba1be440761a84288c93101ca1 + languageName: node + linkType: hard + "shebang-command@npm:^2.0.0": version: 2.0.0 resolution: "shebang-command@npm:2.0.0" From 6eeba71428637fe6a139f53b94f711ab465a3e2f Mon Sep 17 00:00:00 2001 From: PhilWindle Date: Thu, 16 Mar 2023 11:49:30 +0000 Subject: [PATCH 05/36] WIP --- yarn-project/world-state/package.json | 2 +- yarn-project/yarn.lock | 651 +++++++++++++------------- yarn.lock | 4 - 3 files changed, 333 insertions(+), 324 deletions(-) delete mode 100644 yarn.lock diff --git a/yarn-project/world-state/package.json b/yarn-project/world-state/package.json index 4e9bb689ff5..8b596f9f9cf 100644 --- a/yarn-project/world-state/package.json +++ b/yarn-project/world-state/package.json @@ -24,7 +24,7 @@ "rootDir": "./src" }, "dependencies": { - "@aztec/data-archiver": "workspace:^", + "@aztec/archiver": "workspace:^", "@aztec/merkle-tree": "workspace:^", "levelup": "^5.1.1", "memdown": "^6.1.1", diff --git a/yarn-project/yarn.lock b/yarn-project/yarn.lock index eed46caa218..23e828c509a 100644 --- a/yarn-project/yarn.lock +++ b/yarn-project/yarn.lock @@ -32,7 +32,7 @@ __metadata: languageName: unknown linkType: soft -"@aztec/archiver@workspace:archiver": +"@aztec/archiver@workspace:^, @aztec/archiver@workspace:archiver": version: 0.0.0-use.local resolution: "@aztec/archiver@workspace:archiver" dependencies: @@ -375,7 +375,7 @@ __metadata: version: 0.0.0-use.local resolution: "@aztec/world-state@workspace:world-state" dependencies: - "@aztec/data-archiver": "workspace:^" + "@aztec/archiver": "workspace:^" "@aztec/eslint-config": "workspace:^" "@aztec/merkle-tree": "workspace:^" "@jest/globals": ^29.4.3 @@ -411,37 +411,37 @@ __metadata: linkType: hard "@babel/core@npm:^7.11.6, @babel/core@npm:^7.12.3": - version: 7.21.0 - resolution: "@babel/core@npm:7.21.0" + version: 7.21.3 + resolution: "@babel/core@npm:7.21.3" dependencies: "@ampproject/remapping": ^2.2.0 "@babel/code-frame": ^7.18.6 - "@babel/generator": ^7.21.0 + "@babel/generator": ^7.21.3 "@babel/helper-compilation-targets": ^7.20.7 - "@babel/helper-module-transforms": ^7.21.0 + "@babel/helper-module-transforms": ^7.21.2 "@babel/helpers": ^7.21.0 - "@babel/parser": ^7.21.0 + "@babel/parser": ^7.21.3 "@babel/template": ^7.20.7 - "@babel/traverse": ^7.21.0 - "@babel/types": ^7.21.0 + "@babel/traverse": ^7.21.3 + "@babel/types": ^7.21.3 convert-source-map: ^1.7.0 debug: ^4.1.0 gensync: ^1.0.0-beta.2 json5: ^2.2.2 semver: ^6.3.0 - checksum: 357f4dd3638861ceebf6d95ff49ad8b902065ee8b7b352621deed5666c2a6d702a48ca7254dba23ecae2a0afb67d20f90db7dd645c3b75e35e72ad9776c671aa + checksum: bef25fbea96f461bf79bd1d0e4f0cdce679fd5ada464a89c1141ddba59ae1adfdbb23e04440c266ed525712d33d5ffd818cd8b0c25b1dee0e648d5559516153a languageName: node linkType: hard -"@babel/generator@npm:^7.21.0, @babel/generator@npm:^7.21.1, @babel/generator@npm:^7.7.2": - version: 7.21.1 - resolution: "@babel/generator@npm:7.21.1" +"@babel/generator@npm:^7.21.3, @babel/generator@npm:^7.7.2": + version: 7.21.3 + resolution: "@babel/generator@npm:7.21.3" dependencies: - "@babel/types": ^7.21.0 + "@babel/types": ^7.21.3 "@jridgewell/gen-mapping": ^0.3.2 "@jridgewell/trace-mapping": ^0.3.17 jsesc: ^2.5.1 - checksum: 69085a211ff91a7a608ee3f86e6fcb9cf5e724b756d792a713b0c328a671cd3e423e1ef1b12533f366baba0616caffe0a7ba9d328727eab484de5961badbef00 + checksum: be6bb5a32a0273260b91210d4137b7b5da148a2db8dd324654275cb0af865ae59de5e1536e93ac83423b2586415059e1c24cf94293026755cf995757238da749 languageName: node linkType: hard @@ -495,7 +495,7 @@ __metadata: languageName: node linkType: hard -"@babel/helper-module-transforms@npm:^7.21.0": +"@babel/helper-module-transforms@npm:^7.21.2": version: 7.21.2 resolution: "@babel/helper-module-transforms@npm:7.21.2" dependencies: @@ -579,12 +579,12 @@ __metadata: languageName: node linkType: hard -"@babel/parser@npm:^7.1.0, @babel/parser@npm:^7.14.7, @babel/parser@npm:^7.20.7, @babel/parser@npm:^7.21.0, @babel/parser@npm:^7.21.2": - version: 7.21.2 - resolution: "@babel/parser@npm:7.21.2" +"@babel/parser@npm:^7.1.0, @babel/parser@npm:^7.14.7, @babel/parser@npm:^7.20.7, @babel/parser@npm:^7.21.3": + version: 7.21.3 + resolution: "@babel/parser@npm:7.21.3" bin: parser: ./bin/babel-parser.js - checksum: e2b89de2c63d4cdd2cafeaea34f389bba729727eec7a8728f736bc472a59396059e3e9fe322c9bed8fd126d201fb609712949dc8783f4cae4806acd9a73da6ff + checksum: a71e6456a1260c2a943736b56cc0acdf5f2a53c6c79e545f56618967e51f9b710d1d3359264e7c979313a7153741b1d95ad8860834cc2ab4ce4f428b13cc07be languageName: node linkType: hard @@ -753,32 +753,32 @@ __metadata: languageName: node linkType: hard -"@babel/traverse@npm:^7.21.0, @babel/traverse@npm:^7.21.2, @babel/traverse@npm:^7.7.2": - version: 7.21.2 - resolution: "@babel/traverse@npm:7.21.2" +"@babel/traverse@npm:^7.21.0, @babel/traverse@npm:^7.21.2, @babel/traverse@npm:^7.21.3, @babel/traverse@npm:^7.7.2": + version: 7.21.3 + resolution: "@babel/traverse@npm:7.21.3" dependencies: "@babel/code-frame": ^7.18.6 - "@babel/generator": ^7.21.1 + "@babel/generator": ^7.21.3 "@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.2 - "@babel/types": ^7.21.2 + "@babel/parser": ^7.21.3 + "@babel/types": ^7.21.3 debug: ^4.1.0 globals: ^11.1.0 - checksum: d851e3f5cfbdc2fac037a014eae7b0707709de50f7d2fbb82ffbf932d3eeba90a77431529371d6e544f8faaf8c6540eeb18fdd8d1c6fa2b61acea0fb47e18d4b + checksum: 0af5bcd47a2fc501592b90ac1feae9d449afb9ab0772a4f6e68230f4cd3a475795d538c1de3f880fe3414b6c2820bac84d02c6549eea796f39d74a603717447b languageName: node linkType: hard -"@babel/types@npm:^7.0.0, @babel/types@npm:^7.18.6, @babel/types@npm:^7.20.2, @babel/types@npm:^7.20.7, @babel/types@npm:^7.21.0, @babel/types@npm:^7.21.2, @babel/types@npm:^7.3.0, @babel/types@npm:^7.3.3, @babel/types@npm:^7.8.3": - version: 7.21.2 - resolution: "@babel/types@npm:7.21.2" +"@babel/types@npm:^7.0.0, @babel/types@npm:^7.18.6, @babel/types@npm:^7.20.2, @babel/types@npm:^7.20.7, @babel/types@npm:^7.21.0, @babel/types@npm:^7.21.2, @babel/types@npm:^7.21.3, @babel/types@npm:^7.3.0, @babel/types@npm:^7.3.3, @babel/types@npm:^7.8.3": + version: 7.21.3 + resolution: "@babel/types@npm:7.21.3" dependencies: "@babel/helper-string-parser": ^7.19.4 "@babel/helper-validator-identifier": ^7.19.1 to-fast-properties: ^2.0.0 - checksum: a45a52acde139e575502c6de42c994bdbe262bafcb92ae9381fb54cdf1a3672149086843fda655c7683ce9806e998fd002bbe878fa44984498d0fdc7935ce7ff + checksum: b750274718ba9cefd0b81836c464009bb6ba339fccce51b9baff497a0a2d96c044c61dc90cf203cec0adc770454b53a9681c3f7716883c802b85ab84c365ba35 languageName: node linkType: hard @@ -798,192 +798,210 @@ __metadata: languageName: node linkType: hard -"@es-joy/jsdoccomment@npm:~0.36.1": - version: 0.36.1 - resolution: "@es-joy/jsdoccomment@npm:0.36.1" +"@es-joy/jsdoccomment@npm:~0.37.0": + version: 0.37.0 + resolution: "@es-joy/jsdoccomment@npm:0.37.0" dependencies: comment-parser: 1.3.1 esquery: ^1.4.0 - jsdoc-type-pratt-parser: ~3.1.0 - checksum: 28e697779230dc6a95b1f233a8c2a72b64fbea686e407106e5d4292083421a997452731c414de26c10bee86e8e0397c5fb84d6ecfd4b472a29735e1af103ddb6 + jsdoc-type-pratt-parser: ~4.0.0 + checksum: 949c0d164573f189998a7ad7ace936639535e1cacf495d7daa893142dbe9e947f146602615732eaa3174b7ca08af9eea5d9fa97a68fdfe0aa14213ab0f319b13 languageName: node linkType: hard -"@esbuild/android-arm64@npm:0.16.17": - version: 0.16.17 - resolution: "@esbuild/android-arm64@npm:0.16.17" +"@esbuild/android-arm64@npm:0.17.11": + version: 0.17.11 + resolution: "@esbuild/android-arm64@npm:0.17.11" conditions: os=android & cpu=arm64 languageName: node linkType: hard -"@esbuild/android-arm@npm:0.16.17": - version: 0.16.17 - resolution: "@esbuild/android-arm@npm:0.16.17" +"@esbuild/android-arm@npm:0.17.11": + version: 0.17.11 + resolution: "@esbuild/android-arm@npm:0.17.11" conditions: os=android & cpu=arm languageName: node linkType: hard -"@esbuild/android-x64@npm:0.16.17": - version: 0.16.17 - resolution: "@esbuild/android-x64@npm:0.16.17" +"@esbuild/android-x64@npm:0.17.11": + version: 0.17.11 + resolution: "@esbuild/android-x64@npm:0.17.11" conditions: os=android & cpu=x64 languageName: node linkType: hard -"@esbuild/darwin-arm64@npm:0.16.17": - version: 0.16.17 - resolution: "@esbuild/darwin-arm64@npm:0.16.17" +"@esbuild/darwin-arm64@npm:0.17.11": + version: 0.17.11 + resolution: "@esbuild/darwin-arm64@npm:0.17.11" conditions: os=darwin & cpu=arm64 languageName: node linkType: hard -"@esbuild/darwin-x64@npm:0.16.17": - version: 0.16.17 - resolution: "@esbuild/darwin-x64@npm:0.16.17" +"@esbuild/darwin-x64@npm:0.17.11": + version: 0.17.11 + resolution: "@esbuild/darwin-x64@npm:0.17.11" conditions: os=darwin & cpu=x64 languageName: node linkType: hard -"@esbuild/freebsd-arm64@npm:0.16.17": - version: 0.16.17 - resolution: "@esbuild/freebsd-arm64@npm:0.16.17" +"@esbuild/freebsd-arm64@npm:0.17.11": + version: 0.17.11 + resolution: "@esbuild/freebsd-arm64@npm:0.17.11" conditions: os=freebsd & cpu=arm64 languageName: node linkType: hard -"@esbuild/freebsd-x64@npm:0.16.17": - version: 0.16.17 - resolution: "@esbuild/freebsd-x64@npm:0.16.17" +"@esbuild/freebsd-x64@npm:0.17.11": + version: 0.17.11 + resolution: "@esbuild/freebsd-x64@npm:0.17.11" conditions: os=freebsd & cpu=x64 languageName: node linkType: hard -"@esbuild/linux-arm64@npm:0.16.17": - version: 0.16.17 - resolution: "@esbuild/linux-arm64@npm:0.16.17" +"@esbuild/linux-arm64@npm:0.17.11": + version: 0.17.11 + resolution: "@esbuild/linux-arm64@npm:0.17.11" conditions: os=linux & cpu=arm64 languageName: node linkType: hard -"@esbuild/linux-arm@npm:0.16.17": - version: 0.16.17 - resolution: "@esbuild/linux-arm@npm:0.16.17" +"@esbuild/linux-arm@npm:0.17.11": + version: 0.17.11 + resolution: "@esbuild/linux-arm@npm:0.17.11" conditions: os=linux & cpu=arm languageName: node linkType: hard -"@esbuild/linux-ia32@npm:0.16.17": - version: 0.16.17 - resolution: "@esbuild/linux-ia32@npm:0.16.17" +"@esbuild/linux-ia32@npm:0.17.11": + version: 0.17.11 + resolution: "@esbuild/linux-ia32@npm:0.17.11" conditions: os=linux & cpu=ia32 languageName: node linkType: hard -"@esbuild/linux-loong64@npm:0.16.17": - version: 0.16.17 - resolution: "@esbuild/linux-loong64@npm:0.16.17" +"@esbuild/linux-loong64@npm:0.17.11": + version: 0.17.11 + resolution: "@esbuild/linux-loong64@npm:0.17.11" conditions: os=linux & cpu=loong64 languageName: node linkType: hard -"@esbuild/linux-mips64el@npm:0.16.17": - version: 0.16.17 - resolution: "@esbuild/linux-mips64el@npm:0.16.17" +"@esbuild/linux-mips64el@npm:0.17.11": + version: 0.17.11 + resolution: "@esbuild/linux-mips64el@npm:0.17.11" conditions: os=linux & cpu=mips64el languageName: node linkType: hard -"@esbuild/linux-ppc64@npm:0.16.17": - version: 0.16.17 - resolution: "@esbuild/linux-ppc64@npm:0.16.17" +"@esbuild/linux-ppc64@npm:0.17.11": + version: 0.17.11 + resolution: "@esbuild/linux-ppc64@npm:0.17.11" conditions: os=linux & cpu=ppc64 languageName: node linkType: hard -"@esbuild/linux-riscv64@npm:0.16.17": - version: 0.16.17 - resolution: "@esbuild/linux-riscv64@npm:0.16.17" +"@esbuild/linux-riscv64@npm:0.17.11": + version: 0.17.11 + resolution: "@esbuild/linux-riscv64@npm:0.17.11" conditions: os=linux & cpu=riscv64 languageName: node linkType: hard -"@esbuild/linux-s390x@npm:0.16.17": - version: 0.16.17 - resolution: "@esbuild/linux-s390x@npm:0.16.17" +"@esbuild/linux-s390x@npm:0.17.11": + version: 0.17.11 + resolution: "@esbuild/linux-s390x@npm:0.17.11" conditions: os=linux & cpu=s390x languageName: node linkType: hard -"@esbuild/linux-x64@npm:0.16.17": - version: 0.16.17 - resolution: "@esbuild/linux-x64@npm:0.16.17" +"@esbuild/linux-x64@npm:0.17.11": + version: 0.17.11 + resolution: "@esbuild/linux-x64@npm:0.17.11" conditions: os=linux & cpu=x64 languageName: node linkType: hard -"@esbuild/netbsd-x64@npm:0.16.17": - version: 0.16.17 - resolution: "@esbuild/netbsd-x64@npm:0.16.17" +"@esbuild/netbsd-x64@npm:0.17.11": + version: 0.17.11 + resolution: "@esbuild/netbsd-x64@npm:0.17.11" conditions: os=netbsd & cpu=x64 languageName: node linkType: hard -"@esbuild/openbsd-x64@npm:0.16.17": - version: 0.16.17 - resolution: "@esbuild/openbsd-x64@npm:0.16.17" +"@esbuild/openbsd-x64@npm:0.17.11": + version: 0.17.11 + resolution: "@esbuild/openbsd-x64@npm:0.17.11" conditions: os=openbsd & cpu=x64 languageName: node linkType: hard -"@esbuild/sunos-x64@npm:0.16.17": - version: 0.16.17 - resolution: "@esbuild/sunos-x64@npm:0.16.17" +"@esbuild/sunos-x64@npm:0.17.11": + version: 0.17.11 + resolution: "@esbuild/sunos-x64@npm:0.17.11" conditions: os=sunos & cpu=x64 languageName: node linkType: hard -"@esbuild/win32-arm64@npm:0.16.17": - version: 0.16.17 - resolution: "@esbuild/win32-arm64@npm:0.16.17" +"@esbuild/win32-arm64@npm:0.17.11": + version: 0.17.11 + resolution: "@esbuild/win32-arm64@npm:0.17.11" conditions: os=win32 & cpu=arm64 languageName: node linkType: hard -"@esbuild/win32-ia32@npm:0.16.17": - version: 0.16.17 - resolution: "@esbuild/win32-ia32@npm:0.16.17" +"@esbuild/win32-ia32@npm:0.17.11": + version: 0.17.11 + resolution: "@esbuild/win32-ia32@npm:0.17.11" conditions: os=win32 & cpu=ia32 languageName: node linkType: hard -"@esbuild/win32-x64@npm:0.16.17": - version: 0.16.17 - resolution: "@esbuild/win32-x64@npm:0.16.17" +"@esbuild/win32-x64@npm:0.17.11": + version: 0.17.11 + resolution: "@esbuild/win32-x64@npm:0.17.11" conditions: os=win32 & cpu=x64 languageName: node linkType: hard -"@eslint/eslintrc@npm:^2.0.0": - version: 2.0.0 - resolution: "@eslint/eslintrc@npm:2.0.0" +"@eslint-community/eslint-utils@npm:^4.2.0": + version: 4.2.0 + resolution: "@eslint-community/eslint-utils@npm:4.2.0" + dependencies: + eslint-visitor-keys: ^3.3.0 + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + checksum: 82fdd1cc2a5d169def0e665ec790580ef708e7df9c91f20006595dc90e3bd42ec31c8976a2eeccd336286301a72e937c0ddf3ab4b7377d7014997c36333a7d22 + languageName: node + linkType: hard + +"@eslint-community/regexpp@npm:^4.4.0": + version: 4.4.0 + resolution: "@eslint-community/regexpp@npm:4.4.0" + checksum: 2d127af0c752b80e8a782eacfe996a86925d21de92da3ffc6f9e615e701145e44a62e26bdd88bfac2cd76779c39ba8d9875a91046ec5e7e5f23cb647c247ea6a + languageName: node + linkType: hard + +"@eslint/eslintrc@npm:^2.0.1": + version: 2.0.1 + resolution: "@eslint/eslintrc@npm:2.0.1" dependencies: ajv: ^6.12.4 debug: ^4.3.2 - espree: ^9.4.0 + espree: ^9.5.0 globals: ^13.19.0 ignore: ^5.2.0 import-fresh: ^3.2.1 js-yaml: ^4.1.0 minimatch: ^3.1.2 strip-json-comments: ^3.1.1 - checksum: 31119c8ca06723d80384f18f5c78e0530d8e6306ad36379868650131a8b10dd7cffd7aff79a5deb3a2e9933660823052623d268532bae9538ded53d5b19a69a6 + checksum: 56b9192a687a450db53a7b883daf9f0f447c43b3510189cf88808a7a2467c2a302a42a50f184cc6d5a9faf3d1df890a2ef0fd0d60b751f32a3e9dfea717c6b48 languageName: node linkType: hard -"@eslint/js@npm:8.35.0": - version: 8.35.0 - resolution: "@eslint/js@npm:8.35.0" - checksum: 6687ceff659a6d617e37823f809dc9c4b096535961a81acead27d26b1a51a4cf608a5e59d831ddd57f24f6f8bb99340a4a0e19f9c99b390fbb4b275f51ed5f5e +"@eslint/js@npm:8.36.0": + version: 8.36.0 + resolution: "@eslint/js@npm:8.36.0" + checksum: b7d6b84b823c8c7784be390741196617565527b1f7c0977fde9455bfb57fd88f81c074a03dd878757d2c33fa29f24291e9ecbc1425710f067917324b55e1bf3a languageName: node linkType: hard @@ -1588,6 +1606,13 @@ __metadata: languageName: node linkType: hard +"@noble/secp256k1@npm:^1.7.1": + version: 1.7.1 + resolution: "@noble/secp256k1@npm:1.7.1" + checksum: d2301f1f7690368d8409a3152450458f27e54df47e3f917292de3de82c298770890c2de7c967d237eff9c95b70af485389a9695f73eb05a43e2bd562d18b18cb + languageName: node + linkType: hard + "@nodelib/fs.scandir@npm:2.1.5": version: 2.1.5 resolution: "@nodelib/fs.scandir@npm:2.1.5" @@ -1845,23 +1870,13 @@ __metadata: languageName: node linkType: hard -"@types/jest@npm:^29.4.0": - version: 29.4.0 - resolution: "@types/jest@npm:29.4.0" +"@types/jest@npm:^29.4.0, @types/jest@npm:^29.4.1": + version: 29.4.4 + resolution: "@types/jest@npm:29.4.4" dependencies: expect: ^29.0.0 pretty-format: ^29.0.0 - checksum: 23760282362a252e6690314584d83a47512d4cd61663e957ed3398ecf98195fe931c45606ee2f9def12f8ed7d8aa102d492ec42d26facdaf8b78094a31e6568e - languageName: node - linkType: hard - -"@types/jest@npm:^29.4.1": - version: 29.4.1 - resolution: "@types/jest@npm:29.4.1" - dependencies: - expect: ^29.0.0 - pretty-format: ^29.0.0 - checksum: 75cdd1804615b663b88844eef61cb7c8104d65baf718190a1cd88ce199412dbe2ee136df3698604cc258a9a62ba7cbd7bd7712a17d8cb748909263ef56d6aac3 + checksum: 754c21d996c3457c761e55c4076a2dd14d82e6290c3f57122db17aa07ef59c12af7df50a82a06845ef9ba1fbf75bb024a1fed68426514618856bda7fb90eb773 languageName: node linkType: hard @@ -1899,28 +1914,14 @@ __metadata: languageName: node linkType: hard -"@types/node@npm:*, @types/node@npm:^18.7.23": - version: 18.14.6 - resolution: "@types/node@npm:18.14.6" - checksum: 2f88f482cabadc6dbddd627a1674239e68c3c9beab56eb4ae2309fb96fd17fc3a509d99b0309bafe13b58529574f49ecf3a583f2ebe2896dd32fe4be436dc96e - languageName: node - linkType: hard - -"@types/node@npm:^18.14.6, @types/node@npm:^18.15.0, @types/node@npm:^18.15.2": - version: 18.15.2 - resolution: "@types/node@npm:18.15.2" - checksum: 6db83062d295f9da63e7b24477f734b497170a577b21e0c13637d6f355d53713f875536e52ff02938221330d919700b5ed787dc493e32624a3ecb6c86105cfc8 - languageName: node - linkType: hard - -"@types/node@npm:^18.14.6": - version: 18.14.6 - resolution: "@types/node@npm:18.14.6" - checksum: 2f88f482cabadc6dbddd627a1674239e68c3c9beab56eb4ae2309fb96fd17fc3a509d99b0309bafe13b58529574f49ecf3a583f2ebe2896dd32fe4be436dc96e +"@types/ms@npm:*": + version: 0.7.31 + resolution: "@types/ms@npm:0.7.31" + checksum: daadd354aedde024cce6f5aa873fefe7b71b22cd0e28632a69e8b677aeb48ae8caa1c60e5919bb781df040d116b01cb4316335167a3fc0ef6a63fa3614c0f6da languageName: node linkType: hard -"@types/node@npm:^18.15.3": +"@types/node@npm:*, @types/node@npm:^18.14.6, @types/node@npm:^18.15.0, @types/node@npm:^18.15.2, @types/node@npm:^18.15.3, @types/node@npm:^18.7.23": version: 18.15.3 resolution: "@types/node@npm:18.15.3" checksum: 31b1d92475a82c30de29aa6c0771b18a276552d191283b4423ba2d61b3f01159bf0d02576c0b7cc834b043997893800db6bb47f246083ed85aa45e79c80875d7 @@ -1990,17 +1991,17 @@ __metadata: linkType: hard "@typescript-eslint/eslint-plugin@npm:^5.38.0": - version: 5.54.1 - resolution: "@typescript-eslint/eslint-plugin@npm:5.54.1" + version: 5.55.0 + resolution: "@typescript-eslint/eslint-plugin@npm:5.55.0" dependencies: - "@typescript-eslint/scope-manager": 5.54.1 - "@typescript-eslint/type-utils": 5.54.1 - "@typescript-eslint/utils": 5.54.1 + "@eslint-community/regexpp": ^4.4.0 + "@typescript-eslint/scope-manager": 5.55.0 + "@typescript-eslint/type-utils": 5.55.0 + "@typescript-eslint/utils": 5.55.0 debug: ^4.3.4 grapheme-splitter: ^1.0.4 ignore: ^5.2.0 natural-compare-lite: ^1.4.0 - regexpp: ^3.2.0 semver: ^7.3.7 tsutils: ^3.21.0 peerDependencies: @@ -2009,43 +2010,43 @@ __metadata: peerDependenciesMeta: typescript: optional: true - checksum: 76476c08ca0142a9bf6e2381f5cd1c037d86fbafa9c0dded4a97bd3b23b5962dd2c3943bade11b21d674195674f0e36dbf80faa15a1906f5a2ca1f699baf1dd5 + checksum: e3239ec6016eeb73b8b4d8310581978e28b8d3378140a8eb70bd8e33ffd332266020c19d493e0ccae4edfd4abd6097608718c50308fe6288f4ffeb8e4784efd9 languageName: node linkType: hard "@typescript-eslint/parser@npm:^5.38.0": - version: 5.54.1 - resolution: "@typescript-eslint/parser@npm:5.54.1" + version: 5.55.0 + resolution: "@typescript-eslint/parser@npm:5.55.0" dependencies: - "@typescript-eslint/scope-manager": 5.54.1 - "@typescript-eslint/types": 5.54.1 - "@typescript-eslint/typescript-estree": 5.54.1 + "@typescript-eslint/scope-manager": 5.55.0 + "@typescript-eslint/types": 5.55.0 + "@typescript-eslint/typescript-estree": 5.55.0 debug: ^4.3.4 peerDependencies: eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 peerDependenciesMeta: typescript: optional: true - checksum: f466513d306ca926b97c2cec1eebaf2cd15d45bd5633a4358f23ba9a4de1b0ec4630b1c20abc395943934ed1d2ef65f545fd6737c317a7abe579612101e8a83f + checksum: 48a20dc7e67960b5168b77bfb9d11d053a21d57bb83cf7b59f750191cbca5eea3b4636a8e6e75cc0aca5a84cdef91fed5440934fc2935f8c6fa71630a253a50c languageName: node linkType: hard -"@typescript-eslint/scope-manager@npm:5.54.1": - version: 5.54.1 - resolution: "@typescript-eslint/scope-manager@npm:5.54.1" +"@typescript-eslint/scope-manager@npm:5.55.0": + version: 5.55.0 + resolution: "@typescript-eslint/scope-manager@npm:5.55.0" dependencies: - "@typescript-eslint/types": 5.54.1 - "@typescript-eslint/visitor-keys": 5.54.1 - checksum: 9add24cf3a7852634ad0680a827646860ac4698a6ac8aae31e8b781e29f59e84b51f0cdaacffd0747811012647f01b51969d988da9b302ead374ceebffbe204b + "@typescript-eslint/types": 5.55.0 + "@typescript-eslint/visitor-keys": 5.55.0 + checksum: f253db88f69a29e4abe2f567d0a611cc3e7fb1a911a2cc54a2f6baf16e3de4d1883b3f8e45ee61b3db9fa5543dda0fd7b608de9d28ba6173ab49bfd17ff90cad languageName: node linkType: hard -"@typescript-eslint/type-utils@npm:5.54.1": - version: 5.54.1 - resolution: "@typescript-eslint/type-utils@npm:5.54.1" +"@typescript-eslint/type-utils@npm:5.55.0": + version: 5.55.0 + resolution: "@typescript-eslint/type-utils@npm:5.55.0" dependencies: - "@typescript-eslint/typescript-estree": 5.54.1 - "@typescript-eslint/utils": 5.54.1 + "@typescript-eslint/typescript-estree": 5.55.0 + "@typescript-eslint/utils": 5.55.0 debug: ^4.3.4 tsutils: ^3.21.0 peerDependencies: @@ -2053,23 +2054,23 @@ __metadata: peerDependenciesMeta: typescript: optional: true - checksum: 0073838b782b7f4619775be124ca6643fec43a2d56043eaf3ceb100960a5193f14ac747b28ce17a5c9ac643fdee8abda82a7d905c81521358de7b27a2dcbc9af + checksum: 5c60d441355b51f96b596324068c10605c74abb46748c0bbc6d8f7f2ea40acb6b4bda3b537105fa189172324c56d18bd88e7102e67f99f8c03bc05c6d0e2023d languageName: node linkType: hard -"@typescript-eslint/types@npm:5.54.1": - version: 5.54.1 - resolution: "@typescript-eslint/types@npm:5.54.1" - checksum: 84a8f725cfa10646af389659e09c510c38d82c65960c7b613f844a264acc0e197471cba03f3e8f4b6411bc35dca28922c8352a7bd44621411c73fd6dd4096da2 +"@typescript-eslint/types@npm:5.55.0": + version: 5.55.0 + resolution: "@typescript-eslint/types@npm:5.55.0" + checksum: 7d851f09a2106514d3a9c7164d34758f30abfe554e3c7a02be75cdc7e16644e23ca32840a8f39a0321bc509927fb4d98ce91b22b21e8544ac56cef33b815a864 languageName: node linkType: hard -"@typescript-eslint/typescript-estree@npm:5.54.1": - version: 5.54.1 - resolution: "@typescript-eslint/typescript-estree@npm:5.54.1" +"@typescript-eslint/typescript-estree@npm:5.55.0": + version: 5.55.0 + resolution: "@typescript-eslint/typescript-estree@npm:5.55.0" dependencies: - "@typescript-eslint/types": 5.54.1 - "@typescript-eslint/visitor-keys": 5.54.1 + "@typescript-eslint/types": 5.55.0 + "@typescript-eslint/visitor-keys": 5.55.0 debug: ^4.3.4 globby: ^11.1.0 is-glob: ^4.0.3 @@ -2078,47 +2079,47 @@ __metadata: peerDependenciesMeta: typescript: optional: true - checksum: ea42bdb4832fa96fa1121237c9b664ac4506e2836646651e08a8542c8601d78af6c288779707f893ca4c884221829bb7d7b4b43c4a9c3ed959519266d03a139b + checksum: d24a11aee3d01067018d99804f420aecb8af88e43bf170d5d14f6480bd378c0a81ce49a37f5d6c36e5f0f319e3fa8b099720f295f2767338be1a4f7e9a5323e1 languageName: node linkType: hard -"@typescript-eslint/utils@npm:5.54.1": - version: 5.54.1 - resolution: "@typescript-eslint/utils@npm:5.54.1" +"@typescript-eslint/utils@npm:5.55.0": + version: 5.55.0 + resolution: "@typescript-eslint/utils@npm:5.55.0" dependencies: + "@eslint-community/eslint-utils": ^4.2.0 "@types/json-schema": ^7.0.9 "@types/semver": ^7.3.12 - "@typescript-eslint/scope-manager": 5.54.1 - "@typescript-eslint/types": 5.54.1 - "@typescript-eslint/typescript-estree": 5.54.1 + "@typescript-eslint/scope-manager": 5.55.0 + "@typescript-eslint/types": 5.55.0 + "@typescript-eslint/typescript-estree": 5.55.0 eslint-scope: ^5.1.1 - eslint-utils: ^3.0.0 semver: ^7.3.7 peerDependencies: eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 - checksum: 8f428ea4d338ce85d55fd0c9ae2b217b323f29f51b7c9f8077fef7001ca21d28b032c5e5165b67ae6057aef69edb0e7a164c3c483703be6f3e4e574248bbc399 + checksum: 368cfc3fb9d6af6901e739e2e41c3f7f1c1244576607445f4f59d95eccb237f73e1a75e7f0816ec9a32a0f1ec6bb4a3602a99e17e70fe184e62f7c69dcbe4b8d languageName: node linkType: hard -"@typescript-eslint/visitor-keys@npm:5.54.1": - version: 5.54.1 - resolution: "@typescript-eslint/visitor-keys@npm:5.54.1" +"@typescript-eslint/visitor-keys@npm:5.55.0": + version: 5.55.0 + resolution: "@typescript-eslint/visitor-keys@npm:5.55.0" dependencies: - "@typescript-eslint/types": 5.54.1 + "@typescript-eslint/types": 5.55.0 eslint-visitor-keys: ^3.3.0 - checksum: 3a691abd2a43b86a0c41526d14a2afcc93a2e0512b5f8b9ec43f6029c493870808036eae5ee4fc655d26e1999017c4a4dffb241f47c36c2a1238ec9fbd08719c + checksum: 0b24c72dff99dd2cf41c19d20067f8ab20a38aa2e82c79c5530bec7cf651031e95c80702fc21c813c9b94e5f3d4cd210f13967b2966ef38abe548cb5f05848a3 languageName: node linkType: hard "@wagmi/chains@npm:~0.2.11": - version: 0.2.11 - resolution: "@wagmi/chains@npm:0.2.11" + version: 0.2.12 + resolution: "@wagmi/chains@npm:0.2.12" peerDependencies: typescript: ">=4.9.4" peerDependenciesMeta: typescript: optional: true - checksum: 240d810fa254f15619a669be52cbb1839075cb2b77c89fb08d3409ccbbb0903fe817fec8ca0739bb1015335b608664ac8038026571b7bc3a43e70ea39dccc3a9 + checksum: 3f7d7c1026664e990da3b27bddada59a157f0b2d986020601aaa4e6eea5cb5b60ddc0154e0a00bc8e9b1345ca3fc4736df1ef8f8475fc3ad8094512786df4f75 languageName: node linkType: hard @@ -2129,6 +2130,19 @@ __metadata: languageName: node linkType: hard +"abitype@npm:~0.7.1": + version: 0.7.1 + resolution: "abitype@npm:0.7.1" + peerDependencies: + typescript: ">=4.9.4" + zod: ^3 >=3.19.1 + peerDependenciesMeta: + zod: + optional: true + checksum: de0d7082d28a4835b3d8dc4d8c75e9222c95a1f9eed13d6b2381403b46f46b68ea7a281e8ba6628d259a98c54ea466ebc206eec21db6205fa1641c7393854f5e + languageName: node + linkType: hard + "abstract-leveldown@npm:^7.2.0": version: 7.2.0 resolution: "abstract-leveldown@npm:7.2.0" @@ -2586,7 +2600,7 @@ __metadata: languageName: node linkType: hard -"buffer@npm:6.0.3": +"buffer@npm:6.0.3, buffer@npm:^6.0.3": version: 6.0.3 resolution: "buffer@npm:6.0.3" dependencies: @@ -2644,9 +2658,9 @@ __metadata: linkType: hard "caniuse-lite@npm:^1.0.30001449": - version: 1.0.30001462 - resolution: "caniuse-lite@npm:1.0.30001462" - checksum: e4a57d7851eec65e7c9b6c11c4bbcecdc49d87b1b01bff3c15ea27efb05f959891b4c70ac169842067c134d6fa126d9ad5a91d0f85c7387c5bd912eaf41ea647 + version: 1.0.30001466 + resolution: "caniuse-lite@npm:1.0.30001466" + checksum: d81d0801f72162ebb7edb222cb48702f351e1a2d6acc9f340913f5b07e28c2105d1d2de9f0633c9b89e1aa1cd14f5d9154e270bf7b61296a7209745b32bdb01c languageName: node linkType: hard @@ -2838,6 +2852,13 @@ __metadata: languageName: node linkType: hard +"convert-string@npm:~0.1.0": + version: 0.1.0 + resolution: "convert-string@npm:0.1.0" + checksum: a1775cb186d2fbf175486f02e3f7cc68c75e7a0c7609bf434d2a933e801b3a0499ab57de4230919ec824351dc344055bf639a1db5e44a976787145817106d9aa + languageName: node + linkType: hard + "create-hash@npm:^1.1.0, create-hash@npm:^1.1.2": version: 1.2.0 resolution: "create-hash@npm:1.2.0" @@ -3001,9 +3022,9 @@ __metadata: linkType: hard "electron-to-chromium@npm:^1.4.284": - version: 1.4.322 - resolution: "electron-to-chromium@npm:1.4.322" - checksum: 195796a25f28b315d4e2ee17f8aac9d8f7a98c8aaad1b9633113cf6ea8394094b45132e2a7f4e191ec1492303e54fb23667c9ce7794a5a57c961a37aaccaa6cd + version: 1.4.332 + resolution: "electron-to-chromium@npm:1.4.332" + checksum: d65870e47b41dce95ca246ddd27179539de1af34a2f79cdb892b70c8bd6c2ed751aeb937bffd1fbd22e1d63b5c6bf4ce67430f208e6970a51c81e98e0beea1f4 languageName: node linkType: hard @@ -3022,13 +3043,6 @@ __metadata: languageName: node linkType: hard -"emitter-component@npm:^1.1.1": - version: 1.1.1 - resolution: "emitter-component@npm:1.1.1" - checksum: 10e907f507a8c16a318e07595119e58b5c3267528d4e3b962ee9b14fd83c97599e7931ccb983ec551a8de8116955c1d6ae7d213c5b0c920b62c02b7cb8d7a4d7 - languageName: node - linkType: hard - "emittery@npm:^0.10.2": version: 0.10.2 resolution: "emittery@npm:0.10.2" @@ -3082,32 +3096,32 @@ __metadata: languageName: node linkType: hard -"esbuild@npm:^0.16.14": - version: 0.16.17 - resolution: "esbuild@npm:0.16.17" - dependencies: - "@esbuild/android-arm": 0.16.17 - "@esbuild/android-arm64": 0.16.17 - "@esbuild/android-x64": 0.16.17 - "@esbuild/darwin-arm64": 0.16.17 - "@esbuild/darwin-x64": 0.16.17 - "@esbuild/freebsd-arm64": 0.16.17 - "@esbuild/freebsd-x64": 0.16.17 - "@esbuild/linux-arm": 0.16.17 - "@esbuild/linux-arm64": 0.16.17 - "@esbuild/linux-ia32": 0.16.17 - "@esbuild/linux-loong64": 0.16.17 - "@esbuild/linux-mips64el": 0.16.17 - "@esbuild/linux-ppc64": 0.16.17 - "@esbuild/linux-riscv64": 0.16.17 - "@esbuild/linux-s390x": 0.16.17 - "@esbuild/linux-x64": 0.16.17 - "@esbuild/netbsd-x64": 0.16.17 - "@esbuild/openbsd-x64": 0.16.17 - "@esbuild/sunos-x64": 0.16.17 - "@esbuild/win32-arm64": 0.16.17 - "@esbuild/win32-ia32": 0.16.17 - "@esbuild/win32-x64": 0.16.17 +"esbuild@npm:^0.17.5": + version: 0.17.11 + resolution: "esbuild@npm:0.17.11" + dependencies: + "@esbuild/android-arm": 0.17.11 + "@esbuild/android-arm64": 0.17.11 + "@esbuild/android-x64": 0.17.11 + "@esbuild/darwin-arm64": 0.17.11 + "@esbuild/darwin-x64": 0.17.11 + "@esbuild/freebsd-arm64": 0.17.11 + "@esbuild/freebsd-x64": 0.17.11 + "@esbuild/linux-arm": 0.17.11 + "@esbuild/linux-arm64": 0.17.11 + "@esbuild/linux-ia32": 0.17.11 + "@esbuild/linux-loong64": 0.17.11 + "@esbuild/linux-mips64el": 0.17.11 + "@esbuild/linux-ppc64": 0.17.11 + "@esbuild/linux-riscv64": 0.17.11 + "@esbuild/linux-s390x": 0.17.11 + "@esbuild/linux-x64": 0.17.11 + "@esbuild/netbsd-x64": 0.17.11 + "@esbuild/openbsd-x64": 0.17.11 + "@esbuild/sunos-x64": 0.17.11 + "@esbuild/win32-arm64": 0.17.11 + "@esbuild/win32-ia32": 0.17.11 + "@esbuild/win32-x64": 0.17.11 dependenciesMeta: "@esbuild/android-arm": optional: true @@ -3155,7 +3169,7 @@ __metadata: optional: true bin: esbuild: bin/esbuild - checksum: 4c2cc609ecfb426554bc3f75beb92d89eb2d0c515cfceebaa36c7599d7dcaab7056b70f6d6b51e72b45951ddf9021ee28e356cf205f8e42cc055d522312ea30c + checksum: febf218155513bb9c9c970508c03ec58e0aacfdc23394f425836a09f1da0dae0afa12949274adfd382782eef097f86b2d6b3032293062291f2f471de204f77ec languageName: node linkType: hard @@ -3199,19 +3213,19 @@ __metadata: linkType: hard "eslint-plugin-jsdoc@npm:^40.0.0": - version: 40.0.1 - resolution: "eslint-plugin-jsdoc@npm:40.0.1" + version: 40.0.3 + resolution: "eslint-plugin-jsdoc@npm:40.0.3" dependencies: - "@es-joy/jsdoccomment": ~0.36.1 + "@es-joy/jsdoccomment": ~0.37.0 comment-parser: 1.3.1 debug: ^4.3.4 escape-string-regexp: ^4.0.0 - esquery: ^1.4.0 + esquery: ^1.5.0 semver: ^7.3.8 spdx-expression-parse: ^3.0.1 peerDependencies: eslint: ^7.0.0 || ^8.0.0 - checksum: 19c5de2f8d0dec11c981eccce7255a8cc58e37c8d697c75144913879b16a9ea90995764bfeb00cbfc2b0678e28210cbe62a6b7865b05e756e887fffc892baf61 + checksum: abdb69d4aa7a2255dc92d1416f58e4060cfe310642c37b26175b721487be82eaad13466a5b2508d737762b5a382fbeecd41e13f81b239c294e2753a4b9ee0178 languageName: node linkType: hard @@ -3245,24 +3259,6 @@ __metadata: languageName: node linkType: hard -"eslint-utils@npm:^3.0.0": - version: 3.0.0 - resolution: "eslint-utils@npm:3.0.0" - dependencies: - eslint-visitor-keys: ^2.0.0 - peerDependencies: - eslint: ">=5" - checksum: 0668fe02f5adab2e5a367eee5089f4c39033af20499df88fe4e6aba2015c20720404d8c3d6349b6f716b08fdf91b9da4e5d5481f265049278099c4c836ccb619 - languageName: node - linkType: hard - -"eslint-visitor-keys@npm:^2.0.0": - version: 2.1.0 - resolution: "eslint-visitor-keys@npm:2.1.0" - checksum: e3081d7dd2611a35f0388bbdc2f5da60b3a3c5b8b6e928daffff7391146b434d691577aa95064c8b7faad0b8a680266bcda0a42439c18c717b80e6718d7e267d - languageName: node - linkType: hard - "eslint-visitor-keys@npm:^3.3.0": version: 3.3.0 resolution: "eslint-visitor-keys@npm:3.3.0" @@ -3271,11 +3267,13 @@ __metadata: linkType: hard "eslint@npm:^8.21.0": - version: 8.35.0 - resolution: "eslint@npm:8.35.0" + version: 8.36.0 + resolution: "eslint@npm:8.36.0" dependencies: - "@eslint/eslintrc": ^2.0.0 - "@eslint/js": 8.35.0 + "@eslint-community/eslint-utils": ^4.2.0 + "@eslint-community/regexpp": ^4.4.0 + "@eslint/eslintrc": ^2.0.1 + "@eslint/js": 8.36.0 "@humanwhocodes/config-array": ^0.11.8 "@humanwhocodes/module-importer": ^1.0.1 "@nodelib/fs.walk": ^1.2.8 @@ -3286,9 +3284,8 @@ __metadata: doctrine: ^3.0.0 escape-string-regexp: ^4.0.0 eslint-scope: ^7.1.1 - eslint-utils: ^3.0.0 eslint-visitor-keys: ^3.3.0 - espree: ^9.4.0 + espree: ^9.5.0 esquery: ^1.4.2 esutils: ^2.0.2 fast-deep-equal: ^3.1.3 @@ -3310,24 +3307,23 @@ __metadata: minimatch: ^3.1.2 natural-compare: ^1.4.0 optionator: ^0.9.1 - regexpp: ^3.2.0 strip-ansi: ^6.0.1 strip-json-comments: ^3.1.0 text-table: ^0.2.0 bin: eslint: bin/eslint.js - checksum: 6212173691d90b1bc94dd3d640e1f210374b30c3905fc0a15e501cf71c6ca52aa3d80ea7a9a245adaaed26d6019169e01fb6881b3f2885b188d37069c749308c + checksum: e9a961fc3b3de5cff5a1cb2c92eeffaa7e155a715489e30b3e1e76f186bd1255e0481e09564f2094733c0b1dbd3453499fb72ae7c043c83156e11e6d965b2304 languageName: node linkType: hard -"espree@npm:^9.4.0": - version: 9.4.1 - resolution: "espree@npm:9.4.1" +"espree@npm:^9.5.0": + version: 9.5.0 + resolution: "espree@npm:9.5.0" dependencies: acorn: ^8.8.0 acorn-jsx: ^5.3.2 eslint-visitor-keys: ^3.3.0 - checksum: 4d266b0cf81c7dfe69e542c7df0f246e78d29f5b04dda36e514eb4c7af117ee6cfbd3280e560571ed82ff6c9c3f0003c05b82583fc7a94006db7497c4fe4270e + checksum: a7f110aefb6407e0d3237aa635ab3cea87106ae63748dd23c67031afccc640d04c4209fca2daf16e2233c82efb505faead0fb84097478fd9cc6e8f8dd80bf99d languageName: node linkType: hard @@ -3341,7 +3337,7 @@ __metadata: languageName: node linkType: hard -"esquery@npm:^1.4.0, esquery@npm:^1.4.2": +"esquery@npm:^1.4.0, esquery@npm:^1.4.2, esquery@npm:^1.5.0": version: 1.5.0 resolution: "esquery@npm:1.5.0" dependencies: @@ -3990,7 +3986,7 @@ __metadata: languageName: node linkType: hard -"is-core-module@npm:^2.9.0": +"is-core-module@npm:^2.1.0, is-core-module@npm:^2.9.0": version: 2.11.0 resolution: "is-core-module@npm:2.11.0" dependencies: @@ -5050,10 +5046,10 @@ __metadata: languageName: node linkType: hard -"jsdoc-type-pratt-parser@npm:~3.1.0": - version: 3.1.0 - resolution: "jsdoc-type-pratt-parser@npm:3.1.0" - checksum: 2f437b57621f1e481918165f6cf0e48256628a9e510d8b3f88a2ab667bf2128bf8b94c628b57c43e78f555ca61983e9c282814703840dc091d2623992214a061 +"jsdoc-type-pratt-parser@npm:~4.0.0": + version: 4.0.0 + resolution: "jsdoc-type-pratt-parser@npm:4.0.0" + checksum: af0629c9517e484be778d8564440fec8de5b7610e0c9c88a3ba4554321364faf72b46689c8d8845faa12c0718437a9ed97e231977efc0f2d50e8a2dbad807eb3 languageName: node linkType: hard @@ -5238,13 +5234,6 @@ __metadata: languageName: node linkType: hard -"lunr@npm:^2.3.9": - version: 2.3.9 - resolution: "lunr@npm:2.3.9" - checksum: 176719e24fcce7d3cf1baccce9dd5633cd8bdc1f41ebe6a180112e5ee99d80373fe2454f5d4624d437e5a8319698ca6837b9950566e15d2cae5f2a543a3db4b8 - languageName: node - linkType: hard - "ltgt@npm:^2.2.0": version: 2.2.1 resolution: "ltgt@npm:2.2.1" @@ -5252,6 +5241,13 @@ __metadata: languageName: node linkType: hard +"lunr@npm:^2.3.9": + version: 2.3.9 + resolution: "lunr@npm:2.3.9" + checksum: 176719e24fcce7d3cf1baccce9dd5633cd8bdc1f41ebe6a180112e5ee99d80373fe2454f5d4624d437e5a8319698ca6837b9950566e15d2cae5f2a543a3db4b8 + languageName: node + linkType: hard + "make-dir@npm:^3.0.0": version: 3.1.0 resolution: "make-dir@npm:3.1.0" @@ -5328,6 +5324,19 @@ __metadata: languageName: node linkType: hard +"memdown@npm:^6.1.1": + version: 6.1.1 + resolution: "memdown@npm:6.1.1" + dependencies: + abstract-leveldown: ^7.2.0 + buffer: ^6.0.3 + functional-red-black-tree: ^1.0.1 + inherits: ^2.0.1 + ltgt: ^2.2.0 + checksum: a8c418620781a396e650834ab18022c1ae13060b3ca47dc80152eff45caf0e4780598610fd0f9b5a50ebdf195e686ed53fadbae1272addfafad98d598a165a4b + languageName: node + linkType: hard + "merge-stream@npm:^2.0.0": version: 2.0.0 resolution: "merge-stream@npm:2.0.0" @@ -5461,9 +5470,9 @@ __metadata: linkType: hard "minipass@npm:^4.0.0": - version: 4.2.4 - resolution: "minipass@npm:4.2.4" - checksum: c664f2ae4401408d1e7a6e4f50aca45f87b1b0634bc9261136df5c378e313e77355765f73f59c4a5abcadcdf43d83fcd3eb14e4a7cdcce8e36508e2290345753 + version: 4.2.5 + resolution: "minipass@npm:4.2.5" + checksum: 4f9c19af23a5d4a9e7156feefc9110634b178a8cff8f8271af16ec5ebf7e221725a97429952c856f5b17b30c2065ebd24c81722d90c93d2122611d75b952b48f languageName: node linkType: hard @@ -5918,13 +5927,13 @@ __metadata: linkType: hard "pure-rand@npm:^6.0.0": - version: 6.0.0 - resolution: "pure-rand@npm:6.0.0" - checksum: ad1378d0a4859482d053a5264b2b485b445ece4bbc56f8959c233ea678b81ac2d613737925d496ded134eff5f29cc5546bf7492b6bce319ee27bebbad8a0c612 + version: 6.0.1 + resolution: "pure-rand@npm:6.0.1" + checksum: 4bb565399993b815658a72e359f574ce4f04827a42a905105d61163ae86f456d91595a0e4241e7bce04328fae0638ae70ac0428d93ecb55971c465bd084f8648 languageName: node linkType: hard -"queue-microtask@npm:^1.2.2": +"queue-microtask@npm:^1.2.2, queue-microtask@npm:^1.2.3": version: 1.2.3 resolution: "queue-microtask@npm:1.2.3" checksum: b676f8c040cdc5b12723ad2f91414d267605b26419d5c821ff03befa817ddd10e238d22b25d604920340fd73efd8ba795465a0377c4adf45a4a41e4234e42dc4 @@ -5939,20 +5948,13 @@ __metadata: linkType: hard "readable-stream@npm:^3.4.0, readable-stream@npm:^3.6.0": - version: 3.6.1 - resolution: "readable-stream@npm:3.6.1" + version: 3.6.2 + resolution: "readable-stream@npm:3.6.2" dependencies: inherits: ^2.0.3 string_decoder: ^1.1.1 util-deprecate: ^1.0.1 - checksum: b7ab0508dba3c37277b9e43c0a970ea27635375698859a687f558c3c9393154b6c4f39c3aa5689641de183fffa26771bc1a45878ddde0236ad18fc8fdfde50ea - languageName: node - linkType: hard - -"regexpp@npm:^3.2.0": - version: 3.2.0 - resolution: "regexpp@npm:3.2.0" - checksum: a78dc5c7158ad9ddcfe01aa9144f46e192ddbfa7b263895a70a5c6c73edd9ce85faf7c0430e59ac38839e1734e275b9c3de5c57ee3ab6edc0e0b1bdebefccef8 + checksum: bdcbe6c22e846b6af075e32cf8f4751c2576238c5043169a1c221c92ee2878458a816a4ea33f4c67623c0b6827c8a400409bfb3cf0bf3381392d0b1dfb52ac8d languageName: node linkType: hard @@ -6090,9 +6092,9 @@ __metadata: languageName: node linkType: hard -"rollup@npm:^3.10.0": - version: 3.18.0 - resolution: "rollup@npm:3.18.0" +"rollup@npm:^3.18.0": + version: 3.19.1 + resolution: "rollup@npm:3.19.1" dependencies: fsevents: ~2.3.2 dependenciesMeta: @@ -6100,7 +6102,7 @@ __metadata: optional: true bin: rollup: dist/bin/rollup - checksum: 0bcd1abb1cc383abdd09b5594de862ecb2f946e950954bb472a370289bdc4499aea8d04477be55ce205450d973d38ad255f0dc6926162500a251d73bf0e60e6f + checksum: f78198c6de224b26650c70b16db156762d1fcceeb375d34fb2c76fc5b23a78f712c3c881d3248e6f277a511589e20d50c247bcf5c7920f1ddc0a43cadf9f0140 languageName: node linkType: hard @@ -6178,6 +6180,16 @@ __metadata: languageName: node linkType: hard +"sha256@npm:^0.2.0": + version: 0.2.0 + resolution: "sha256@npm:0.2.0" + dependencies: + convert-hex: ~0.1.0 + convert-string: ~0.1.0 + checksum: bed2d6507279e34ad2c517d18fbe871900244aca425a298d6ba10115e9beb49a8028296aeff5441b6db4902503a47198138e23ba1be440761a84288c93101ca1 + languageName: node + linkType: hard + "sha3@npm:^2.1.4": version: 2.1.4 resolution: "sha3@npm:2.1.4" @@ -6316,9 +6328,9 @@ __metadata: linkType: hard "spdx-license-ids@npm:^3.0.0": - version: 3.0.12 - resolution: "spdx-license-ids@npm:3.0.12" - checksum: 92a4dddce62ce1db6fe54a7a839cf85e06abc308fc83b776a55b44e4f1906f02e7ebd506120847039e976bbbad359ea8bdfafb7925eae5cd7e73255f02e0b7d6 + version: 3.0.13 + resolution: "spdx-license-ids@npm:3.0.13" + checksum: 3469d85c65f3245a279fa11afc250c3dca96e9e847f2f79d57f466940c5bb8495da08a542646086d499b7f24a74b8d0b42f3fc0f95d50ff99af1f599f6360ad7 languageName: node linkType: hard @@ -6766,8 +6778,8 @@ __metadata: linkType: hard "typedoc@npm:^0.23.26": - version: 0.23.26 - resolution: "typedoc@npm:0.23.26" + version: 0.23.27 + resolution: "typedoc@npm:0.23.27" dependencies: lunr: ^2.3.9 marked: ^4.2.12 @@ -6777,7 +6789,7 @@ __metadata: typescript: 4.6.x || 4.7.x || 4.8.x || 4.9.x bin: typedoc: bin/typedoc - checksum: 09dbd221b5bd27a7f6c593a6aa7e4efc3c46f20761e109a76bf0ed7239011cca1261357094710c01472582060d75a7558aab5bf5b78db3aff7c52188d146ee65 + checksum: 1ddcccf0b839c708a37d18b6dc1ab57ace6e177daf8f0442ff60d6e72c23ecbd78b0e602f0e1e553c7cb0254e0c769afff7c24c58683e564a7a07a2469cf99a5 languageName: node linkType: hard @@ -6877,28 +6889,29 @@ __metadata: linkType: hard "viem@npm:^0.1.15": - version: 0.1.15 - resolution: "viem@npm:0.1.15" + version: 0.1.21 + resolution: "viem@npm:0.1.21" dependencies: "@noble/hashes": ^1.1.2 + "@noble/secp256k1": ^1.7.1 "@wagmi/chains": ~0.2.11 abitype: ~0.7.1 idna-uts46-hx: ^4.1.2 isomorphic-ws: ^5.0.0 ws: ^8.12.0 - checksum: 9f935e5f8ad7bff674c491782b7ca47263fed7bf9ec52f97aa6914e23ee4418481e6f0c605819b86fb9e6c03fa578c547d5f1d3861a112cec8fc1ded2d45b5ad + checksum: ae7575d40db8e1f128c8f979ea550ece86444a0a198e7301a2b018b95d67942674a87752092982c1f036aae4355eb23682baf05dfb9464d7fa5c68c59db41a17 languageName: node linkType: hard "vite@npm:^4.1.4": - version: 4.1.4 - resolution: "vite@npm:4.1.4" + version: 4.2.0 + resolution: "vite@npm:4.2.0" dependencies: - esbuild: ^0.16.14 + esbuild: ^0.17.5 fsevents: ~2.3.2 postcss: ^8.4.21 resolve: ^1.22.1 - rollup: ^3.10.0 + rollup: ^3.18.0 peerDependencies: "@types/node": ">= 14" less: "*" @@ -6924,7 +6937,7 @@ __metadata: optional: true bin: vite: bin/vite.js - checksum: 50a9a1f2e29e0ee8fefdec60314d38fb9b746df0bb6ae5a8114014b5bfd95e0fc9b29c0d5e73939361ba53af7eb66c7d20c5656bbe53a783e96540bd3b907c47 + checksum: 1088cdc0c89ab835aab07a0a114397b749e8dfb20f4b94241ba179d9c371b72d31e13782b22893860c3d65da596e43b24fce5e023f79cfde427f42549f2e1844 languageName: node linkType: hard diff --git a/yarn.lock b/yarn.lock deleted file mode 100644 index fb57ccd13af..00000000000 --- a/yarn.lock +++ /dev/null @@ -1,4 +0,0 @@ -# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. -# yarn lockfile v1 - - From a5a0198868fcc214b16d241c11cc5ec1c1388724 Mon Sep 17 00:00:00 2001 From: benesjan Date: Thu, 16 Mar 2023 09:47:53 -0600 Subject: [PATCH 06/36] docs: fixed memory_fifo docs --- yarn-project/world-state/src/memory_fifo.ts | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/yarn-project/world-state/src/memory_fifo.ts b/yarn-project/world-state/src/memory_fifo.ts index 7e333661365..1d905055cd9 100644 --- a/yarn-project/world-state/src/memory_fifo.ts +++ b/yarn-project/world-state/src/memory_fifo.ts @@ -8,7 +8,11 @@ export class MemoryFifo { private items: T[] = []; private flushing = false; - public length() { + /** + * Returns the number of items in the queue. + * @returns The number of items in the queue. + */ + public length(): number { return this.items.length; } @@ -16,6 +20,8 @@ export class MemoryFifo { * Returns next item within the queue, or blocks until and item has been put into the queue. * If given a timeout, the promise will reject if no item is received after `timeout` seconds. * If the queue is flushing, `null` is returned. + * @param timeout - The number of seconds to wait for an item before rejecting the promise. + * @returns The next item in the queue, or null if the queue is flushing. */ public get(timeout?: number): Promise { if (this.items.length) { @@ -44,6 +50,7 @@ export class MemoryFifo { /** * Put an item onto back of the queue. + * @param item - The item to put onto the queue. */ public put(item: T) { if (this.flushing) { @@ -78,6 +85,7 @@ export class MemoryFifo { /** * Helper method that can be used to continously consume and process items on the queue. + * @param handler - The function to call for each item in the queue. */ public async process(handler: (item: T) => Promise) { try { From 047e305608e5b6f8cdb23f70fe8a7f9da6924c5e Mon Sep 17 00:00:00 2001 From: benesjan Date: Thu, 16 Mar 2023 10:02:56 -0600 Subject: [PATCH 07/36] refactor+docs: updated naming + fixed docs in L2BlockDownloader --- yarn-project/archiver/package.json | 5 +++- ...k_downloader.ts => l2_block_downloader.ts} | 30 +++++++++++++++---- 2 files changed, 28 insertions(+), 7 deletions(-) rename yarn-project/world-state/src/{rollup_block_downloader.ts => l2_block_downloader.ts} (60%) diff --git a/yarn-project/archiver/package.json b/yarn-project/archiver/package.json index c43b39032b2..e521a28bcd6 100644 --- a/yarn-project/archiver/package.json +++ b/yarn-project/archiver/package.json @@ -2,7 +2,10 @@ "name": "@aztec/archiver", "version": "0.0.0", "type": "module", - "exports": "./dest/index.js", + "exports": { + "./l2_block": "./dest/l2_block/l2_block.js", + "./l2_block_source": "./dest/l2_block_source.js" + }, "typedoc": { "entryPoint": "./src/index.ts", "displayName": "Archiver", diff --git a/yarn-project/world-state/src/rollup_block_downloader.ts b/yarn-project/world-state/src/l2_block_downloader.ts similarity index 60% rename from yarn-project/world-state/src/rollup_block_downloader.ts rename to yarn-project/world-state/src/l2_block_downloader.ts index d97b3f6d6ed..70e9e109792 100644 --- a/yarn-project/world-state/src/rollup_block_downloader.ts +++ b/yarn-project/world-state/src/l2_block_downloader.ts @@ -1,20 +1,31 @@ -import { RollupSource, Rollup } from '@aztec/data-archiver'; +import { L2Block } from '@aztec/archiver/l2_block'; import { MemoryFifo } from './memory_fifo.js'; import { Semaphore } from './semaphore.js'; import { InterruptableSleep } from './sleep.js'; +import { L2BlockSource } from '@aztec/archiver/l2_block_source'; -export class RollupBlockDownloader { +/** + * Downloads L2 blocks from a L2BlockSource. + * The blocks are stored in a queue and can be retrieved using the getBlocks method. + * The queue size is limited by the maxQueueSize parameter. + * The downloader will pause when the queue is full or when the L2BlockSource is out of blocks. + */ +export class L2BlockDownloader { private runningPromise?: Promise; private running = false; private from = 0; private interruptableSleep = new InterruptableSleep(); private semaphore: Semaphore; - private queue = new MemoryFifo(); + private queue = new MemoryFifo(); - constructor(private rollupProvider: RollupSource, maxQueueSize: number) { + constructor(private l2BlockSource: L2BlockSource, maxQueueSize: number) { this.semaphore = new Semaphore(maxQueueSize); } + /** + * Starts the downloader. + * @param from - The block number to start downloading from. Defaults to 0. + */ public start(from = 0) { this.from = from; @@ -28,7 +39,7 @@ export class RollupBlockDownloader { const fn = async () => { while (this.running) { try { - const blocks = await this.rollupProvider.getBlocks(this.from, 10); + const blocks = this.l2BlockSource.getL2Blocks(this.from, 10); if (!blocks.length) { await this.interruptableSleep.sleep(10000); @@ -50,6 +61,9 @@ export class RollupBlockDownloader { this.runningPromise = fn(); } + /** + * Stops the downloader. + */ public async stop() { this.running = false; this.interruptableSleep.interrupt(); @@ -57,7 +71,11 @@ export class RollupBlockDownloader { await this.runningPromise; } - public async getBlocks() { + /** + * Gets the next batch of blocks from the queue. + * @returns The next batch of blocks from the queue. + */ + public async getL2Blocks() { const blocks = await this.queue.get(); if (!blocks) { return []; From f4ffdab1e0e56e1dcc85fe33c8abc6f7112e473e Mon Sep 17 00:00:00 2001 From: benesjan Date: Thu, 16 Mar 2023 10:14:55 -0600 Subject: [PATCH 08/36] refactor+docs: updated naming + fixed docs in Synchronizer --- .../server_world_state_synchroniser.ts | 59 +++++++++++++------ 1 file changed, 42 insertions(+), 17 deletions(-) diff --git a/yarn-project/world-state/src/synchroniser/server_world_state_synchroniser.ts b/yarn-project/world-state/src/synchroniser/server_world_state_synchroniser.ts index 8c56f648ce2..85479d92172 100644 --- a/yarn-project/world-state/src/synchroniser/server_world_state_synchroniser.ts +++ b/yarn-project/world-state/src/synchroniser/server_world_state_synchroniser.ts @@ -1,58 +1,83 @@ import { WorldStateRunningState, WorldStateStatus, WorldStateSynchroniser } from './world_state_synchroniser.js'; -import { RollupSource, Rollup } from '@aztec/data-archiver'; import { BatchUpdate, WorldStateTreeId } from '../world-state-db/index.js'; import { MerkleTreeDb } from '@aztec/merkle-tree'; -import { RollupBlockDownloader } from '../rollup_block_downloader.js'; +import { L2BlockDownloader } from '../l2_block_downloader.js'; +import { L2BlockSource } from '@aztec/archiver/l2_block_source'; +import { L2Block } from '@aztec/archiver/l2_block'; +/** + * Synchronises the world state with the L2 blocks from a L2BlockSource. + * The synchroniser will download the L2 blocks from the L2BlockSource and insert the new commitments into the merkle + * tree. + */ export class ServerWorldStateSynchroniser implements WorldStateSynchroniser { - private currentRollupId = 0; - private rollupDownloader: RollupBlockDownloader; + private currentL2BlockNum = 0; + private l2BlockDownloader: L2BlockDownloader; private runningPromise: Promise = Promise.resolve(); private running = false; - constructor(private merkleTreeDb: MerkleTreeDb, rollupSource: RollupSource, maxQueueSize = 1000) { - this.rollupDownloader = new RollupBlockDownloader(rollupSource, maxQueueSize); + constructor(private merkleTreeDb: MerkleTreeDb, l2BlockSource: L2BlockSource, maxQueueSize = 1000) { + this.l2BlockDownloader = new L2BlockDownloader(l2BlockSource, maxQueueSize); } + /** + * Starts the synchroniser. + * @param from - The block number to start downloading from. Defaults to 0. + */ public start(from = 0) { this.running = true; const blockProcess = async () => { while (this.running) { - const blocks = await this.rollupDownloader.getBlocks(); - await this.handleRollups(blocks); + const blocks = await this.l2BlockDownloader.getL2Blocks(); + await this.handleL2Blocks(blocks); } }; this.runningPromise = blockProcess(); - this.rollupDownloader.start(from); + this.l2BlockDownloader.start(from); } + /** + * Stops the synchroniser. + */ public async stop() { - await this.rollupDownloader.stop(); + await this.l2BlockDownloader.stop(); this.running = false; await this.runningPromise; } + /** + * Returns the current status of the synchroniser. + * @returns The current status of the synchroniser. + */ public status(): Promise { const status = { - syncedToRollup: this.currentRollupId, + syncedToRollup: this.currentL2BlockNum, state: WorldStateRunningState.IDLE, } as WorldStateStatus; return Promise.resolve(status); } - private async handleRollups(rollups: Rollup[]) { - for (const rollup of rollups) { - await this.handleRollup(rollup); + /** + * Handles a list of L2 blocks (i.e. Inserts the new commitments into the merkle tree). + * @param l2blocks - The L2 blocks to handle. + */ + private async handleL2Blocks(l2blocks: L2Block[]) { + for (const l2block of l2blocks) { + await this.handleL2Block(l2block); } } - private async handleRollup(rollup: Rollup) { + /** + * Handles a single L2 block (i.e. Inserts the new commitments into the merkle tree). + * @param l2block - The L2 block to handle. + */ + private async handleL2Block(l2block: L2Block) { const update = { treeId: WorldStateTreeId.CONTRACT_TREE, - elements: rollup.commitments, + elements: l2block.newCommitments, } as BatchUpdate; await this.merkleTreeDb.insertElements([update]); - this.currentRollupId = rollup.rollupId; + this.currentL2BlockNum = l2block.number; } } From bc29ca12654b0ab0c1cf233663304e72eaed8e50 Mon Sep 17 00:00:00 2001 From: benesjan Date: Thu, 16 Mar 2023 10:19:03 -0600 Subject: [PATCH 09/36] docs: fixed Semaphore docs --- yarn-project/world-state/src/semaphore.ts | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/yarn-project/world-state/src/semaphore.ts b/yarn-project/world-state/src/semaphore.ts index 2db1a851d47..8837beebb3b 100644 --- a/yarn-project/world-state/src/semaphore.ts +++ b/yarn-project/world-state/src/semaphore.ts @@ -10,10 +10,16 @@ export class Semaphore { new Array(size).fill(true).map(() => this.queue.put(true)); } + /** + * Acquires a token from the queue. If no token is available, blocks until a token is released. + */ public async acquire() { await this.queue.get(); } + /** + * Releases a token back into the queue. + */ public release() { this.queue.put(true); } From adaf815244d36997e48690c7f8d0e531914ee11a Mon Sep 17 00:00:00 2001 From: benesjan Date: Thu, 16 Mar 2023 10:30:44 -0600 Subject: [PATCH 10/36] docs: fixed SerialQueue docs --- yarn-project/world-state/src/memory_fifo.ts | 2 +- yarn-project/world-state/src/serial_queue.ts | 32 +++++++++++++++----- 2 files changed, 26 insertions(+), 8 deletions(-) diff --git a/yarn-project/world-state/src/memory_fifo.ts b/yarn-project/world-state/src/memory_fifo.ts index 1d905055cd9..a77742f4a9e 100644 --- a/yarn-project/world-state/src/memory_fifo.ts +++ b/yarn-project/world-state/src/memory_fifo.ts @@ -84,7 +84,7 @@ export class MemoryFifo { } /** - * Helper method that can be used to continously consume and process items on the queue. + * Helper method that can be used to continuously consume and process items on the queue. * @param handler - The function to call for each item in the queue. */ public async process(handler: (item: T) => Promise) { diff --git a/yarn-project/world-state/src/serial_queue.ts b/yarn-project/world-state/src/serial_queue.ts index 01a6886cd8e..3c891e471c7 100644 --- a/yarn-project/world-state/src/serial_queue.ts +++ b/yarn-project/world-state/src/serial_queue.ts @@ -1,4 +1,4 @@ -import { MemoryFifo } from '@aztec/barretenberg/fifo'; +import { MemoryFifo } from './memory_fifo.js'; /** * A more specialised fifo queue that enqueues functions to execute. Enqueued functions are executed in serial. @@ -7,27 +7,43 @@ export class SerialQueue { private readonly queue = new MemoryFifo<() => Promise>(); private runningPromise!: Promise; + /** + * Starts the promise that executes the functions in the queue. + */ public start() { this.runningPromise = this.queue.process(fn => fn()); } - public length() { + /** + * Returns the number of items in the queue. + * @returns The number of items in the queue. + */ + public length(): number { return this.queue.length(); } - public cancel() { + /** + * Cancels the queue. + * @returns A promise that resolves when the queue is empty. + */ + public cancel(): Promise { this.queue.cancel(); return this.runningPromise; } - public end() { + /** + * Ends the queue (no more items can be added - existing items will be processed). + * @returns A promise that resolves when the queue is empty. + */ + public end(): Promise { this.queue.end(); return this.runningPromise; } /** - * Enqueues fn for execution on the serial queue. - * Returns the result of the function after execution. + * Enqueues `fn` for execution on the serial queue. + * @param fn - The function to enqueue. + * @returns The result of the function after execution. */ public put(fn: () => Promise): Promise { return new Promise((resolve, reject) => { @@ -42,7 +58,9 @@ export class SerialQueue { }); } - // Awaiting this ensures the queue is empty before resuming. + /** + * Awaiting this function ensures the queue is empty before resuming. + */ public async syncPoint() { await this.put(async () => {}); } From 9dcae599d145da6383323a3b746b8e040d0295a1 Mon Sep 17 00:00:00 2001 From: benesjan Date: Thu, 16 Mar 2023 10:43:19 -0600 Subject: [PATCH 11/36] docs: fixed docs in InterruptableSleep --- yarn-project/world-state/src/sleep.ts | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/yarn-project/world-state/src/sleep.ts b/yarn-project/world-state/src/sleep.ts index 229e103a2d7..02cf7ec553a 100644 --- a/yarn-project/world-state/src/sleep.ts +++ b/yarn-project/world-state/src/sleep.ts @@ -1,8 +1,15 @@ +/** + * A class which allows you to sleep for a given number of milliseconds, and interrupt that sleep when necessary. + */ export class InterruptableSleep { private interruptResolve: (shouldThrow: boolean) => void = () => {}; private interruptPromise = new Promise(resolve => (this.interruptResolve = resolve)); private timeouts: NodeJS.Timeout[] = []; + /** + * If awaited, will sleep for the given number of milliseconds or until interrupted. + * @param ms - The number of milliseconds to sleep for. + */ public async sleep(ms: number) { let timeout!: NodeJS.Timeout; const promise = new Promise(resolve => (timeout = setTimeout(() => resolve(false), ms))); @@ -15,12 +22,22 @@ export class InterruptableSleep { } } + /** + * Interrupts the sleep function. + * @param sleepShouldThrow - If true, the sleep function will throw an error if the `interruptPromise` is resolved + * first. + */ public interrupt(sleepShouldThrow = false) { this.interruptResolve(sleepShouldThrow); this.interruptPromise = new Promise(resolve => (this.interruptResolve = resolve)); } } +/** + * Sleeps for the given number of milliseconds. + * @param ms - The number of milliseconds to sleep for. + * @returns A promise that resolves after the given number of milliseconds. + */ export function sleep(ms: number) { return new Promise(resolve => setTimeout(resolve, ms)); } From 785ae6b1f2e8cbf455410e4506edf2ec5264b31b Mon Sep 17 00:00:00 2001 From: benesjan Date: Thu, 16 Mar 2023 10:46:32 -0600 Subject: [PATCH 12/36] docs: fixed WorldStateSynchroniser interface --- .../server_world_state_synchroniser.ts | 2 +- .../synchroniser/world_state_synchroniser.ts | 17 ++++++++++++++++- 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/yarn-project/world-state/src/synchroniser/server_world_state_synchroniser.ts b/yarn-project/world-state/src/synchroniser/server_world_state_synchroniser.ts index 85479d92172..9bac25595bf 100644 --- a/yarn-project/world-state/src/synchroniser/server_world_state_synchroniser.ts +++ b/yarn-project/world-state/src/synchroniser/server_world_state_synchroniser.ts @@ -52,7 +52,7 @@ export class ServerWorldStateSynchroniser implements WorldStateSynchroniser { */ public status(): Promise { const status = { - syncedToRollup: this.currentL2BlockNum, + syncedToL2Block: this.currentL2BlockNum, state: WorldStateRunningState.IDLE, } as WorldStateStatus; return Promise.resolve(status); diff --git a/yarn-project/world-state/src/synchroniser/world_state_synchroniser.ts b/yarn-project/world-state/src/synchroniser/world_state_synchroniser.ts index eef86c66410..08b8c8079c1 100644 --- a/yarn-project/world-state/src/synchroniser/world_state_synchroniser.ts +++ b/yarn-project/world-state/src/synchroniser/world_state_synchroniser.ts @@ -1,3 +1,6 @@ +/** + * Defines the possible states of the world state synchroniser. + */ export enum WorldStateRunningState { IDLE, SYNCHING, @@ -5,11 +8,23 @@ export enum WorldStateRunningState { STOPPED, } +/** + * Defines the status of the world state synchroniser. + */ export interface WorldStateStatus { + /** + * The current state of the world state synchroniser. + */ state: WorldStateRunningState; - syncedToRollup: number; + /** + * The block number that the world state synchroniser is synced to. + */ + syncedToL2Block: number; } +/** + * Defines the interface for a world state synchroniser. + */ export interface WorldStateSynchroniser { start(): void; status(): Promise; From 06b2d9e1514179aa55a1355e905a9288322888be Mon Sep 17 00:00:00 2001 From: benesjan Date: Thu, 16 Mar 2023 10:55:14 -0600 Subject: [PATCH 13/36] docs: fixed WorldStatedB docs --- .../world-state/src/world-state-db/index.ts | 26 +++++++++++++++++-- 1 file changed, 24 insertions(+), 2 deletions(-) diff --git a/yarn-project/world-state/src/world-state-db/index.ts b/yarn-project/world-state/src/world-state-db/index.ts index 82f15b99efc..b1f569549d9 100644 --- a/yarn-project/world-state/src/world-state-db/index.ts +++ b/yarn-project/world-state/src/world-state-db/index.ts @@ -1,16 +1,38 @@ -import { HashPath } from '@aztec/merkle-tree'; - +/** + * Defines what kind of tree we are dealing with. + */ export enum WorldStateTreeId { CONTRACT_TREE = 0, } +/** + * Defines tree information. + */ export interface TreeInfo { + /** + * The tree ID. + */ treeId: WorldStateTreeId; + /** + * The tree root. + */ root: Buffer; + /** + * The number of leaves. + */ size: number; } +/** + * Defines a batch update. + */ export interface BatchUpdate { + /** + * The ID of a tree to be updated. + */ treeId: WorldStateTreeId; + /** + * The leaves to be updated. + */ elements: Buffer[]; } From 23177224141bf0ef11f21aa28895f3d2b46e3d3f Mon Sep 17 00:00:00 2001 From: benesjan Date: Thu, 16 Mar 2023 11:08:18 -0600 Subject: [PATCH 14/36] docs: finished fixing world state docs --- .../world-state-db/memory_world_state_db.ts | 73 +++++++++++++++++-- 1 file changed, 66 insertions(+), 7 deletions(-) diff --git a/yarn-project/world-state/src/world-state-db/memory_world_state_db.ts b/yarn-project/world-state/src/world-state-db/memory_world_state_db.ts index 3a7da3f89f6..d3e86feb51d 100644 --- a/yarn-project/world-state/src/world-state-db/memory_world_state_db.ts +++ b/yarn-project/world-state/src/world-state-db/memory_world_state_db.ts @@ -10,6 +10,9 @@ import { } from '@aztec/merkle-tree'; import { SerialQueue } from '../serial_queue.js'; +/** + * A convenience class for managing multiple merkle trees. + */ export class MerkleTrees implements MerkleTreeDb { private trees: MerkleTree[] = []; private jobQueue = new SerialQueue(); @@ -28,35 +31,71 @@ export class MerkleTrees implements MerkleTreeDb { this.jobQueue.start(); } + /** + * Stops the job queue (waits for all jobs to finish). + */ public async stop() { await this.jobQueue.end(); } - public async getTreeInfo() { + /** + * Gets the tree info for all trees. + * @returns The tree info for all trees. + */ + public async getTreeInfo(): Promise { return await this.synchronise(() => this._getTreeInfo()); } + /** + * Gets the sibling path for a leaf in a tree. + * @param treeId - The ID of the tree. + * @param index - The index of the leaf. + * @returns The sibling path for the leaf. + */ public async getSiblingPath(treeId: MerkleTreeId, index: number): Promise { return await this.synchronise(() => this._getSiblingPath(treeId, index)); } + /** + * Appends leaves to a tree. + * @param treeId - The ID of the tree. + * @param leaves - The leaves to append. + * @returns Empty promise. + */ public async appendLeaves(treeId: MerkleTreeId, leaves: Buffer[]): Promise { return await this.synchronise(() => this._appendLeaves(treeId, leaves)); } - public async commit() { + /** + * Commits all pending updates. + * @returns Empty promise. + */ + public async commit(): Promise { return await this.synchronise(() => this._commit()); } - public async rollback() { + /** + * Rolls back all pending updates. + * @returns Empty promise. + */ + public async rollback(): Promise { return await this.synchronise(() => this._rollback()); } + /** + * Waits for all jobs to finish before executing the given function. + * @param fn - The function to execute. + * @returns Promise containing the result of the function. + */ private async synchronise(fn: () => Promise): Promise { return await this.jobQueue.put(fn); } - private _getTreeInfo() { + /** + * Returns the tree info for all trees. + * @returns The tree info for all trees. + */ + private _getTreeInfo(): Promise { return Promise.resolve( this.trees.map((tree, index) => { return { @@ -68,21 +107,41 @@ export class MerkleTrees implements MerkleTreeDb { ); } + /** + * Returns the sibling path for a leaf in a tree. + * @param treeId - Id of the tree to get the sibling path from. + * @param index - Index of the leaf to get the sibling path for. + * @returns Promise containing the sibling path for the leaf. + */ private _getSiblingPath(treeId: MerkleTreeId, index: number): Promise { return Promise.resolve(this.trees[treeId].getHashPath(index)); } - private async _appendLeaves(treeId: MerkleTreeId, leaves: Buffer[]) { + /** + * Appends leaves to a tree. + * @param treeId - Id of the tree to append leaves to. + * @param leaves - Leaves to append. + * @returns Empty promise. + */ + private async _appendLeaves(treeId: MerkleTreeId, leaves: Buffer[]): Promise { return await this.trees[treeId].appendLeaves(leaves); } - private async _commit() { + /** + * Commits all pending updates. + * @returns Empty promise. + */ + private async _commit(): Promise { for (const tree of this.trees) { await tree.commit(); } } - private async _rollback() { + /** + * Rolls back all pending updates. + * @returns Empty promise. + */ + private async _rollback(): Promise { for (const tree of this.trees) { await tree.rollback(); } From 3c4f960eaee068a019513eba725a8c3247c6f6bc Mon Sep 17 00:00:00 2001 From: benesjan Date: Thu, 16 Mar 2023 16:43:50 -0600 Subject: [PATCH 15/36] docs: fixed StandardMerkleTree docs --- yarn-project/merkle-tree/src/standard_tree.ts | 97 +++++++++++++++++-- 1 file changed, 90 insertions(+), 7 deletions(-) diff --git a/yarn-project/merkle-tree/src/standard_tree.ts b/yarn-project/merkle-tree/src/standard_tree.ts index 714a4ba1ead..1f094e3e262 100644 --- a/yarn-project/merkle-tree/src/standard_tree.ts +++ b/yarn-project/merkle-tree/src/standard_tree.ts @@ -24,6 +24,9 @@ const decodeMeta = (meta: Buffer) => { }; }; +/** + * A Merkle tree implementation that uses a LevelDB database to store the tree. + */ export class StandardMerkleTree implements MerkleTree { public static ZERO_ELEMENT = Buffer.from('0000000000000000000000000000000000000000000000000000000000000000', 'hex'); private root!: Buffer; @@ -54,6 +57,15 @@ export class StandardMerkleTree implements MerkleTree { this.root = root ? root : current; } + /** + * Creates a new tree. + * @param db - A database implementing the LevelUp interface. + * @param hasher - A hasher implementing the Hasher interface. + * @param name - Name of the tree. + * @param depth - Depth of the tree. + * @param initialLeafValue - The initial value of the leaves. + * @returns The newly created tree. + */ static async new( db: LevelUp, hasher: Hasher, @@ -66,12 +78,23 @@ export class StandardMerkleTree implements MerkleTree { return tree; } + /** + * Creates a new tree and sets its root, depth and size based on the meta data which are associated with the name. + * @param db - A database implementing the LevelUp interface. + * @param hasher - A hasher implementing the Hasher interface. + * @param name - Name of the tree. + * @param initialLeafValue - The initial value of the leaves before assigned. + * @returns The newly created tree. + */ static async fromName(db: LevelUp, hasher: Hasher, name: string, initialLeafValue = StandardMerkleTree.ZERO_ELEMENT) { const meta: Buffer = await db.get(name); const { root, depth, size } = decodeMeta(meta); return new StandardMerkleTree(db, hasher, name, depth, size, root, initialLeafValue); } + /** + * Sets the root, depth and size of the tree based on the meta data which are associated with the tree name. + */ public async syncFromDb() { const meta: Buffer | undefined = await this.dbGet(this.name); if (!meta) { @@ -84,25 +107,43 @@ export class StandardMerkleTree implements MerkleTree { this.clearCache(); } - public getRoot() { + /** + * Returns the root of the tree. + * @returns The root of the tree. + */ + public getRoot(): Buffer { return this.cache[indexToKeyHash(this.name, 0, 0n)] ?? this.root; } + /** + * Returns the number of leaves in the tree. + * @returns The number of leaves in the tree. + */ public getNumLeaves() { return this.cachedSize ?? this.size; } - public getName() { + /** + * Returns the name of the tree. + * @returns The name of the tree. + */ + public getName(): string { return this.name; } - public getDepth() { + /** + * Returns the depth of the tree. + * @returns The depth of the tree. + */ + public getDepth(): number { return this.depth; } /** * Returns a sibling path for the element at the given index. - * The sibling path is an array of sibling hashes, with the lowest hash (leaf hash) first, and the highest hash last. + * @param index - The index of the element. + * @returns A sibling path for the element at the given index. + * Note: The sibling path is an array of sibling hashes, with the lowest hash (leaf hash) first, and the highest hash last. */ public async getSiblingPath(index: bigint) { const path = new SiblingPath(); @@ -117,6 +158,11 @@ export class StandardMerkleTree implements MerkleTree { return path; } + /** + * Appends the given leaves to the tree. + * @param leaves - The leaves to append. + * @returns Empty promise. + */ public async appendLeaves(leaves: Buffer[]): Promise { const numLeaves = this.getNumLeaves(); for (let i = 0; i < leaves.length; i++) { @@ -126,6 +172,11 @@ export class StandardMerkleTree implements MerkleTree { this.cachedSize = numLeaves + BigInt(leaves.length); } + /** + * Updates a leaf in the tree. + * @param leaf - New contents of the leaf. + * @param index - Index of the leaf to be updated. + */ public async updateLeaf(leaf: Buffer, index: bigint) { await this.addLeafToCacheAndHashToRoot(leaf, index); const numLeaves = this.getNumLeaves(); @@ -134,6 +185,10 @@ export class StandardMerkleTree implements MerkleTree { } } + /** + * Commits the changes to the database. + * @returns Empty promise. + */ public async commit(): Promise { const batch = this.db.batch(); const keys = Object.getOwnPropertyNames(this.cache); @@ -147,16 +202,28 @@ export class StandardMerkleTree implements MerkleTree { this.clearCache(); } + /** + * Rolls back the not-yet-committed changes. + * @returns Empty promise. + */ public rollback(): Promise { this.clearCache(); return Promise.resolve(); } + /** + * Clears the catch. + */ private clearCache() { this.cache = {}; this.cachedSize = undefined; } + /** + * Adds a leaf and all the hashes above it to the cache. + * @param leaf - Leaf to add to cache. + * @param index - Index of the leaf (used to derive the cache key). + */ private async addLeafToCacheAndHashToRoot(leaf: Buffer, index: bigint) { const key = indexToKeyHash(this.name, this.depth, index); let current = leaf; @@ -175,22 +242,38 @@ export class StandardMerkleTree implements MerkleTree { } } + /** + * Returns the latest value at the given index. + * @param level - The level of the tree. + * @param index - The index of the element. + * @returns The latest value at the given index. + * Note: If the value is not in the cache, it will be fetched from the database. + */ private async getLatestValueAtIndex(level: number, index: bigint): Promise { const key = indexToKeyHash(this.name, level, index); if (this.cache[key] !== undefined) { return this.cache[key]; } - const comitted = await this.dbGet(key); - if (comitted !== undefined) { - return comitted; + const committed = await this.dbGet(key); + if (committed !== undefined) { + return committed; } return this.zeroHashes[level - 1]; } + /** + * Gets a value from db by key. + * @param key - The key to by which to get the value. + * @returns A value from the db based on the key. + */ private async dbGet(key: string): Promise { return await this.db.get(key).catch(() => {}); } + /** + * Writes meta data to the provided batch. + * @param batch - The batch to which to write the meta data. + */ private async writeMeta(batch?: LevelUpChain) { const data = encodeMeta(this.getRoot(), this.depth, this.getNumLeaves()); if (batch) { From 7e298af405065b864be02bfc8db1bbe472769c8f Mon Sep 17 00:00:00 2001 From: benesjan Date: Thu, 16 Mar 2023 17:04:54 -0600 Subject: [PATCH 16/36] docs: fixed SiblingPath docs --- yarn-project/merkle-tree/src/sibling_path.ts | 47 +++++++++++++++++--- 1 file changed, 40 insertions(+), 7 deletions(-) diff --git a/yarn-project/merkle-tree/src/sibling_path.ts b/yarn-project/merkle-tree/src/sibling_path.ts index ebedb51f122..79fba929e79 100644 --- a/yarn-project/merkle-tree/src/sibling_path.ts +++ b/yarn-project/merkle-tree/src/sibling_path.ts @@ -1,8 +1,18 @@ import { Pedersen } from './pedersen.js'; import { deserializeArrayFromVector, serializeBufferArrayToVector } from './serialise.js'; +/** + * Contains functionality to compute and serialize/deserialize a sibling path. + */ export class SiblingPath { - public static ZERO(size: number, zeroElement: Buffer, pedersen: Pedersen) { + /** + * Returns sibling path hashed up from the a element. + * @param size - The number of elements in a given path. + * @param zeroElement - Value of the zero element. + * @param pedersen - Implementation of a hasher interface using the Pedersen hash. + * @returns A sibling path hashed up from a zero element. + */ + public static ZERO(size: number, zeroElement: Buffer, pedersen: Pedersen): SiblingPath { const bufs: Buffer[] = []; let current = zeroElement; for (let i = 0; i < size; ++i) { @@ -14,15 +24,31 @@ export class SiblingPath { constructor(public data: Buffer[] = []) {} - public toBuffer() { + /** + * Serializes this SiblingPath object to a buffer. + * @returns The buffer representation of this object. + */ + public toBuffer(): Buffer { return serializeBufferArrayToVector(this.data); } - static fromBuffer(buf: Buffer, offset = 0) { + /** + * Deserializes a SiblingPath from a buffer. + * @param buf - A buffer containing the buffer representation of SiblingPath. + * @param offset - An offset to start deserializing from. + * @returns A SiblingPath object. + */ + static fromBuffer(buf: Buffer, offset = 0): SiblingPath { const { elem } = SiblingPath.deserialize(buf, offset); return elem; } + /** + * Deserializes a SiblingPath object from a slice of a part of a buffer and returns the amount of bytes advanced. + * @param buf - A buffer representation of the sibling path. + * @param offset - An offset to start deserializing from. + * @returns The deserialized sibling path and the number of bytes advanced. + */ static deserialize(buf: Buffer, offset = 0) { const deserializePath = (buf: Buffer, offset: number) => ({ elem: buf.slice(offset, offset + 32), @@ -32,13 +58,20 @@ export class SiblingPath { return { elem: new SiblingPath(elem), adv }; } - // For json serialization - public toString() { + /** + * Serializes this SiblingPath object to a hex string representation. + * @returns A hex string representation of the sibling path. + */ + public toString(): string { return this.toBuffer().toString('hex'); } - // For json deserialization - public static fromString(repr: string) { + /** + * Deserializes a SiblingPath object from a hex string representation. + * @param repr - A hex string representation of the sibling path. + * @returns A SiblingPath object. + */ + public static fromString(repr: string): SiblingPath { return SiblingPath.fromBuffer(Buffer.from(repr, 'hex')); } } From 93bd2486df6302b8e303ddd819780ede90f2241b Mon Sep 17 00:00:00 2001 From: benesjan Date: Thu, 16 Mar 2023 17:22:32 -0600 Subject: [PATCH 17/36] docs: fixed docs of serialise.ts --- yarn-project/merkle-tree/src/serialise.ts | 35 +++++++++++++++++++++-- 1 file changed, 32 insertions(+), 3 deletions(-) diff --git a/yarn-project/merkle-tree/src/serialise.ts b/yarn-project/merkle-tree/src/serialise.ts index 2025d82ee80..a0a16c30eb8 100644 --- a/yarn-project/merkle-tree/src/serialise.ts +++ b/yarn-project/merkle-tree/src/serialise.ts @@ -1,18 +1,47 @@ -// For serializing an array of fixed length elements. -export function serializeBufferArrayToVector(arr: Buffer[]) { +/** + * Concatenates buffers and prefixes them with the resulting length. + * @param arr - An array of buffers to serialize to a vector. + * @returns A vector containing the length of the array, followed by the concatenated buffers. + */ +export function serializeBufferArrayToVector(arr: Buffer[]): Buffer { const lengthBuf = Buffer.alloc(4); lengthBuf.writeUInt32BE(arr.length, 0); return Buffer.concat([lengthBuf, ...arr]); } +/** + * Extracts a buffer from a vector and returns the buffer and the amount of bytes advanced. + * @param vector - A vector from which we extract the buffer. + * @param offset - An offset from which to start extracting the buffer. + * @returns Extracted buffer and the amount of bytes advanced. + */ export function deserializeBufferFromVector(vector: Buffer, offset = 0) { const length = vector.readUInt32BE(offset); const adv = 4 + length; return { elem: vector.slice(offset + 4, offset + adv), adv }; } +/** + * Deserializes elements from a vector using the provided deserialization function and returns the elements as array. + * @param deserialize - A function used to deserialize the elements of the array. + * @param vector - A vector from which to extract the elements. + * @param offset - An offset from which to start extracting the elements. + * @returns An array of elements and the amount of bytes advanced. + */ export function deserializeArrayFromVector( - deserialize: (buf: Buffer, offset: number) => { elem: T; adv: number }, + deserialize: ( + buf: Buffer, + offset: number, + ) => { + /** + * A deserialized element. + */ + elem: T; + /** + * An amount of bytes advanced. + */ + adv: number; + }, vector: Buffer, offset = 0, ) { From f1ab5f89bd3b6a270d1d520eae4d45ad87104b69 Mon Sep 17 00:00:00 2001 From: benesjan Date: Thu, 16 Mar 2023 17:29:04 -0600 Subject: [PATCH 18/36] docs: fixed MerkleTree docs --- yarn-project/merkle-tree/src/merkle_tree.ts | 33 +++++++++++++++++++ .../world-state/src/world-state-db/index.ts | 4 +-- 2 files changed, 35 insertions(+), 2 deletions(-) diff --git a/yarn-project/merkle-tree/src/merkle_tree.ts b/yarn-project/merkle-tree/src/merkle_tree.ts index e1794c9b61d..7953ad2a044 100644 --- a/yarn-project/merkle-tree/src/merkle_tree.ts +++ b/yarn-project/merkle-tree/src/merkle_tree.ts @@ -1,26 +1,56 @@ import { SiblingPath } from './sibling_path.js'; +/** + * Defines the possible Merkle tree IDs. + */ export enum MerkleTreeId { CONTRACT_TREE = 0, CONTRACT_TREE_ROOTS_TREE = 1, NULLIFIER_TREE = 2, } +/** + * Defines tree information. + */ export interface TreeInfo { + /** + * The tree ID. + */ treeId: MerkleTreeId; + /** + * The tree root. + */ root: Buffer; + /** + * The number of leaves in the tree. + */ size: bigint; } +/** + * Defines the interface for a batch update. + */ export interface BatchUpdate { + /** + * The ID of the Merkle tree to be updated. + */ treeId: MerkleTreeId; + /** + * The elements to be updated. + */ elements: Buffer[]; } +/** + * Defines the interface for a source of sibling paths. + */ export interface SiblingPathSource { getSiblingPath(index: bigint): Promise; } +/** + * Defines the interface for a Merkle tree. + */ export interface MerkleTree extends SiblingPathSource { getRoot(): Buffer; getNumLeaves(): bigint; @@ -29,6 +59,9 @@ export interface MerkleTree extends SiblingPathSource { rollback(): Promise; } +/** + * Defines the interface for a database that stores Merkle trees. + */ export interface MerkleTreeDb { getTreeInfo(treeId: MerkleTreeId): Promise; appendLeaves(treeId: MerkleTreeId, leaves: Buffer[]): Promise; diff --git a/yarn-project/world-state/src/world-state-db/index.ts b/yarn-project/world-state/src/world-state-db/index.ts index b1f569549d9..fe55dababd4 100644 --- a/yarn-project/world-state/src/world-state-db/index.ts +++ b/yarn-project/world-state/src/world-state-db/index.ts @@ -1,5 +1,5 @@ /** - * Defines what kind of tree we are dealing with. + * Defines the possible tree IDs. */ export enum WorldStateTreeId { CONTRACT_TREE = 0, @@ -18,7 +18,7 @@ export interface TreeInfo { */ root: Buffer; /** - * The number of leaves. + * The number of leaves in the tree. */ size: number; } From f8914cf01ee86902b912bdbab35933f0b4122b8c Mon Sep 17 00:00:00 2001 From: benesjan Date: Thu, 16 Mar 2023 18:03:30 -0600 Subject: [PATCH 19/36] docs: fixed IndexedTree docs --- yarn-project/merkle-tree/src/indexed_tree.ts | 107 ++++++++++++++++-- yarn-project/merkle-tree/src/standard_tree.ts | 8 +- 2 files changed, 102 insertions(+), 13 deletions(-) diff --git a/yarn-project/merkle-tree/src/indexed_tree.ts b/yarn-project/merkle-tree/src/indexed_tree.ts index ca119942667..41fe16f41f2 100644 --- a/yarn-project/merkle-tree/src/indexed_tree.ts +++ b/yarn-project/merkle-tree/src/indexed_tree.ts @@ -9,9 +9,21 @@ const indexToKeyLeaf = (name: string, index: bigint) => { return `${name}:leaf:${index}`; }; +/** + * A leaf of a tree. + */ interface LeafData { + /** + * A value of the leaf. + */ value: bigint; + /** + * An index of the next leaf. + */ nextIndex: bigint; + /** + * A value of the next leaf. + */ nextValue: bigint; } @@ -39,12 +51,23 @@ const initialLeaf: LeafData = { nextValue: 0n, }; +/** + * A Merkle tree that supports efficient lookup of leaves by value. + */ export class IndexedTree implements MerkleTree { private leaves: LeafData[] = []; private cachedLeaves: { [key: number]: LeafData } = {}; constructor(private underlying: StandardMerkleTree, private hasher: Hasher, private db: LevelUp) {} - public static async new(db: LevelUp, hasher: Hasher, name: string, depth: number) { + /** + * Creates an IndexedTree object. + * @param db - A database used to store the Merkle tree data. + * @param hasher - A hasher used to compute hash paths. + * @param name - A name of the tree. + * @param depth - A depth of the tree. + * @returns A promise with the new Merkle tree. + */ + public static async new(db: LevelUp, hasher: Hasher, name: string, depth: number): Promise { const underlying = await StandardMerkleTree.new( db, hasher, @@ -57,7 +80,14 @@ export class IndexedTree implements MerkleTree { return tree; } - static async fromName(db: LevelUp, hasher: Hasher, name: string) { + /** + * Creates a new tree and sets its root, depth and size based on the meta data which are associated with the name. + * @param db - A database used to store the Merkle tree data. + * @param hasher - A hasher used to compute hash paths. + * @param name - Name of the tree. + * @returns The newly created tree. + */ + static async fromName(db: LevelUp, hasher: Hasher, name: string): Promise { const underlying = await StandardMerkleTree.fromName( db, hasher, @@ -69,28 +99,66 @@ export class IndexedTree implements MerkleTree { return tree; } + /** + * Returns the root of the tree. + * @returns The root of the tree. + */ public getRoot(): Buffer { return this.underlying.getRoot(); } + + /** + * Returns the number of leaves in the tree. + * @returns The number of leaves in the tree. + */ public getNumLeaves(): bigint { return this.underlying.getNumLeaves(); } + + /** + * Appends the given leaves to the tree. + * @param leaves - The leaves to append. + * @returns Empty promise. + */ public async appendLeaves(leaves: Buffer[]): Promise { for (const leaf of leaves) { await this.appendLeaf(leaf); } } + + /** + * Commits the changes to the database. + * @returns Empty promise. + */ public async commit(): Promise { await this.underlying.commit(); await this.commitLeaves(); } + + /** + * Rolls back the not-yet-committed changes. + * @returns Empty promise. + */ public async rollback(): Promise { await this.underlying.rollback(); this.rollbackLeaves(); } + + /** + * Returns a sibling path for the element at the given index. + * @param index - The index of the element. + * @returns A sibling path for the element at the given index. + * Note: The sibling path is an array of sibling hashes, with the lowest hash (leaf hash) first, and the highest hash last. + */ public async getSiblingPath(index: bigint): Promise { return await this.underlying.getSiblingPath(index); } + + /** + * Appends the given leaf to the tree. + * @param leaf - The leaf to append. + * @returns Empty promise. + */ private async appendLeaf(leaf: Buffer): Promise { const newValue = toBigIntBE(leaf); const indexOfPrevious = this.findIndexOfPreviousValue(newValue); @@ -122,13 +190,13 @@ export class IndexedTree implements MerkleTree { const numLeaves = this.underlying.getNumLeaves(); const diff: bigint[] = []; for (let i = 0; i < numLeaves; i++) { - const stored = this.getLatestLeafDataCopy(i)!; - if (stored.value > newValue) { + const storedLeaf = this.getLatestLeafDataCopy(i)!; + if (storedLeaf.value > newValue) { diff.push(newValue); - } else if (stored.value === newValue) { + } else if (storedLeaf.value === newValue) { return { index: i, alreadyPresent: true }; } else { - diff.push(newValue - stored.value); + diff.push(newValue - storedLeaf.value); } } const minIndex = this.findMinIndex(diff); @@ -148,13 +216,20 @@ export class IndexedTree implements MerkleTree { return minIndex; } + /** + * Saves the initial leaf to this object and saves it to a database. + */ private async init() { this.leaves.push(initialLeaf); await this.underlying.appendLeaves([this.hasher.hashToField(encodeTreeValue(initialLeaf))]); await this.commit(); } - private async initFromDb(startingIndex = 0n) { + /** + * Loads Merkle tree data from a database and assigns them to this object. + * @param startingIndex - An index locating a first element of the tree. + */ + private async initFromDb(startingIndex = 0n): Promise { const values: LeafData[] = []; const promise = new Promise((resolve, reject) => { this.db @@ -179,7 +254,10 @@ export class IndexedTree implements MerkleTree { this.leaves = values; } - private async commitLeaves() { + /** + * Commits all the leaves to the database and removes them from a cache. + */ + private async commitLeaves(): Promise { const batch = this.db.batch(); const keys = Object.getOwnPropertyNames(this.cachedLeaves); for (const key of keys) { @@ -191,15 +269,26 @@ export class IndexedTree implements MerkleTree { this.clearCache(); } + /** + * Wipes all the leaves in a cache. + */ private rollbackLeaves() { this.clearCache(); } + /** + * Clears the cache. + */ private clearCache() { this.cachedLeaves = {}; } - private getLatestLeafDataCopy(index: number) { + /** + * Gets the latest LeafData copy. + * @param index - Index of the leaf of which to obtain the LeafData copy. + * @returns A copy of the leaf data at the given index or undefined if the leaf was not found. + */ + private getLatestLeafDataCopy(index: number): LeafData | undefined { const leaf = this.cachedLeaves[index] ?? this.leaves[index]; return leaf ? ({ diff --git a/yarn-project/merkle-tree/src/standard_tree.ts b/yarn-project/merkle-tree/src/standard_tree.ts index 1f094e3e262..4d2ce162181 100644 --- a/yarn-project/merkle-tree/src/standard_tree.ts +++ b/yarn-project/merkle-tree/src/standard_tree.ts @@ -59,8 +59,8 @@ export class StandardMerkleTree implements MerkleTree { /** * Creates a new tree. - * @param db - A database implementing the LevelUp interface. - * @param hasher - A hasher implementing the Hasher interface. + * @param db - A database used to store the Merkle tree data. + * @param hasher - A hasher used to compute hash paths. * @param name - Name of the tree. * @param depth - Depth of the tree. * @param initialLeafValue - The initial value of the leaves. @@ -80,8 +80,8 @@ export class StandardMerkleTree implements MerkleTree { /** * Creates a new tree and sets its root, depth and size based on the meta data which are associated with the name. - * @param db - A database implementing the LevelUp interface. - * @param hasher - A hasher implementing the Hasher interface. + * @param db - A database used to store the Merkle tree data. + * @param hasher - A hasher used to compute hash paths. * @param name - Name of the tree. * @param initialLeafValue - The initial value of the leaves before assigned. * @returns The newly created tree. From bd35504d797f58a7e465026bb4d2deec5af58369 Mon Sep 17 00:00:00 2001 From: benesjan Date: Thu, 16 Mar 2023 18:08:12 -0600 Subject: [PATCH 20/36] docs: other merkle tree fixes --- yarn-project/merkle-tree/src/bigint_buffer.ts | 14 +++++++------- yarn-project/merkle-tree/src/hasher.ts | 3 +++ yarn-project/merkle-tree/src/indexed_tree.test.ts | 12 ++++++------ 3 files changed, 16 insertions(+), 13 deletions(-) diff --git a/yarn-project/merkle-tree/src/bigint_buffer.ts b/yarn-project/merkle-tree/src/bigint_buffer.ts index b04faaaf864..6347b952d64 100644 --- a/yarn-project/merkle-tree/src/bigint_buffer.ts +++ b/yarn-project/merkle-tree/src/bigint_buffer.ts @@ -1,6 +1,6 @@ /** * Convert a little-endian buffer into a BigInt. - * @param buf The little-endian buffer to convert + * @param buf - The little-endian buffer to convert. * @returns A BigInt with the little-endian representation of buf. */ export function toBigIntLE(buf: Buffer): bigint { @@ -14,8 +14,8 @@ export function toBigIntLE(buf: Buffer): bigint { } /** - * Convert a big-endian buffer into a BigInt - * @param buf The big-endian buffer to convert. + * Convert a big-endian buffer into a BigInt. + * @param buf - The big-endian buffer to convert. * @returns A BigInt with the big-endian representation of buf. */ export function toBigIntBE(buf: Buffer): bigint { @@ -28,8 +28,8 @@ export function toBigIntBE(buf: Buffer): bigint { /** * Convert a BigInt to a little-endian buffer. - * @param num The BigInt to convert. - * @param width The number of bytes that the resulting buffer should be. + * @param num - The BigInt to convert. + * @param width - The number of bytes that the resulting buffer should be. * @returns A little-endian buffer representation of num. */ export function toBufferLE(num: bigint, width: number): Buffer { @@ -41,8 +41,8 @@ export function toBufferLE(num: bigint, width: number): Buffer { /** * Convert a BigInt to a big-endian buffer. - * @param num The BigInt to convert. - * @param width The number of bytes that the resulting buffer should be. + * @param num - The BigInt to convert. + * @param width - The number of bytes that the resulting buffer should be. * @returns A big-endian buffer representation of num. */ export function toBufferBE(num: bigint, width: number): Buffer { diff --git a/yarn-project/merkle-tree/src/hasher.ts b/yarn-project/merkle-tree/src/hasher.ts index eddf0103c04..b85218e2fbb 100644 --- a/yarn-project/merkle-tree/src/hasher.ts +++ b/yarn-project/merkle-tree/src/hasher.ts @@ -1,3 +1,6 @@ +/** + * Defines hasher interface used by Merkle trees. + */ export interface Hasher { compress(lhs: Uint8Array, rhs: Uint8Array): Buffer; hashToField(data: Uint8Array): Buffer; diff --git a/yarn-project/merkle-tree/src/indexed_tree.test.ts b/yarn-project/merkle-tree/src/indexed_tree.test.ts index dd041d7e41b..bc33ced10fc 100644 --- a/yarn-project/merkle-tree/src/indexed_tree.test.ts +++ b/yarn-project/merkle-tree/src/indexed_tree.test.ts @@ -32,13 +32,13 @@ describe('IndexedMerkleTreeSpecific', () => { const tree = await createDb(db, pedersen, 'test', 3); /** - * Intial state: + * Initial state: * * index 0 1 2 3 4 5 6 7 * --------------------------------------------------------------------- * val 0 0 0 0 0 0 0 0 * nextIdx 0 0 0 0 0 0 0 0 - * nextVal 0 0 0 0 0 0 0 0 + * nextVal 0 0 0 0 0 0 0 0. */ const zeroTreeLeafHash = pedersen.hashToField(createIndexedTreeLeaf(0, 0, 0)); @@ -57,7 +57,7 @@ describe('IndexedMerkleTreeSpecific', () => { * --------------------------------------------------------------------- * val 0 30 0 0 0 0 0 0 * nextIdx 1 0 0 0 0 0 0 0 - * nextVal 30 0 0 0 0 0 0 0 + * nextVal 30 0 0 0 0 0 0 0. */ let index0Hash = pedersen.hashToField(createIndexedTreeLeaf(0, 1, 30)); let index1Hash = pedersen.hashToField(createIndexedTreeLeaf(30, 0, 0)); @@ -78,7 +78,7 @@ describe('IndexedMerkleTreeSpecific', () => { * --------------------------------------------------------------------- * val 0 30 10 0 0 0 0 0 * nextIdx 2 0 1 0 0 0 0 0 - * nextVal 10 0 30 0 0 0 0 0 + * nextVal 10 0 30 0 0 0 0 0. */ index0Hash = pedersen.hashToField(createIndexedTreeLeaf(0, 2, 10)); let index2Hash = pedersen.hashToField(createIndexedTreeLeaf(10, 1, 30)); @@ -100,7 +100,7 @@ describe('IndexedMerkleTreeSpecific', () => { * --------------------------------------------------------------------- * val 0 30 10 20 0 0 0 0 * nextIdx 2 0 3 1 0 0 0 0 - * nextVal 10 0 20 30 0 0 0 0 + * nextVal 10 0 20 30 0 0 0 0. */ e10 = pedersen.compress(index0Hash, index1Hash); index2Hash = pedersen.hashToField(createIndexedTreeLeaf(10, 3, 20)); @@ -122,7 +122,7 @@ describe('IndexedMerkleTreeSpecific', () => { * --------------------------------------------------------------------- * val 0 30 10 20 50 0 0 0 * nextIdx 2 4 3 1 0 0 0 0 - * nextVal 10 50 20 30 0 0 0 0 + * nextVal 10 50 20 30 0 0 0 0. */ index1Hash = pedersen.hashToField(createIndexedTreeLeaf(30, 4, 50)); const index4Hash = pedersen.hashToField(createIndexedTreeLeaf(50, 0, 0)); From f5371a244cda315cb2b5a436a9976fa81746f54d Mon Sep 17 00:00:00 2001 From: benesjan Date: Thu, 16 Mar 2023 18:12:54 -0600 Subject: [PATCH 21/36] docs: fixed archiver --- yarn-project/archiver/README.md | 3 --- yarn-project/archiver/src/archiver.ts | 11 ++++++++--- yarn-project/archiver/src/l2_block/l2_block.ts | 4 ++++ 3 files changed, 12 insertions(+), 6 deletions(-) diff --git a/yarn-project/archiver/README.md b/yarn-project/archiver/README.md index f787b04c84a..a6743c372be 100644 --- a/yarn-project/archiver/README.md +++ b/yarn-project/archiver/README.md @@ -4,6 +4,3 @@ To run: 2. in the aztec3-l1-contracts repo check out my branch `janb/archiver-test-data`, 3. deploy the contracts and generate initial activity with: `forge script --fork-url "http://127.0.0.1:8545/" --ffi GenerateActivityTest --sig "testGenerateActivity()" --private-key 0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80 --broadcast` 4. in this repository run `yarn start:dev` (Note: this repo is currently messy and eslint will not allow it to be built with `yarn start`) - -Relevant unresolved issues: -https://stackoverflow.com/questions/75739742/why-is-eslint-complaining-about-inheritdoc-tag diff --git a/yarn-project/archiver/src/archiver.ts b/yarn-project/archiver/src/archiver.ts index 5f229f0f038..1f3f057754c 100644 --- a/yarn-project/archiver/src/archiver.ts +++ b/yarn-project/archiver/src/archiver.ts @@ -39,7 +39,8 @@ export class Archiver implements L2BlockSource { ) {} /** - * {@inheritDoc L2BlockSource.getSyncStatus} + * Gets the sync status of the L2 block source. + * @returns The sync status of the L2 block source. */ public async getSyncStatus(): Promise { const nextBlockNum = await this.publicClient.readContract({ @@ -162,7 +163,10 @@ export class Archiver implements L2BlockSource { } /** - * {@inheritDoc L2BlockSource.getL2Blocks} + * Gets the `take` amount of L2 blocks starting from `from`. + * @param from - If of the first rollup to return (inclusive). + * @param take - The number of blocks to return. + * @returns The requested L2 blocks. */ public getL2Blocks(from: number, take: number): L2Block[] { if (from > this.l2Blocks.length) { @@ -176,7 +180,8 @@ export class Archiver implements L2BlockSource { } /** - * {@inheritDoc L2BlockSource.getLatestBlockNum} + * Gets the number of the latest L2 block processed by the block source implementation. + * @returns The number of the latest L2 block processed by the block source implementation. */ public getLatestBlockNum(): number { return this.l2Blocks.length - 1; diff --git a/yarn-project/archiver/src/l2_block/l2_block.ts b/yarn-project/archiver/src/l2_block/l2_block.ts index fa1ff549249..8c2264a82b7 100644 --- a/yarn-project/archiver/src/l2_block/l2_block.ts +++ b/yarn-project/archiver/src/l2_block/l2_block.ts @@ -69,6 +69,10 @@ export class L2Block { public newContractData: ContractData[], ) {} + /** + * Sets the yeet on this block. + * @param yeet - The yeet to set. + */ setYeet(yeet: Buffer) { this.yeet = yeet; } From 68425e7d01bdbb94b9979e180a0b7bd7178073d4 Mon Sep 17 00:00:00 2001 From: benesjan Date: Thu, 16 Mar 2023 18:59:40 -0600 Subject: [PATCH 22/36] docs: fixed running promise docs --- yarn-project/archiver/src/running_promise.ts | 20 +++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/yarn-project/archiver/src/running_promise.ts b/yarn-project/archiver/src/running_promise.ts index ea8b594ce73..05b986bfd97 100644 --- a/yarn-project/archiver/src/running_promise.ts +++ b/yarn-project/archiver/src/running_promise.ts @@ -1,3 +1,6 @@ +/** + * A promise that runs a function in a loop with a polling interval. + */ export class RunningPromise { private running = false; private runningPromise = Promise.resolve(); @@ -6,7 +9,7 @@ export class RunningPromise { constructor(private fn: () => Promise, private pollingInterval = 10000) {} /** - * Starts the running promise + * Starts the running promise. */ public start() { this.running = true; @@ -21,13 +24,20 @@ export class RunningPromise { this.runningPromise = poll(); } + /** + * Stops the running promise. + */ async stop(): Promise { this.running = false; this.interruptResolve(); await this.runningPromise; } - private async interruptableSleep(timeInMs: number) { + /** + * Sleeps for a given amount of time, but can be interrupted by calling stop. + * @param timeInMs - The time to sleep in milliseconds. + */ + private async interruptableSleep(timeInMs: number): Promise { let timeout!: NodeJS.Timeout; const sleepPromise = new Promise(resolve => { timeout = setTimeout(resolve, timeInMs); @@ -36,7 +46,11 @@ export class RunningPromise { clearTimeout(timeout); } - public isRunning() { + /** + * Returns whether the running promise is running. + * @returns Whether the running promise is running. + */ + public isRunning(): boolean { return this.running; } } From 0a10ce49ecaf5e900375e4b723a1897c4628f201 Mon Sep 17 00:00:00 2001 From: PhilWindle Date: Tue, 21 Mar 2023 11:06:39 +0000 Subject: [PATCH 23/36] WIP --- yarn-project/archiver/src/archiver.test.ts | 4 +- yarn-project/archiver/src/archiver.ts | 14 +- yarn-project/archiver/src/l2_block_source.ts | 4 +- .../archiver/src/mock_rollup_source.ts | 34 --- .../src/movetofoundation/log/console.ts | 1 + .../src/movetofoundation/log/debug.ts | 1 + .../src/movetofoundation/log/log_history.ts | 1 + .../archiver/src/polling_rollup_emitter.ts | 46 ---- yarn-project/archiver/src/rollup.ts | 4 - yarn-project/archiver/src/rollup_emitter.ts | 25 -- yarn-project/archiver/src/rollup_source.ts | 7 - yarn-project/merkle-tree/src/index.ts | 5 +- .../{ => indexed_tree}/indexed_tree.test.ts | 6 +- .../src/{ => indexed_tree}/indexed_tree.ts | 20 +- yarn-project/merkle-tree/src/merkle_tree.ts | 25 +- .../src/{ => sibling_path}/sibling_path.ts | 4 +- .../{ => standard_tree}/standard_tree.test.ts | 7 +- .../src/{ => standard_tree}/standard_tree.ts | 8 +- .../merkle-tree/src/{ => test}/test_suite.ts | 2 +- .../world-state/src/l2_block_downloader.ts | 9 +- .../server_world_state_synchroniser.test.ts | 214 ++++++++++++++++++ .../server_world_state_synchroniser.ts | 78 +++++-- .../world-state-db/memory_world_state_db.ts | 68 +++--- 23 files changed, 378 insertions(+), 209 deletions(-) delete mode 100644 yarn-project/archiver/src/mock_rollup_source.ts delete mode 100644 yarn-project/archiver/src/polling_rollup_emitter.ts delete mode 100644 yarn-project/archiver/src/rollup.ts delete mode 100644 yarn-project/archiver/src/rollup_emitter.ts delete mode 100644 yarn-project/archiver/src/rollup_source.ts rename yarn-project/merkle-tree/src/{ => indexed_tree}/indexed_tree.test.ts (97%) rename yarn-project/merkle-tree/src/{ => indexed_tree}/indexed_tree.ts (92%) rename yarn-project/merkle-tree/src/{ => sibling_path}/sibling_path.ts (97%) rename yarn-project/merkle-tree/src/{ => standard_tree}/standard_tree.test.ts (93%) rename yarn-project/merkle-tree/src/{ => standard_tree}/standard_tree.ts (97%) rename yarn-project/merkle-tree/src/{ => test}/test_suite.ts (98%) create mode 100644 yarn-project/world-state/src/synchroniser/server_world_state_synchroniser.test.ts diff --git a/yarn-project/archiver/src/archiver.test.ts b/yarn-project/archiver/src/archiver.test.ts index ff8a4868ffe..8fb2297198f 100644 --- a/yarn-project/archiver/src/archiver.test.ts +++ b/yarn-project/archiver/src/archiver.test.ts @@ -37,7 +37,7 @@ describe('Archiver', () => { it('can start, sync and stop', async () => { const archiver = new Archiver(publicClient, rollupAddress, yeeterAddress); let syncStatus = await archiver.getSyncStatus(); - let latestBlockNum = archiver.getLatestBlockNum(); + let latestBlockNum = await archiver.getLatestBlockNum(); expect(syncStatus).toStrictEqual({ syncedToBlock: -1, latestBlock: 2, @@ -47,7 +47,7 @@ describe('Archiver', () => { await archiver.start(); syncStatus = await archiver.getSyncStatus(); - latestBlockNum = archiver.getLatestBlockNum(); + latestBlockNum = await archiver.getLatestBlockNum(); expect(syncStatus).toStrictEqual({ syncedToBlock: 2, latestBlock: 2, diff --git a/yarn-project/archiver/src/archiver.ts b/yarn-project/archiver/src/archiver.ts index 1f3f057754c..8b4f590461c 100644 --- a/yarn-project/archiver/src/archiver.ts +++ b/yarn-project/archiver/src/archiver.ts @@ -50,7 +50,7 @@ export class Archiver implements L2BlockSource { }); return { - syncedToBlock: this.getLatestBlockNum(), + syncedToBlock: await this.getLatestBlockNum(), latestBlock: Number(nextBlockNum) - 1, }; } @@ -168,23 +168,23 @@ export class Archiver implements L2BlockSource { * @param take - The number of blocks to return. * @returns The requested L2 blocks. */ - public getL2Blocks(from: number, take: number): L2Block[] { + public getL2Blocks(from: number, take: number): Promise { if (from > this.l2Blocks.length) { - return []; + return Promise.resolve([]); } if (from + take > this.l2Blocks.length) { - return this.l2Blocks.slice(from); + return Promise.resolve(this.l2Blocks.slice(from)); } - return this.l2Blocks.slice(from, from + take); + return Promise.resolve(this.l2Blocks.slice(from, from + take)); } /** * Gets the number of the latest L2 block processed by the block source implementation. * @returns The number of the latest L2 block processed by the block source implementation. */ - public getLatestBlockNum(): number { - return this.l2Blocks.length - 1; + public getLatestBlockNum(): Promise { + return Promise.resolve(this.l2Blocks.length - 1); } } diff --git a/yarn-project/archiver/src/l2_block_source.ts b/yarn-project/archiver/src/l2_block_source.ts index 200a02961f4..4ada33cbd98 100644 --- a/yarn-project/archiver/src/l2_block_source.ts +++ b/yarn-project/archiver/src/l2_block_source.ts @@ -28,7 +28,7 @@ export interface L2BlockSource { * Gets the number of the latest L2 block processed by the block source implementation. * @returns The number of the latest L2 block processed by the block source implementation. */ - getLatestBlockNum(): number; + getLatestBlockNum(): Promise; /** * Gets the `take` amount of L2 blocks starting from `from`. @@ -36,5 +36,5 @@ export interface L2BlockSource { * @param take - The number of blocks to return. * @returns The requested L2 blocks. */ - getL2Blocks(from: number, take: number): L2Block[]; + getL2Blocks(from: number, take: number): Promise; } diff --git a/yarn-project/archiver/src/mock_rollup_source.ts b/yarn-project/archiver/src/mock_rollup_source.ts deleted file mode 100644 index c3bfeb40c0f..00000000000 --- a/yarn-project/archiver/src/mock_rollup_source.ts +++ /dev/null @@ -1,34 +0,0 @@ -import { Rollup } from './rollup.js'; -import { RollupSource } from './rollup_source.js'; - -const createMockRollup = (rollupId: number) => { - return { - rollupId, - commitments: [Buffer.alloc(32)], - } as Rollup; -}; - -export class MockRollupSource implements RollupSource { - private currentRollupId: number; - private rollups: Rollup[] = []; - constructor(private startRollupId: number) { - this.currentRollupId = startRollupId; - if (this.currentRollupId >= 0) { - this.rollups = [createMockRollup(this.currentRollupId)]; - } - } - public getRollups(from: number, take = 10): Promise { - if (from < this.startRollupId || from > this.currentRollupId + 1) { - throw new Error('Rollup not found'); - } - if (from === this.currentRollupId + 1) { - this.rollups.push(createMockRollup(this.currentRollupId)); - this.currentRollupId + 1; - } - return Promise.resolve(this.rollups.slice(from, take)); - } - - public getLatestRollupId(): Promise { - return Promise.resolve(this.currentRollupId); - } -} diff --git a/yarn-project/archiver/src/movetofoundation/log/console.ts b/yarn-project/archiver/src/movetofoundation/log/console.ts index 6315a10e0e7..0395ab5a2f5 100644 --- a/yarn-project/archiver/src/movetofoundation/log/console.ts +++ b/yarn-project/archiver/src/movetofoundation/log/console.ts @@ -1,3 +1,4 @@ +/* eslint-disable */ export type Logger = (...args: any[]) => void; class ConsoleLogger { diff --git a/yarn-project/archiver/src/movetofoundation/log/debug.ts b/yarn-project/archiver/src/movetofoundation/log/debug.ts index f9be3945d9b..1e9733bb921 100644 --- a/yarn-project/archiver/src/movetofoundation/log/debug.ts +++ b/yarn-project/archiver/src/movetofoundation/log/debug.ts @@ -1,3 +1,4 @@ +/* eslint-disable */ import debug from 'debug'; let preLogHook: ((...args: any[]) => void) | undefined; diff --git a/yarn-project/archiver/src/movetofoundation/log/log_history.ts b/yarn-project/archiver/src/movetofoundation/log/log_history.ts index d60151a78c1..6328c9cb5b5 100644 --- a/yarn-project/archiver/src/movetofoundation/log/log_history.ts +++ b/yarn-project/archiver/src/movetofoundation/log/log_history.ts @@ -1,3 +1,4 @@ +/* eslint-disable */ import { setPreDebugLogHook } from './debug.js'; export class LogHistory { diff --git a/yarn-project/archiver/src/polling_rollup_emitter.ts b/yarn-project/archiver/src/polling_rollup_emitter.ts deleted file mode 100644 index b5032269c3a..00000000000 --- a/yarn-project/archiver/src/polling_rollup_emitter.ts +++ /dev/null @@ -1,46 +0,0 @@ -import { EventEmitter } from 'stream'; -import { Rollup } from './rollup.js'; -import { RollupEmitter } from './rollup_emitter.js'; -import { RollupSource } from './rollup_source.js'; -import { RunningPromise } from './running_promise.js'; - -export class PollingRollupEmitter extends EventEmitter implements RollupEmitter { - private runningPromise?: RunningPromise; - constructor(private retriever: RollupSource, private pollingInterval = 10000) { - super(); - } - public getRollups(from: number, take?: number): Promise { - return this.retriever.getRollups(from, take); - } - - /** - * Starts emitting rollup blocks. - */ - public async start(fromRollup = 0, syncInitial = true) { - const getAndEmitNewBlocks = async () => { - try { - const rollups = await this.getRollups(fromRollup); - for (const rollup of rollups) { - this.emit('rollup', rollup); - fromRollup = rollup.rollupId + 1; - } - } catch (error) { - console.log(error); - } - }; - if (syncInitial) { - await getAndEmitNewBlocks(); - } - - this.runningPromise = new RunningPromise(getAndEmitNewBlocks, this.pollingInterval); - this.runningPromise!.start(); - } - - async stop(): Promise { - await this.runningPromise?.stop(); - } - - public getLatestRollupId(): Promise { - return this.retriever.getLatestRollupId(); - } -} diff --git a/yarn-project/archiver/src/rollup.ts b/yarn-project/archiver/src/rollup.ts deleted file mode 100644 index afea10ebf01..00000000000 --- a/yarn-project/archiver/src/rollup.ts +++ /dev/null @@ -1,4 +0,0 @@ -export interface Rollup { - rollupId: number; - commitments: Buffer[]; -} diff --git a/yarn-project/archiver/src/rollup_emitter.ts b/yarn-project/archiver/src/rollup_emitter.ts deleted file mode 100644 index 8d08e35aaeb..00000000000 --- a/yarn-project/archiver/src/rollup_emitter.ts +++ /dev/null @@ -1,25 +0,0 @@ -import { EventEmitter } from 'stream'; -import { Rollup } from './rollup.js'; - -export interface RollupEmitter extends EventEmitter { - /** - * Returns up to `take` rollups from rollup id `from`. - * This does not guarantee all rollups are returned. It may return a subset, and the - * client should use `getLatestRollupId()` to determine if it needs to make further requests. - */ - getRollups(from: number, take?: number): Promise; - - /** - * Starts emitting rollup blocks. - * If syncInitial == true, all blocks from `fromRollup` will be emitted before the function ends - */ - start(fromRollup?: number, syncInitial?: boolean): void; - - stop(): Promise; - - on(event: 'rollup', fn: (rollup: Rollup) => void): this; - - removeAllListeners(): this; - - getLatestRollupId(): Promise; -} diff --git a/yarn-project/archiver/src/rollup_source.ts b/yarn-project/archiver/src/rollup_source.ts deleted file mode 100644 index 13c7f029344..00000000000 --- a/yarn-project/archiver/src/rollup_source.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { Rollup } from './rollup.js'; - -export interface RollupSource { - getRollups(from: number, take?: number): Promise; - - getLatestRollupId(): Promise; -} diff --git a/yarn-project/merkle-tree/src/index.ts b/yarn-project/merkle-tree/src/index.ts index ad75bd4cb2a..7d6590c633d 100644 --- a/yarn-project/merkle-tree/src/index.ts +++ b/yarn-project/merkle-tree/src/index.ts @@ -1,5 +1,6 @@ -export * from './sibling_path.js'; +export * from './sibling_path/sibling_path.js'; export * from './hasher.js'; -export * from './standard_tree.js'; +export * from './standard_tree/standard_tree.js'; export * from './pedersen.js'; export * from './merkle_tree.js'; +export * from './indexed_tree/indexed_tree.js'; diff --git a/yarn-project/merkle-tree/src/indexed_tree.test.ts b/yarn-project/merkle-tree/src/indexed_tree/indexed_tree.test.ts similarity index 97% rename from yarn-project/merkle-tree/src/indexed_tree.test.ts rename to yarn-project/merkle-tree/src/indexed_tree/indexed_tree.test.ts index bc33ced10fc..a9cb88a5e5a 100644 --- a/yarn-project/merkle-tree/src/indexed_tree.test.ts +++ b/yarn-project/merkle-tree/src/indexed_tree/indexed_tree.test.ts @@ -1,9 +1,9 @@ import { default as levelup } from 'levelup'; import { default as memdown } from 'memdown'; -import { toBufferBE } from './bigint_buffer.js'; -import { Hasher, Pedersen, SiblingPath } from './index.js'; +import { toBufferBE } from '../bigint_buffer.js'; +import { Hasher, Pedersen, SiblingPath } from '../index.js'; import { IndexedTree } from './indexed_tree.js'; -import { merkleTreeTestSuite } from './test_suite.js'; +import { merkleTreeTestSuite } from '../test/test_suite.js'; const createDb = async (levelUp: levelup.LevelUp, hasher: Hasher, name: string, depth: number) => { return await IndexedTree.new(levelUp, hasher, name, depth); diff --git a/yarn-project/merkle-tree/src/indexed_tree.ts b/yarn-project/merkle-tree/src/indexed_tree/indexed_tree.ts similarity index 92% rename from yarn-project/merkle-tree/src/indexed_tree.ts rename to yarn-project/merkle-tree/src/indexed_tree/indexed_tree.ts index 41fe16f41f2..d02a73a100b 100644 --- a/yarn-project/merkle-tree/src/indexed_tree.ts +++ b/yarn-project/merkle-tree/src/indexed_tree/indexed_tree.ts @@ -1,9 +1,9 @@ import { LevelUp } from 'levelup'; -import { toBigIntBE, toBufferBE } from './bigint_buffer.js'; -import { MerkleTree } from './merkle_tree.js'; -import { SiblingPath } from './sibling_path.js'; -import { StandardMerkleTree } from './standard_tree.js'; -import { Hasher } from './hasher.js'; +import { toBigIntBE, toBufferBE } from '../bigint_buffer.js'; +import { MerkleTree } from '../merkle_tree.js'; +import { SiblingPath } from '../sibling_path/sibling_path.js'; +import { StandardMerkleTree } from '../standard_tree/standard_tree.js'; +import { Hasher } from '../hasher.js'; const indexToKeyLeaf = (name: string, index: bigint) => { return `${name}:leaf:${index}`; @@ -186,6 +186,11 @@ export class IndexedTree implements MerkleTree { await this.underlying.appendLeaves([this.hasher.hashToField(newTreeValue)]); } + /** + * Finds the index of the largest leaf whose value is less than or equal to the provided value. + * @param newValue - The new value to be inserted into the tree. + * @returns Tuple containing the leaf index and a flag to say if the value is a duplicate. + */ private findIndexOfPreviousValue(newValue: bigint) { const numLeaves = this.underlying.getNumLeaves(); const diff: bigint[] = []; @@ -203,6 +208,11 @@ export class IndexedTree implements MerkleTree { return { index: minIndex, alreadyPresent: false }; } + /** + * Finds the index of the minimum value in an array. + * @param values - The collection of values to be searched. + * @returns The index of the minimum value in the array. + */ private findMinIndex(values: bigint[]) { if (!values.length) { return 0; diff --git a/yarn-project/merkle-tree/src/merkle_tree.ts b/yarn-project/merkle-tree/src/merkle_tree.ts index 7953ad2a044..e300f28d839 100644 --- a/yarn-project/merkle-tree/src/merkle_tree.ts +++ b/yarn-project/merkle-tree/src/merkle_tree.ts @@ -1,4 +1,4 @@ -import { SiblingPath } from './sibling_path.js'; +import { SiblingPath } from './sibling_path/sibling_path.js'; /** * Defines the possible Merkle tree IDs. @@ -9,6 +9,15 @@ export enum MerkleTreeId { NULLIFIER_TREE = 2, } +/** + * Defines the depths of the various merkle trees. + */ +export enum MerkleTreeDepths { + CONTRACT_TREE = 32, + CONTRACT_TREE_ROOTS_TREE = 8, + NULLIFIER_TREE = 32, +} + /** * Defines tree information. */ @@ -27,20 +36,6 @@ export interface TreeInfo { size: bigint; } -/** - * Defines the interface for a batch update. - */ -export interface BatchUpdate { - /** - * The ID of the Merkle tree to be updated. - */ - treeId: MerkleTreeId; - /** - * The elements to be updated. - */ - elements: Buffer[]; -} - /** * Defines the interface for a source of sibling paths. */ diff --git a/yarn-project/merkle-tree/src/sibling_path.ts b/yarn-project/merkle-tree/src/sibling_path/sibling_path.ts similarity index 97% rename from yarn-project/merkle-tree/src/sibling_path.ts rename to yarn-project/merkle-tree/src/sibling_path/sibling_path.ts index 79fba929e79..6b12590eee2 100644 --- a/yarn-project/merkle-tree/src/sibling_path.ts +++ b/yarn-project/merkle-tree/src/sibling_path/sibling_path.ts @@ -1,5 +1,5 @@ -import { Pedersen } from './pedersen.js'; -import { deserializeArrayFromVector, serializeBufferArrayToVector } from './serialise.js'; +import { Pedersen } from '../pedersen.js'; +import { deserializeArrayFromVector, serializeBufferArrayToVector } from '../serialise.js'; /** * Contains functionality to compute and serialize/deserialize a sibling path. diff --git a/yarn-project/merkle-tree/src/standard_tree.test.ts b/yarn-project/merkle-tree/src/standard_tree/standard_tree.test.ts similarity index 93% rename from yarn-project/merkle-tree/src/standard_tree.test.ts rename to yarn-project/merkle-tree/src/standard_tree/standard_tree.test.ts index 81a644d22f0..958ebfde184 100644 --- a/yarn-project/merkle-tree/src/standard_tree.test.ts +++ b/yarn-project/merkle-tree/src/standard_tree/standard_tree.test.ts @@ -1,7 +1,10 @@ import { default as levelup } from 'levelup'; import { default as memdown } from 'memdown'; -import { Hasher, Pedersen, SiblingPath, StandardMerkleTree } from './index.js'; -import { merkleTreeTestSuite } from './test_suite.js'; +import { Hasher } from '../hasher.js'; +import { SiblingPath } from '../index.js'; +import { Pedersen } from '../pedersen.js'; +import { StandardMerkleTree } from './standard_tree.js'; +import { merkleTreeTestSuite } from '../test/test_suite.js'; const createDb = async (levelUp: levelup.LevelUp, hasher: Hasher, name: string, depth: number) => { return await StandardMerkleTree.new(levelUp, hasher, name, depth); diff --git a/yarn-project/merkle-tree/src/standard_tree.ts b/yarn-project/merkle-tree/src/standard_tree/standard_tree.ts similarity index 97% rename from yarn-project/merkle-tree/src/standard_tree.ts rename to yarn-project/merkle-tree/src/standard_tree/standard_tree.ts index 4d2ce162181..700dc3e0330 100644 --- a/yarn-project/merkle-tree/src/standard_tree.ts +++ b/yarn-project/merkle-tree/src/standard_tree/standard_tree.ts @@ -1,8 +1,8 @@ import { LevelUp, LevelUpChain } from 'levelup'; -import { SiblingPath } from './sibling_path.js'; -import { Hasher } from './hasher.js'; -import { MerkleTree } from './merkle_tree.js'; -import { toBufferLE, toBigIntLE } from './bigint_buffer.js'; +import { SiblingPath } from '../sibling_path/sibling_path.js'; +import { Hasher } from '../hasher.js'; +import { MerkleTree } from '../merkle_tree.js'; +import { toBufferLE, toBigIntLE } from '../bigint_buffer.js'; const MAX_DEPTH = 32; diff --git a/yarn-project/merkle-tree/src/test_suite.ts b/yarn-project/merkle-tree/src/test/test_suite.ts similarity index 98% rename from yarn-project/merkle-tree/src/test_suite.ts rename to yarn-project/merkle-tree/src/test/test_suite.ts index 4bbd2af7cbf..2c55a977a61 100644 --- a/yarn-project/merkle-tree/src/test_suite.ts +++ b/yarn-project/merkle-tree/src/test/test_suite.ts @@ -1,6 +1,6 @@ import { default as levelup } from 'levelup'; import { default as memdown } from 'memdown'; -import { Hasher, MerkleTree, Pedersen, SiblingPath } from './index.js'; +import { Hasher, MerkleTree, Pedersen, SiblingPath } from '../index.js'; const expectSameTrees = async (tree1: MerkleTree, tree2: MerkleTree) => { const size = tree1.getNumLeaves(); diff --git a/yarn-project/world-state/src/l2_block_downloader.ts b/yarn-project/world-state/src/l2_block_downloader.ts index 70e9e109792..472d56f41eb 100644 --- a/yarn-project/world-state/src/l2_block_downloader.ts +++ b/yarn-project/world-state/src/l2_block_downloader.ts @@ -18,7 +18,7 @@ export class L2BlockDownloader { private semaphore: Semaphore; private queue = new MemoryFifo(); - constructor(private l2BlockSource: L2BlockSource, maxQueueSize: number) { + constructor(private l2BlockSource: L2BlockSource, maxQueueSize: number, private pollIntervalMS = 10000) { this.semaphore = new Semaphore(maxQueueSize); } @@ -39,21 +39,20 @@ export class L2BlockDownloader { const fn = async () => { while (this.running) { try { - const blocks = this.l2BlockSource.getL2Blocks(this.from, 10); + const blocks = await this.l2BlockSource.getL2Blocks(this.from, 10); if (!blocks.length) { - await this.interruptableSleep.sleep(10000); + await this.interruptableSleep.sleep(this.pollIntervalMS); continue; } // Blocks if there are maxQueueSize results in the queue, until released after the callback. await this.semaphore.acquire(); - this.queue.put(blocks); this.from += blocks.length; } catch (err) { console.log(err); - await this.interruptableSleep.sleep(10000); + await this.interruptableSleep.sleep(this.pollIntervalMS); } } }; diff --git a/yarn-project/world-state/src/synchroniser/server_world_state_synchroniser.test.ts b/yarn-project/world-state/src/synchroniser/server_world_state_synchroniser.test.ts new file mode 100644 index 00000000000..bc59a777498 --- /dev/null +++ b/yarn-project/world-state/src/synchroniser/server_world_state_synchroniser.test.ts @@ -0,0 +1,214 @@ +/* eslint-disable */ +import { ServerWorldStateSynchroniser } from './server_world_state_synchroniser.js'; +import { L2BlockSource, SyncStatus } from '@aztec/archiver/l2_block_source'; +import { L2Block } from '@aztec/archiver/l2_block'; +import { sleep } from '../sleep.js'; +import { WorldStateRunningState } from './world_state_synchroniser.js'; +import { jest } from '@jest/globals'; +import { Pedersen, MerkleTreeDb, MerkleTreeId, SiblingPath, StandardMerkleTree } from '@aztec/merkle-tree'; + +type Mockify = { + [P in keyof T]: jest.Mock; +}; + +const syncStatus = { + syncedToBlock: 0, + latestBlock: 0, +} as SyncStatus; + +let latestBlockNumber = 5; +const getLatestBlockNumber = () => latestBlockNumber; +let nextBlocks: L2Block[] = []; +const consumeNextBlocks = () => { + const blocks = nextBlocks; + nextBlocks = []; + return Promise.resolve(blocks); +}; + +const getMockBlock = (blockNumber: number, newContractsCommitments?: Buffer[]) => { + const block = { + number: blockNumber, + newContracts: newContractsCommitments ?? [Buffer.alloc(32, 0)], + } as L2Block; + return block; +}; + +const createSynchroniser = (merkleTreeDb: any, rollupSource: any) => + new ServerWorldStateSynchroniser(merkleTreeDb as MerkleTreeDb, rollupSource as L2BlockSource, 1, 100); + +describe('server_world_state_synchroniser', () => { + const pedersen: Pedersen = new Pedersen(); + const rollupSource: Mockify = { + getSyncStatus: jest.fn().mockImplementation(() => Promise.resolve(syncStatus)), + getLatestBlockNum: jest.fn().mockImplementation(getLatestBlockNumber), + getL2Blocks: jest.fn().mockImplementation(consumeNextBlocks), + } as any; + + const merkleTreeDb: Mockify = { + getTreeInfo: jest + .fn() + .mockImplementation(() => + Promise.resolve({ treeId: MerkleTreeId.CONTRACT_TREE, root: Buffer.alloc(32, 0), size: 0n }), + ), + appendLeaves: jest.fn().mockImplementation(() => Promise.resolve()), + getSiblingPath: jest.fn().mockImplementation(() => { + return Promise.resolve(SiblingPath.ZERO(32, StandardMerkleTree.ZERO_ELEMENT, pedersen)); + }), + commit: jest.fn().mockImplementation(() => Promise.resolve()), + rollback: jest.fn().mockImplementation(() => Promise.resolve()), + } as any; + + it('can be constructed', () => { + expect(() => createSynchroniser(merkleTreeDb, rollupSource)).not.toThrow(); + }); + + it('updates sync progress', async () => { + const server = createSynchroniser(merkleTreeDb, rollupSource); + + // test initial state + let status = await server.status(); + expect(status.syncedToL2Block).toEqual(-1); + expect(status.state).toEqual(WorldStateRunningState.IDLE); + + // create an initial block + let currentBlockNumber = -1; + nextBlocks = [getMockBlock(currentBlockNumber + 1)]; + + // start the sync process but don't await + server.start(0).catch(() => console.log('Sync not completed!!')); + + // now setup a loop to monitor the sync progress and push new blocks in + while (currentBlockNumber <= latestBlockNumber) { + status = await server.status(); + expect( + status.syncedToL2Block >= currentBlockNumber || status.syncedToL2Block <= currentBlockNumber + 1, + ).toBeTruthy(); + if (status.syncedToL2Block === latestBlockNumber) { + break; + } + expect( + status.state >= WorldStateRunningState.IDLE || status.state <= WorldStateRunningState.SYNCHING, + ).toBeTruthy(); + if (status.syncedToL2Block === currentBlockNumber) { + await sleep(100); + continue; + } + currentBlockNumber++; + nextBlocks = [getMockBlock(currentBlockNumber + 1)]; + } + + // check the status agian, should be fully synced + status = await server.status(); + expect(status.state).toEqual(WorldStateRunningState.RUNNING); + expect(status.syncedToL2Block).toEqual(latestBlockNumber); + + // stop the synchroniser + await server.stop(); + + // check the final status + status = await server.status(); + expect(status.state).toEqual(WorldStateRunningState.STOPPED); + expect(status.syncedToL2Block).toEqual(latestBlockNumber); + }); + + it('enables blocking until synced', async () => { + const server = createSynchroniser(merkleTreeDb, rollupSource); + let currentBlockNumber = -1; + + const newBlocks = async () => { + while (currentBlockNumber <= latestBlockNumber) { + await sleep(100); + nextBlocks = [...nextBlocks, getMockBlock(++currentBlockNumber)]; + } + }; + + // kick off the background queueing of blocks + const newBlockPromise = newBlocks(); + + // kick off the synching + const syncPromise = server.start(0); + + // await the synching + await syncPromise; + + await newBlockPromise; + + let status = await server.status(); + expect(status.state).toEqual(WorldStateRunningState.RUNNING); + expect(status.syncedToL2Block).toEqual(latestBlockNumber); + await server.stop(); + status = await server.status(); + expect(status.state).toEqual(WorldStateRunningState.STOPPED); + expect(status.syncedToL2Block).toEqual(latestBlockNumber); + }); + + it('handles multiple calls to start', async () => { + const server = createSynchroniser(merkleTreeDb, rollupSource); + let currentBlockNumber = -1; + + const newBlocks = async () => { + while (currentBlockNumber < latestBlockNumber) { + await sleep(100); + const newBlock = getMockBlock(++currentBlockNumber); + nextBlocks = [...nextBlocks, newBlock]; + } + }; + + // kick off the background queueing of blocks + const newBlockPromise = newBlocks(); + + // kick off the synching + await server.start(0); + + // call start again, should get back the same promise + await server.start(0); + + // wait until the block production has finished + await newBlockPromise; + + await server.stop(); + }); + + it('immediately syncs if no new blocks', async () => { + const server = createSynchroniser(merkleTreeDb, rollupSource); + + // kick off the synching + const syncPromise = server.start(5); + + // it should already be synced, no need to push new blocks + await syncPromise; + + const status = await server.status(); + expect(status.state).toBe(WorldStateRunningState.RUNNING); + expect(status.syncedToL2Block).toBe(latestBlockNumber); + await server.stop(); + }); + + it("can't be started if already stopped", async () => { + const server = createSynchroniser(merkleTreeDb, rollupSource); + + // kick off the synching + const syncPromise = server.start(5); + await syncPromise; + await server.stop(); + + await expect(server.start()).rejects.toThrow(); + }); + + it('updates the contract tree', async () => { + merkleTreeDb.appendLeaves.mockReset(); + const server = createSynchroniser(merkleTreeDb, rollupSource); + const totalBlocks = latestBlockNumber + 1; + nextBlocks = Array(totalBlocks) + .fill(0) + .map((_, index) => getMockBlock(index, [Buffer.alloc(32, index)])); + // sync the server + await server.start(0); + expect(merkleTreeDb.appendLeaves).toHaveBeenCalledTimes(totalBlocks); + for (let i = 0; i < totalBlocks; i++) { + expect(merkleTreeDb.appendLeaves.mock.calls[i][0]).toEqual(MerkleTreeId.CONTRACT_TREE); + expect(merkleTreeDb.appendLeaves.mock.calls[i][1]).toEqual([Buffer.alloc(32, i)]); + } + await server.stop(); + }); +}); diff --git a/yarn-project/world-state/src/synchroniser/server_world_state_synchroniser.ts b/yarn-project/world-state/src/synchroniser/server_world_state_synchroniser.ts index 9bac25595bf..834bddf7c38 100644 --- a/yarn-project/world-state/src/synchroniser/server_world_state_synchroniser.ts +++ b/yarn-project/world-state/src/synchroniser/server_world_state_synchroniser.ts @@ -1,6 +1,5 @@ import { WorldStateRunningState, WorldStateStatus, WorldStateSynchroniser } from './world_state_synchroniser.js'; -import { BatchUpdate, WorldStateTreeId } from '../world-state-db/index.js'; -import { MerkleTreeDb } from '@aztec/merkle-tree'; +import { MerkleTreeDb, MerkleTreeId } from '@aztec/merkle-tree'; import { L2BlockDownloader } from '../l2_block_downloader.js'; import { L2BlockSource } from '@aztec/archiver/l2_block_source'; import { L2Block } from '@aztec/archiver/l2_block'; @@ -11,30 +10,65 @@ import { L2Block } from '@aztec/archiver/l2_block'; * tree. */ export class ServerWorldStateSynchroniser implements WorldStateSynchroniser { - private currentL2BlockNum = 0; + private currentL2BlockNum = -1; + private latestBlockNumberAtStart = -1; private l2BlockDownloader: L2BlockDownloader; + private syncPromise: Promise = Promise.resolve(); + private syncResolve?: () => void = undefined; + private syncReject?: () => void = undefined; + private stopping = false; private runningPromise: Promise = Promise.resolve(); - private running = false; + private currentState: WorldStateRunningState = WorldStateRunningState.IDLE; - constructor(private merkleTreeDb: MerkleTreeDb, l2BlockSource: L2BlockSource, maxQueueSize = 1000) { - this.l2BlockDownloader = new L2BlockDownloader(l2BlockSource, maxQueueSize); + constructor( + private merkleTreeDb: MerkleTreeDb, + private l2BlockSource: L2BlockSource, + maxQueueSize = 1000, + pollIntervalMS = 10000, + ) { + this.l2BlockDownloader = new L2BlockDownloader(l2BlockSource, maxQueueSize, pollIntervalMS); } /** * Starts the synchroniser. * @param from - The block number to start downloading from. Defaults to 0. + * @returns A promise that resolves once the initial sync is completed. */ - public start(from = 0) { - this.running = true; + public async start(from = 0) { + if (this.currentState === WorldStateRunningState.STOPPED) { + throw new Error('Synchroniser already stopped'); + } + if (this.currentState !== WorldStateRunningState.IDLE) { + return this.syncPromise; + } + + // get the current latest block number + this.latestBlockNumberAtStart = await this.l2BlockSource.getLatestBlockNum(); + + // if there are blocks to be retrieved, go to a synching state + if (from < this.latestBlockNumberAtStart) { + this.currentState = WorldStateRunningState.SYNCHING; + this.syncPromise = new Promise((resolve, reject) => { + this.syncResolve = resolve; + this.syncReject = reject; + }); + } else { + // if no blocks to be retrieved, go straight to running + this.currentState = WorldStateRunningState.RUNNING; + this.currentL2BlockNum = this.latestBlockNumberAtStart; + this.syncPromise = Promise.resolve(); + } + + // start looking for further blocks const blockProcess = async () => { - while (this.running) { + while (!this.stopping) { const blocks = await this.l2BlockDownloader.getL2Blocks(); await this.handleL2Blocks(blocks); } }; this.runningPromise = blockProcess(); - this.l2BlockDownloader.start(from); + return this.syncPromise; } /** @@ -42,8 +76,12 @@ export class ServerWorldStateSynchroniser implements WorldStateSynchroniser { */ public async stop() { await this.l2BlockDownloader.stop(); - this.running = false; + this.stopping = true; await this.runningPromise; + if (this.currentState === WorldStateRunningState.SYNCHING && this.syncReject !== undefined) { + this.syncReject(); + } + this.currentState = WorldStateRunningState.STOPPED; } /** @@ -53,7 +91,7 @@ export class ServerWorldStateSynchroniser implements WorldStateSynchroniser { public status(): Promise { const status = { syncedToL2Block: this.currentL2BlockNum, - state: WorldStateRunningState.IDLE, + state: this.currentState, } as WorldStateStatus; return Promise.resolve(status); } @@ -73,11 +111,17 @@ export class ServerWorldStateSynchroniser implements WorldStateSynchroniser { * @param l2block - The L2 block to handle. */ private async handleL2Block(l2block: L2Block) { - const update = { - treeId: WorldStateTreeId.CONTRACT_TREE, - elements: l2block.newCommitments, - } as BatchUpdate; - await this.merkleTreeDb.insertElements([update]); + await this.merkleTreeDb.appendLeaves(MerkleTreeId.CONTRACT_TREE, l2block.newContracts); + await this.merkleTreeDb.commit(); this.currentL2BlockNum = l2block.number; + if ( + this.currentState === WorldStateRunningState.SYNCHING && + this.currentL2BlockNum >= this.latestBlockNumberAtStart + ) { + this.currentState = WorldStateRunningState.RUNNING; + if (this.syncResolve !== undefined) { + this.syncResolve(); + } + } } } diff --git a/yarn-project/world-state/src/world-state-db/memory_world_state_db.ts b/yarn-project/world-state/src/world-state-db/memory_world_state_db.ts index d3e86feb51d..d4333890cb8 100644 --- a/yarn-project/world-state/src/world-state-db/memory_world_state_db.ts +++ b/yarn-project/world-state/src/world-state-db/memory_world_state_db.ts @@ -1,4 +1,4 @@ -import { default as LevelUp } from 'levelup'; +import { default as levelup } from 'levelup'; import { StandardMerkleTree, Pedersen, @@ -7,6 +7,8 @@ import { MerkleTreeId, TreeInfo, IndexedTree, + MerkleTreeDepths, + MerkleTree, } from '@aztec/merkle-tree'; import { SerialQueue } from '../serial_queue.js'; @@ -17,16 +19,31 @@ export class MerkleTrees implements MerkleTreeDb { private trees: MerkleTree[] = []; private jobQueue = new SerialQueue(); - constructor(db: LevelUp) { + constructor(private db: levelup.LevelUp) {} + + /** + * Initialises the collection of Merkle Trees. + */ + public async init() { const hasher = new Pedersen(); - const contractTree = StandardMerkleTree.new(db, hasher, `${MerkleTreeId[MerkleTreeId.CONTRACT_TREE]}`, 32); - const contractTreeRootsTree = StandardMerkleTree.new( - db, + const contractTree = await StandardMerkleTree.new( + this.db, + hasher, + `${MerkleTreeId[MerkleTreeId.CONTRACT_TREE]}`, + MerkleTreeDepths.CONTRACT_TREE, + ); + const contractTreeRootsTree = await StandardMerkleTree.new( + this.db, hasher, `${MerkleTreeId[MerkleTreeId.CONTRACT_TREE_ROOTS_TREE]}`, - 7, + MerkleTreeDepths.CONTRACT_TREE_ROOTS_TREE, + ); + const nullifierTree = await IndexedTree.new( + this.db, + hasher, + `${MerkleTreeId[MerkleTreeId.NULLIFIER_TREE]}`, + MerkleTreeDepths.NULLIFIER_TREE, ); - const nullifierTree = IndexedTree.new(db, hasher, `${MerkleTreeId[MerkleTreeId.NULLIFIER_TREE]}`, 32); this.trees = [contractTree, contractTreeRootsTree, nullifierTree]; this.jobQueue.start(); } @@ -39,11 +56,12 @@ export class MerkleTrees implements MerkleTreeDb { } /** - * Gets the tree info for all trees. - * @returns The tree info for all trees. + * Gets the tree info for the specified tree. + * @param treeId - Id of the tree to get information from. + * @returns The tree info for the specified tree. */ - public async getTreeInfo(): Promise { - return await this.synchronise(() => this._getTreeInfo()); + public async getTreeInfo(treeId: MerkleTreeId): Promise { + return await this.synchronise(() => this._getTreeInfo(treeId)); } /** @@ -52,7 +70,7 @@ export class MerkleTrees implements MerkleTreeDb { * @param index - The index of the leaf. * @returns The sibling path for the leaf. */ - public async getSiblingPath(treeId: MerkleTreeId, index: number): Promise { + public async getSiblingPath(treeId: MerkleTreeId, index: bigint): Promise { return await this.synchronise(() => this._getSiblingPath(treeId, index)); } @@ -92,19 +110,17 @@ export class MerkleTrees implements MerkleTreeDb { } /** - * Returns the tree info for all trees. - * @returns The tree info for all trees. + * Returns the tree info for the specified tree. + * @param treeId - Id of the tree to get information from. + * @returns The tree info for the specified tree. */ - private _getTreeInfo(): Promise { - return Promise.resolve( - this.trees.map((tree, index) => { - return { - treeId: MerkleTreeId[index], - root: tree.getRoot(), - size: tree.getSize(), - } as TreeInfo; - }), - ); + private _getTreeInfo(treeId: MerkleTreeId): Promise { + const treeInfo = { + treeId, + root: this.trees[treeId].getRoot(), + size: this.trees[treeId].getNumLeaves(), + } as TreeInfo; + return Promise.resolve(treeInfo); } /** @@ -113,8 +129,8 @@ export class MerkleTrees implements MerkleTreeDb { * @param index - Index of the leaf to get the sibling path for. * @returns Promise containing the sibling path for the leaf. */ - private _getSiblingPath(treeId: MerkleTreeId, index: number): Promise { - return Promise.resolve(this.trees[treeId].getHashPath(index)); + private _getSiblingPath(treeId: MerkleTreeId, index: bigint): Promise { + return Promise.resolve(this.trees[treeId].getSiblingPath(index)); } /** From a1a7d340525d0a9779fdbbe0ca3287baeac0773a Mon Sep 17 00:00:00 2001 From: spypsy Date: Tue, 21 Mar 2023 11:11:21 +0000 Subject: [PATCH 24/36] P2P module (#36) * add basic p2p client declarations for starting * WIP adding basic properties to p2p client * basic in-memory tx pool * super high-level implementation of p2p client initial sync * add public stop function to p2p client * add txPool to p2p client constructor * add functions to get all txs from tx pool & p2p client * add base p2p test * add yarn start - start:dev * consolidate some temp types etc * reject txs after being stopped * p2p running sync promise * add client state to status response * tx pool tests + cleanup * add world-state to yarn-project-base dockerfile * add merkle-tree to yarn-project-base-dockerfile * update project references + VERY BASIC implementation of Accumulated Tx Data * use types from data-archiver * merge fixes * update to use l2 blocks from archiver --- .gitmodules | 3 + barretenberg | 2 +- build-system | 2 +- yarn-project/foundation | 1 + yarn-project/p2p/package.json | 9 +- yarn-project/p2p/src/index.ts | 22 +- yarn-project/p2p/src/memory_p2p_client.ts | 196 + yarn-project/p2p/src/mocks.ts | 44 + yarn-project/p2p/src/p2p_client.test.ts | 70 + yarn-project/p2p/src/p2p_client.ts | 17 + yarn-project/p2p/src/temp_types.ts | 43 + yarn-project/p2p/src/tx.ts | 44 + yarn-project/p2p/src/tx_pool/index.ts | 2 + .../p2p/src/tx_pool/memory_tx_pool.ts | 67 + yarn-project/p2p/src/tx_pool/tx_pool.test.ts | 24 + yarn-project/p2p/src/tx_pool/tx_pool.ts | 31 + yarn-project/p2p/tsconfig.dest.json | 15 +- yarn-project/p2p/tsconfig.json | 21 +- yarn-project/package.json | 3 +- yarn-project/world-state/package.json | 3 +- yarn-project/world-state/src/index.ts | 2 + yarn-project/world-state/src/memory_fifo.ts | 2 +- yarn-project/world-state/tsconfig.dest.json | 15 +- yarn-project/world-state/tsconfig.json | 8 +- yarn-project/yarn-project-base/Dockerfile | 2 + yarn-project/yarn.lock | 7092 ----------------- 26 files changed, 630 insertions(+), 7110 deletions(-) create mode 160000 yarn-project/foundation create mode 100644 yarn-project/p2p/src/memory_p2p_client.ts create mode 100644 yarn-project/p2p/src/mocks.ts create mode 100644 yarn-project/p2p/src/p2p_client.test.ts create mode 100644 yarn-project/p2p/src/p2p_client.ts create mode 100644 yarn-project/p2p/src/temp_types.ts create mode 100644 yarn-project/p2p/src/tx.ts create mode 100644 yarn-project/p2p/src/tx_pool/index.ts create mode 100644 yarn-project/p2p/src/tx_pool/memory_tx_pool.ts create mode 100644 yarn-project/p2p/src/tx_pool/tx_pool.test.ts create mode 100644 yarn-project/p2p/src/tx_pool/tx_pool.ts delete mode 100644 yarn-project/yarn.lock diff --git a/.gitmodules b/.gitmodules index 241af58f6f0..9f898950188 100644 --- a/.gitmodules +++ b/.gitmodules @@ -10,3 +10,6 @@ [submodule "barretenberg"] path = barretenberg url = git@github.com:AztecProtocol/barretenberg.git +[submodule "yarn-project/foundation"] + path = yarn-project/foundation + url = git@github.com:AztecProtocol/foundation.git diff --git a/barretenberg b/barretenberg index f2fdebe037d..f2f8d1f7a24 160000 --- a/barretenberg +++ b/barretenberg @@ -1 +1 @@ -Subproject commit f2fdebe037d4d2d90761f98e28b4b0d3af9a0f63 +Subproject commit f2f8d1f7a24ca73e30c981fd245c86f7f964abb7 diff --git a/build-system b/build-system index c85b185d917..274f5637d45 160000 --- a/build-system +++ b/build-system @@ -1 +1 @@ -Subproject commit c85b185d917df423586897fd036275400b7159d9 +Subproject commit 274f5637d4573372a90cf745a60968103dec8b92 diff --git a/yarn-project/foundation b/yarn-project/foundation new file mode 160000 index 00000000000..41c02c7b3f3 --- /dev/null +++ b/yarn-project/foundation @@ -0,0 +1 @@ +Subproject commit 41c02c7b3f3fddaa052f8c242e5f386c245e322e diff --git a/yarn-project/p2p/package.json b/yarn-project/p2p/package.json index 81476af28b0..2a2a281b0ae 100644 --- a/yarn-project/p2p/package.json +++ b/yarn-project/p2p/package.json @@ -11,6 +11,8 @@ "scripts": { "build": "yarn clean && yarn formatting && tsc -b tsconfig.dest.json", "build:dev": "tsc -b tsconfig.dest.json --watch", + "start": "node ./dest", + "start:dev": "tsc-watch -p tsconfig.dest.json --onSuccess 'yarn start'", "clean": "rm -rf ./dest .tsbuildinfo", "formatting": "run -T prettier --check ./src && run -T eslint --max-warnings 0 ./src", "test": "NODE_NO_WARNINGS=1 node --experimental-vm-modules $(yarn bin jest) --no-cache --passWithNoTests" @@ -29,6 +31,9 @@ "rootDir": "./src" }, "dependencies": { + "@aztec/archiver": "workspace:^", + "@aztec/world-state": "workspace:^", + "sha3": "^2.1.4", "tslib": "^2.4.0" }, "devDependencies": { @@ -36,10 +41,10 @@ "@jest/globals": "^29.4.3", "@rushstack/eslint-patch": "^1.1.4", "@types/jest": "^29.4.0", - "@types/node": "^18.7.23", + "@types/node": "^18.14.6", "jest": "^28.1.3", "ts-jest": "^28.0.7", "ts-node": "^10.9.1", "typescript": "^4.9.5" } -} +} \ No newline at end of file diff --git a/yarn-project/p2p/src/index.ts b/yarn-project/p2p/src/index.ts index e43af2992a9..3e8af2e18f8 100644 --- a/yarn-project/p2p/src/index.ts +++ b/yarn-project/p2p/src/index.ts @@ -1,4 +1,22 @@ +import { InMemoryP2PCLient } from './memory_p2p_client.js'; +import { MockRollupSource } from './mocks.js'; + /** - * A placeholder for the P2P layer. + * Main function of P2P in-memory client that runs at init. */ -export class P2P {} +async function main() { + // TODO: replace with actual rollup source that gets instantiated with env variables + const rollupSource = new MockRollupSource(); + const p2pClient = new InMemoryP2PCLient(rollupSource); + await p2pClient.start(); + + const shutdown = async () => { + await p2pClient.stop(); + process.exit(0); + }; + + process.once('SIGINT', shutdown); + process.once('SIGTERM', shutdown); +} + +main().catch(err => console.log('ERROR in main p2p function: ', err)); diff --git a/yarn-project/p2p/src/memory_p2p_client.ts b/yarn-project/p2p/src/memory_p2p_client.ts new file mode 100644 index 00000000000..010b5a66bdf --- /dev/null +++ b/yarn-project/p2p/src/memory_p2p_client.ts @@ -0,0 +1,196 @@ +import { InterruptableSleep, L2BlockDownloader } from '@aztec/world-state'; +import { L2BlockSource, L2Block } from '@aztec/archiver'; + +import { InMemoryTxPool } from './tx_pool/memory_tx_pool.js'; +import { P2P } from './p2p_client.js'; +import { TxPool } from './tx_pool/index.js'; +import { Tx } from './temp_types.js'; +import { AccumulatedTxData } from './tx.js'; + +const TAKE_NUM = 10; + +/** + * Enum defining the possible states of the p2p client. + */ +enum P2PClientState { + IDLE, + SYNCING, + RUNNING, + STOPPED, +} + +/** + * An in-memory implementation of the P2P client. + */ +export class InMemoryP2PCLient implements P2P { + /** + * L2 Block download that p2p client uses to stay in sync with latest blocks. + */ + private blockDownloader: L2BlockDownloader; + + /** + * Property that indicates whether the client is running. + */ + private running = false; + + /** + * Property that indicates whether the client is ready to receive new txs. + */ + private ready = false; + + /** + * The JS promise that will be running to keep the client's data in sync. Can be interrupted if the client is stopped. + */ + private runningSyncPromise!: Promise; + + /** + * A function that waits for a specified time or until it's interrupted. + */ + private interruptableSleep = new InterruptableSleep(); + + /** + * Store the ID of the latest block the client has synced to. + */ + private syncedBlockNum = 0; + + /** + * In-memory P2P client constructor. + * @param l2BlockSource - P2P client's source for fetching existing block data. + * @param txPool - The client's instance of a transaction pool. Defaults to in-memory implementation. + */ + constructor(private l2BlockSource: L2BlockSource, private txPool: TxPool = new InMemoryTxPool()) { + this.blockDownloader = new L2BlockDownloader(l2BlockSource, TAKE_NUM); + } + + /** + * Starts the P2P client. + */ + public async start() { + this.running = true; + + let synced = false; + + const latestBlockNum = await this.l2BlockSource.getLatestBlockNum(); + + const txPoolSize = this.txPool.getAllTxs().keys.length; + if (!txPoolSize) { + // No initial reconciliation needed, proceed; + synced = true; + this.syncedBlockNum = latestBlockNum; + // start block downloader from latest L2 Block ID + this.blockDownloader.start(latestBlockNum); + } + + while (!synced) { + // start block downloader from the beginning + this.blockDownloader.start(); + const blocks = await this.blockDownloader.getL2Blocks(); + this.reconcileTxPool(blocks); + + if (blocks.length) { + this.syncedBlockNum = blocks[blocks.length - 1].number; + } else { + synced = true; + this.syncedBlockNum = latestBlockNum; + } + } + this.ready = true; + + const runningSyncPromise = async () => { + while (this.running) { + const newBlocks = await this.blockDownloader.getL2Blocks(); + if (newBlocks.length) { + this.reconcileTxPool(newBlocks); + } else { + await this.interruptableSleep.sleep(10000); + } + } + }; + + this.runningSyncPromise = runningSyncPromise(); + } + + /** + * Allows consumers to stop the instance of the P2P client. + * 'running' & 'ready' will now return 'false' and the running promise that keeps the client synced is interrupted. + */ + public async stop() { + this.running = false; + this.ready = false; + this.blockDownloader.stop(); + this.interruptableSleep.interrupt(); + await this.runningSyncPromise; + } + + /** + * Returns all transactions in the transaction pool. + * @returns An array of Txs. + */ + public getTxs(): Tx[] { + return this.txPool.getAllTxs(); + } + + /** + * Verifies the 'tx' and, if valid, adds it to local tx pool and forwards it to other peers. + * @param tx - The tx to verify. + **/ + public sendTx(tx: Tx): void { + if (!this.ready || !this.running) { + return; + } + this.txPool.addTxs([tx]); + } + + /** + * Public function to check if P2P client is currently running. + * @returns True if the P2P client is running. + */ + public isRunning() { + return this.running; + } + + /** + * Public function to check if the p2p client is fully synced and ready to receive txs. + * @returns True if the P2P client is ready to receive txs. + */ + public isReady() { + return this.ready; + } + + /** + * Public function to check the latest block number that the P2P client is synced to. + * @returns Block number of latest L2 Block we've synced with. + */ + public getSyncedBlockNum() { + return this.syncedBlockNum; + } + + /** + * Method to check the status the p2p client. + * @returns Information about p2p client status: state & syncedToBlockNum. + */ + public getStatus() { + let clientState = P2PClientState.IDLE; + if (this.ready) { + clientState = P2PClientState.RUNNING; + } else if (this.running) { + clientState = P2PClientState.SYNCING; + } + + return { + state: clientState, + syncedToBlockNum: this.syncedBlockNum, + }; + } + + /** + * Internal method that uses the provided blocks to check against the client's tx pool. + * @param blocks - A list of existing blocks with txs that the P2P client needs to ensure the tx pool is reconciled with. + */ + private reconcileTxPool(blocks: L2Block[]) { + for (let i = 0; i < blocks.length; i++) { + const { newContracts } = blocks[i]; + this.txPool.deleteTxs(newContracts?.map((data: Buffer) => AccumulatedTxData.createTxId(data)) || []); + } + } +} diff --git a/yarn-project/p2p/src/mocks.ts b/yarn-project/p2p/src/mocks.ts new file mode 100644 index 00000000000..c46fae1c036 --- /dev/null +++ b/yarn-project/p2p/src/mocks.ts @@ -0,0 +1,44 @@ +/* eslint-disable jsdoc/require-jsdoc */ +import { randomBytes } from 'crypto'; +import { L2BlockSource, L2Block } from '@aztec/archiver'; + +import { Tx } from './temp_types.js'; + +export class MockTx implements Tx { + constructor(private _txId: Buffer = randomBytes(32)) {} + + get txId() { + return this._txId; + } +} + +export class MockBlockSource implements L2BlockSource { + private l2Blocks: L2Block[]; + + constructor() { + this.l2Blocks = []; + for (let i = 0; i++; i < 99) { + this.l2Blocks.push(new MockBlock(i)); + } + } + + public getLatestBlockNum() { + return this.l2Blocks.length; + } + + public getL2Blocks(from: number, take: number) { + return this.l2Blocks.slice(from, from + take); + } +} + +export class MockBlock implements L2Block { + constructor(private _id: number) {} + + get number() { + return this._id; + } + + get settlementTimestamp() { + return Date.now(); + } +} diff --git a/yarn-project/p2p/src/p2p_client.test.ts b/yarn-project/p2p/src/p2p_client.test.ts new file mode 100644 index 00000000000..f1fae6b4a50 --- /dev/null +++ b/yarn-project/p2p/src/p2p_client.test.ts @@ -0,0 +1,70 @@ +import { expect, jest } from '@jest/globals'; +import { L2BlockSource } from '@aztec/archiver'; + +import { InMemoryP2PCLient } from './memory_p2p_client.js'; +import { TxPool } from './tx_pool/index.js'; +import { MockBlockSource } from './mocks.js'; +import { MockTx } from './mocks.js'; + +/** + * Mockify helper for testing purposes. + */ +type Mockify = { + [P in keyof T]: ReturnType; +}; + +describe('In-Memory P2P Client', () => { + let txPool: Mockify; + let blockSource: L2BlockSource; + + beforeEach(() => { + txPool = { + addTxs: jest.fn(), + getTx: jest.fn().mockReturnValue(undefined), + deleteTxs: jest.fn(), + getAllTxs: jest.fn().mockReturnValue([]), + }; + + blockSource = new MockBlockSource(); + }); + + it('can start & stop', async () => { + const client = new InMemoryP2PCLient(blockSource, txPool); + expect(client.isReady()).toEqual(false); + expect(client.isRunning()).toEqual(false); + + await client.start(); + expect(client.isReady()).toEqual(true); + expect(client.isRunning()).toEqual(true); + + await client.stop(); + expect(client.isReady()).toEqual(false); + expect(client.isRunning()).toEqual(false); + }); + + it('adds txs to pool', async () => { + const client = new InMemoryP2PCLient(blockSource, txPool); + await client.start(); + const tx1 = new MockTx(); + const tx2 = new MockTx(); + client.sendTx(tx1); + client.sendTx(tx2); + + expect(txPool.addTxs).toHaveBeenCalledTimes(2); + }); + + it('rejects txs after being stopped', async () => { + const client = new InMemoryP2PCLient(blockSource, txPool); + await client.start(); + const tx1 = new MockTx(); + const tx2 = new MockTx(); + client.sendTx(tx1); + client.sendTx(tx2); + + expect(txPool.addTxs).toHaveBeenCalledTimes(2); + await client.stop(); + const tx3 = new MockTx(); + client.sendTx(tx3); + expect(txPool.addTxs).toHaveBeenCalledTimes(2); + }); +}); diff --git a/yarn-project/p2p/src/p2p_client.ts b/yarn-project/p2p/src/p2p_client.ts new file mode 100644 index 00000000000..a04e5fb0245 --- /dev/null +++ b/yarn-project/p2p/src/p2p_client.ts @@ -0,0 +1,17 @@ +import { Tx } from './temp_types.js'; + +/** + * Interface of a P2P client. + **/ +export interface P2P { + /** + * Verifies the 'tx' and, if valid, adds it to local tx pool and forwards it to other peers. + **/ + sendTx(tx: Tx): void; + + /** + * Returns all transactions in the transaction pool. + * @returns An array of Txs. + */ + getTxs(): Tx[]; +} diff --git a/yarn-project/p2p/src/temp_types.ts b/yarn-project/p2p/src/temp_types.ts new file mode 100644 index 00000000000..f3d42eba7dd --- /dev/null +++ b/yarn-project/p2p/src/temp_types.ts @@ -0,0 +1,43 @@ +/* eslint-disable jsdoc/require-jsdoc */ +export interface Tx { + txId: Buffer; +} + +/** + * Interface defining data contained in a rollup object. + */ +export interface Rollup { + /** + * The ID of the rollup (block height in L1 terminology). + */ + rollupId: number; + + /** + * Timestamp of an L1 block in which the settlement tx containing this rollup was included. + */ + settlementTimestamp?: number; + + /** + * List of rollup transactions. + */ + txs?: Tx[]; +} + +/** + * Interface of classes allowing for the retrieval of all the relevant rollup information. + */ +export interface RollupSource { + /** + * Gets the ID of the last rollup. + * @returns The ID of the last rollup. + **/ + getLastRollupId(): number; + + /** + * Gets the `take` rollups starting from ID `from`. + * @param from - If of the first rollup to return (inclusive). + * @param take - The number of rollups to return. + * @returns The requested rollups. + */ + getRollups(from: number, take: number): Rollup[]; +} diff --git a/yarn-project/p2p/src/tx.ts b/yarn-project/p2p/src/tx.ts new file mode 100644 index 00000000000..03e5d82fe70 --- /dev/null +++ b/yarn-project/p2p/src/tx.ts @@ -0,0 +1,44 @@ +import { randomBytes } from 'crypto'; +import { Keccak } from 'sha3'; + +import { Tx } from './temp_types.js'; + +const hash = new Keccak(256); + +/** + * Accumulated data of an A3 transaction. + */ +export class AccumulatedTxData implements Tx { + constructor( + private aggregationObject?: object, + private callCount?: number, + private newCommitments: Buffer[] = [randomBytes(32)], + private newNullifiers: Buffer[] = [randomBytes(32)], + private privateCallStack: Buffer[] = [randomBytes(32)], + private publicCallStack: Buffer[] = [randomBytes(32)], + private l1MsgStack: Buffer[] = [randomBytes(32)], + private newContracts: Buffer[] = [randomBytes(32)], + private optionallyRevealedData: Buffer[] = [randomBytes(32)], + ) {} + + /** + * Construct & return transaction ID. + * // TODO: actually construct & return tx id + * @returns The transaction's id. + */ + get txId() { + const constractTxData = this.newContracts[0]; + hash.reset(); + return hash.update(constractTxData).digest(); + } + + /** + * Utility function to generate tx ID. + * @param txData - Binary representation of the tx data. + * @returns A hash of the tx data that identifies the tx. + */ + static createTxId(txData: Buffer) { + hash.reset(); + return hash.update(txData).digest(); + } +} diff --git a/yarn-project/p2p/src/tx_pool/index.ts b/yarn-project/p2p/src/tx_pool/index.ts new file mode 100644 index 00000000000..07d1496cc01 --- /dev/null +++ b/yarn-project/p2p/src/tx_pool/index.ts @@ -0,0 +1,2 @@ +export * from './tx_pool.js'; +export * from './memory_tx_pool.js'; diff --git a/yarn-project/p2p/src/tx_pool/memory_tx_pool.ts b/yarn-project/p2p/src/tx_pool/memory_tx_pool.ts new file mode 100644 index 00000000000..c43d733f34a --- /dev/null +++ b/yarn-project/p2p/src/tx_pool/memory_tx_pool.ts @@ -0,0 +1,67 @@ +import { Tx } from '../temp_types.js'; +import { TxPool } from './index.js'; + +/** + * Helper to tranform Buffer IDs to a bigint. + */ +// TODO: place in/use from foundation repo +const toBigInt = (buf: Buffer): bigint => { + const hex = buf.toString('hex'); + if (hex.length === 0) { + return BigInt(0); + } + return BigInt(`0x${hex}`); +}; + +/** + * In-memory implementation of the Transaction Pool. + */ +export class InMemoryTxPool implements TxPool { + /** + * Our tx pool, stored as a Map in-memory, with K: tx ID and V: the transaction. + */ + private txs: Map; + + /** + * Class constructor for in-memory TxPool. Initiates our transaction pool as a JS Map. + */ + constructor() { + this.txs = new Map(); + } + + /** + * Checks if a transaction exists in the pool and returns it. + * @param txId - The generated tx ID. + * @returns The transaction, if found, 'undefined' otherwise. + */ + public getTx(txId: Buffer): Tx | undefined { + const result = this.txs.get(toBigInt(txId)); + return result; + } + + /** + * Adds a list of transactions to the pool. Duplicates are ignored. + * @param txs - An array of txs to be added to the pool. + */ + public addTxs(txs: Tx[]): void { + txs.forEach(tx => this.txs.set(toBigInt(tx.txId), tx)); + } + + /** + * Deletes transactions from the pool. Tx IDs that are not present are ignored. + * @param txIds - An array of tx IDs to be removed from the tx pool. + * @returns The number of transactions that was deleted from the pool. + */ + public deleteTxs(txIds: Buffer[]): number { + const numTxsRemoved = txIds.map(txId => this.txs.delete(toBigInt(txId))).filter(result => result === true).length; + return numTxsRemoved; + } + + /** + * Gets all the transactions stored in the pool. + * @returns Array of tx objects in the order they were added to the pool. + */ + public getAllTxs(): Tx[] { + return Array.from(this.txs.values()); + } +} diff --git a/yarn-project/p2p/src/tx_pool/tx_pool.test.ts b/yarn-project/p2p/src/tx_pool/tx_pool.test.ts new file mode 100644 index 00000000000..d4e5a586de9 --- /dev/null +++ b/yarn-project/p2p/src/tx_pool/tx_pool.test.ts @@ -0,0 +1,24 @@ +import { MockTx } from '../mocks.js'; +import { InMemoryTxPool } from './index.js'; + +describe('In-Memory TX pool', () => { + it('Adds txs to the pool', () => { + const pool = new InMemoryTxPool(); + const tx1 = new MockTx(); + + pool.addTxs([tx1]); + const poolTx = pool.getTx(tx1.txId); + expect(poolTx?.txId.toString('hex')).toEqual(tx1.txId.toString('hex')); + }); + + it('Removes txs from the pool', () => { + const pool = new InMemoryTxPool(); + const tx1 = new MockTx(); + + pool.addTxs([tx1]); + pool.deleteTxs([tx1.txId]); + + const poolTx = pool.getTx(tx1.txId); + expect(poolTx).toBeFalsy(); + }); +}); diff --git a/yarn-project/p2p/src/tx_pool/tx_pool.ts b/yarn-project/p2p/src/tx_pool/tx_pool.ts new file mode 100644 index 00000000000..9ebb05ae15d --- /dev/null +++ b/yarn-project/p2p/src/tx_pool/tx_pool.ts @@ -0,0 +1,31 @@ +import { Tx } from '../temp_types.js'; + +/** + * Interface of a transaction pool. The pool includes tx requests and is kept up-to-date by a P2P client. + */ +export interface TxPool { + /** + * Adds a list of transactions to the pool. Duplicates are ignored. + * @param txs - An array of txs to be added to the pool. + */ + addTxs(txs: Tx[]): void; + + /** + * Checks if a transaction exists in the pool and returns it. + * @param txId - The generated tx ID. + * @returns The transaction, if found, 'undefined' otherwise. + */ + getTx(txId: Buffer): Tx | undefined; + + /** + * Deletes transactions from the pool. Tx IDs that are not present are ignored. + * @param txIds - An array of tx IDs to be removed from the tx pool. + */ + deleteTxs(txIds: Buffer[]): void; + + /** + * Gets all transactions currently in the tx pool. + * @returns An array of transaction objects found in the tx pool. + */ + getAllTxs(): Tx[]; +} diff --git a/yarn-project/p2p/tsconfig.dest.json b/yarn-project/p2p/tsconfig.dest.json index 965aaa1c433..85b203f9f04 100644 --- a/yarn-project/p2p/tsconfig.dest.json +++ b/yarn-project/p2p/tsconfig.dest.json @@ -1,4 +1,15 @@ { "extends": ".", - "exclude": ["**/*.test.*", "**/fixtures/*"] -} + "references": [ + { + "path": "../world-state/tsconfig.dest.json" + }, + { + "path": "../archiver/tsconfig.dest.json" + } + ], + "exclude": [ + "**/*.test.*", + "**/fixtures/*" + ] +} \ No newline at end of file diff --git a/yarn-project/p2p/tsconfig.json b/yarn-project/p2p/tsconfig.json index f67ddec9fd6..d1c52c68102 100644 --- a/yarn-project/p2p/tsconfig.json +++ b/yarn-project/p2p/tsconfig.json @@ -3,7 +3,22 @@ "compilerOptions": { "outDir": "dest", "rootDir": "src", - "tsBuildInfoFile": ".tsbuildinfo" + "tsBuildInfoFile": ".tsbuildinfo", + "moduleResolution": "nodenext", + "types": [ + "node", + "jest" + ] }, - "include": ["src"] -} + "references": [ + { + "path": "../world-state/tsconfig.dest.json" + }, + { + "path": "../archiver/tsconfig.dest.json" + } + ], + "include": [ + "src" + ] +} \ No newline at end of file diff --git a/yarn-project/package.json b/yarn-project/package.json index df4ebd76db6..65a36f41224 100644 --- a/yarn-project/package.json +++ b/yarn-project/package.json @@ -18,6 +18,7 @@ "eslint-config", "ethereum.js", "ethereum.js/example", + "foundation", "kernel-simulator", "key-store", "merkle-tree", @@ -36,4 +37,4 @@ "typedoc": "^0.23.26", "typescript": "^4.9.5" } -} +} \ No newline at end of file diff --git a/yarn-project/world-state/package.json b/yarn-project/world-state/package.json index 8b596f9f9cf..7da41b45324 100644 --- a/yarn-project/world-state/package.json +++ b/yarn-project/world-state/package.json @@ -31,6 +31,7 @@ "tslib": "^2.4.0" }, "devDependencies": { + "@aztec/archiver": "workspace:^", "@aztec/eslint-config": "workspace:^", "@jest/globals": "^29.4.3", "@rushstack/eslint-patch": "^1.1.4", @@ -43,4 +44,4 @@ "ts-node": "^10.9.1", "typescript": "^4.9.5" } -} +} \ No newline at end of file diff --git a/yarn-project/world-state/src/index.ts b/yarn-project/world-state/src/index.ts index 2d348b5a90c..9f841199aa3 100644 --- a/yarn-project/world-state/src/index.ts +++ b/yarn-project/world-state/src/index.ts @@ -1,2 +1,4 @@ export * from './synchroniser/index.js'; export * from './world-state-db/index.js'; +export * from './l2_block_downloader.js'; +export * from './sleep.js'; diff --git a/yarn-project/world-state/src/memory_fifo.ts b/yarn-project/world-state/src/memory_fifo.ts index a77742f4a9e..854f4017c88 100644 --- a/yarn-project/world-state/src/memory_fifo.ts +++ b/yarn-project/world-state/src/memory_fifo.ts @@ -17,7 +17,7 @@ export class MemoryFifo { } /** - * Returns next item within the queue, or blocks until and item has been put into the queue. + * Returns next item within the queue, or blocks until an item has been put into the queue. * If given a timeout, the promise will reject if no item is received after `timeout` seconds. * If the queue is flushing, `null` is returned. * @param timeout - The number of seconds to wait for an item before rejecting the promise. diff --git a/yarn-project/world-state/tsconfig.dest.json b/yarn-project/world-state/tsconfig.dest.json index 965aaa1c433..57f19a229e9 100644 --- a/yarn-project/world-state/tsconfig.dest.json +++ b/yarn-project/world-state/tsconfig.dest.json @@ -1,4 +1,15 @@ { "extends": ".", - "exclude": ["**/*.test.*", "**/fixtures/*"] -} + "references": [ + { + "path": "../archiver/tsconfig.dest.json" + }, + { + "path": "../merkle-tree/tsconfig.dest.json" + } + ], + "exclude": [ + "**/*.test.*", + "**/fixtures/*" + ] +} \ No newline at end of file diff --git a/yarn-project/world-state/tsconfig.json b/yarn-project/world-state/tsconfig.json index f67ddec9fd6..80285209fdf 100644 --- a/yarn-project/world-state/tsconfig.json +++ b/yarn-project/world-state/tsconfig.json @@ -5,5 +5,9 @@ "rootDir": "src", "tsBuildInfoFile": ".tsbuildinfo" }, - "include": ["src"] -} + "references": [ + { "path": "../archiver/tsconfig.dest.json" }, + { "path": "../merkle-tree/tsconfig.dest.json" } + ], + "include": [ "src" ] +} \ No newline at end of file diff --git a/yarn-project/yarn-project-base/Dockerfile b/yarn-project/yarn-project-base/Dockerfile index 9749868649f..8964c51e735 100644 --- a/yarn-project/yarn-project-base/Dockerfile +++ b/yarn-project/yarn-project-base/Dockerfile @@ -23,11 +23,13 @@ COPY ethereum.js/example/package.json ethereum.js/example/package.json COPY ethereum.js/package.json ethereum.js/package.json COPY kernel-simulator/package.json kernel-simulator/package.json COPY key-store/package.json key-store/package.json +COPY merkle-tree/package.json merkle-tree/package.json COPY p2p/package.json p2p/package.json COPY prover-client/package.json prover-client/package.json COPY public-client/package.json public-client/package.json COPY sequencer-client/package.json sequencer-client/package.json COPY wallet/package.json wallet/package.json +COPY world-state/package.json world-state/package.json # All workspaces use the linting config, so always include it. COPY eslint-config eslint-config COPY prettier-config prettier-config diff --git a/yarn-project/yarn.lock b/yarn-project/yarn.lock deleted file mode 100644 index 23e828c509a..00000000000 --- a/yarn-project/yarn.lock +++ /dev/null @@ -1,7092 +0,0 @@ -# This file is generated by running "yarn install" inside your project. -# Manual changes might be lost - proceed with caution! - -__metadata: - version: 6 - cacheKey: 8 - -"@ampproject/remapping@npm:^2.2.0": - version: 2.2.0 - resolution: "@ampproject/remapping@npm:2.2.0" - dependencies: - "@jridgewell/gen-mapping": ^0.1.0 - "@jridgewell/trace-mapping": ^0.3.9 - checksum: d74d170d06468913921d72430259424b7e4c826b5a7d39ff839a29d547efb97dc577caa8ba3fb5cf023624e9af9d09651afc3d4112a45e2050328abc9b3a2292 - languageName: node - linkType: hard - -"@aztec/acir-simulator@workspace:acir-simulator": - version: 0.0.0-use.local - resolution: "@aztec/acir-simulator@workspace:acir-simulator" - dependencies: - "@aztec/eslint-config": "workspace:^" - "@jest/globals": ^29.4.3 - "@rushstack/eslint-patch": ^1.1.4 - "@types/jest": ^29.4.0 - "@types/node": ^18.7.23 - jest: ^28.1.3 - ts-jest: ^28.0.7 - ts-node: ^10.9.1 - tslib: ^2.4.0 - typescript: ^4.9.5 - languageName: unknown - linkType: soft - -"@aztec/archiver@workspace:^, @aztec/archiver@workspace:archiver": - version: 0.0.0-use.local - resolution: "@aztec/archiver@workspace:archiver" - dependencies: - "@aztec/eslint-config": "workspace:^" - "@jest/globals": ^29.5.0 - "@rushstack/eslint-patch": ^1.2.0 - "@types/debug": ^4.1.7 - "@types/jest": ^29.4.1 - "@types/node": ^18.15.2 - "@types/ws": ^8.5.4 - debug: ^4.3.4 - jest: ^29.5.0 - ts-jest: ^29.0.5 - ts-node: ^10.9.1 - tsc-watch: ^6.0.0 - tslib: ^2.5.0 - typescript: ^4.9.5 - viem: ^0.1.15 - ws: ^8.13.0 - languageName: unknown - linkType: soft - -"@aztec/aztec-cli@workspace:aztec-cli": - version: 0.0.0-use.local - resolution: "@aztec/aztec-cli@workspace:aztec-cli" - dependencies: - "@aztec/eslint-config": "workspace:^" - "@jest/globals": ^29.4.3 - "@rushstack/eslint-patch": ^1.1.4 - "@types/jest": ^29.4.0 - "@types/node": ^18.7.23 - commander: ^9.0.0 - jest: ^28.1.3 - ts-jest: ^28.0.7 - ts-node: ^10.9.1 - tslib: ^2.4.0 - typescript: ^4.9.5 - bin: - aztec_cli: index.js - languageName: unknown - linkType: soft - -"@aztec/aztec.js@workspace:^, @aztec/aztec.js@workspace:aztec.js": - version: 0.0.0-use.local - resolution: "@aztec/aztec.js@workspace:aztec.js" - dependencies: - "@aztec/eslint-config": "workspace:^" - "@jest/globals": ^29.4.3 - "@rushstack/eslint-patch": ^1.1.4 - "@types/jest": ^29.4.0 - "@types/node": ^18.7.23 - jest: ^28.1.3 - ts-jest: ^28.0.7 - ts-node: ^10.9.1 - tslib: ^2.4.0 - typescript: ^4.9.5 - languageName: unknown - linkType: soft - -"@aztec/aztec3-packages@workspace:.": - version: 0.0.0-use.local - resolution: "@aztec/aztec3-packages@workspace:." - dependencies: - eslint: ^8.21.0 - prettier: ^2.7.1 - typedoc: ^0.23.26 - typescript: ^4.9.5 - languageName: unknown - linkType: soft - -"@aztec/barretenberg.js@workspace:barretenberg.js": - version: 0.0.0-use.local - resolution: "@aztec/barretenberg.js@workspace:barretenberg.js" - dependencies: - "@aztec/eslint-config": "workspace:^" - "@jest/globals": ^29.4.3 - "@rushstack/eslint-patch": ^1.1.4 - "@types/jest": ^29.4.0 - "@types/node": ^18.7.23 - jest: ^28.1.3 - ts-jest: ^28.0.7 - ts-node: ^10.9.1 - tslib: ^2.4.0 - typescript: ^4.9.5 - languageName: unknown - linkType: soft - -"@aztec/circuit.js@workspace:circuit.js": - version: 0.0.0-use.local - resolution: "@aztec/circuit.js@workspace:circuit.js" - dependencies: - "@aztec/eslint-config": "workspace:^" - "@jest/globals": ^29.4.3 - "@rushstack/eslint-patch": ^1.1.4 - "@types/jest": ^29.4.0 - "@types/node": ^18.7.23 - jest: ^28.1.3 - ts-jest: ^28.0.7 - ts-node: ^10.9.1 - tslib: ^2.4.0 - typescript: ^4.9.5 - languageName: unknown - linkType: soft - -"@aztec/docs@workspace:docs": - version: 0.0.0-use.local - resolution: "@aztec/docs@workspace:docs" - dependencies: - vite: ^4.1.4 - languageName: unknown - linkType: soft - -"@aztec/end-to-end@workspace:end-to-end": - version: 0.0.0-use.local - resolution: "@aztec/end-to-end@workspace:end-to-end" - dependencies: - "@aztec/aztec.js": "workspace:^" - "@aztec/eslint-config": "workspace:^" - "@jest/globals": ^29.4.3 - "@rushstack/eslint-patch": ^1.1.4 - "@types/jest": ^29.4.0 - "@types/node": ^18.7.23 - jest: ^28.1.3 - ts-jest: ^28.0.7 - ts-node: ^10.9.1 - tslib: ^2.4.0 - typescript: ^4.9.5 - languageName: unknown - linkType: soft - -"@aztec/eslint-config@workspace:^, @aztec/eslint-config@workspace:eslint-config": - version: 0.0.0-use.local - resolution: "@aztec/eslint-config@workspace:eslint-config" - dependencies: - "@typescript-eslint/eslint-plugin": ^5.38.0 - "@typescript-eslint/parser": ^5.38.0 - eslint: ^8.21.0 - eslint-config-prettier: ^8.5.0 - eslint-plugin-jsdoc: ^40.0.0 - eslint-plugin-tsdoc: ^0.2.17 - languageName: unknown - linkType: soft - -"@aztec/ethereum.js-example@workspace:ethereum.js/example": - version: 0.0.0-use.local - resolution: "@aztec/ethereum.js-example@workspace:ethereum.js/example" - dependencies: - "@aztec/eslint-config": "workspace:^" - "@aztec/ethereum.js": "workspace:^" - "@rushstack/eslint-patch": ^1.2.0 - "@types/node": ^18.15.0 - source-map-support: ^0.5.21 - typescript: ^4.9.5 - languageName: unknown - linkType: soft - -"@aztec/ethereum.js@workspace:^, @aztec/ethereum.js@workspace:ethereum.js": - version: 0.0.0-use.local - resolution: "@aztec/ethereum.js@workspace:ethereum.js" - dependencies: - "@aztec/eslint-config": "workspace:^" - "@jest/globals": ^29.5.0 - "@rushstack/eslint-patch": ^1.2.0 - "@types/elliptic": ^6.4.14 - "@types/hdkey": ^2.0.1 - "@types/jest": ^29.4.0 - "@types/node": ^18.14.6 - "@types/uuid": ^9.0.0 - bip39: ^3.0.4 - browserify-aes: ^1.2.0 - debug: ^4.3.4 - detect-node: ^2.1.0 - elliptic: ^6.5.4 - hdkey: ^2.1.0 - jest: ^28.0.0 - jest-mock-extended: ^3.0.1 - pbkdf2: ^3.1.2 - rlp: ^3.0.0 - sha3: ^2.1.4 - source-map-support: ^0.5.21 - ts-jest: 28.0.7 - typescript: ^4.9.5 - uuid: ^9.0.0 - bin: - contract_gen_def: ./dest/contract/gen_def/index.js - languageName: unknown - linkType: soft - -"@aztec/kernel-simulator@workspace:kernel-simulator": - version: 0.0.0-use.local - resolution: "@aztec/kernel-simulator@workspace:kernel-simulator" - dependencies: - "@aztec/eslint-config": "workspace:^" - "@jest/globals": ^29.4.3 - "@rushstack/eslint-patch": ^1.1.4 - "@types/jest": ^29.4.0 - "@types/node": ^18.7.23 - jest: ^28.1.3 - ts-jest: ^28.0.7 - ts-node: ^10.9.1 - tslib: ^2.4.0 - typescript: ^4.9.5 - languageName: unknown - linkType: soft - -"@aztec/key-store@workspace:key-store": - version: 0.0.0-use.local - resolution: "@aztec/key-store@workspace:key-store" - dependencies: - "@aztec/eslint-config": "workspace:^" - "@jest/globals": ^29.4.3 - "@rushstack/eslint-patch": ^1.1.4 - "@types/jest": ^29.4.0 - "@types/node": ^18.7.23 - jest: ^28.1.3 - ts-jest: ^28.0.7 - ts-node: ^10.9.1 - tslib: ^2.4.0 - typescript: ^4.9.5 - languageName: unknown - linkType: soft - -"@aztec/merkle-tree@workspace:^, @aztec/merkle-tree@workspace:merkle-tree": - version: 0.0.0-use.local - resolution: "@aztec/merkle-tree@workspace:merkle-tree" - dependencies: - "@aztec/eslint-config": "workspace:^" - "@jest/globals": ^29.4.3 - "@rushstack/eslint-patch": ^1.1.4 - "@types/jest": ^29.4.0 - "@types/levelup": ^5.1.2 - "@types/memdown": ^3.0.1 - "@types/node": ^18.15.3 - "@types/sha256": ^0.2.0 - jest: ^28.1.3 - levelup: ^5.1.1 - memdown: ^6.1.1 - sha256: ^0.2.0 - ts-jest: ^28.0.7 - ts-node: ^10.9.1 - tslib: ^2.4.0 - typescript: ^4.9.5 - languageName: unknown - linkType: soft - -"@aztec/p2p@workspace:p2p": - version: 0.0.0-use.local - resolution: "@aztec/p2p@workspace:p2p" - dependencies: - "@aztec/eslint-config": "workspace:^" - "@jest/globals": ^29.4.3 - "@rushstack/eslint-patch": ^1.1.4 - "@types/jest": ^29.4.0 - "@types/node": ^18.7.23 - jest: ^28.1.3 - ts-jest: ^28.0.7 - ts-node: ^10.9.1 - tslib: ^2.4.0 - typescript: ^4.9.5 - languageName: unknown - linkType: soft - -"@aztec/prettier-config@workspace:prettier-config": - version: 0.0.0-use.local - resolution: "@aztec/prettier-config@workspace:prettier-config" - dependencies: - prettier: ^2.7.1 - languageName: unknown - linkType: soft - -"@aztec/prover-client@workspace:prover-client": - version: 0.0.0-use.local - resolution: "@aztec/prover-client@workspace:prover-client" - dependencies: - "@aztec/eslint-config": "workspace:^" - "@jest/globals": ^29.4.3 - "@rushstack/eslint-patch": ^1.1.4 - "@types/jest": ^29.4.0 - "@types/node": ^18.7.23 - jest: ^28.1.3 - ts-jest: ^28.0.7 - ts-node: ^10.9.1 - tslib: ^2.4.0 - typescript: ^4.9.5 - languageName: unknown - linkType: soft - -"@aztec/public-client@workspace:public-client": - version: 0.0.0-use.local - resolution: "@aztec/public-client@workspace:public-client" - dependencies: - "@aztec/eslint-config": "workspace:^" - "@jest/globals": ^29.4.3 - "@rushstack/eslint-patch": ^1.1.4 - "@types/jest": ^29.4.0 - "@types/node": ^18.7.23 - jest: ^28.1.3 - ts-jest: ^28.0.7 - ts-node: ^10.9.1 - tslib: ^2.4.0 - typescript: ^4.9.5 - languageName: unknown - linkType: soft - -"@aztec/sequencer-client@workspace:sequencer-client": - version: 0.0.0-use.local - resolution: "@aztec/sequencer-client@workspace:sequencer-client" - dependencies: - "@aztec/eslint-config": "workspace:^" - "@jest/globals": ^29.4.3 - "@rushstack/eslint-patch": ^1.1.4 - "@types/jest": ^29.4.0 - "@types/node": ^18.7.23 - jest: ^28.1.3 - ts-jest: ^28.0.7 - ts-node: ^10.9.1 - tslib: ^2.4.0 - typescript: ^4.9.5 - languageName: unknown - linkType: soft - -"@aztec/wallet@workspace:wallet": - version: 0.0.0-use.local - resolution: "@aztec/wallet@workspace:wallet" - dependencies: - "@aztec/eslint-config": "workspace:^" - "@jest/globals": ^29.4.3 - "@rushstack/eslint-patch": ^1.1.4 - "@types/jest": ^29.4.0 - "@types/node": ^18.7.23 - jest: ^28.1.3 - ts-jest: ^28.0.7 - ts-node: ^10.9.1 - tslib: ^2.4.0 - typescript: ^4.9.5 - languageName: unknown - linkType: soft - -"@aztec/world-state@workspace:world-state": - version: 0.0.0-use.local - resolution: "@aztec/world-state@workspace:world-state" - dependencies: - "@aztec/archiver": "workspace:^" - "@aztec/eslint-config": "workspace:^" - "@aztec/merkle-tree": "workspace:^" - "@jest/globals": ^29.4.3 - "@rushstack/eslint-patch": ^1.1.4 - "@types/jest": ^29.4.0 - "@types/levelup": ^5.1.2 - "@types/memdown": ^3.0.0 - "@types/node": ^18.7.23 - jest: ^28.1.3 - levelup: ^5.1.1 - memdown: ^6.1.1 - ts-jest: ^28.0.7 - ts-node: ^10.9.1 - tslib: ^2.4.0 - typescript: ^4.9.5 - languageName: unknown - linkType: soft - -"@babel/code-frame@npm:^7.0.0, @babel/code-frame@npm:^7.12.13, @babel/code-frame@npm:^7.18.6": - version: 7.18.6 - resolution: "@babel/code-frame@npm:7.18.6" - dependencies: - "@babel/highlight": ^7.18.6 - checksum: 195e2be3172d7684bf95cff69ae3b7a15a9841ea9d27d3c843662d50cdd7d6470fd9c8e64be84d031117e4a4083486effba39f9aef6bbb2c89f7f21bcfba33ba - languageName: node - linkType: hard - -"@babel/compat-data@npm:^7.20.5": - version: 7.21.0 - resolution: "@babel/compat-data@npm:7.21.0" - checksum: dbf632c532f9c75ba0be7d1dc9f6cd3582501af52f10a6b90415d634ec5878735bd46064c91673b10317af94d4cc99c4da5bd9d955978cdccb7905fc33291e4d - languageName: node - linkType: hard - -"@babel/core@npm:^7.11.6, @babel/core@npm:^7.12.3": - version: 7.21.3 - resolution: "@babel/core@npm:7.21.3" - dependencies: - "@ampproject/remapping": ^2.2.0 - "@babel/code-frame": ^7.18.6 - "@babel/generator": ^7.21.3 - "@babel/helper-compilation-targets": ^7.20.7 - "@babel/helper-module-transforms": ^7.21.2 - "@babel/helpers": ^7.21.0 - "@babel/parser": ^7.21.3 - "@babel/template": ^7.20.7 - "@babel/traverse": ^7.21.3 - "@babel/types": ^7.21.3 - convert-source-map: ^1.7.0 - debug: ^4.1.0 - gensync: ^1.0.0-beta.2 - json5: ^2.2.2 - semver: ^6.3.0 - checksum: bef25fbea96f461bf79bd1d0e4f0cdce679fd5ada464a89c1141ddba59ae1adfdbb23e04440c266ed525712d33d5ffd818cd8b0c25b1dee0e648d5559516153a - languageName: node - linkType: hard - -"@babel/generator@npm:^7.21.3, @babel/generator@npm:^7.7.2": - version: 7.21.3 - resolution: "@babel/generator@npm:7.21.3" - dependencies: - "@babel/types": ^7.21.3 - "@jridgewell/gen-mapping": ^0.3.2 - "@jridgewell/trace-mapping": ^0.3.17 - jsesc: ^2.5.1 - checksum: be6bb5a32a0273260b91210d4137b7b5da148a2db8dd324654275cb0af865ae59de5e1536e93ac83423b2586415059e1c24cf94293026755cf995757238da749 - languageName: node - linkType: hard - -"@babel/helper-compilation-targets@npm:^7.20.7": - version: 7.20.7 - resolution: "@babel/helper-compilation-targets@npm:7.20.7" - dependencies: - "@babel/compat-data": ^7.20.5 - "@babel/helper-validator-option": ^7.18.6 - browserslist: ^4.21.3 - lru-cache: ^5.1.1 - semver: ^6.3.0 - peerDependencies: - "@babel/core": ^7.0.0 - checksum: 8c32c873ba86e2e1805b30e0807abd07188acbe00ebb97576f0b09061cc65007f1312b589eccb4349c5a8c7f8bb9f2ab199d41da7030bf103d9f347dcd3a3cf4 - languageName: node - linkType: hard - -"@babel/helper-environment-visitor@npm:^7.18.9": - version: 7.18.9 - resolution: "@babel/helper-environment-visitor@npm:7.18.9" - checksum: b25101f6162ddca2d12da73942c08ad203d7668e06663df685634a8fde54a98bc015f6f62938e8554457a592a024108d45b8f3e651fd6dcdb877275b73cc4420 - languageName: node - linkType: hard - -"@babel/helper-function-name@npm:^7.21.0": - version: 7.21.0 - resolution: "@babel/helper-function-name@npm:7.21.0" - dependencies: - "@babel/template": ^7.20.7 - "@babel/types": ^7.21.0 - checksum: d63e63c3e0e3e8b3138fa47b0cd321148a300ef12b8ee951196994dcd2a492cc708aeda94c2c53759a5c9177fffaac0fd8778791286746f72a000976968daf4e - languageName: node - linkType: hard - -"@babel/helper-hoist-variables@npm:^7.18.6": - version: 7.18.6 - resolution: "@babel/helper-hoist-variables@npm:7.18.6" - dependencies: - "@babel/types": ^7.18.6 - checksum: fd9c35bb435fda802bf9ff7b6f2df06308a21277c6dec2120a35b09f9de68f68a33972e2c15505c1a1a04b36ec64c9ace97d4a9e26d6097b76b4396b7c5fa20f - languageName: node - linkType: hard - -"@babel/helper-module-imports@npm:^7.18.6": - version: 7.18.6 - resolution: "@babel/helper-module-imports@npm:7.18.6" - dependencies: - "@babel/types": ^7.18.6 - checksum: f393f8a3b3304b1b7a288a38c10989de754f01d29caf62ce7c4e5835daf0a27b81f3ac687d9d2780d39685aae7b55267324b512150e7b2be967b0c493b6a1def - languageName: node - linkType: hard - -"@babel/helper-module-transforms@npm:^7.21.2": - version: 7.21.2 - resolution: "@babel/helper-module-transforms@npm:7.21.2" - dependencies: - "@babel/helper-environment-visitor": ^7.18.9 - "@babel/helper-module-imports": ^7.18.6 - "@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.2 - "@babel/types": ^7.21.2 - checksum: 8a1c129a4f90bdf97d8b6e7861732c9580f48f877aaaafbc376ce2482febebcb8daaa1de8bc91676d12886487603f8c62a44f9e90ee76d6cac7f9225b26a49e1 - languageName: node - linkType: hard - -"@babel/helper-plugin-utils@npm:^7.0.0, @babel/helper-plugin-utils@npm:^7.10.4, @babel/helper-plugin-utils@npm:^7.12.13, @babel/helper-plugin-utils@npm:^7.14.5, @babel/helper-plugin-utils@npm:^7.18.6, @babel/helper-plugin-utils@npm:^7.19.0, @babel/helper-plugin-utils@npm:^7.8.0": - version: 7.20.2 - resolution: "@babel/helper-plugin-utils@npm:7.20.2" - checksum: f6cae53b7fdb1bf3abd50fa61b10b4470985b400cc794d92635da1e7077bb19729f626adc0741b69403d9b6e411cddddb9c0157a709cc7c4eeb41e663be5d74b - languageName: node - linkType: hard - -"@babel/helper-simple-access@npm:^7.20.2": - version: 7.20.2 - resolution: "@babel/helper-simple-access@npm:7.20.2" - dependencies: - "@babel/types": ^7.20.2 - checksum: ad1e96ee2e5f654ffee2369a586e5e8d2722bf2d8b028a121b4c33ebae47253f64d420157b9f0a8927aea3a9e0f18c0103e74fdd531815cf3650a0a4adca11a1 - languageName: node - linkType: hard - -"@babel/helper-split-export-declaration@npm:^7.18.6": - version: 7.18.6 - resolution: "@babel/helper-split-export-declaration@npm:7.18.6" - dependencies: - "@babel/types": ^7.18.6 - checksum: c6d3dede53878f6be1d869e03e9ffbbb36f4897c7cc1527dc96c56d127d834ffe4520a6f7e467f5b6f3c2843ea0e81a7819d66ae02f707f6ac057f3d57943a2b - languageName: node - linkType: hard - -"@babel/helper-string-parser@npm:^7.19.4": - version: 7.19.4 - resolution: "@babel/helper-string-parser@npm:7.19.4" - checksum: b2f8a3920b30dfac81ec282ac4ad9598ea170648f8254b10f475abe6d944808fb006aab325d3eb5a8ad3bea8dfa888cfa6ef471050dae5748497c110ec060943 - languageName: node - linkType: hard - -"@babel/helper-validator-identifier@npm:^7.18.6, @babel/helper-validator-identifier@npm:^7.19.1": - version: 7.19.1 - resolution: "@babel/helper-validator-identifier@npm:7.19.1" - checksum: 0eca5e86a729162af569b46c6c41a63e18b43dbe09fda1d2a3c8924f7d617116af39cac5e4cd5d431bb760b4dca3c0970e0c444789b1db42bcf1fa41fbad0a3a - languageName: node - linkType: hard - -"@babel/helper-validator-option@npm:^7.18.6": - version: 7.21.0 - resolution: "@babel/helper-validator-option@npm:7.21.0" - checksum: 8ece4c78ffa5461fd8ab6b6e57cc51afad59df08192ed5d84b475af4a7193fc1cb794b59e3e7be64f3cdc4df7ac78bf3dbb20c129d7757ae078e6279ff8c2f07 - languageName: node - linkType: hard - -"@babel/helpers@npm:^7.21.0": - version: 7.21.0 - resolution: "@babel/helpers@npm:7.21.0" - dependencies: - "@babel/template": ^7.20.7 - "@babel/traverse": ^7.21.0 - "@babel/types": ^7.21.0 - checksum: 9370dad2bb665c551869a08ac87c8bdafad53dbcdce1f5c5d498f51811456a3c005d9857562715151a0f00b2e912ac8d89f56574f837b5689f5f5072221cdf54 - languageName: node - linkType: hard - -"@babel/highlight@npm:^7.18.6": - version: 7.18.6 - resolution: "@babel/highlight@npm:7.18.6" - dependencies: - "@babel/helper-validator-identifier": ^7.18.6 - chalk: ^2.0.0 - js-tokens: ^4.0.0 - checksum: 92d8ee61549de5ff5120e945e774728e5ccd57fd3b2ed6eace020ec744823d4a98e242be1453d21764a30a14769ecd62170fba28539b211799bbaf232bbb2789 - languageName: node - linkType: hard - -"@babel/parser@npm:^7.1.0, @babel/parser@npm:^7.14.7, @babel/parser@npm:^7.20.7, @babel/parser@npm:^7.21.3": - version: 7.21.3 - resolution: "@babel/parser@npm:7.21.3" - bin: - parser: ./bin/babel-parser.js - checksum: a71e6456a1260c2a943736b56cc0acdf5f2a53c6c79e545f56618967e51f9b710d1d3359264e7c979313a7153741b1d95ad8860834cc2ab4ce4f428b13cc07be - languageName: node - linkType: hard - -"@babel/plugin-syntax-async-generators@npm:^7.8.4": - version: 7.8.4 - resolution: "@babel/plugin-syntax-async-generators@npm:7.8.4" - dependencies: - "@babel/helper-plugin-utils": ^7.8.0 - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 7ed1c1d9b9e5b64ef028ea5e755c0be2d4e5e4e3d6cf7df757b9a8c4cfa4193d268176d0f1f7fbecdda6fe722885c7fda681f480f3741d8a2d26854736f05367 - languageName: node - linkType: hard - -"@babel/plugin-syntax-bigint@npm:^7.8.3": - version: 7.8.3 - resolution: "@babel/plugin-syntax-bigint@npm:7.8.3" - dependencies: - "@babel/helper-plugin-utils": ^7.8.0 - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 3a10849d83e47aec50f367a9e56a6b22d662ddce643334b087f9828f4c3dd73bdc5909aaeabe123fed78515767f9ca43498a0e621c438d1cd2802d7fae3c9648 - languageName: node - linkType: hard - -"@babel/plugin-syntax-class-properties@npm:^7.8.3": - version: 7.12.13 - resolution: "@babel/plugin-syntax-class-properties@npm:7.12.13" - dependencies: - "@babel/helper-plugin-utils": ^7.12.13 - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 24f34b196d6342f28d4bad303612d7ff566ab0a013ce89e775d98d6f832969462e7235f3e7eaf17678a533d4be0ba45d3ae34ab4e5a9dcbda5d98d49e5efa2fc - languageName: node - linkType: hard - -"@babel/plugin-syntax-import-meta@npm:^7.8.3": - version: 7.10.4 - resolution: "@babel/plugin-syntax-import-meta@npm:7.10.4" - dependencies: - "@babel/helper-plugin-utils": ^7.10.4 - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 166ac1125d10b9c0c430e4156249a13858c0366d38844883d75d27389621ebe651115cb2ceb6dc011534d5055719fa1727b59f39e1ab3ca97820eef3dcab5b9b - languageName: node - linkType: hard - -"@babel/plugin-syntax-json-strings@npm:^7.8.3": - version: 7.8.3 - resolution: "@babel/plugin-syntax-json-strings@npm:7.8.3" - dependencies: - "@babel/helper-plugin-utils": ^7.8.0 - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: bf5aea1f3188c9a507e16efe030efb996853ca3cadd6512c51db7233cc58f3ac89ff8c6bdfb01d30843b161cfe7d321e1bf28da82f7ab8d7e6bc5464666f354a - languageName: node - linkType: hard - -"@babel/plugin-syntax-jsx@npm:^7.7.2": - version: 7.18.6 - resolution: "@babel/plugin-syntax-jsx@npm:7.18.6" - dependencies: - "@babel/helper-plugin-utils": ^7.18.6 - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 6d37ea972970195f1ffe1a54745ce2ae456e0ac6145fae9aa1480f297248b262ea6ebb93010eddb86ebfacb94f57c05a1fc5d232b9a67325b09060299d515c67 - languageName: node - linkType: hard - -"@babel/plugin-syntax-logical-assignment-operators@npm:^7.8.3": - version: 7.10.4 - resolution: "@babel/plugin-syntax-logical-assignment-operators@npm:7.10.4" - dependencies: - "@babel/helper-plugin-utils": ^7.10.4 - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: aff33577037e34e515911255cdbb1fd39efee33658aa00b8a5fd3a4b903585112d037cce1cc9e4632f0487dc554486106b79ccd5ea63a2e00df4363f6d4ff886 - languageName: node - linkType: hard - -"@babel/plugin-syntax-nullish-coalescing-operator@npm:^7.8.3": - version: 7.8.3 - resolution: "@babel/plugin-syntax-nullish-coalescing-operator@npm:7.8.3" - dependencies: - "@babel/helper-plugin-utils": ^7.8.0 - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 87aca4918916020d1fedba54c0e232de408df2644a425d153be368313fdde40d96088feed6c4e5ab72aac89be5d07fef2ddf329a15109c5eb65df006bf2580d1 - languageName: node - linkType: hard - -"@babel/plugin-syntax-numeric-separator@npm:^7.8.3": - version: 7.10.4 - resolution: "@babel/plugin-syntax-numeric-separator@npm:7.10.4" - dependencies: - "@babel/helper-plugin-utils": ^7.10.4 - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 01ec5547bd0497f76cc903ff4d6b02abc8c05f301c88d2622b6d834e33a5651aa7c7a3d80d8d57656a4588f7276eba357f6b7e006482f5b564b7a6488de493a1 - languageName: node - linkType: hard - -"@babel/plugin-syntax-object-rest-spread@npm:^7.8.3": - version: 7.8.3 - resolution: "@babel/plugin-syntax-object-rest-spread@npm:7.8.3" - dependencies: - "@babel/helper-plugin-utils": ^7.8.0 - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: fddcf581a57f77e80eb6b981b10658421bc321ba5f0a5b754118c6a92a5448f12a0c336f77b8abf734841e102e5126d69110a306eadb03ca3e1547cab31f5cbf - languageName: node - linkType: hard - -"@babel/plugin-syntax-optional-catch-binding@npm:^7.8.3": - version: 7.8.3 - resolution: "@babel/plugin-syntax-optional-catch-binding@npm:7.8.3" - dependencies: - "@babel/helper-plugin-utils": ^7.8.0 - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 910d90e72bc90ea1ce698e89c1027fed8845212d5ab588e35ef91f13b93143845f94e2539d831dc8d8ededc14ec02f04f7bd6a8179edd43a326c784e7ed7f0b9 - languageName: node - linkType: hard - -"@babel/plugin-syntax-optional-chaining@npm:^7.8.3": - version: 7.8.3 - resolution: "@babel/plugin-syntax-optional-chaining@npm:7.8.3" - dependencies: - "@babel/helper-plugin-utils": ^7.8.0 - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: eef94d53a1453361553c1f98b68d17782861a04a392840341bc91780838dd4e695209c783631cf0de14c635758beafb6a3a65399846ffa4386bff90639347f30 - languageName: node - linkType: hard - -"@babel/plugin-syntax-top-level-await@npm:^7.8.3": - version: 7.14.5 - resolution: "@babel/plugin-syntax-top-level-await@npm:7.14.5" - dependencies: - "@babel/helper-plugin-utils": ^7.14.5 - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: bbd1a56b095be7820029b209677b194db9b1d26691fe999856462e66b25b281f031f3dfd91b1619e9dcf95bebe336211833b854d0fb8780d618e35667c2d0d7e - languageName: node - linkType: hard - -"@babel/plugin-syntax-typescript@npm:^7.7.2": - version: 7.20.0 - resolution: "@babel/plugin-syntax-typescript@npm:7.20.0" - dependencies: - "@babel/helper-plugin-utils": ^7.19.0 - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 6189c0b5c32ba3c9a80a42338bd50719d783b20ef29b853d4f03929e971913d3cefd80184e924ae98ad6db09080be8fe6f1ffde9a6db8972523234f0274d36f7 - languageName: node - linkType: hard - -"@babel/template@npm:^7.20.7, @babel/template@npm:^7.3.3": - version: 7.20.7 - resolution: "@babel/template@npm:7.20.7" - dependencies: - "@babel/code-frame": ^7.18.6 - "@babel/parser": ^7.20.7 - "@babel/types": ^7.20.7 - checksum: 2eb1a0ab8d415078776bceb3473d07ab746e6bb4c2f6ca46ee70efb284d75c4a32bb0cd6f4f4946dec9711f9c0780e8e5d64b743208deac6f8e9858afadc349e - languageName: node - linkType: hard - -"@babel/traverse@npm:^7.21.0, @babel/traverse@npm:^7.21.2, @babel/traverse@npm:^7.21.3, @babel/traverse@npm:^7.7.2": - version: 7.21.3 - resolution: "@babel/traverse@npm:7.21.3" - dependencies: - "@babel/code-frame": ^7.18.6 - "@babel/generator": ^7.21.3 - "@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.3 - "@babel/types": ^7.21.3 - debug: ^4.1.0 - globals: ^11.1.0 - checksum: 0af5bcd47a2fc501592b90ac1feae9d449afb9ab0772a4f6e68230f4cd3a475795d538c1de3f880fe3414b6c2820bac84d02c6549eea796f39d74a603717447b - languageName: node - linkType: hard - -"@babel/types@npm:^7.0.0, @babel/types@npm:^7.18.6, @babel/types@npm:^7.20.2, @babel/types@npm:^7.20.7, @babel/types@npm:^7.21.0, @babel/types@npm:^7.21.2, @babel/types@npm:^7.21.3, @babel/types@npm:^7.3.0, @babel/types@npm:^7.3.3, @babel/types@npm:^7.8.3": - version: 7.21.3 - resolution: "@babel/types@npm:7.21.3" - dependencies: - "@babel/helper-string-parser": ^7.19.4 - "@babel/helper-validator-identifier": ^7.19.1 - to-fast-properties: ^2.0.0 - checksum: b750274718ba9cefd0b81836c464009bb6ba339fccce51b9baff497a0a2d96c044c61dc90cf203cec0adc770454b53a9681c3f7716883c802b85ab84c365ba35 - languageName: node - linkType: hard - -"@bcoe/v8-coverage@npm:^0.2.3": - version: 0.2.3 - resolution: "@bcoe/v8-coverage@npm:0.2.3" - checksum: 850f9305536d0f2bd13e9e0881cb5f02e4f93fad1189f7b2d4bebf694e3206924eadee1068130d43c11b750efcc9405f88a8e42ef098b6d75239c0f047de1a27 - languageName: node - linkType: hard - -"@cspotcode/source-map-support@npm:^0.8.0": - version: 0.8.1 - resolution: "@cspotcode/source-map-support@npm:0.8.1" - dependencies: - "@jridgewell/trace-mapping": 0.3.9 - checksum: 5718f267085ed8edb3e7ef210137241775e607ee18b77d95aa5bd7514f47f5019aa2d82d96b3bf342ef7aa890a346fa1044532ff7cc3009e7d24fce3ce6200fa - languageName: node - linkType: hard - -"@es-joy/jsdoccomment@npm:~0.37.0": - version: 0.37.0 - resolution: "@es-joy/jsdoccomment@npm:0.37.0" - dependencies: - comment-parser: 1.3.1 - esquery: ^1.4.0 - jsdoc-type-pratt-parser: ~4.0.0 - checksum: 949c0d164573f189998a7ad7ace936639535e1cacf495d7daa893142dbe9e947f146602615732eaa3174b7ca08af9eea5d9fa97a68fdfe0aa14213ab0f319b13 - languageName: node - linkType: hard - -"@esbuild/android-arm64@npm:0.17.11": - version: 0.17.11 - resolution: "@esbuild/android-arm64@npm:0.17.11" - conditions: os=android & cpu=arm64 - languageName: node - linkType: hard - -"@esbuild/android-arm@npm:0.17.11": - version: 0.17.11 - resolution: "@esbuild/android-arm@npm:0.17.11" - conditions: os=android & cpu=arm - languageName: node - linkType: hard - -"@esbuild/android-x64@npm:0.17.11": - version: 0.17.11 - resolution: "@esbuild/android-x64@npm:0.17.11" - conditions: os=android & cpu=x64 - languageName: node - linkType: hard - -"@esbuild/darwin-arm64@npm:0.17.11": - version: 0.17.11 - resolution: "@esbuild/darwin-arm64@npm:0.17.11" - conditions: os=darwin & cpu=arm64 - languageName: node - linkType: hard - -"@esbuild/darwin-x64@npm:0.17.11": - version: 0.17.11 - resolution: "@esbuild/darwin-x64@npm:0.17.11" - conditions: os=darwin & cpu=x64 - languageName: node - linkType: hard - -"@esbuild/freebsd-arm64@npm:0.17.11": - version: 0.17.11 - resolution: "@esbuild/freebsd-arm64@npm:0.17.11" - conditions: os=freebsd & cpu=arm64 - languageName: node - linkType: hard - -"@esbuild/freebsd-x64@npm:0.17.11": - version: 0.17.11 - resolution: "@esbuild/freebsd-x64@npm:0.17.11" - conditions: os=freebsd & cpu=x64 - languageName: node - linkType: hard - -"@esbuild/linux-arm64@npm:0.17.11": - version: 0.17.11 - resolution: "@esbuild/linux-arm64@npm:0.17.11" - conditions: os=linux & cpu=arm64 - languageName: node - linkType: hard - -"@esbuild/linux-arm@npm:0.17.11": - version: 0.17.11 - resolution: "@esbuild/linux-arm@npm:0.17.11" - conditions: os=linux & cpu=arm - languageName: node - linkType: hard - -"@esbuild/linux-ia32@npm:0.17.11": - version: 0.17.11 - resolution: "@esbuild/linux-ia32@npm:0.17.11" - conditions: os=linux & cpu=ia32 - languageName: node - linkType: hard - -"@esbuild/linux-loong64@npm:0.17.11": - version: 0.17.11 - resolution: "@esbuild/linux-loong64@npm:0.17.11" - conditions: os=linux & cpu=loong64 - languageName: node - linkType: hard - -"@esbuild/linux-mips64el@npm:0.17.11": - version: 0.17.11 - resolution: "@esbuild/linux-mips64el@npm:0.17.11" - conditions: os=linux & cpu=mips64el - languageName: node - linkType: hard - -"@esbuild/linux-ppc64@npm:0.17.11": - version: 0.17.11 - resolution: "@esbuild/linux-ppc64@npm:0.17.11" - conditions: os=linux & cpu=ppc64 - languageName: node - linkType: hard - -"@esbuild/linux-riscv64@npm:0.17.11": - version: 0.17.11 - resolution: "@esbuild/linux-riscv64@npm:0.17.11" - conditions: os=linux & cpu=riscv64 - languageName: node - linkType: hard - -"@esbuild/linux-s390x@npm:0.17.11": - version: 0.17.11 - resolution: "@esbuild/linux-s390x@npm:0.17.11" - conditions: os=linux & cpu=s390x - languageName: node - linkType: hard - -"@esbuild/linux-x64@npm:0.17.11": - version: 0.17.11 - resolution: "@esbuild/linux-x64@npm:0.17.11" - conditions: os=linux & cpu=x64 - languageName: node - linkType: hard - -"@esbuild/netbsd-x64@npm:0.17.11": - version: 0.17.11 - resolution: "@esbuild/netbsd-x64@npm:0.17.11" - conditions: os=netbsd & cpu=x64 - languageName: node - linkType: hard - -"@esbuild/openbsd-x64@npm:0.17.11": - version: 0.17.11 - resolution: "@esbuild/openbsd-x64@npm:0.17.11" - conditions: os=openbsd & cpu=x64 - languageName: node - linkType: hard - -"@esbuild/sunos-x64@npm:0.17.11": - version: 0.17.11 - resolution: "@esbuild/sunos-x64@npm:0.17.11" - conditions: os=sunos & cpu=x64 - languageName: node - linkType: hard - -"@esbuild/win32-arm64@npm:0.17.11": - version: 0.17.11 - resolution: "@esbuild/win32-arm64@npm:0.17.11" - conditions: os=win32 & cpu=arm64 - languageName: node - linkType: hard - -"@esbuild/win32-ia32@npm:0.17.11": - version: 0.17.11 - resolution: "@esbuild/win32-ia32@npm:0.17.11" - conditions: os=win32 & cpu=ia32 - languageName: node - linkType: hard - -"@esbuild/win32-x64@npm:0.17.11": - version: 0.17.11 - resolution: "@esbuild/win32-x64@npm:0.17.11" - conditions: os=win32 & cpu=x64 - languageName: node - linkType: hard - -"@eslint-community/eslint-utils@npm:^4.2.0": - version: 4.2.0 - resolution: "@eslint-community/eslint-utils@npm:4.2.0" - dependencies: - eslint-visitor-keys: ^3.3.0 - peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 - checksum: 82fdd1cc2a5d169def0e665ec790580ef708e7df9c91f20006595dc90e3bd42ec31c8976a2eeccd336286301a72e937c0ddf3ab4b7377d7014997c36333a7d22 - languageName: node - linkType: hard - -"@eslint-community/regexpp@npm:^4.4.0": - version: 4.4.0 - resolution: "@eslint-community/regexpp@npm:4.4.0" - checksum: 2d127af0c752b80e8a782eacfe996a86925d21de92da3ffc6f9e615e701145e44a62e26bdd88bfac2cd76779c39ba8d9875a91046ec5e7e5f23cb647c247ea6a - languageName: node - linkType: hard - -"@eslint/eslintrc@npm:^2.0.1": - version: 2.0.1 - resolution: "@eslint/eslintrc@npm:2.0.1" - dependencies: - ajv: ^6.12.4 - debug: ^4.3.2 - espree: ^9.5.0 - globals: ^13.19.0 - ignore: ^5.2.0 - import-fresh: ^3.2.1 - js-yaml: ^4.1.0 - minimatch: ^3.1.2 - strip-json-comments: ^3.1.1 - checksum: 56b9192a687a450db53a7b883daf9f0f447c43b3510189cf88808a7a2467c2a302a42a50f184cc6d5a9faf3d1df890a2ef0fd0d60b751f32a3e9dfea717c6b48 - languageName: node - linkType: hard - -"@eslint/js@npm:8.36.0": - version: 8.36.0 - resolution: "@eslint/js@npm:8.36.0" - checksum: b7d6b84b823c8c7784be390741196617565527b1f7c0977fde9455bfb57fd88f81c074a03dd878757d2c33fa29f24291e9ecbc1425710f067917324b55e1bf3a - languageName: node - linkType: hard - -"@gar/promisify@npm:^1.1.3": - version: 1.1.3 - resolution: "@gar/promisify@npm:1.1.3" - checksum: 4059f790e2d07bf3c3ff3e0fec0daa8144fe35c1f6e0111c9921bd32106adaa97a4ab096ad7dab1e28ee6a9060083c4d1a4ada42a7f5f3f7a96b8812e2b757c1 - languageName: node - linkType: hard - -"@humanwhocodes/config-array@npm:^0.11.8": - version: 0.11.8 - resolution: "@humanwhocodes/config-array@npm:0.11.8" - dependencies: - "@humanwhocodes/object-schema": ^1.2.1 - debug: ^4.1.1 - minimatch: ^3.0.5 - checksum: 0fd6b3c54f1674ce0a224df09b9c2f9846d20b9e54fabae1281ecfc04f2e6ad69bf19e1d6af6a28f88e8aa3990168b6cb9e1ef755868c3256a630605ec2cb1d3 - languageName: node - linkType: hard - -"@humanwhocodes/module-importer@npm:^1.0.1": - version: 1.0.1 - resolution: "@humanwhocodes/module-importer@npm:1.0.1" - checksum: 0fd22007db8034a2cdf2c764b140d37d9020bbfce8a49d3ec5c05290e77d4b0263b1b972b752df8c89e5eaa94073408f2b7d977aed131faf6cf396ebb5d7fb61 - languageName: node - linkType: hard - -"@humanwhocodes/object-schema@npm:^1.2.1": - version: 1.2.1 - resolution: "@humanwhocodes/object-schema@npm:1.2.1" - checksum: a824a1ec31591231e4bad5787641f59e9633827d0a2eaae131a288d33c9ef0290bd16fda8da6f7c0fcb014147865d12118df10db57f27f41e20da92369fcb3f1 - languageName: node - linkType: hard - -"@istanbuljs/load-nyc-config@npm:^1.0.0": - version: 1.1.0 - resolution: "@istanbuljs/load-nyc-config@npm:1.1.0" - dependencies: - camelcase: ^5.3.1 - find-up: ^4.1.0 - get-package-type: ^0.1.0 - js-yaml: ^3.13.1 - resolve-from: ^5.0.0 - checksum: d578da5e2e804d5c93228450a1380e1a3c691de4953acc162f387b717258512a3e07b83510a936d9fab03eac90817473917e24f5d16297af3867f59328d58568 - languageName: node - linkType: hard - -"@istanbuljs/schema@npm:^0.1.2": - version: 0.1.3 - resolution: "@istanbuljs/schema@npm:0.1.3" - checksum: 5282759d961d61350f33d9118d16bcaed914ebf8061a52f4fa474b2cb08720c9c81d165e13b82f2e5a8a212cc5af482f0c6fc1ac27b9e067e5394c9a6ed186c9 - languageName: node - linkType: hard - -"@jest/console@npm:^28.1.3": - version: 28.1.3 - resolution: "@jest/console@npm:28.1.3" - dependencies: - "@jest/types": ^28.1.3 - "@types/node": "*" - chalk: ^4.0.0 - jest-message-util: ^28.1.3 - jest-util: ^28.1.3 - slash: ^3.0.0 - checksum: fe50d98d26d02ce2901c76dff4bd5429a33c13affb692c9ebf8a578ca2f38a5dd854363d40d6c394f215150791fd1f692afd8e730a4178dda24107c8dfd9750a - languageName: node - linkType: hard - -"@jest/console@npm:^29.5.0": - version: 29.5.0 - resolution: "@jest/console@npm:29.5.0" - dependencies: - "@jest/types": ^29.5.0 - "@types/node": "*" - chalk: ^4.0.0 - jest-message-util: ^29.5.0 - jest-util: ^29.5.0 - slash: ^3.0.0 - checksum: 9f4f4b8fabd1221361b7f2e92d4a90f5f8c2e2b29077249996ab3c8b7f765175ffee795368f8d6b5b2bb3adb32dc09319f7270c7c787b0d259e624e00e0f64a5 - languageName: node - linkType: hard - -"@jest/core@npm:^28.1.3": - version: 28.1.3 - resolution: "@jest/core@npm:28.1.3" - dependencies: - "@jest/console": ^28.1.3 - "@jest/reporters": ^28.1.3 - "@jest/test-result": ^28.1.3 - "@jest/transform": ^28.1.3 - "@jest/types": ^28.1.3 - "@types/node": "*" - ansi-escapes: ^4.2.1 - chalk: ^4.0.0 - ci-info: ^3.2.0 - exit: ^0.1.2 - graceful-fs: ^4.2.9 - jest-changed-files: ^28.1.3 - jest-config: ^28.1.3 - jest-haste-map: ^28.1.3 - jest-message-util: ^28.1.3 - jest-regex-util: ^28.0.2 - jest-resolve: ^28.1.3 - jest-resolve-dependencies: ^28.1.3 - jest-runner: ^28.1.3 - jest-runtime: ^28.1.3 - jest-snapshot: ^28.1.3 - jest-util: ^28.1.3 - jest-validate: ^28.1.3 - jest-watcher: ^28.1.3 - micromatch: ^4.0.4 - pretty-format: ^28.1.3 - rimraf: ^3.0.0 - slash: ^3.0.0 - strip-ansi: ^6.0.0 - peerDependencies: - node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 - peerDependenciesMeta: - node-notifier: - optional: true - checksum: cb79f34bafc4637e7130df12257f5b29075892a2be2c7f45c6d4c0420853e80b5dae11016e652530eb234f4c44c00910cdca3c2cd86275721860725073f7d9b4 - languageName: node - linkType: hard - -"@jest/core@npm:^29.5.0": - version: 29.5.0 - resolution: "@jest/core@npm:29.5.0" - dependencies: - "@jest/console": ^29.5.0 - "@jest/reporters": ^29.5.0 - "@jest/test-result": ^29.5.0 - "@jest/transform": ^29.5.0 - "@jest/types": ^29.5.0 - "@types/node": "*" - ansi-escapes: ^4.2.1 - chalk: ^4.0.0 - ci-info: ^3.2.0 - exit: ^0.1.2 - graceful-fs: ^4.2.9 - jest-changed-files: ^29.5.0 - jest-config: ^29.5.0 - jest-haste-map: ^29.5.0 - jest-message-util: ^29.5.0 - jest-regex-util: ^29.4.3 - jest-resolve: ^29.5.0 - jest-resolve-dependencies: ^29.5.0 - jest-runner: ^29.5.0 - jest-runtime: ^29.5.0 - jest-snapshot: ^29.5.0 - jest-util: ^29.5.0 - jest-validate: ^29.5.0 - jest-watcher: ^29.5.0 - micromatch: ^4.0.4 - pretty-format: ^29.5.0 - slash: ^3.0.0 - strip-ansi: ^6.0.0 - peerDependencies: - node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 - peerDependenciesMeta: - node-notifier: - optional: true - checksum: 9e8f5243fe82d5a57f3971e1b96f320058df7c315328a3a827263f3b17f64be10c80f4a9c1b1773628b64d2de6d607c70b5b2d5bf13e7f5ad04223e9ef6aac06 - languageName: node - linkType: hard - -"@jest/environment@npm:^28.1.3": - version: 28.1.3 - resolution: "@jest/environment@npm:28.1.3" - dependencies: - "@jest/fake-timers": ^28.1.3 - "@jest/types": ^28.1.3 - "@types/node": "*" - jest-mock: ^28.1.3 - checksum: 14c496b84aef951df33128cea68988e9de43b2e9d62be9f9c4308d4ac307fa345642813679f80d0a4cedeb900cf6f0b6bb2b92ce089528e8721f72295fdc727f - languageName: node - linkType: hard - -"@jest/environment@npm:^29.5.0": - version: 29.5.0 - resolution: "@jest/environment@npm:29.5.0" - dependencies: - "@jest/fake-timers": ^29.5.0 - "@jest/types": ^29.5.0 - "@types/node": "*" - jest-mock: ^29.5.0 - checksum: 921de6325cd4817dec6685e5ff299b499b6379f3f9cf489b4b13588ee1f3820a0c77b49e6a087996b6de8f629f6f5251e636cba08d1bdb97d8071cc7d033c88a - languageName: node - linkType: hard - -"@jest/expect-utils@npm:^28.1.3": - version: 28.1.3 - resolution: "@jest/expect-utils@npm:28.1.3" - dependencies: - jest-get-type: ^28.0.2 - checksum: 808ea3a68292a7e0b95490fdd55605c430b4cf209ea76b5b61bfb2a1badcb41bc046810fe4e364bd5fe04663978aa2bd73d8f8465a761dd7c655aeb44cf22987 - languageName: node - linkType: hard - -"@jest/expect-utils@npm:^29.5.0": - version: 29.5.0 - resolution: "@jest/expect-utils@npm:29.5.0" - dependencies: - jest-get-type: ^29.4.3 - checksum: c46fb677c88535cf83cf29f0a5b1f376c6a1109ddda266ad7da1a9cbc53cb441fa402dd61fc7b111ffc99603c11a9b3357ee41a1c0e035a58830bcb360871476 - languageName: node - linkType: hard - -"@jest/expect@npm:^28.1.3": - version: 28.1.3 - resolution: "@jest/expect@npm:28.1.3" - dependencies: - expect: ^28.1.3 - jest-snapshot: ^28.1.3 - checksum: 4197f6fdddc33dc45ba4e838f992fc61839c421d7aed0dfe665ef9c2f172bb1df8a8cac9cecee272b40e744a326da521d5e182709fe82a0b936055bfffa3b473 - languageName: node - linkType: hard - -"@jest/expect@npm:^29.5.0": - version: 29.5.0 - resolution: "@jest/expect@npm:29.5.0" - dependencies: - expect: ^29.5.0 - jest-snapshot: ^29.5.0 - checksum: bd10e295111547e6339137107d83986ab48d46561525393834d7d2d8b2ae9d5626653f3f5e48e5c3fa742ac982e97bdf1f541b53b9e1d117a247b08e938527f6 - languageName: node - linkType: hard - -"@jest/fake-timers@npm:^28.1.3": - version: 28.1.3 - resolution: "@jest/fake-timers@npm:28.1.3" - dependencies: - "@jest/types": ^28.1.3 - "@sinonjs/fake-timers": ^9.1.2 - "@types/node": "*" - jest-message-util: ^28.1.3 - jest-mock: ^28.1.3 - jest-util: ^28.1.3 - checksum: cec14d5b14913a54dce64a62912c5456235f5d90b509ceae19c727565073114dae1aaf960ac6be96b3eb94789a3a758b96b72c8fca7e49a6ccac415fbc0321e1 - languageName: node - linkType: hard - -"@jest/fake-timers@npm:^29.5.0": - version: 29.5.0 - resolution: "@jest/fake-timers@npm:29.5.0" - dependencies: - "@jest/types": ^29.5.0 - "@sinonjs/fake-timers": ^10.0.2 - "@types/node": "*" - jest-message-util: ^29.5.0 - jest-mock: ^29.5.0 - jest-util: ^29.5.0 - checksum: 69930c6922341f244151ec0d27640852ec96237f730fc024da1f53143d31b43cde75d92f9d8e5937981cdce3b31416abc3a7090a0d22c2377512c4a6613244ee - languageName: node - linkType: hard - -"@jest/globals@npm:^28.1.3": - version: 28.1.3 - resolution: "@jest/globals@npm:28.1.3" - dependencies: - "@jest/environment": ^28.1.3 - "@jest/expect": ^28.1.3 - "@jest/types": ^28.1.3 - checksum: 3504bb23de629d466c6f2b6b75d2e1c1b10caccbbcfb7eaa82d22cc37711c8e364c243929581184846605c023b475ea6c42c2e3ea5994429a988d8d527af32cd - languageName: node - linkType: hard - -"@jest/globals@npm:^29.4.3, @jest/globals@npm:^29.5.0": - version: 29.5.0 - resolution: "@jest/globals@npm:29.5.0" - dependencies: - "@jest/environment": ^29.5.0 - "@jest/expect": ^29.5.0 - "@jest/types": ^29.5.0 - jest-mock: ^29.5.0 - checksum: b309ab8f21b571a7c672608682e84bbdd3d2b554ddf81e4e32617fec0a69094a290ab42e3c8b2c66ba891882bfb1b8b2736720ea1285b3ad646d55c2abefedd9 - languageName: node - linkType: hard - -"@jest/reporters@npm:^28.1.3": - version: 28.1.3 - resolution: "@jest/reporters@npm:28.1.3" - dependencies: - "@bcoe/v8-coverage": ^0.2.3 - "@jest/console": ^28.1.3 - "@jest/test-result": ^28.1.3 - "@jest/transform": ^28.1.3 - "@jest/types": ^28.1.3 - "@jridgewell/trace-mapping": ^0.3.13 - "@types/node": "*" - chalk: ^4.0.0 - collect-v8-coverage: ^1.0.0 - exit: ^0.1.2 - glob: ^7.1.3 - graceful-fs: ^4.2.9 - istanbul-lib-coverage: ^3.0.0 - istanbul-lib-instrument: ^5.1.0 - istanbul-lib-report: ^3.0.0 - istanbul-lib-source-maps: ^4.0.0 - istanbul-reports: ^3.1.3 - jest-message-util: ^28.1.3 - jest-util: ^28.1.3 - jest-worker: ^28.1.3 - slash: ^3.0.0 - string-length: ^4.0.1 - strip-ansi: ^6.0.0 - terminal-link: ^2.0.0 - v8-to-istanbul: ^9.0.1 - peerDependencies: - node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 - peerDependenciesMeta: - node-notifier: - optional: true - checksum: a7440887ce837922cbeaa64c3232eb48aae02aa9123f29fc4280ad3e1afe4b35dcba171ba1d5fd219037c396c5152d9c2d102cff1798dd5ae3bd33ac4759ae0a - languageName: node - linkType: hard - -"@jest/reporters@npm:^29.5.0": - version: 29.5.0 - resolution: "@jest/reporters@npm:29.5.0" - dependencies: - "@bcoe/v8-coverage": ^0.2.3 - "@jest/console": ^29.5.0 - "@jest/test-result": ^29.5.0 - "@jest/transform": ^29.5.0 - "@jest/types": ^29.5.0 - "@jridgewell/trace-mapping": ^0.3.15 - "@types/node": "*" - chalk: ^4.0.0 - collect-v8-coverage: ^1.0.0 - exit: ^0.1.2 - glob: ^7.1.3 - graceful-fs: ^4.2.9 - istanbul-lib-coverage: ^3.0.0 - istanbul-lib-instrument: ^5.1.0 - istanbul-lib-report: ^3.0.0 - istanbul-lib-source-maps: ^4.0.0 - istanbul-reports: ^3.1.3 - jest-message-util: ^29.5.0 - jest-util: ^29.5.0 - jest-worker: ^29.5.0 - slash: ^3.0.0 - string-length: ^4.0.1 - strip-ansi: ^6.0.0 - v8-to-istanbul: ^9.0.1 - peerDependencies: - node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 - peerDependenciesMeta: - node-notifier: - optional: true - checksum: 481268aac9a4a75cc49c4df1273d6b111808dec815e9d009dad717c32383ebb0cebac76e820ad1ab44e207540e1c2fe1e640d44c4f262de92ab1933e057fdeeb - languageName: node - linkType: hard - -"@jest/schemas@npm:^28.1.3": - version: 28.1.3 - resolution: "@jest/schemas@npm:28.1.3" - dependencies: - "@sinclair/typebox": ^0.24.1 - checksum: 3cf1d4b66c9c4ffda58b246de1ddcba8e6ad085af63dccdf07922511f13b68c0cc480a7bc620cb4f3099a6f134801c747e1df7bfc7a4ef4dceefbdea3e31e1de - languageName: node - linkType: hard - -"@jest/schemas@npm:^29.4.3": - version: 29.4.3 - resolution: "@jest/schemas@npm:29.4.3" - dependencies: - "@sinclair/typebox": ^0.25.16 - checksum: ac754e245c19dc39e10ebd41dce09040214c96a4cd8efa143b82148e383e45128f24599195ab4f01433adae4ccfbe2db6574c90db2862ccd8551a86704b5bebd - languageName: node - linkType: hard - -"@jest/source-map@npm:^28.1.2": - version: 28.1.2 - resolution: "@jest/source-map@npm:28.1.2" - dependencies: - "@jridgewell/trace-mapping": ^0.3.13 - callsites: ^3.0.0 - graceful-fs: ^4.2.9 - checksum: b82a5c2e93d35d86779c61a02ccb967d1b5cd2e9dd67d26d8add44958637cbbb99daeeb8129c7653389cb440dc2a2f5ae4d2183dc453c67669ff98938b775a3a - languageName: node - linkType: hard - -"@jest/source-map@npm:^29.4.3": - version: 29.4.3 - resolution: "@jest/source-map@npm:29.4.3" - dependencies: - "@jridgewell/trace-mapping": ^0.3.15 - callsites: ^3.0.0 - graceful-fs: ^4.2.9 - checksum: 2301d225145f8123540c0be073f35a80fd26a2f5e59550fd68525d8cea580fb896d12bf65106591ffb7366a8a19790076dbebc70e0f5e6ceb51f81827ed1f89c - languageName: node - linkType: hard - -"@jest/test-result@npm:^28.1.3": - version: 28.1.3 - resolution: "@jest/test-result@npm:28.1.3" - dependencies: - "@jest/console": ^28.1.3 - "@jest/types": ^28.1.3 - "@types/istanbul-lib-coverage": ^2.0.0 - collect-v8-coverage: ^1.0.0 - checksum: 957a5dd2fd2e84aabe86698f93c0825e96128ccaa23abf548b159a9b08ac74e4bde7acf4bec48479243dbdb27e4ea1b68c171846d21fb64855c6b55cead9ef27 - languageName: node - linkType: hard - -"@jest/test-result@npm:^29.5.0": - version: 29.5.0 - resolution: "@jest/test-result@npm:29.5.0" - dependencies: - "@jest/console": ^29.5.0 - "@jest/types": ^29.5.0 - "@types/istanbul-lib-coverage": ^2.0.0 - collect-v8-coverage: ^1.0.0 - checksum: 2e8ff5242227ab960c520c3ea0f6544c595cc1c42fa3873c158e9f4f685f4ec9670ec08a4af94ae3885c0005a43550a9595191ffbc27a0965df27d9d98bbf901 - languageName: node - linkType: hard - -"@jest/test-sequencer@npm:^28.1.3": - version: 28.1.3 - resolution: "@jest/test-sequencer@npm:28.1.3" - dependencies: - "@jest/test-result": ^28.1.3 - graceful-fs: ^4.2.9 - jest-haste-map: ^28.1.3 - slash: ^3.0.0 - checksum: 13f8905e6d1ec8286694146f7be3cf90eff801bbdea5e5c403e6881444bb390ed15494c7b9948aa94bd7e9c9a851e0d3002ed6e7371d048b478596e5b23df953 - languageName: node - linkType: hard - -"@jest/test-sequencer@npm:^29.5.0": - version: 29.5.0 - resolution: "@jest/test-sequencer@npm:29.5.0" - dependencies: - "@jest/test-result": ^29.5.0 - graceful-fs: ^4.2.9 - jest-haste-map: ^29.5.0 - slash: ^3.0.0 - checksum: eca34b4aeb2fda6dfb7f9f4b064c858a7adf64ec5c6091b6f4ed9d3c19549177cbadcf1c615c4c182688fa1cf085c8c55c3ca6eea40719a34554b0bf071d842e - languageName: node - linkType: hard - -"@jest/transform@npm:^28.1.3": - version: 28.1.3 - resolution: "@jest/transform@npm:28.1.3" - dependencies: - "@babel/core": ^7.11.6 - "@jest/types": ^28.1.3 - "@jridgewell/trace-mapping": ^0.3.13 - babel-plugin-istanbul: ^6.1.1 - chalk: ^4.0.0 - convert-source-map: ^1.4.0 - fast-json-stable-stringify: ^2.0.0 - graceful-fs: ^4.2.9 - jest-haste-map: ^28.1.3 - jest-regex-util: ^28.0.2 - jest-util: ^28.1.3 - micromatch: ^4.0.4 - pirates: ^4.0.4 - slash: ^3.0.0 - write-file-atomic: ^4.0.1 - checksum: dadf618936e0aa84342f07f532801d5bed43cdf95d1417b929e4f8782c872cff1adc84096d5a287a796d0039a2691c06d8450cce5a713a8b52fbb9f872a1e760 - languageName: node - linkType: hard - -"@jest/transform@npm:^29.5.0": - version: 29.5.0 - resolution: "@jest/transform@npm:29.5.0" - dependencies: - "@babel/core": ^7.11.6 - "@jest/types": ^29.5.0 - "@jridgewell/trace-mapping": ^0.3.15 - babel-plugin-istanbul: ^6.1.1 - chalk: ^4.0.0 - convert-source-map: ^2.0.0 - fast-json-stable-stringify: ^2.1.0 - graceful-fs: ^4.2.9 - jest-haste-map: ^29.5.0 - jest-regex-util: ^29.4.3 - jest-util: ^29.5.0 - micromatch: ^4.0.4 - pirates: ^4.0.4 - slash: ^3.0.0 - write-file-atomic: ^4.0.2 - checksum: d55d604085c157cf5112e165ff5ac1fa788873b3b31265fb4734ca59892ee24e44119964cc47eb6d178dd9512bbb6c576d1e20e51a201ff4e24d31e818a1c92d - languageName: node - linkType: hard - -"@jest/types@npm:^28.1.3": - version: 28.1.3 - resolution: "@jest/types@npm:28.1.3" - dependencies: - "@jest/schemas": ^28.1.3 - "@types/istanbul-lib-coverage": ^2.0.0 - "@types/istanbul-reports": ^3.0.0 - "@types/node": "*" - "@types/yargs": ^17.0.8 - chalk: ^4.0.0 - checksum: 1e258d9c063fcf59ebc91e46d5ea5984674ac7ae6cae3e50aa780d22b4405bf2c925f40350bf30013839eb5d4b5e521d956ddf8f3b7c78debef0e75a07f57350 - languageName: node - linkType: hard - -"@jest/types@npm:^29.5.0": - version: 29.5.0 - resolution: "@jest/types@npm:29.5.0" - dependencies: - "@jest/schemas": ^29.4.3 - "@types/istanbul-lib-coverage": ^2.0.0 - "@types/istanbul-reports": ^3.0.0 - "@types/node": "*" - "@types/yargs": ^17.0.8 - chalk: ^4.0.0 - checksum: 1811f94b19cf8a9460a289c4f056796cfc373480e0492692a6125a553cd1a63824bd846d7bb78820b7b6f758f6dd3c2d4558293bb676d541b2fa59c70fdf9d39 - languageName: node - linkType: hard - -"@jridgewell/gen-mapping@npm:^0.1.0": - version: 0.1.1 - resolution: "@jridgewell/gen-mapping@npm:0.1.1" - dependencies: - "@jridgewell/set-array": ^1.0.0 - "@jridgewell/sourcemap-codec": ^1.4.10 - checksum: 3bcc21fe786de6ffbf35c399a174faab05eb23ce6a03e8769569de28abbf4facc2db36a9ddb0150545ae23a8d35a7cf7237b2aa9e9356a7c626fb4698287d5cc - languageName: node - linkType: hard - -"@jridgewell/gen-mapping@npm:^0.3.2": - version: 0.3.2 - resolution: "@jridgewell/gen-mapping@npm:0.3.2" - dependencies: - "@jridgewell/set-array": ^1.0.1 - "@jridgewell/sourcemap-codec": ^1.4.10 - "@jridgewell/trace-mapping": ^0.3.9 - checksum: 1832707a1c476afebe4d0fbbd4b9434fdb51a4c3e009ab1e9938648e21b7a97049fa6009393bdf05cab7504108413441df26d8a3c12193996e65493a4efb6882 - languageName: node - linkType: hard - -"@jridgewell/resolve-uri@npm:3.1.0, @jridgewell/resolve-uri@npm:^3.0.3": - version: 3.1.0 - resolution: "@jridgewell/resolve-uri@npm:3.1.0" - checksum: b5ceaaf9a110fcb2780d1d8f8d4a0bfd216702f31c988d8042e5f8fbe353c55d9b0f55a1733afdc64806f8e79c485d2464680ac48a0d9fcadb9548ee6b81d267 - languageName: node - linkType: hard - -"@jridgewell/set-array@npm:^1.0.0, @jridgewell/set-array@npm:^1.0.1": - version: 1.1.2 - resolution: "@jridgewell/set-array@npm:1.1.2" - checksum: 69a84d5980385f396ff60a175f7177af0b8da4ddb81824cb7016a9ef914eee9806c72b6b65942003c63f7983d4f39a5c6c27185bbca88eb4690b62075602e28e - languageName: node - linkType: hard - -"@jridgewell/sourcemap-codec@npm:1.4.14, @jridgewell/sourcemap-codec@npm:^1.4.10": - version: 1.4.14 - resolution: "@jridgewell/sourcemap-codec@npm:1.4.14" - checksum: 61100637b6d173d3ba786a5dff019e1a74b1f394f323c1fee337ff390239f053b87266c7a948777f4b1ee68c01a8ad0ab61e5ff4abb5a012a0b091bec391ab97 - languageName: node - linkType: hard - -"@jridgewell/trace-mapping@npm:0.3.9": - version: 0.3.9 - resolution: "@jridgewell/trace-mapping@npm:0.3.9" - dependencies: - "@jridgewell/resolve-uri": ^3.0.3 - "@jridgewell/sourcemap-codec": ^1.4.10 - checksum: d89597752fd88d3f3480845691a05a44bd21faac18e2185b6f436c3b0fd0c5a859fbbd9aaa92050c4052caf325ad3e10e2e1d1b64327517471b7d51babc0ddef - languageName: node - linkType: hard - -"@jridgewell/trace-mapping@npm:^0.3.12, @jridgewell/trace-mapping@npm:^0.3.13, @jridgewell/trace-mapping@npm:^0.3.15, @jridgewell/trace-mapping@npm:^0.3.17, @jridgewell/trace-mapping@npm:^0.3.9": - version: 0.3.17 - resolution: "@jridgewell/trace-mapping@npm:0.3.17" - dependencies: - "@jridgewell/resolve-uri": 3.1.0 - "@jridgewell/sourcemap-codec": 1.4.14 - checksum: 9d703b859cff5cd83b7308fd457a431387db5db96bd781a63bf48e183418dd9d3d44e76b9e4ae13237f6abeeb25d739ec9215c1d5bfdd08f66f750a50074a339 - languageName: node - linkType: hard - -"@microsoft/tsdoc-config@npm:0.16.2": - version: 0.16.2 - resolution: "@microsoft/tsdoc-config@npm:0.16.2" - dependencies: - "@microsoft/tsdoc": 0.14.2 - ajv: ~6.12.6 - jju: ~1.4.0 - resolve: ~1.19.0 - checksum: 12b0d703154076bcaac75ca42e804e4fc292672396441e54346d7eadd0d6b57f90980eda2b1bab89b224af86da34a2389f9054002e282011e795ca5919a4386f - languageName: node - linkType: hard - -"@microsoft/tsdoc@npm:0.14.2": - version: 0.14.2 - resolution: "@microsoft/tsdoc@npm:0.14.2" - checksum: b167c89e916ba73ee20b9c9d5dba6aa3a0de25ed3d50050e8a344dca7cd43cb2e1059bd515c820369b6e708901dd3fda476a42bc643ca74a35671ce77f724a3a - languageName: node - linkType: hard - -"@noble/hashes@npm:^1.1.2, @noble/hashes@npm:^1.2.0": - version: 1.2.0 - resolution: "@noble/hashes@npm:1.2.0" - checksum: 8ca080ce557b8f40fb2f78d3aedffd95825a415ac8e13d7ffe3643f8626a8c2d99a3e5975b555027ac24316d8b3c02a35b8358567c0c23af681e6573602aa434 - languageName: node - linkType: hard - -"@noble/secp256k1@npm:^1.7.1": - version: 1.7.1 - resolution: "@noble/secp256k1@npm:1.7.1" - checksum: d2301f1f7690368d8409a3152450458f27e54df47e3f917292de3de82c298770890c2de7c967d237eff9c95b70af485389a9695f73eb05a43e2bd562d18b18cb - languageName: node - linkType: hard - -"@nodelib/fs.scandir@npm:2.1.5": - version: 2.1.5 - resolution: "@nodelib/fs.scandir@npm:2.1.5" - dependencies: - "@nodelib/fs.stat": 2.0.5 - run-parallel: ^1.1.9 - checksum: a970d595bd23c66c880e0ef1817791432dbb7acbb8d44b7e7d0e7a22f4521260d4a83f7f9fd61d44fda4610105577f8f58a60718105fb38352baed612fd79e59 - languageName: node - linkType: hard - -"@nodelib/fs.stat@npm:2.0.5, @nodelib/fs.stat@npm:^2.0.2": - version: 2.0.5 - resolution: "@nodelib/fs.stat@npm:2.0.5" - checksum: 012480b5ca9d97bff9261571dbbec7bbc6033f69cc92908bc1ecfad0792361a5a1994bc48674b9ef76419d056a03efadfce5a6cf6dbc0a36559571a7a483f6f0 - languageName: node - linkType: hard - -"@nodelib/fs.walk@npm:^1.2.3, @nodelib/fs.walk@npm:^1.2.8": - version: 1.2.8 - resolution: "@nodelib/fs.walk@npm:1.2.8" - dependencies: - "@nodelib/fs.scandir": 2.1.5 - fastq: ^1.6.0 - checksum: 190c643f156d8f8f277bf2a6078af1ffde1fd43f498f187c2db24d35b4b4b5785c02c7dc52e356497b9a1b65b13edc996de08de0b961c32844364da02986dc53 - languageName: node - linkType: hard - -"@npmcli/fs@npm:^2.1.0": - version: 2.1.2 - resolution: "@npmcli/fs@npm:2.1.2" - dependencies: - "@gar/promisify": ^1.1.3 - semver: ^7.3.5 - checksum: 405074965e72d4c9d728931b64d2d38e6ea12066d4fad651ac253d175e413c06fe4350970c783db0d749181da8fe49c42d3880bd1cbc12cd68e3a7964d820225 - languageName: node - linkType: hard - -"@npmcli/move-file@npm:^2.0.0": - version: 2.0.1 - resolution: "@npmcli/move-file@npm:2.0.1" - dependencies: - mkdirp: ^1.0.4 - rimraf: ^3.0.2 - checksum: 52dc02259d98da517fae4cb3a0a3850227bdae4939dda1980b788a7670636ca2b4a01b58df03dd5f65c1e3cb70c50fa8ce5762b582b3f499ec30ee5ce1fd9380 - languageName: node - linkType: hard - -"@rushstack/eslint-patch@npm:^1.1.4, @rushstack/eslint-patch@npm:^1.2.0": - version: 1.2.0 - resolution: "@rushstack/eslint-patch@npm:1.2.0" - checksum: faa749faae0e83c26ae9eb00ad36a897ac78f3cf27da8e8ff21c00bcf7973b598d823d8f2b3957ef66079288bcf577f94df831eae2d65f3f68d8ca32f18b6aff - languageName: node - linkType: hard - -"@sinclair/typebox@npm:^0.24.1": - version: 0.24.51 - resolution: "@sinclair/typebox@npm:0.24.51" - checksum: fd0d855e748ef767eb19da1a60ed0ab928e91e0f358c1dd198d600762c0015440b15755e96d1176e2a0db7e09c6a64ed487828ee10dd0c3e22f61eb09c478cd0 - languageName: node - linkType: hard - -"@sinclair/typebox@npm:^0.25.16": - version: 0.25.24 - resolution: "@sinclair/typebox@npm:0.25.24" - checksum: 10219c58f40b8414c50b483b0550445e9710d4fe7b2c4dccb9b66533dd90ba8e024acc776026cebe81e87f06fa24b07fdd7bc30dd277eb9cc386ec50151a3026 - languageName: node - linkType: hard - -"@sinonjs/commons@npm:^1.7.0": - version: 1.8.6 - resolution: "@sinonjs/commons@npm:1.8.6" - dependencies: - type-detect: 4.0.8 - checksum: 7d3f8c1e85f30cd4e83594fc19b7a657f14d49eb8d95a30095631ce15e906c869e0eff96c5b93dffea7490c00418b07f54582ba49c6560feb2a8c34c0b16832d - languageName: node - linkType: hard - -"@sinonjs/commons@npm:^2.0.0": - version: 2.0.0 - resolution: "@sinonjs/commons@npm:2.0.0" - dependencies: - type-detect: 4.0.8 - checksum: 5023ba17edf2b85ed58262313b8e9b59e23c6860681a9af0200f239fe939e2b79736d04a260e8270ddd57196851dde3ba754d7230be5c5234e777ae2ca8af137 - languageName: node - linkType: hard - -"@sinonjs/fake-timers@npm:^10.0.2": - version: 10.0.2 - resolution: "@sinonjs/fake-timers@npm:10.0.2" - dependencies: - "@sinonjs/commons": ^2.0.0 - checksum: c62aa98e7cefda8dedc101ce227abc888dc46b8ff9706c5f0a8dfd9c3ada97d0a5611384738d9ba0b26b59f99c2ba24efece8e779bb08329e9e87358fa309824 - languageName: node - linkType: hard - -"@sinonjs/fake-timers@npm:^9.1.2": - version: 9.1.2 - resolution: "@sinonjs/fake-timers@npm:9.1.2" - dependencies: - "@sinonjs/commons": ^1.7.0 - checksum: 7d3aef54e17c1073101cb64d953157c19d62a40e261a30923fa1ee337b049c5f29cc47b1f0c477880f42b5659848ba9ab897607ac8ea4acd5c30ddcfac57fca6 - languageName: node - linkType: hard - -"@tootallnate/once@npm:2": - version: 2.0.0 - resolution: "@tootallnate/once@npm:2.0.0" - checksum: ad87447820dd3f24825d2d947ebc03072b20a42bfc96cbafec16bff8bbda6c1a81fcb0be56d5b21968560c5359a0af4038a68ba150c3e1694fe4c109a063bed8 - languageName: node - linkType: hard - -"@tsconfig/node10@npm:^1.0.7": - version: 1.0.9 - resolution: "@tsconfig/node10@npm:1.0.9" - checksum: a33ae4dc2a621c0678ac8ac4bceb8e512ae75dac65417a2ad9b022d9b5411e863c4c198b6ba9ef659e14b9fb609bbec680841a2e84c1172df7a5ffcf076539df - languageName: node - linkType: hard - -"@tsconfig/node12@npm:^1.0.7": - version: 1.0.11 - resolution: "@tsconfig/node12@npm:1.0.11" - checksum: 5ce29a41b13e7897a58b8e2df11269c5395999e588b9a467386f99d1d26f6c77d1af2719e407621412520ea30517d718d5192a32403b8dfcc163bf33e40a338a - languageName: node - linkType: hard - -"@tsconfig/node14@npm:^1.0.0": - version: 1.0.3 - resolution: "@tsconfig/node14@npm:1.0.3" - checksum: 19275fe80c4c8d0ad0abed6a96dbf00642e88b220b090418609c4376e1cef81bf16237bf170ad1b341452feddb8115d8dd2e5acdfdea1b27422071163dc9ba9d - languageName: node - linkType: hard - -"@tsconfig/node16@npm:^1.0.2": - version: 1.0.3 - resolution: "@tsconfig/node16@npm:1.0.3" - checksum: 3a8b657dd047495b7ad23437d6afd20297ce90380ff0bdee93fc7d39a900dbd8d9e26e53ff6b465e7967ce2adf0b218782590ce9013285121e6a5928fbd6819f - languageName: node - linkType: hard - -"@types/abstract-leveldown@npm:*": - version: 7.2.1 - resolution: "@types/abstract-leveldown@npm:7.2.1" - checksum: 20689e7d144ce26d2384e2e151eed59046c95d573a6988da5e77e3076808eb4f435f474a0387af9ac786bfbfc7089e277dcfd9572ae902553d5c018e9b527a30 - languageName: node - linkType: hard - -"@types/babel__core@npm:^7.1.14": - version: 7.20.0 - resolution: "@types/babel__core@npm:7.20.0" - dependencies: - "@babel/parser": ^7.20.7 - "@babel/types": ^7.20.7 - "@types/babel__generator": "*" - "@types/babel__template": "*" - "@types/babel__traverse": "*" - checksum: 49b601a0a7637f1f387442c8156bd086cfd10ff4b82b0e1994e73a6396643b5435366fb33d6b604eade8467cca594ef97adcbc412aede90bb112ebe88d0ad6df - languageName: node - linkType: hard - -"@types/babel__generator@npm:*": - version: 7.6.4 - resolution: "@types/babel__generator@npm:7.6.4" - dependencies: - "@babel/types": ^7.0.0 - checksum: 20effbbb5f8a3a0211e95959d06ae70c097fb6191011b73b38fe86deebefad8e09ee014605e0fd3cdaedc73d158be555866810e9166e1f09e4cfd880b874dcb0 - languageName: node - linkType: hard - -"@types/babel__template@npm:*": - version: 7.4.1 - resolution: "@types/babel__template@npm:7.4.1" - dependencies: - "@babel/parser": ^7.1.0 - "@babel/types": ^7.0.0 - checksum: 649fe8b42c2876be1fd28c6ed9b276f78152d5904ec290b6c861d9ef324206e0a5c242e8305c421ac52ecf6358fa7e32ab7a692f55370484825c1df29b1596ee - languageName: node - linkType: hard - -"@types/babel__traverse@npm:*, @types/babel__traverse@npm:^7.0.6": - version: 7.18.3 - resolution: "@types/babel__traverse@npm:7.18.3" - dependencies: - "@babel/types": ^7.3.0 - checksum: d20953338b2f012ab7750932ece0a78e7d1645b0a6ff42d49be90f55e9998085da1374a9786a7da252df89555c6586695ba4d1d4b4e88ab2b9f306bcd35e00d3 - languageName: node - linkType: hard - -"@types/bn.js@npm:*": - version: 5.1.1 - resolution: "@types/bn.js@npm:5.1.1" - dependencies: - "@types/node": "*" - checksum: e50ed2dd3abe997e047caf90e0352c71e54fc388679735217978b4ceb7e336e51477791b715f49fd77195ac26dd296c7bad08a3be9750e235f9b2e1edb1b51c2 - languageName: node - linkType: hard - -"@types/debug@npm:^4.1.7": - version: 4.1.7 - resolution: "@types/debug@npm:4.1.7" - dependencies: - "@types/ms": "*" - checksum: 0a7b89d8ed72526858f0b61c6fd81f477853e8c4415bb97f48b1b5545248d2ae389931680b94b393b993a7cfe893537a200647d93defe6d87159b96812305adc - languageName: node - linkType: hard - -"@types/elliptic@npm:^6.4.14": - version: 6.4.14 - resolution: "@types/elliptic@npm:6.4.14" - dependencies: - "@types/bn.js": "*" - checksum: d5a64f540e0ed4b74a12dfa5cc88c0aa7b531eab3b7a9fab17948ffbfc6e01814230e63d7417ce1b607dbd8b5d70e1b64f5afac632deabf96e44875aaac0ae1b - languageName: node - linkType: hard - -"@types/graceful-fs@npm:^4.1.3": - version: 4.1.6 - resolution: "@types/graceful-fs@npm:4.1.6" - dependencies: - "@types/node": "*" - checksum: c3070ccdc9ca0f40df747bced1c96c71a61992d6f7c767e8fd24bb6a3c2de26e8b84135ede000b7e79db530a23e7e88dcd9db60eee6395d0f4ce1dae91369dd4 - languageName: node - linkType: hard - -"@types/hdkey@npm:^2.0.1": - version: 2.0.1 - resolution: "@types/hdkey@npm:2.0.1" - dependencies: - "@types/node": "*" - checksum: 2593145197b17c7867987428c568f2840cbdd00eae8cfe43538dbb60b158c9e6ca2094007643f51e8dd392d00fc0e806ee22e2755180d94b19dbe3d508ecb23f - languageName: node - linkType: hard - -"@types/istanbul-lib-coverage@npm:*, @types/istanbul-lib-coverage@npm:^2.0.0, @types/istanbul-lib-coverage@npm:^2.0.1": - version: 2.0.4 - resolution: "@types/istanbul-lib-coverage@npm:2.0.4" - checksum: a25d7589ee65c94d31464c16b72a9dc81dfa0bea9d3e105ae03882d616e2a0712a9c101a599ec482d297c3591e16336962878cb3eb1a0a62d5b76d277a890ce7 - languageName: node - linkType: hard - -"@types/istanbul-lib-report@npm:*": - version: 3.0.0 - resolution: "@types/istanbul-lib-report@npm:3.0.0" - dependencies: - "@types/istanbul-lib-coverage": "*" - checksum: 656398b62dc288e1b5226f8880af98087233cdb90100655c989a09f3052b5775bf98ba58a16c5ae642fb66c61aba402e07a9f2bff1d1569e3b306026c59f3f36 - languageName: node - linkType: hard - -"@types/istanbul-reports@npm:^3.0.0": - version: 3.0.1 - resolution: "@types/istanbul-reports@npm:3.0.1" - dependencies: - "@types/istanbul-lib-report": "*" - checksum: f1ad54bc68f37f60b30c7915886b92f86b847033e597f9b34f2415acdbe5ed742fa559a0a40050d74cdba3b6a63c342cac1f3a64dba5b68b66a6941f4abd7903 - languageName: node - linkType: hard - -"@types/jest@npm:^29.4.0, @types/jest@npm:^29.4.1": - version: 29.4.4 - resolution: "@types/jest@npm:29.4.4" - dependencies: - expect: ^29.0.0 - pretty-format: ^29.0.0 - checksum: 754c21d996c3457c761e55c4076a2dd14d82e6290c3f57122db17aa07ef59c12af7df50a82a06845ef9ba1fbf75bb024a1fed68426514618856bda7fb90eb773 - languageName: node - linkType: hard - -"@types/json-schema@npm:^7.0.9": - version: 7.0.11 - resolution: "@types/json-schema@npm:7.0.11" - checksum: 527bddfe62db9012fccd7627794bd4c71beb77601861055d87e3ee464f2217c85fca7a4b56ae677478367bbd248dbde13553312b7d4dbc702a2f2bbf60c4018d - languageName: node - linkType: hard - -"@types/level-errors@npm:*": - version: 3.0.0 - resolution: "@types/level-errors@npm:3.0.0" - checksum: ad9392663439306677ac9cb704f8fa0b64c300dfea4f3494369eb78a2e09c194156cbab2b52c71a361a09b735d54a2de65195dcadba0ec7db1d14a320198133e - languageName: node - linkType: hard - -"@types/levelup@npm:^5.1.2": - version: 5.1.2 - resolution: "@types/levelup@npm:5.1.2" - dependencies: - "@types/abstract-leveldown": "*" - "@types/level-errors": "*" - "@types/node": "*" - checksum: 6740284488b6806ba398bc38842fa789edd5667a342830c544a6b3611ebeed957a08d03dc8bde1e32fe03ac9c439341647c044c1ff0f73a26bcded9ca302a009 - languageName: node - linkType: hard - -"@types/memdown@npm:^3.0.0, @types/memdown@npm:^3.0.1": - version: 3.0.1 - resolution: "@types/memdown@npm:3.0.1" - dependencies: - "@types/abstract-leveldown": "*" - checksum: 08085fff44f1868d352ec3be81890cfd0034ad1086f3dbc8bbfc412d55434bb6f5bbd512a22a92f2f9c416ccb0784815ecaa0a6fada4478c9a39db3f0f7a1a43 - languageName: node - linkType: hard - -"@types/ms@npm:*": - version: 0.7.31 - resolution: "@types/ms@npm:0.7.31" - checksum: daadd354aedde024cce6f5aa873fefe7b71b22cd0e28632a69e8b677aeb48ae8caa1c60e5919bb781df040d116b01cb4316335167a3fc0ef6a63fa3614c0f6da - languageName: node - linkType: hard - -"@types/node@npm:*, @types/node@npm:^18.14.6, @types/node@npm:^18.15.0, @types/node@npm:^18.15.2, @types/node@npm:^18.15.3, @types/node@npm:^18.7.23": - version: 18.15.3 - resolution: "@types/node@npm:18.15.3" - checksum: 31b1d92475a82c30de29aa6c0771b18a276552d191283b4423ba2d61b3f01159bf0d02576c0b7cc834b043997893800db6bb47f246083ed85aa45e79c80875d7 - languageName: node - linkType: hard - -"@types/prettier@npm:^2.1.5": - version: 2.7.2 - resolution: "@types/prettier@npm:2.7.2" - checksum: b47d76a5252265f8d25dd2fe2a5a61dc43ba0e6a96ffdd00c594cb4fd74c1982c2e346497e3472805d97915407a09423804cc2110a0b8e1b22cffcab246479b7 - languageName: node - linkType: hard - -"@types/semver@npm:^7.3.12": - version: 7.3.13 - resolution: "@types/semver@npm:7.3.13" - checksum: 00c0724d54757c2f4bc60b5032fe91cda6410e48689633d5f35ece8a0a66445e3e57fa1d6e07eb780f792e82ac542948ec4d0b76eb3484297b79bd18b8cf1cb0 - languageName: node - linkType: hard - -"@types/sha256@npm:^0.2.0": - version: 0.2.0 - resolution: "@types/sha256@npm:0.2.0" - dependencies: - "@types/node": "*" - checksum: f3c8e0dcaf11d833292b7dd19db567ef41b23036b2fb9ea7335cba100aac8c56e1346171fae6c63885f6c0e1048550506fd165628bc0001902fea010a16d3842 - languageName: node - linkType: hard - -"@types/stack-utils@npm:^2.0.0": - version: 2.0.1 - resolution: "@types/stack-utils@npm:2.0.1" - checksum: 205fdbe3326b7046d7eaf5e494d8084f2659086a266f3f9cf00bccc549c8e36e407f88168ad4383c8b07099957ad669f75f2532ed4bc70be2b037330f7bae019 - languageName: node - linkType: hard - -"@types/uuid@npm:^9.0.0": - version: 9.0.1 - resolution: "@types/uuid@npm:9.0.1" - checksum: c472b8a77cbeded4bc529220b8611afa39bd64677f507838f8083d8aac8033b1f88cb9ddaa2f8589e0dcd2317291d0f6e1379f82d5ceebd6f74f3b4825288e00 - languageName: node - linkType: hard - -"@types/ws@npm:^8.5.4": - version: 8.5.4 - resolution: "@types/ws@npm:8.5.4" - dependencies: - "@types/node": "*" - checksum: fefbad20d211929bb996285c4e6f699b12192548afedbe4930ab4384f8a94577c9cd421acaad163cacd36b88649509970a05a0b8f20615b30c501ed5269038d1 - languageName: node - linkType: hard - -"@types/yargs-parser@npm:*": - version: 21.0.0 - resolution: "@types/yargs-parser@npm:21.0.0" - checksum: b2f4c8d12ac18a567440379909127cf2cec393daffb73f246d0a25df36ea983b93b7e9e824251f959e9f928cbc7c1aab6728d0a0ff15d6145f66cec2be67d9a2 - languageName: node - linkType: hard - -"@types/yargs@npm:^17.0.8": - version: 17.0.22 - resolution: "@types/yargs@npm:17.0.22" - dependencies: - "@types/yargs-parser": "*" - checksum: 0773523fda71bafdc52f13f5970039e535a353665a60ba9261149a5c9c2b908242e6e77fbb7a8c06931ec78ce889d64d09673c68ba23eb5f5742d5385d0d1982 - languageName: node - linkType: hard - -"@typescript-eslint/eslint-plugin@npm:^5.38.0": - version: 5.55.0 - resolution: "@typescript-eslint/eslint-plugin@npm:5.55.0" - dependencies: - "@eslint-community/regexpp": ^4.4.0 - "@typescript-eslint/scope-manager": 5.55.0 - "@typescript-eslint/type-utils": 5.55.0 - "@typescript-eslint/utils": 5.55.0 - debug: ^4.3.4 - grapheme-splitter: ^1.0.4 - ignore: ^5.2.0 - natural-compare-lite: ^1.4.0 - semver: ^7.3.7 - tsutils: ^3.21.0 - peerDependencies: - "@typescript-eslint/parser": ^5.0.0 - eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 - peerDependenciesMeta: - typescript: - optional: true - checksum: e3239ec6016eeb73b8b4d8310581978e28b8d3378140a8eb70bd8e33ffd332266020c19d493e0ccae4edfd4abd6097608718c50308fe6288f4ffeb8e4784efd9 - languageName: node - linkType: hard - -"@typescript-eslint/parser@npm:^5.38.0": - version: 5.55.0 - resolution: "@typescript-eslint/parser@npm:5.55.0" - dependencies: - "@typescript-eslint/scope-manager": 5.55.0 - "@typescript-eslint/types": 5.55.0 - "@typescript-eslint/typescript-estree": 5.55.0 - debug: ^4.3.4 - peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 - peerDependenciesMeta: - typescript: - optional: true - checksum: 48a20dc7e67960b5168b77bfb9d11d053a21d57bb83cf7b59f750191cbca5eea3b4636a8e6e75cc0aca5a84cdef91fed5440934fc2935f8c6fa71630a253a50c - languageName: node - linkType: hard - -"@typescript-eslint/scope-manager@npm:5.55.0": - version: 5.55.0 - resolution: "@typescript-eslint/scope-manager@npm:5.55.0" - dependencies: - "@typescript-eslint/types": 5.55.0 - "@typescript-eslint/visitor-keys": 5.55.0 - checksum: f253db88f69a29e4abe2f567d0a611cc3e7fb1a911a2cc54a2f6baf16e3de4d1883b3f8e45ee61b3db9fa5543dda0fd7b608de9d28ba6173ab49bfd17ff90cad - languageName: node - linkType: hard - -"@typescript-eslint/type-utils@npm:5.55.0": - version: 5.55.0 - resolution: "@typescript-eslint/type-utils@npm:5.55.0" - dependencies: - "@typescript-eslint/typescript-estree": 5.55.0 - "@typescript-eslint/utils": 5.55.0 - debug: ^4.3.4 - tsutils: ^3.21.0 - peerDependencies: - eslint: "*" - peerDependenciesMeta: - typescript: - optional: true - checksum: 5c60d441355b51f96b596324068c10605c74abb46748c0bbc6d8f7f2ea40acb6b4bda3b537105fa189172324c56d18bd88e7102e67f99f8c03bc05c6d0e2023d - languageName: node - linkType: hard - -"@typescript-eslint/types@npm:5.55.0": - version: 5.55.0 - resolution: "@typescript-eslint/types@npm:5.55.0" - checksum: 7d851f09a2106514d3a9c7164d34758f30abfe554e3c7a02be75cdc7e16644e23ca32840a8f39a0321bc509927fb4d98ce91b22b21e8544ac56cef33b815a864 - languageName: node - linkType: hard - -"@typescript-eslint/typescript-estree@npm:5.55.0": - version: 5.55.0 - resolution: "@typescript-eslint/typescript-estree@npm:5.55.0" - dependencies: - "@typescript-eslint/types": 5.55.0 - "@typescript-eslint/visitor-keys": 5.55.0 - debug: ^4.3.4 - globby: ^11.1.0 - is-glob: ^4.0.3 - semver: ^7.3.7 - tsutils: ^3.21.0 - peerDependenciesMeta: - typescript: - optional: true - checksum: d24a11aee3d01067018d99804f420aecb8af88e43bf170d5d14f6480bd378c0a81ce49a37f5d6c36e5f0f319e3fa8b099720f295f2767338be1a4f7e9a5323e1 - languageName: node - linkType: hard - -"@typescript-eslint/utils@npm:5.55.0": - version: 5.55.0 - resolution: "@typescript-eslint/utils@npm:5.55.0" - dependencies: - "@eslint-community/eslint-utils": ^4.2.0 - "@types/json-schema": ^7.0.9 - "@types/semver": ^7.3.12 - "@typescript-eslint/scope-manager": 5.55.0 - "@typescript-eslint/types": 5.55.0 - "@typescript-eslint/typescript-estree": 5.55.0 - eslint-scope: ^5.1.1 - semver: ^7.3.7 - peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 - checksum: 368cfc3fb9d6af6901e739e2e41c3f7f1c1244576607445f4f59d95eccb237f73e1a75e7f0816ec9a32a0f1ec6bb4a3602a99e17e70fe184e62f7c69dcbe4b8d - languageName: node - linkType: hard - -"@typescript-eslint/visitor-keys@npm:5.55.0": - version: 5.55.0 - resolution: "@typescript-eslint/visitor-keys@npm:5.55.0" - dependencies: - "@typescript-eslint/types": 5.55.0 - eslint-visitor-keys: ^3.3.0 - checksum: 0b24c72dff99dd2cf41c19d20067f8ab20a38aa2e82c79c5530bec7cf651031e95c80702fc21c813c9b94e5f3d4cd210f13967b2966ef38abe548cb5f05848a3 - languageName: node - linkType: hard - -"@wagmi/chains@npm:~0.2.11": - version: 0.2.12 - resolution: "@wagmi/chains@npm:0.2.12" - peerDependencies: - typescript: ">=4.9.4" - peerDependenciesMeta: - typescript: - optional: true - checksum: 3f7d7c1026664e990da3b27bddada59a157f0b2d986020601aaa4e6eea5cb5b60ddc0154e0a00bc8e9b1345ca3fc4736df1ef8f8475fc3ad8094512786df4f75 - languageName: node - linkType: hard - -"abbrev@npm:^1.0.0": - version: 1.1.1 - resolution: "abbrev@npm:1.1.1" - checksum: a4a97ec07d7ea112c517036882b2ac22f3109b7b19077dc656316d07d308438aac28e4d9746dc4d84bf6b1e75b4a7b0a5f3cb30592419f128ca9a8cee3bcfa17 - languageName: node - linkType: hard - -"abitype@npm:~0.7.1": - version: 0.7.1 - resolution: "abitype@npm:0.7.1" - peerDependencies: - typescript: ">=4.9.4" - zod: ^3 >=3.19.1 - peerDependenciesMeta: - zod: - optional: true - checksum: de0d7082d28a4835b3d8dc4d8c75e9222c95a1f9eed13d6b2381403b46f46b68ea7a281e8ba6628d259a98c54ea466ebc206eec21db6205fa1641c7393854f5e - languageName: node - linkType: hard - -"abstract-leveldown@npm:^7.2.0": - version: 7.2.0 - resolution: "abstract-leveldown@npm:7.2.0" - dependencies: - buffer: ^6.0.3 - catering: ^2.0.0 - is-buffer: ^2.0.5 - level-concat-iterator: ^3.0.0 - level-supports: ^2.0.1 - queue-microtask: ^1.2.3 - checksum: d558111f2d123da95ac80b8ba3b9b0a5bc8cd87296e64b05dca693f5f4839aa0e2fc97bad56a101766f499824e2962611750f8a76bbac4a5db35801968fbbe02 - languageName: node - linkType: hard - -"acorn-jsx@npm:^5.3.2": - version: 5.3.2 - resolution: "acorn-jsx@npm:5.3.2" - peerDependencies: - acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 - checksum: c3d3b2a89c9a056b205b69530a37b972b404ee46ec8e5b341666f9513d3163e2a4f214a71f4dfc7370f5a9c07472d2fd1c11c91c3f03d093e37637d95da98950 - languageName: node - linkType: hard - -"acorn-walk@npm:^8.1.1": - version: 8.2.0 - resolution: "acorn-walk@npm:8.2.0" - checksum: 1715e76c01dd7b2d4ca472f9c58968516a4899378a63ad5b6c2d668bba8da21a71976c14ec5f5b75f887b6317c4ae0b897ab141c831d741dc76024d8745f1ad1 - languageName: node - linkType: hard - -"acorn@npm:^8.4.1, acorn@npm:^8.8.0": - version: 8.8.2 - resolution: "acorn@npm:8.8.2" - bin: - acorn: bin/acorn - checksum: f790b99a1bf63ef160c967e23c46feea7787e531292bb827126334612c234ed489a0dc2c7ba33156416f0ffa8d25bf2b0fdb7f35c2ba60eb3e960572bece4001 - languageName: node - linkType: hard - -"agent-base@npm:6, agent-base@npm:^6.0.2": - version: 6.0.2 - resolution: "agent-base@npm:6.0.2" - dependencies: - debug: 4 - checksum: f52b6872cc96fd5f622071b71ef200e01c7c4c454ee68bc9accca90c98cfb39f2810e3e9aa330435835eedc8c23f4f8a15267f67c6e245d2b33757575bdac49d - languageName: node - linkType: hard - -"agentkeepalive@npm:^4.2.1": - version: 4.3.0 - resolution: "agentkeepalive@npm:4.3.0" - dependencies: - debug: ^4.1.0 - depd: ^2.0.0 - humanize-ms: ^1.2.1 - checksum: 982453aa44c11a06826c836025e5162c846e1200adb56f2d075400da7d32d87021b3b0a58768d949d824811f5654223d5a8a3dad120921a2439625eb847c6260 - languageName: node - linkType: hard - -"aggregate-error@npm:^3.0.0": - version: 3.1.0 - resolution: "aggregate-error@npm:3.1.0" - dependencies: - clean-stack: ^2.0.0 - indent-string: ^4.0.0 - checksum: 1101a33f21baa27a2fa8e04b698271e64616b886795fd43c31068c07533c7b3facfcaf4e9e0cab3624bd88f729a592f1c901a1a229c9e490eafce411a8644b79 - languageName: node - linkType: hard - -"ajv@npm:^6.10.0, ajv@npm:^6.12.4, ajv@npm:~6.12.6": - version: 6.12.6 - resolution: "ajv@npm:6.12.6" - dependencies: - fast-deep-equal: ^3.1.1 - fast-json-stable-stringify: ^2.0.0 - json-schema-traverse: ^0.4.1 - uri-js: ^4.2.2 - checksum: 874972efe5c4202ab0a68379481fbd3d1b5d0a7bd6d3cc21d40d3536ebff3352a2a1fabb632d4fd2cc7fe4cbdcd5ed6782084c9bbf7f32a1536d18f9da5007d4 - languageName: node - linkType: hard - -"ansi-escapes@npm:^4.2.1": - version: 4.3.2 - resolution: "ansi-escapes@npm:4.3.2" - dependencies: - type-fest: ^0.21.3 - checksum: 93111c42189c0a6bed9cdb4d7f2829548e943827ee8479c74d6e0b22ee127b2a21d3f8b5ca57723b8ef78ce011fbfc2784350eb2bde3ccfccf2f575fa8489815 - languageName: node - linkType: hard - -"ansi-regex@npm:^5.0.1": - version: 5.0.1 - resolution: "ansi-regex@npm:5.0.1" - checksum: 2aa4bb54caf2d622f1afdad09441695af2a83aa3fe8b8afa581d205e57ed4261c183c4d3877cee25794443fde5876417d859c108078ab788d6af7e4fe52eb66b - languageName: node - linkType: hard - -"ansi-sequence-parser@npm:^1.1.0": - version: 1.1.0 - resolution: "ansi-sequence-parser@npm:1.1.0" - checksum: 75f4d3a4c555655a698aec05b5763cbddcd16ccccdbfd178fb0aa471ab74fdf98e031b875ef26e64be6a95cf970c89238744b26de6e34af97f316d5186b1df53 - languageName: node - linkType: hard - -"ansi-styles@npm:^3.2.1": - version: 3.2.1 - resolution: "ansi-styles@npm:3.2.1" - dependencies: - color-convert: ^1.9.0 - checksum: d85ade01c10e5dd77b6c89f34ed7531da5830d2cb5882c645f330079975b716438cd7ebb81d0d6e6b4f9c577f19ae41ab55f07f19786b02f9dfd9e0377395665 - languageName: node - linkType: hard - -"ansi-styles@npm:^4.0.0, ansi-styles@npm:^4.1.0": - version: 4.3.0 - resolution: "ansi-styles@npm:4.3.0" - dependencies: - color-convert: ^2.0.1 - checksum: 513b44c3b2105dd14cc42a19271e80f386466c4be574bccf60b627432f9198571ebf4ab1e4c3ba17347658f4ee1711c163d574248c0c1cdc2d5917a0ad582ec4 - languageName: node - linkType: hard - -"ansi-styles@npm:^5.0.0": - version: 5.2.0 - resolution: "ansi-styles@npm:5.2.0" - checksum: d7f4e97ce0623aea6bc0d90dcd28881ee04cba06c570b97fd3391bd7a268eedfd9d5e2dd4fdcbdd82b8105df5faf6f24aaedc08eaf3da898e702db5948f63469 - languageName: node - linkType: hard - -"anymatch@npm:^3.0.3": - version: 3.1.3 - resolution: "anymatch@npm:3.1.3" - dependencies: - normalize-path: ^3.0.0 - picomatch: ^2.0.4 - checksum: 3e044fd6d1d26545f235a9fe4d7a534e2029d8e59fa7fd9f2a6eb21230f6b5380ea1eaf55136e60cbf8e613544b3b766e7a6fa2102e2a3a117505466e3025dc2 - languageName: node - linkType: hard - -"aproba@npm:^1.0.3 || ^2.0.0": - version: 2.0.0 - resolution: "aproba@npm:2.0.0" - checksum: 5615cadcfb45289eea63f8afd064ab656006361020e1735112e346593856f87435e02d8dcc7ff0d11928bc7d425f27bc7c2a84f6c0b35ab0ff659c814c138a24 - languageName: node - linkType: hard - -"are-we-there-yet@npm:^3.0.0": - version: 3.0.1 - resolution: "are-we-there-yet@npm:3.0.1" - dependencies: - delegates: ^1.0.0 - readable-stream: ^3.6.0 - checksum: 52590c24860fa7173bedeb69a4c05fb573473e860197f618b9a28432ee4379049336727ae3a1f9c4cb083114601c1140cee578376164d0e651217a9843f9fe83 - languageName: node - linkType: hard - -"arg@npm:^4.1.0": - version: 4.1.3 - resolution: "arg@npm:4.1.3" - checksum: 544af8dd3f60546d3e4aff084d451b96961d2267d668670199692f8d054f0415d86fc5497d0e641e91546f0aa920e7c29e5250e99fc89f5552a34b5d93b77f43 - languageName: node - linkType: hard - -"argparse@npm:^1.0.7": - version: 1.0.10 - resolution: "argparse@npm:1.0.10" - dependencies: - sprintf-js: ~1.0.2 - checksum: 7ca6e45583a28de7258e39e13d81e925cfa25d7d4aacbf806a382d3c02fcb13403a07fb8aeef949f10a7cfe4a62da0e2e807b348a5980554cc28ee573ef95945 - languageName: node - linkType: hard - -"argparse@npm:^2.0.1": - version: 2.0.1 - resolution: "argparse@npm:2.0.1" - checksum: 83644b56493e89a254bae05702abf3a1101b4fa4d0ca31df1c9985275a5a5bd47b3c27b7fa0b71098d41114d8ca000e6ed90cad764b306f8a503665e4d517ced - languageName: node - linkType: hard - -"array-union@npm:^2.1.0": - version: 2.1.0 - resolution: "array-union@npm:2.1.0" - checksum: 5bee12395cba82da674931df6d0fea23c4aa4660cb3b338ced9f828782a65caa232573e6bf3968f23e0c5eb301764a382cef2f128b170a9dc59de0e36c39f98d - languageName: node - linkType: hard - -"babel-jest@npm:^28.1.3": - version: 28.1.3 - resolution: "babel-jest@npm:28.1.3" - dependencies: - "@jest/transform": ^28.1.3 - "@types/babel__core": ^7.1.14 - babel-plugin-istanbul: ^6.1.1 - babel-preset-jest: ^28.1.3 - chalk: ^4.0.0 - graceful-fs: ^4.2.9 - slash: ^3.0.0 - peerDependencies: - "@babel/core": ^7.8.0 - checksum: 57ccd2296e1839687b5df2fd138c3d00717e0369e385254b012ccd4ee70e75f5d5c8e6cfcdf92d155015b468cfebb847b38e69bb5805d8aaf730e20575127cc6 - languageName: node - linkType: hard - -"babel-jest@npm:^29.5.0": - version: 29.5.0 - resolution: "babel-jest@npm:29.5.0" - dependencies: - "@jest/transform": ^29.5.0 - "@types/babel__core": ^7.1.14 - babel-plugin-istanbul: ^6.1.1 - babel-preset-jest: ^29.5.0 - chalk: ^4.0.0 - graceful-fs: ^4.2.9 - slash: ^3.0.0 - peerDependencies: - "@babel/core": ^7.8.0 - checksum: eafb6d37deb71f0c80bf3c80215aa46732153e5e8bcd73f6ff47d92e5c0c98c8f7f75995d0efec6289c371edad3693cd8fa2367b0661c4deb71a3a7117267ede - languageName: node - linkType: hard - -"babel-plugin-istanbul@npm:^6.1.1": - version: 6.1.1 - resolution: "babel-plugin-istanbul@npm:6.1.1" - dependencies: - "@babel/helper-plugin-utils": ^7.0.0 - "@istanbuljs/load-nyc-config": ^1.0.0 - "@istanbuljs/schema": ^0.1.2 - istanbul-lib-instrument: ^5.0.4 - test-exclude: ^6.0.0 - checksum: cb4fd95738219f232f0aece1116628cccff16db891713c4ccb501cddbbf9272951a5df81f2f2658dfdf4b3e7b236a9d5cbcf04d5d8c07dd5077297339598061a - languageName: node - linkType: hard - -"babel-plugin-jest-hoist@npm:^28.1.3": - version: 28.1.3 - resolution: "babel-plugin-jest-hoist@npm:28.1.3" - dependencies: - "@babel/template": ^7.3.3 - "@babel/types": ^7.3.3 - "@types/babel__core": ^7.1.14 - "@types/babel__traverse": ^7.0.6 - checksum: 648d89f9d80f6450ce7e50d0c32eb91b7f26269b47c3e37aaf2e0f2f66a980978345bd6b8c9b8c3aa6a8252ad2bc2c9fb50630e9895622c9a0972af5f70ed20e - languageName: node - linkType: hard - -"babel-plugin-jest-hoist@npm:^29.5.0": - version: 29.5.0 - resolution: "babel-plugin-jest-hoist@npm:29.5.0" - dependencies: - "@babel/template": ^7.3.3 - "@babel/types": ^7.3.3 - "@types/babel__core": ^7.1.14 - "@types/babel__traverse": ^7.0.6 - checksum: 099b5254073b6bc985b6d2d045ad26fb8ed30ff8ae6404c4fe8ee7cd0e98a820f69e3dfb871c7c65aae0f4b65af77046244c07bb92d49ef9005c90eedf681539 - languageName: node - linkType: hard - -"babel-preset-current-node-syntax@npm:^1.0.0": - version: 1.0.1 - resolution: "babel-preset-current-node-syntax@npm:1.0.1" - dependencies: - "@babel/plugin-syntax-async-generators": ^7.8.4 - "@babel/plugin-syntax-bigint": ^7.8.3 - "@babel/plugin-syntax-class-properties": ^7.8.3 - "@babel/plugin-syntax-import-meta": ^7.8.3 - "@babel/plugin-syntax-json-strings": ^7.8.3 - "@babel/plugin-syntax-logical-assignment-operators": ^7.8.3 - "@babel/plugin-syntax-nullish-coalescing-operator": ^7.8.3 - "@babel/plugin-syntax-numeric-separator": ^7.8.3 - "@babel/plugin-syntax-object-rest-spread": ^7.8.3 - "@babel/plugin-syntax-optional-catch-binding": ^7.8.3 - "@babel/plugin-syntax-optional-chaining": ^7.8.3 - "@babel/plugin-syntax-top-level-await": ^7.8.3 - peerDependencies: - "@babel/core": ^7.0.0 - checksum: d118c2742498c5492c095bc8541f4076b253e705b5f1ad9a2e7d302d81a84866f0070346662355c8e25fc02caa28dc2da8d69bcd67794a0d60c4d6fab6913cc8 - languageName: node - linkType: hard - -"babel-preset-jest@npm:^28.1.3": - version: 28.1.3 - resolution: "babel-preset-jest@npm:28.1.3" - dependencies: - babel-plugin-jest-hoist: ^28.1.3 - babel-preset-current-node-syntax: ^1.0.0 - peerDependencies: - "@babel/core": ^7.0.0 - checksum: 8248a4a5ca4242cc06ad13b10b9183ad2664da8fb0da060c352223dcf286f0ce9c708fa17901dc44ecabec25e6d309e5e5b9830a61dd777c3925f187a345a47d - languageName: node - linkType: hard - -"babel-preset-jest@npm:^29.5.0": - version: 29.5.0 - resolution: "babel-preset-jest@npm:29.5.0" - dependencies: - babel-plugin-jest-hoist: ^29.5.0 - babel-preset-current-node-syntax: ^1.0.0 - peerDependencies: - "@babel/core": ^7.0.0 - checksum: 5566ca2762766c9319b4973d018d2fa08c0fcf6415c72cc54f4c8e7199e851ea8f5e6c6730f03ed7ed44fc8beefa959dd15911f2647dee47c615ff4faeddb1ad - languageName: node - linkType: hard - -"balanced-match@npm:^1.0.0": - version: 1.0.2 - resolution: "balanced-match@npm:1.0.2" - checksum: 9706c088a283058a8a99e0bf91b0a2f75497f185980d9ffa8b304de1d9e58ebda7c72c07ebf01dadedaac5b2907b2c6f566f660d62bd336c3468e960403b9d65 - languageName: node - linkType: hard - -"base-x@npm:^3.0.2": - version: 3.0.9 - resolution: "base-x@npm:3.0.9" - dependencies: - safe-buffer: ^5.0.1 - checksum: 957101d6fd09e1903e846fd8f69fd7e5e3e50254383e61ab667c725866bec54e5ece5ba49ce385128ae48f9ec93a26567d1d5ebb91f4d56ef4a9cc0d5a5481e8 - languageName: node - linkType: hard - -"base64-js@npm:^1.3.1": - version: 1.5.1 - resolution: "base64-js@npm:1.5.1" - checksum: 669632eb3745404c2f822a18fc3a0122d2f9a7a13f7fb8b5823ee19d1d2ff9ee5b52c53367176ea4ad093c332fd5ab4bd0ebae5a8e27917a4105a4cfc86b1005 - languageName: node - linkType: hard - -"bip39@npm:^3.0.4": - version: 3.1.0 - resolution: "bip39@npm:3.1.0" - dependencies: - "@noble/hashes": ^1.2.0 - checksum: 1224e763ffc6b097052ed8abd57f0e521ad6d31f1645be0d0a15f4417c13f8461f00e47e9cf7c8c784bd533f4fb1ee3ab020f258c7df45ee5dc722b4b0336cfc - languageName: node - linkType: hard - -"bn.js@npm:^4.11.9": - version: 4.12.0 - resolution: "bn.js@npm:4.12.0" - checksum: 39afb4f15f4ea537b55eaf1446c896af28ac948fdcf47171961475724d1bb65118cca49fa6e3d67706e4790955ec0e74de584e45c8f1ef89f46c812bee5b5a12 - languageName: node - linkType: hard - -"brace-expansion@npm:^1.1.7": - version: 1.1.11 - resolution: "brace-expansion@npm:1.1.11" - dependencies: - balanced-match: ^1.0.0 - concat-map: 0.0.1 - checksum: faf34a7bb0c3fcf4b59c7808bc5d2a96a40988addf2e7e09dfbb67a2251800e0d14cd2bfc1aa79174f2f5095c54ff27f46fb1289fe2d77dac755b5eb3434cc07 - languageName: node - linkType: hard - -"brace-expansion@npm:^2.0.1": - version: 2.0.1 - resolution: "brace-expansion@npm:2.0.1" - dependencies: - balanced-match: ^1.0.0 - checksum: a61e7cd2e8a8505e9f0036b3b6108ba5e926b4b55089eeb5550cd04a471fe216c96d4fe7e4c7f995c728c554ae20ddfc4244cad10aef255e72b62930afd233d1 - languageName: node - linkType: hard - -"braces@npm:^3.0.2": - version: 3.0.2 - resolution: "braces@npm:3.0.2" - dependencies: - fill-range: ^7.0.1 - checksum: e2a8e769a863f3d4ee887b5fe21f63193a891c68b612ddb4b68d82d1b5f3ff9073af066c343e9867a393fe4c2555dcb33e89b937195feb9c1613d259edfcd459 - languageName: node - linkType: hard - -"brorand@npm:^1.1.0": - version: 1.1.0 - resolution: "brorand@npm:1.1.0" - checksum: 8a05c9f3c4b46572dec6ef71012b1946db6cae8c7bb60ccd4b7dd5a84655db49fe043ecc6272e7ef1f69dc53d6730b9e2a3a03a8310509a3d797a618cbee52be - languageName: node - linkType: hard - -"browserify-aes@npm:^1.2.0": - version: 1.2.0 - resolution: "browserify-aes@npm:1.2.0" - dependencies: - buffer-xor: ^1.0.3 - cipher-base: ^1.0.0 - create-hash: ^1.1.0 - evp_bytestokey: ^1.0.3 - inherits: ^2.0.1 - safe-buffer: ^5.0.1 - checksum: 4a17c3eb55a2aa61c934c286f34921933086bf6d67f02d4adb09fcc6f2fc93977b47d9d884c25619144fccd47b3b3a399e1ad8b3ff5a346be47270114bcf7104 - languageName: node - linkType: hard - -"browserslist@npm:^4.21.3": - version: 4.21.5 - resolution: "browserslist@npm:4.21.5" - dependencies: - caniuse-lite: ^1.0.30001449 - electron-to-chromium: ^1.4.284 - node-releases: ^2.0.8 - update-browserslist-db: ^1.0.10 - bin: - browserslist: cli.js - checksum: 9755986b22e73a6a1497fd8797aedd88e04270be33ce66ed5d85a1c8a798292a65e222b0f251bafa1c2522261e237d73b08b58689d4920a607e5a53d56dc4706 - languageName: node - linkType: hard - -"bs-logger@npm:0.x": - version: 0.2.6 - resolution: "bs-logger@npm:0.2.6" - dependencies: - fast-json-stable-stringify: 2.x - checksum: d34bdaf68c64bd099ab97c3ea608c9ae7d3f5faa1178b3f3f345acd94e852e608b2d4f9103fb2e503f5e69780e98293df41691b84be909b41cf5045374d54606 - languageName: node - linkType: hard - -"bs58@npm:^4.0.0": - version: 4.0.1 - resolution: "bs58@npm:4.0.1" - dependencies: - base-x: ^3.0.2 - checksum: b3c5365bb9e0c561e1a82f1a2d809a1a692059fae016be233a6127ad2f50a6b986467c3a50669ce4c18929dcccb297c5909314dd347a25a68c21b68eb3e95ac2 - languageName: node - linkType: hard - -"bs58check@npm:^2.1.2": - version: 2.1.2 - resolution: "bs58check@npm:2.1.2" - dependencies: - bs58: ^4.0.0 - create-hash: ^1.1.0 - safe-buffer: ^5.1.2 - checksum: 43bdf08a5dd04581b78f040bc4169480e17008da482ffe2a6507327bbc4fc5c28de0501f7faf22901cfe57fbca79cbb202ca529003fedb4cb8dccd265b38e54d - languageName: node - linkType: hard - -"bser@npm:2.1.1": - version: 2.1.1 - resolution: "bser@npm:2.1.1" - dependencies: - node-int64: ^0.4.0 - checksum: 9ba4dc58ce86300c862bffc3ae91f00b2a03b01ee07f3564beeeaf82aa243b8b03ba53f123b0b842c190d4399b94697970c8e7cf7b1ea44b61aa28c3526a4449 - languageName: node - linkType: hard - -"buffer-from@npm:^1.0.0": - version: 1.1.2 - resolution: "buffer-from@npm:1.1.2" - checksum: 0448524a562b37d4d7ed9efd91685a5b77a50672c556ea254ac9a6d30e3403a517d8981f10e565db24e8339413b43c97ca2951f10e399c6125a0d8911f5679bb - languageName: node - linkType: hard - -"buffer-xor@npm:^1.0.3": - version: 1.0.3 - resolution: "buffer-xor@npm:1.0.3" - checksum: 10c520df29d62fa6e785e2800e586a20fc4f6dfad84bcdbd12e1e8a83856de1cb75c7ebd7abe6d036bbfab738a6cf18a3ae9c8e5a2e2eb3167ca7399ce65373a - languageName: node - linkType: hard - -"buffer@npm:6.0.3, buffer@npm:^6.0.3": - version: 6.0.3 - resolution: "buffer@npm:6.0.3" - dependencies: - base64-js: ^1.3.1 - ieee754: ^1.2.1 - checksum: 5ad23293d9a731e4318e420025800b42bf0d264004c0286c8cc010af7a270c7a0f6522e84f54b9ad65cbd6db20b8badbfd8d2ebf4f80fa03dab093b89e68c3f9 - languageName: node - linkType: hard - -"cacache@npm:^16.1.0": - version: 16.1.3 - resolution: "cacache@npm:16.1.3" - dependencies: - "@npmcli/fs": ^2.1.0 - "@npmcli/move-file": ^2.0.0 - chownr: ^2.0.0 - fs-minipass: ^2.1.0 - glob: ^8.0.1 - infer-owner: ^1.0.4 - lru-cache: ^7.7.1 - minipass: ^3.1.6 - minipass-collect: ^1.0.2 - minipass-flush: ^1.0.5 - minipass-pipeline: ^1.2.4 - mkdirp: ^1.0.4 - p-map: ^4.0.0 - promise-inflight: ^1.0.1 - rimraf: ^3.0.2 - ssri: ^9.0.0 - tar: ^6.1.11 - unique-filename: ^2.0.0 - checksum: d91409e6e57d7d9a3a25e5dcc589c84e75b178ae8ea7de05cbf6b783f77a5fae938f6e8fda6f5257ed70000be27a681e1e44829251bfffe4c10216002f8f14e6 - languageName: node - linkType: hard - -"callsites@npm:^3.0.0": - version: 3.1.0 - resolution: "callsites@npm:3.1.0" - checksum: 072d17b6abb459c2ba96598918b55868af677154bec7e73d222ef95a8fdb9bbf7dae96a8421085cdad8cd190d86653b5b6dc55a4484f2e5b2e27d5e0c3fc15b3 - languageName: node - linkType: hard - -"camelcase@npm:^5.3.1": - version: 5.3.1 - resolution: "camelcase@npm:5.3.1" - checksum: e6effce26b9404e3c0f301498184f243811c30dfe6d0b9051863bd8e4034d09c8c2923794f280d6827e5aa055f6c434115ff97864a16a963366fb35fd673024b - languageName: node - linkType: hard - -"camelcase@npm:^6.2.0": - version: 6.3.0 - resolution: "camelcase@npm:6.3.0" - checksum: 8c96818a9076434998511251dcb2761a94817ea17dbdc37f47ac080bd088fc62c7369429a19e2178b993497132c8cbcf5cc1f44ba963e76782ba469c0474938d - languageName: node - linkType: hard - -"caniuse-lite@npm:^1.0.30001449": - version: 1.0.30001466 - resolution: "caniuse-lite@npm:1.0.30001466" - checksum: d81d0801f72162ebb7edb222cb48702f351e1a2d6acc9f340913f5b07e28c2105d1d2de9f0633c9b89e1aa1cd14f5d9154e270bf7b61296a7209745b32bdb01c - languageName: node - linkType: hard - -"catering@npm:^2.0.0, catering@npm:^2.1.0": - version: 2.1.1 - resolution: "catering@npm:2.1.1" - checksum: 205daefa69c935b0c19f3d8f2e0a520dd69aebe9bda55902958003f7c9cff8f967dfb90071b421bd6eb618576f657a89d2bc0986872c9bc04bbd66655e9d4bd6 - languageName: node - linkType: hard - -"chalk@npm:^2.0.0": - version: 2.4.2 - resolution: "chalk@npm:2.4.2" - dependencies: - ansi-styles: ^3.2.1 - escape-string-regexp: ^1.0.5 - supports-color: ^5.3.0 - checksum: ec3661d38fe77f681200f878edbd9448821924e0f93a9cefc0e26a33b145f1027a2084bf19967160d11e1f03bfe4eaffcabf5493b89098b2782c3fe0b03d80c2 - languageName: node - linkType: hard - -"chalk@npm:^4.0.0": - version: 4.1.2 - resolution: "chalk@npm:4.1.2" - dependencies: - ansi-styles: ^4.1.0 - supports-color: ^7.1.0 - checksum: fe75c9d5c76a7a98d45495b91b2172fa3b7a09e0cc9370e5c8feb1c567b85c4288e2b3fded7cfdd7359ac28d6b3844feb8b82b8686842e93d23c827c417e83fc - languageName: node - linkType: hard - -"char-regex@npm:^1.0.2": - version: 1.0.2 - resolution: "char-regex@npm:1.0.2" - checksum: b563e4b6039b15213114626621e7a3d12f31008bdce20f9c741d69987f62aeaace7ec30f6018890ad77b2e9b4d95324c9f5acfca58a9441e3b1dcdd1e2525d17 - languageName: node - linkType: hard - -"chownr@npm:^2.0.0": - version: 2.0.0 - resolution: "chownr@npm:2.0.0" - checksum: c57cf9dd0791e2f18a5ee9c1a299ae6e801ff58fee96dc8bfd0dcb4738a6ce58dd252a3605b1c93c6418fe4f9d5093b28ffbf4d66648cb2a9c67eaef9679be2f - languageName: node - linkType: hard - -"ci-info@npm:^3.2.0": - version: 3.8.0 - resolution: "ci-info@npm:3.8.0" - checksum: d0a4d3160497cae54294974a7246202244fff031b0a6ea20dd57b10ec510aa17399c41a1b0982142c105f3255aff2173e5c0dd7302ee1b2f28ba3debda375098 - languageName: node - linkType: hard - -"cipher-base@npm:^1.0.0, cipher-base@npm:^1.0.1, cipher-base@npm:^1.0.3": - version: 1.0.4 - resolution: "cipher-base@npm:1.0.4" - dependencies: - inherits: ^2.0.1 - safe-buffer: ^5.0.1 - checksum: 47d3568dbc17431a339bad1fe7dff83ac0891be8206911ace3d3b818fc695f376df809bea406e759cdea07fff4b454fa25f1013e648851bec790c1d75763032e - languageName: node - linkType: hard - -"cjs-module-lexer@npm:^1.0.0": - version: 1.2.2 - resolution: "cjs-module-lexer@npm:1.2.2" - checksum: 977f3f042bd4f08e368c890d91eecfbc4f91da0bc009a3c557bc4dfbf32022ad1141244ac1178d44de70fc9f3dea7add7cd9a658a34b9fae98a55d8f92331ce5 - languageName: node - linkType: hard - -"clean-stack@npm:^2.0.0": - version: 2.2.0 - resolution: "clean-stack@npm:2.2.0" - checksum: 2ac8cd2b2f5ec986a3c743935ec85b07bc174d5421a5efc8017e1f146a1cf5f781ae962618f416352103b32c9cd7e203276e8c28241bbe946160cab16149fb68 - languageName: node - linkType: hard - -"cliui@npm:^8.0.1": - version: 8.0.1 - resolution: "cliui@npm:8.0.1" - dependencies: - string-width: ^4.2.0 - strip-ansi: ^6.0.1 - wrap-ansi: ^7.0.0 - checksum: 79648b3b0045f2e285b76fb2e24e207c6db44323581e421c3acbd0e86454cba1b37aea976ab50195a49e7384b871e6dfb2247ad7dec53c02454ac6497394cb56 - languageName: node - linkType: hard - -"co@npm:^4.6.0": - version: 4.6.0 - resolution: "co@npm:4.6.0" - checksum: 5210d9223010eb95b29df06a91116f2cf7c8e0748a9013ed853b53f362ea0e822f1e5bb054fb3cefc645239a4cf966af1f6133a3b43f40d591f3b68ed6cf0510 - languageName: node - linkType: hard - -"collect-v8-coverage@npm:^1.0.0": - version: 1.0.1 - resolution: "collect-v8-coverage@npm:1.0.1" - checksum: 4efe0a1fccd517b65478a2364b33dadd0a43fc92a56f59aaece9b6186fe5177b2de471253587de7c91516f07c7268c2f6770b6cbcffc0e0ece353b766ec87e55 - languageName: node - linkType: hard - -"color-convert@npm:^1.9.0": - version: 1.9.3 - resolution: "color-convert@npm:1.9.3" - dependencies: - color-name: 1.1.3 - checksum: fd7a64a17cde98fb923b1dd05c5f2e6f7aefda1b60d67e8d449f9328b4e53b228a428fd38bfeaeb2db2ff6b6503a776a996150b80cdf224062af08a5c8a3a203 - languageName: node - linkType: hard - -"color-convert@npm:^2.0.1": - version: 2.0.1 - resolution: "color-convert@npm:2.0.1" - dependencies: - color-name: ~1.1.4 - checksum: 79e6bdb9fd479a205c71d89574fccfb22bd9053bd98c6c4d870d65c132e5e904e6034978e55b43d69fcaa7433af2016ee203ce76eeba9cfa554b373e7f7db336 - languageName: node - linkType: hard - -"color-name@npm:1.1.3": - version: 1.1.3 - resolution: "color-name@npm:1.1.3" - checksum: 09c5d3e33d2105850153b14466501f2bfb30324a2f76568a408763a3b7433b0e50e5b4ab1947868e65cb101bb7cb75029553f2c333b6d4b8138a73fcc133d69d - languageName: node - linkType: hard - -"color-name@npm:~1.1.4": - version: 1.1.4 - resolution: "color-name@npm:1.1.4" - checksum: b0445859521eb4021cd0fb0cc1a75cecf67fceecae89b63f62b201cca8d345baf8b952c966862a9d9a2632987d4f6581f0ec8d957dfacece86f0a7919316f610 - languageName: node - linkType: hard - -"color-support@npm:^1.1.3": - version: 1.1.3 - resolution: "color-support@npm:1.1.3" - bin: - color-support: bin.js - checksum: 9b7356817670b9a13a26ca5af1c21615463b500783b739b7634a0c2047c16cef4b2865d7576875c31c3cddf9dd621fa19285e628f20198b233a5cfdda6d0793b - languageName: node - linkType: hard - -"commander@npm:^9.0.0": - version: 9.5.0 - resolution: "commander@npm:9.5.0" - checksum: c7a3e27aa59e913b54a1bafd366b88650bc41d6651f0cbe258d4ff09d43d6a7394232a4dadd0bf518b3e696fdf595db1028a0d82c785b88bd61f8a440cecfade - languageName: node - linkType: hard - -"comment-parser@npm:1.3.1": - version: 1.3.1 - resolution: "comment-parser@npm:1.3.1" - checksum: 421e6a113a3afd548500e7174ab46a2049dccf92e82bbaa3b209031b1bdf97552aabfa1ae2a120c0b62df17e1ba70e0d8b05d68504fee78e1ef974c59bcfe718 - languageName: node - linkType: hard - -"concat-map@npm:0.0.1": - version: 0.0.1 - resolution: "concat-map@npm:0.0.1" - checksum: 902a9f5d8967a3e2faf138d5cb784b9979bad2e6db5357c5b21c568df4ebe62bcb15108af1b2253744844eb964fc023fbd9afbbbb6ddd0bcc204c6fb5b7bf3af - languageName: node - linkType: hard - -"console-control-strings@npm:^1.1.0": - version: 1.1.0 - resolution: "console-control-strings@npm:1.1.0" - checksum: 8755d76787f94e6cf79ce4666f0c5519906d7f5b02d4b884cf41e11dcd759ed69c57da0670afd9236d229a46e0f9cf519db0cd829c6dca820bb5a5c3def584ed - languageName: node - linkType: hard - -"convert-hex@npm:~0.1.0": - version: 0.1.0 - resolution: "convert-hex@npm:0.1.0" - checksum: eacb880dbc45a36a0e6b5f5674f7e57bdce59bbf5a3ebfba980f694e2be81f1b2c81c9c89834f8054f23cc9c21d1fd210265e2000287a1cd0426657797b2f462 - languageName: node - linkType: hard - -"convert-source-map@npm:^1.4.0, convert-source-map@npm:^1.6.0, convert-source-map@npm:^1.7.0": - version: 1.9.0 - resolution: "convert-source-map@npm:1.9.0" - checksum: dc55a1f28ddd0e9485ef13565f8f756b342f9a46c4ae18b843fe3c30c675d058d6a4823eff86d472f187b176f0adf51ea7b69ea38be34be4a63cbbf91b0593c8 - languageName: node - linkType: hard - -"convert-source-map@npm:^2.0.0": - version: 2.0.0 - resolution: "convert-source-map@npm:2.0.0" - checksum: 63ae9933be5a2b8d4509daca5124e20c14d023c820258e484e32dc324d34c2754e71297c94a05784064ad27615037ef677e3f0c00469fb55f409d2bb21261035 - languageName: node - linkType: hard - -"convert-string@npm:~0.1.0": - version: 0.1.0 - resolution: "convert-string@npm:0.1.0" - checksum: a1775cb186d2fbf175486f02e3f7cc68c75e7a0c7609bf434d2a933e801b3a0499ab57de4230919ec824351dc344055bf639a1db5e44a976787145817106d9aa - languageName: node - linkType: hard - -"create-hash@npm:^1.1.0, create-hash@npm:^1.1.2": - version: 1.2.0 - resolution: "create-hash@npm:1.2.0" - dependencies: - cipher-base: ^1.0.1 - inherits: ^2.0.1 - md5.js: ^1.3.4 - ripemd160: ^2.0.1 - sha.js: ^2.4.0 - checksum: 02a6ae3bb9cd4afee3fabd846c1d8426a0e6b495560a977ba46120c473cb283be6aa1cace76b5f927cf4e499c6146fb798253e48e83d522feba807d6b722eaa9 - languageName: node - linkType: hard - -"create-hmac@npm:^1.1.4": - version: 1.1.7 - resolution: "create-hmac@npm:1.1.7" - dependencies: - cipher-base: ^1.0.3 - create-hash: ^1.1.0 - inherits: ^2.0.1 - ripemd160: ^2.0.0 - safe-buffer: ^5.0.1 - sha.js: ^2.4.8 - checksum: ba12bb2257b585a0396108c72830e85f882ab659c3320c83584b1037f8ab72415095167ced80dc4ce8e446a8ecc4b2acf36d87befe0707d73b26cf9dc77440ed - languageName: node - linkType: hard - -"create-require@npm:^1.1.0": - version: 1.1.1 - resolution: "create-require@npm:1.1.1" - checksum: a9a1503d4390d8b59ad86f4607de7870b39cad43d929813599a23714831e81c520bddf61bcdd1f8e30f05fd3a2b71ae8538e946eb2786dc65c2bbc520f692eff - languageName: node - linkType: hard - -"cross-spawn@npm:^7.0.2, cross-spawn@npm:^7.0.3": - version: 7.0.3 - resolution: "cross-spawn@npm:7.0.3" - dependencies: - path-key: ^3.1.0 - shebang-command: ^2.0.0 - which: ^2.0.1 - checksum: 671cc7c7288c3a8406f3c69a3ae2fc85555c04169e9d611def9a675635472614f1c0ed0ef80955d5b6d4e724f6ced67f0ad1bb006c2ea643488fcfef994d7f52 - languageName: node - linkType: hard - -"debug@npm:4, debug@npm:^4.1.0, debug@npm:^4.1.1, debug@npm:^4.3.2, debug@npm:^4.3.3, debug@npm:^4.3.4": - version: 4.3.4 - resolution: "debug@npm:4.3.4" - dependencies: - ms: 2.1.2 - peerDependenciesMeta: - supports-color: - optional: true - checksum: 3dbad3f94ea64f34431a9cbf0bafb61853eda57bff2880036153438f50fb5a84f27683ba0d8e5426bf41a8c6ff03879488120cf5b3a761e77953169c0600a708 - languageName: node - linkType: hard - -"dedent@npm:^0.7.0": - version: 0.7.0 - resolution: "dedent@npm:0.7.0" - checksum: 87de191050d9a40dd70cad01159a0bcf05ecb59750951242070b6abf9569088684880d00ba92a955b4058804f16eeaf91d604f283929b4f614d181cd7ae633d2 - languageName: node - linkType: hard - -"deep-is@npm:^0.1.3": - version: 0.1.4 - resolution: "deep-is@npm:0.1.4" - checksum: edb65dd0d7d1b9c40b2f50219aef30e116cedd6fc79290e740972c132c09106d2e80aa0bc8826673dd5a00222d4179c84b36a790eef63a4c4bca75a37ef90804 - languageName: node - linkType: hard - -"deepmerge@npm:^4.2.2": - version: 4.3.0 - resolution: "deepmerge@npm:4.3.0" - checksum: c7980eb5c5be040b371f1df0d566473875cfabed9f672ccc177b81ba8eee5686ce2478de2f1d0076391621cbe729e5eacda397179a59ef0f68901849647db126 - languageName: node - linkType: hard - -"deferred-leveldown@npm:^7.0.0": - version: 7.0.0 - resolution: "deferred-leveldown@npm:7.0.0" - dependencies: - abstract-leveldown: ^7.2.0 - inherits: ^2.0.3 - checksum: 1ed5eb73e381aeb36d7153bf94dd957060b0294903660c1c8123a375e2b5cd5b3865428d7490aa1561c6ea08a5559563751e59e468d5786c99c765d2a868c658 - languageName: node - linkType: hard - -"delegates@npm:^1.0.0": - version: 1.0.0 - resolution: "delegates@npm:1.0.0" - checksum: a51744d9b53c164ba9c0492471a1a2ffa0b6727451bdc89e31627fdf4adda9d51277cfcbfb20f0a6f08ccb3c436f341df3e92631a3440226d93a8971724771fd - languageName: node - linkType: hard - -"depd@npm:^2.0.0": - version: 2.0.0 - resolution: "depd@npm:2.0.0" - checksum: abbe19c768c97ee2eed6282d8ce3031126662252c58d711f646921c9623f9052e3e1906443066beec1095832f534e57c523b7333f8e7e0d93051ab6baef5ab3a - languageName: node - linkType: hard - -"detect-newline@npm:^3.0.0": - version: 3.1.0 - resolution: "detect-newline@npm:3.1.0" - checksum: ae6cd429c41ad01b164c59ea36f264a2c479598e61cba7c99da24175a7ab80ddf066420f2bec9a1c57a6bead411b4655ff15ad7d281c000a89791f48cbe939e7 - languageName: node - linkType: hard - -"detect-node@npm:^2.1.0": - version: 2.1.0 - resolution: "detect-node@npm:2.1.0" - checksum: 832184ec458353e41533ac9c622f16c19f7c02d8b10c303dfd3a756f56be93e903616c0bb2d4226183c9351c15fc0b3dba41a17a2308262afabcfa3776e6ae6e - languageName: node - linkType: hard - -"diff-sequences@npm:^28.1.1": - version: 28.1.1 - resolution: "diff-sequences@npm:28.1.1" - checksum: e2529036505567c7ca5a2dea86b6bcd1ca0e3ae63bf8ebf529b8a99cfa915bbf194b7021dc1c57361a4017a6d95578d4ceb29fabc3232a4f4cb866a2726c7690 - languageName: node - linkType: hard - -"diff-sequences@npm:^29.4.3": - version: 29.4.3 - resolution: "diff-sequences@npm:29.4.3" - checksum: 28b265e04fdddcf7f9f814effe102cc95a9dec0564a579b5aed140edb24fc345c611ca52d76d725a3cab55d3888b915b5e8a4702e0f6058968a90fa5f41fcde7 - languageName: node - linkType: hard - -"diff@npm:^4.0.1": - version: 4.0.2 - resolution: "diff@npm:4.0.2" - checksum: f2c09b0ce4e6b301c221addd83bf3f454c0bc00caa3dd837cf6c127d6edf7223aa2bbe3b688feea110b7f262adbfc845b757c44c8a9f8c0c5b15d8fa9ce9d20d - languageName: node - linkType: hard - -"dir-glob@npm:^3.0.1": - version: 3.0.1 - resolution: "dir-glob@npm:3.0.1" - dependencies: - path-type: ^4.0.0 - checksum: fa05e18324510d7283f55862f3161c6759a3f2f8dbce491a2fc14c8324c498286c54282c1f0e933cb930da8419b30679389499b919122952a4f8592362ef4615 - languageName: node - linkType: hard - -"doctrine@npm:^3.0.0": - version: 3.0.0 - resolution: "doctrine@npm:3.0.0" - dependencies: - esutils: ^2.0.2 - checksum: fd7673ca77fe26cd5cba38d816bc72d641f500f1f9b25b83e8ce28827fe2da7ad583a8da26ab6af85f834138cf8dae9f69b0cd6ab925f52ddab1754db44d99ce - languageName: node - linkType: hard - -"duplexer@npm:~0.1.1": - version: 0.1.2 - resolution: "duplexer@npm:0.1.2" - checksum: 62ba61a830c56801db28ff6305c7d289b6dc9f859054e8c982abd8ee0b0a14d2e9a8e7d086ffee12e868d43e2bbe8a964be55ddbd8c8957714c87373c7a4f9b0 - languageName: node - linkType: hard - -"electron-to-chromium@npm:^1.4.284": - version: 1.4.332 - resolution: "electron-to-chromium@npm:1.4.332" - checksum: d65870e47b41dce95ca246ddd27179539de1af34a2f79cdb892b70c8bd6c2ed751aeb937bffd1fbd22e1d63b5c6bf4ce67430f208e6970a51c81e98e0beea1f4 - languageName: node - linkType: hard - -"elliptic@npm:^6.5.4": - version: 6.5.4 - resolution: "elliptic@npm:6.5.4" - dependencies: - bn.js: ^4.11.9 - brorand: ^1.1.0 - hash.js: ^1.0.0 - hmac-drbg: ^1.0.1 - inherits: ^2.0.4 - minimalistic-assert: ^1.0.1 - minimalistic-crypto-utils: ^1.0.1 - checksum: d56d21fd04e97869f7ffcc92e18903b9f67f2d4637a23c860492fbbff5a3155fd9ca0184ce0c865dd6eb2487d234ce9551335c021c376cd2d3b7cb749c7d10f4 - languageName: node - linkType: hard - -"emittery@npm:^0.10.2": - version: 0.10.2 - resolution: "emittery@npm:0.10.2" - checksum: ee3e21788b043b90885b18ea756ec3105c1cedc50b29709c92b01e239c7e55345d4bb6d3aef4ddbaf528eef448a40b3bb831bad9ee0fc9c25cbf1367ab1ab5ac - languageName: node - linkType: hard - -"emittery@npm:^0.13.1": - version: 0.13.1 - resolution: "emittery@npm:0.13.1" - checksum: 2b089ab6306f38feaabf4f6f02792f9ec85fc054fda79f44f6790e61bbf6bc4e1616afb9b232e0c5ec5289a8a452f79bfa6d905a6fd64e94b49981f0934001c6 - languageName: node - linkType: hard - -"emoji-regex@npm:^8.0.0": - version: 8.0.0 - resolution: "emoji-regex@npm:8.0.0" - checksum: d4c5c39d5a9868b5fa152f00cada8a936868fd3367f33f71be515ecee4c803132d11b31a6222b2571b1e5f7e13890156a94880345594d0ce7e3c9895f560f192 - languageName: node - linkType: hard - -"encoding@npm:^0.1.13": - version: 0.1.13 - resolution: "encoding@npm:0.1.13" - dependencies: - iconv-lite: ^0.6.2 - checksum: bb98632f8ffa823996e508ce6a58ffcf5856330fde839ae42c9e1f436cc3b5cc651d4aeae72222916545428e54fd0f6aa8862fd8d25bdbcc4589f1e3f3715e7f - languageName: node - linkType: hard - -"env-paths@npm:^2.2.0": - version: 2.2.1 - resolution: "env-paths@npm:2.2.1" - checksum: 65b5df55a8bab92229ab2b40dad3b387fad24613263d103a97f91c9fe43ceb21965cd3392b1ccb5d77088021e525c4e0481adb309625d0cb94ade1d1fb8dc17e - languageName: node - linkType: hard - -"err-code@npm:^2.0.2": - version: 2.0.3 - resolution: "err-code@npm:2.0.3" - checksum: 8b7b1be20d2de12d2255c0bc2ca638b7af5171142693299416e6a9339bd7d88fc8d7707d913d78e0993176005405a236b066b45666b27b797252c771156ace54 - languageName: node - linkType: hard - -"error-ex@npm:^1.3.1": - version: 1.3.2 - resolution: "error-ex@npm:1.3.2" - dependencies: - is-arrayish: ^0.2.1 - checksum: c1c2b8b65f9c91b0f9d75f0debaa7ec5b35c266c2cac5de412c1a6de86d4cbae04ae44e510378cb14d032d0645a36925d0186f8bb7367bcc629db256b743a001 - languageName: node - linkType: hard - -"esbuild@npm:^0.17.5": - version: 0.17.11 - resolution: "esbuild@npm:0.17.11" - dependencies: - "@esbuild/android-arm": 0.17.11 - "@esbuild/android-arm64": 0.17.11 - "@esbuild/android-x64": 0.17.11 - "@esbuild/darwin-arm64": 0.17.11 - "@esbuild/darwin-x64": 0.17.11 - "@esbuild/freebsd-arm64": 0.17.11 - "@esbuild/freebsd-x64": 0.17.11 - "@esbuild/linux-arm": 0.17.11 - "@esbuild/linux-arm64": 0.17.11 - "@esbuild/linux-ia32": 0.17.11 - "@esbuild/linux-loong64": 0.17.11 - "@esbuild/linux-mips64el": 0.17.11 - "@esbuild/linux-ppc64": 0.17.11 - "@esbuild/linux-riscv64": 0.17.11 - "@esbuild/linux-s390x": 0.17.11 - "@esbuild/linux-x64": 0.17.11 - "@esbuild/netbsd-x64": 0.17.11 - "@esbuild/openbsd-x64": 0.17.11 - "@esbuild/sunos-x64": 0.17.11 - "@esbuild/win32-arm64": 0.17.11 - "@esbuild/win32-ia32": 0.17.11 - "@esbuild/win32-x64": 0.17.11 - dependenciesMeta: - "@esbuild/android-arm": - optional: true - "@esbuild/android-arm64": - optional: true - "@esbuild/android-x64": - optional: true - "@esbuild/darwin-arm64": - optional: true - "@esbuild/darwin-x64": - optional: true - "@esbuild/freebsd-arm64": - optional: true - "@esbuild/freebsd-x64": - optional: true - "@esbuild/linux-arm": - optional: true - "@esbuild/linux-arm64": - optional: true - "@esbuild/linux-ia32": - optional: true - "@esbuild/linux-loong64": - optional: true - "@esbuild/linux-mips64el": - optional: true - "@esbuild/linux-ppc64": - optional: true - "@esbuild/linux-riscv64": - optional: true - "@esbuild/linux-s390x": - optional: true - "@esbuild/linux-x64": - optional: true - "@esbuild/netbsd-x64": - optional: true - "@esbuild/openbsd-x64": - optional: true - "@esbuild/sunos-x64": - optional: true - "@esbuild/win32-arm64": - optional: true - "@esbuild/win32-ia32": - optional: true - "@esbuild/win32-x64": - optional: true - bin: - esbuild: bin/esbuild - checksum: febf218155513bb9c9c970508c03ec58e0aacfdc23394f425836a09f1da0dae0afa12949274adfd382782eef097f86b2d6b3032293062291f2f471de204f77ec - languageName: node - linkType: hard - -"escalade@npm:^3.1.1": - version: 3.1.1 - resolution: "escalade@npm:3.1.1" - checksum: a3e2a99f07acb74b3ad4989c48ca0c3140f69f923e56d0cba0526240ee470b91010f9d39001f2a4a313841d237ede70a729e92125191ba5d21e74b106800b133 - languageName: node - linkType: hard - -"escape-string-regexp@npm:^1.0.5": - version: 1.0.5 - resolution: "escape-string-regexp@npm:1.0.5" - checksum: 6092fda75c63b110c706b6a9bfde8a612ad595b628f0bd2147eea1d3406723020810e591effc7db1da91d80a71a737a313567c5abb3813e8d9c71f4aa595b410 - languageName: node - linkType: hard - -"escape-string-regexp@npm:^2.0.0": - version: 2.0.0 - resolution: "escape-string-regexp@npm:2.0.0" - checksum: 9f8a2d5743677c16e85c810e3024d54f0c8dea6424fad3c79ef6666e81dd0846f7437f5e729dfcdac8981bc9e5294c39b4580814d114076b8d36318f46ae4395 - languageName: node - linkType: hard - -"escape-string-regexp@npm:^4.0.0": - version: 4.0.0 - resolution: "escape-string-regexp@npm:4.0.0" - checksum: 98b48897d93060f2322108bf29db0feba7dd774be96cd069458d1453347b25ce8682ecc39859d4bca2203cc0ab19c237bcc71755eff49a0f8d90beadeeba5cc5 - languageName: node - linkType: hard - -"eslint-config-prettier@npm:^8.5.0": - version: 8.7.0 - resolution: "eslint-config-prettier@npm:8.7.0" - peerDependencies: - eslint: ">=7.0.0" - bin: - eslint-config-prettier: bin/cli.js - checksum: b05bc7f2296ce3e0925c14147849706544870e0382d38af2352d709a6cf8521bdaff2bd8e5021f1780e570775a8ffa1d2bac28b8065d90d43a3f1f98fd26ce52 - languageName: node - linkType: hard - -"eslint-plugin-jsdoc@npm:^40.0.0": - version: 40.0.3 - resolution: "eslint-plugin-jsdoc@npm:40.0.3" - dependencies: - "@es-joy/jsdoccomment": ~0.37.0 - comment-parser: 1.3.1 - debug: ^4.3.4 - escape-string-regexp: ^4.0.0 - esquery: ^1.5.0 - semver: ^7.3.8 - spdx-expression-parse: ^3.0.1 - peerDependencies: - eslint: ^7.0.0 || ^8.0.0 - checksum: abdb69d4aa7a2255dc92d1416f58e4060cfe310642c37b26175b721487be82eaad13466a5b2508d737762b5a382fbeecd41e13f81b239c294e2753a4b9ee0178 - languageName: node - linkType: hard - -"eslint-plugin-tsdoc@npm:^0.2.17": - version: 0.2.17 - resolution: "eslint-plugin-tsdoc@npm:0.2.17" - dependencies: - "@microsoft/tsdoc": 0.14.2 - "@microsoft/tsdoc-config": 0.16.2 - checksum: d143a5f1c5967812d75f246ae2776cb030f6e7966b981406c9df9352a9ab02b035f294cedb30054eac2c4a217ee4ab2ed9fb76292bdccda9438e54d2d7b0146e - languageName: node - linkType: hard - -"eslint-scope@npm:^5.1.1": - version: 5.1.1 - resolution: "eslint-scope@npm:5.1.1" - dependencies: - esrecurse: ^4.3.0 - estraverse: ^4.1.1 - checksum: 47e4b6a3f0cc29c7feedee6c67b225a2da7e155802c6ea13bbef4ac6b9e10c66cd2dcb987867ef176292bf4e64eccc680a49e35e9e9c669f4a02bac17e86abdb - languageName: node - linkType: hard - -"eslint-scope@npm:^7.1.1": - version: 7.1.1 - resolution: "eslint-scope@npm:7.1.1" - dependencies: - esrecurse: ^4.3.0 - estraverse: ^5.2.0 - checksum: 9f6e974ab2db641ca8ab13508c405b7b859e72afe9f254e8131ff154d2f40c99ad4545ce326fd9fde3212ff29707102562a4834f1c48617b35d98c71a97fbf3e - languageName: node - linkType: hard - -"eslint-visitor-keys@npm:^3.3.0": - version: 3.3.0 - resolution: "eslint-visitor-keys@npm:3.3.0" - checksum: d59e68a7c5a6d0146526b0eec16ce87fbf97fe46b8281e0d41384224375c4e52f5ffb9e16d48f4ea50785cde93f766b0c898e31ab89978d88b0e1720fbfb7808 - languageName: node - linkType: hard - -"eslint@npm:^8.21.0": - version: 8.36.0 - resolution: "eslint@npm:8.36.0" - dependencies: - "@eslint-community/eslint-utils": ^4.2.0 - "@eslint-community/regexpp": ^4.4.0 - "@eslint/eslintrc": ^2.0.1 - "@eslint/js": 8.36.0 - "@humanwhocodes/config-array": ^0.11.8 - "@humanwhocodes/module-importer": ^1.0.1 - "@nodelib/fs.walk": ^1.2.8 - ajv: ^6.10.0 - chalk: ^4.0.0 - cross-spawn: ^7.0.2 - debug: ^4.3.2 - doctrine: ^3.0.0 - escape-string-regexp: ^4.0.0 - eslint-scope: ^7.1.1 - eslint-visitor-keys: ^3.3.0 - espree: ^9.5.0 - esquery: ^1.4.2 - esutils: ^2.0.2 - fast-deep-equal: ^3.1.3 - file-entry-cache: ^6.0.1 - find-up: ^5.0.0 - glob-parent: ^6.0.2 - globals: ^13.19.0 - grapheme-splitter: ^1.0.4 - ignore: ^5.2.0 - import-fresh: ^3.0.0 - imurmurhash: ^0.1.4 - is-glob: ^4.0.0 - is-path-inside: ^3.0.3 - js-sdsl: ^4.1.4 - js-yaml: ^4.1.0 - json-stable-stringify-without-jsonify: ^1.0.1 - levn: ^0.4.1 - lodash.merge: ^4.6.2 - minimatch: ^3.1.2 - natural-compare: ^1.4.0 - optionator: ^0.9.1 - strip-ansi: ^6.0.1 - strip-json-comments: ^3.1.0 - text-table: ^0.2.0 - bin: - eslint: bin/eslint.js - checksum: e9a961fc3b3de5cff5a1cb2c92eeffaa7e155a715489e30b3e1e76f186bd1255e0481e09564f2094733c0b1dbd3453499fb72ae7c043c83156e11e6d965b2304 - languageName: node - linkType: hard - -"espree@npm:^9.5.0": - version: 9.5.0 - resolution: "espree@npm:9.5.0" - dependencies: - acorn: ^8.8.0 - acorn-jsx: ^5.3.2 - eslint-visitor-keys: ^3.3.0 - checksum: a7f110aefb6407e0d3237aa635ab3cea87106ae63748dd23c67031afccc640d04c4209fca2daf16e2233c82efb505faead0fb84097478fd9cc6e8f8dd80bf99d - languageName: node - linkType: hard - -"esprima@npm:^4.0.0": - version: 4.0.1 - resolution: "esprima@npm:4.0.1" - bin: - esparse: ./bin/esparse.js - esvalidate: ./bin/esvalidate.js - checksum: b45bc805a613dbea2835278c306b91aff6173c8d034223fa81498c77dcbce3b2931bf6006db816f62eacd9fd4ea975dfd85a5b7f3c6402cfd050d4ca3c13a628 - languageName: node - linkType: hard - -"esquery@npm:^1.4.0, esquery@npm:^1.4.2, esquery@npm:^1.5.0": - version: 1.5.0 - resolution: "esquery@npm:1.5.0" - dependencies: - estraverse: ^5.1.0 - checksum: aefb0d2596c230118656cd4ec7532d447333a410a48834d80ea648b1e7b5c9bc9ed8b5e33a89cb04e487b60d622f44cf5713bf4abed7c97343edefdc84a35900 - languageName: node - linkType: hard - -"esrecurse@npm:^4.3.0": - version: 4.3.0 - resolution: "esrecurse@npm:4.3.0" - dependencies: - estraverse: ^5.2.0 - checksum: ebc17b1a33c51cef46fdc28b958994b1dc43cd2e86237515cbc3b4e5d2be6a811b2315d0a1a4d9d340b6d2308b15322f5c8291059521cc5f4802f65e7ec32837 - languageName: node - linkType: hard - -"estraverse@npm:^4.1.1": - version: 4.3.0 - resolution: "estraverse@npm:4.3.0" - checksum: a6299491f9940bb246124a8d44b7b7a413a8336f5436f9837aaa9330209bd9ee8af7e91a654a3545aee9c54b3308e78ee360cef1d777d37cfef77d2fa33b5827 - languageName: node - linkType: hard - -"estraverse@npm:^5.1.0, estraverse@npm:^5.2.0": - version: 5.3.0 - resolution: "estraverse@npm:5.3.0" - checksum: 072780882dc8416ad144f8fe199628d2b3e7bbc9989d9ed43795d2c90309a2047e6bc5979d7e2322a341163d22cfad9e21f4110597fe487519697389497e4e2b - languageName: node - linkType: hard - -"esutils@npm:^2.0.2": - version: 2.0.3 - resolution: "esutils@npm:2.0.3" - checksum: 22b5b08f74737379a840b8ed2036a5fb35826c709ab000683b092d9054e5c2a82c27818f12604bfc2a9a76b90b6834ef081edbc1c7ae30d1627012e067c6ec87 - languageName: node - linkType: hard - -"event-stream@npm:=3.3.4": - version: 3.3.4 - resolution: "event-stream@npm:3.3.4" - dependencies: - duplexer: ~0.1.1 - from: ~0 - map-stream: ~0.1.0 - pause-stream: 0.0.11 - split: 0.3 - stream-combiner: ~0.0.4 - through: ~2.3.1 - checksum: 80b467820b6daf824d9fb4345d2daf115a056e5c104463f2e98534e92d196a27f2df5ea2aa085624db26f4c45698905499e881d13bc7c01f7a13eac85be72a22 - languageName: node - linkType: hard - -"evp_bytestokey@npm:^1.0.3": - version: 1.0.3 - resolution: "evp_bytestokey@npm:1.0.3" - dependencies: - md5.js: ^1.3.4 - node-gyp: latest - safe-buffer: ^5.1.1 - checksum: ad4e1577f1a6b721c7800dcc7c733fe01f6c310732bb5bf2240245c2a5b45a38518b91d8be2c610611623160b9d1c0e91f1ce96d639f8b53e8894625cf20fa45 - languageName: node - linkType: hard - -"execa@npm:^5.0.0": - version: 5.1.1 - resolution: "execa@npm:5.1.1" - dependencies: - cross-spawn: ^7.0.3 - get-stream: ^6.0.0 - human-signals: ^2.1.0 - is-stream: ^2.0.0 - merge-stream: ^2.0.0 - npm-run-path: ^4.0.1 - onetime: ^5.1.2 - signal-exit: ^3.0.3 - strip-final-newline: ^2.0.0 - checksum: fba9022c8c8c15ed862847e94c252b3d946036d7547af310e344a527e59021fd8b6bb0723883ea87044dc4f0201f949046993124a42ccb0855cae5bf8c786343 - languageName: node - linkType: hard - -"exit@npm:^0.1.2": - version: 0.1.2 - resolution: "exit@npm:0.1.2" - checksum: abc407f07a875c3961e4781dfcb743b58d6c93de9ab263f4f8c9d23bb6da5f9b7764fc773f86b43dd88030444d5ab8abcb611cb680fba8ca075362b77114bba3 - languageName: node - linkType: hard - -"expect@npm:^28.1.3": - version: 28.1.3 - resolution: "expect@npm:28.1.3" - dependencies: - "@jest/expect-utils": ^28.1.3 - jest-get-type: ^28.0.2 - jest-matcher-utils: ^28.1.3 - jest-message-util: ^28.1.3 - jest-util: ^28.1.3 - checksum: 101e0090de300bcafedb7dbfd19223368a2251ce5fe0105bbb6de5720100b89fb6b64290ebfb42febc048324c76d6a4979cdc4b61eb77747857daf7a5de9b03d - languageName: node - linkType: hard - -"expect@npm:^29.0.0, expect@npm:^29.5.0": - version: 29.5.0 - resolution: "expect@npm:29.5.0" - dependencies: - "@jest/expect-utils": ^29.5.0 - jest-get-type: ^29.4.3 - jest-matcher-utils: ^29.5.0 - jest-message-util: ^29.5.0 - jest-util: ^29.5.0 - checksum: 58f70b38693df6e5c6892db1bcd050f0e518d6f785175dc53917d4fa6a7359a048e5690e19ddcb96b65c4493881dd89a3dabdab1a84dfa55c10cdbdabf37b2d7 - languageName: node - linkType: hard - -"fast-deep-equal@npm:^3.1.1, fast-deep-equal@npm:^3.1.3": - version: 3.1.3 - resolution: "fast-deep-equal@npm:3.1.3" - checksum: e21a9d8d84f53493b6aa15efc9cfd53dd5b714a1f23f67fb5dc8f574af80df889b3bce25dc081887c6d25457cce704e636395333abad896ccdec03abaf1f3f9d - languageName: node - linkType: hard - -"fast-glob@npm:^3.2.9": - version: 3.2.12 - resolution: "fast-glob@npm:3.2.12" - dependencies: - "@nodelib/fs.stat": ^2.0.2 - "@nodelib/fs.walk": ^1.2.3 - glob-parent: ^5.1.2 - merge2: ^1.3.0 - micromatch: ^4.0.4 - checksum: 0b1990f6ce831c7e28c4d505edcdaad8e27e88ab9fa65eedadb730438cfc7cde4910d6c975d6b7b8dc8a73da4773702ebcfcd6e3518e73938bb1383badfe01c2 - languageName: node - linkType: hard - -"fast-json-stable-stringify@npm:2.x, fast-json-stable-stringify@npm:^2.0.0, fast-json-stable-stringify@npm:^2.1.0": - version: 2.1.0 - resolution: "fast-json-stable-stringify@npm:2.1.0" - checksum: b191531e36c607977e5b1c47811158733c34ccb3bfde92c44798929e9b4154884378536d26ad90dfecd32e1ffc09c545d23535ad91b3161a27ddbb8ebe0cbecb - languageName: node - linkType: hard - -"fast-levenshtein@npm:^2.0.6": - version: 2.0.6 - resolution: "fast-levenshtein@npm:2.0.6" - checksum: 92cfec0a8dfafd9c7a15fba8f2cc29cd0b62b85f056d99ce448bbcd9f708e18ab2764bda4dd5158364f4145a7c72788538994f0d1787b956ef0d1062b0f7c24c - languageName: node - linkType: hard - -"fastq@npm:^1.6.0": - version: 1.15.0 - resolution: "fastq@npm:1.15.0" - dependencies: - reusify: ^1.0.4 - checksum: 0170e6bfcd5d57a70412440b8ef600da6de3b2a6c5966aeaf0a852d542daff506a0ee92d6de7679d1de82e644bce69d7a574a6c93f0b03964b5337eed75ada1a - languageName: node - linkType: hard - -"fb-watchman@npm:^2.0.0": - version: 2.0.2 - resolution: "fb-watchman@npm:2.0.2" - dependencies: - bser: 2.1.1 - checksum: b15a124cef28916fe07b400eb87cbc73ca082c142abf7ca8e8de6af43eca79ca7bd13eb4d4d48240b3bd3136eaac40d16e42d6edf87a8e5d1dd8070626860c78 - languageName: node - linkType: hard - -"file-entry-cache@npm:^6.0.1": - version: 6.0.1 - resolution: "file-entry-cache@npm:6.0.1" - dependencies: - flat-cache: ^3.0.4 - checksum: f49701feaa6314c8127c3c2f6173cfefff17612f5ed2daaafc6da13b5c91fd43e3b2a58fd0d63f9f94478a501b167615931e7200e31485e320f74a33885a9c74 - languageName: node - linkType: hard - -"fill-range@npm:^7.0.1": - version: 7.0.1 - resolution: "fill-range@npm:7.0.1" - dependencies: - to-regex-range: ^5.0.1 - checksum: cc283f4e65b504259e64fd969bcf4def4eb08d85565e906b7d36516e87819db52029a76b6363d0f02d0d532f0033c9603b9e2d943d56ee3b0d4f7ad3328ff917 - languageName: node - linkType: hard - -"find-up@npm:^4.0.0, find-up@npm:^4.1.0": - version: 4.1.0 - resolution: "find-up@npm:4.1.0" - dependencies: - locate-path: ^5.0.0 - path-exists: ^4.0.0 - checksum: 4c172680e8f8c1f78839486e14a43ef82e9decd0e74145f40707cc42e7420506d5ec92d9a11c22bd2c48fb0c384ea05dd30e10dd152fefeec6f2f75282a8b844 - languageName: node - linkType: hard - -"find-up@npm:^5.0.0": - version: 5.0.0 - resolution: "find-up@npm:5.0.0" - dependencies: - locate-path: ^6.0.0 - path-exists: ^4.0.0 - checksum: 07955e357348f34660bde7920783204ff5a26ac2cafcaa28bace494027158a97b9f56faaf2d89a6106211a8174db650dd9f503f9c0d526b1202d5554a00b9095 - languageName: node - linkType: hard - -"flat-cache@npm:^3.0.4": - version: 3.0.4 - resolution: "flat-cache@npm:3.0.4" - dependencies: - flatted: ^3.1.0 - rimraf: ^3.0.2 - checksum: 4fdd10ecbcbf7d520f9040dd1340eb5dfe951e6f0ecf2252edeec03ee68d989ec8b9a20f4434270e71bcfd57800dc09b3344fca3966b2eb8f613072c7d9a2365 - languageName: node - linkType: hard - -"flatted@npm:^3.1.0": - version: 3.2.7 - resolution: "flatted@npm:3.2.7" - checksum: 427633049d55bdb80201c68f7eb1cbd533e03eac541f97d3aecab8c5526f12a20ccecaeede08b57503e772c769e7f8680b37e8d482d1e5f8d7e2194687f9ea35 - languageName: node - linkType: hard - -"from@npm:~0": - version: 0.1.7 - resolution: "from@npm:0.1.7" - checksum: b85125b7890489656eb2e4f208f7654a93ec26e3aefaf3bbbcc0d496fc1941e4405834fcc9fe7333192aa2187905510ace70417bbf9ac6f6f4784a731d986939 - languageName: node - linkType: hard - -"fs-minipass@npm:^2.0.0, fs-minipass@npm:^2.1.0": - version: 2.1.0 - resolution: "fs-minipass@npm:2.1.0" - dependencies: - minipass: ^3.0.0 - checksum: 1b8d128dae2ac6cc94230cc5ead341ba3e0efaef82dab46a33d171c044caaa6ca001364178d42069b2809c35a1c3c35079a32107c770e9ffab3901b59af8c8b1 - languageName: node - linkType: hard - -"fs.realpath@npm:^1.0.0": - version: 1.0.0 - resolution: "fs.realpath@npm:1.0.0" - checksum: 99ddea01a7e75aa276c250a04eedeffe5662bce66c65c07164ad6264f9de18fb21be9433ead460e54cff20e31721c811f4fb5d70591799df5f85dce6d6746fd0 - languageName: node - linkType: hard - -"fsevents@npm:^2.3.2, fsevents@npm:~2.3.2": - version: 2.3.2 - resolution: "fsevents@npm:2.3.2" - dependencies: - node-gyp: latest - checksum: 97ade64e75091afee5265e6956cb72ba34db7819b4c3e94c431d4be2b19b8bb7a2d4116da417950c3425f17c8fe693d25e20212cac583ac1521ad066b77ae31f - conditions: os=darwin - languageName: node - linkType: hard - -"fsevents@patch:fsevents@^2.3.2#~builtin, fsevents@patch:fsevents@~2.3.2#~builtin": - version: 2.3.2 - resolution: "fsevents@patch:fsevents@npm%3A2.3.2#~builtin::version=2.3.2&hash=df0bf1" - dependencies: - node-gyp: latest - conditions: os=darwin - languageName: node - linkType: hard - -"function-bind@npm:^1.1.1": - version: 1.1.1 - resolution: "function-bind@npm:1.1.1" - checksum: b32fbaebb3f8ec4969f033073b43f5c8befbb58f1a79e12f1d7490358150359ebd92f49e72ff0144f65f2c48ea2a605bff2d07965f548f6474fd8efd95bf361a - languageName: node - linkType: hard - -"functional-red-black-tree@npm:^1.0.1": - version: 1.0.1 - resolution: "functional-red-black-tree@npm:1.0.1" - checksum: ca6c170f37640e2d94297da8bb4bf27a1d12bea3e00e6a3e007fd7aa32e37e000f5772acf941b4e4f3cf1c95c3752033d0c509af157ad8f526e7f00723b9eb9f - languageName: node - linkType: hard - -"gauge@npm:^4.0.3": - version: 4.0.4 - resolution: "gauge@npm:4.0.4" - dependencies: - aproba: ^1.0.3 || ^2.0.0 - color-support: ^1.1.3 - console-control-strings: ^1.1.0 - has-unicode: ^2.0.1 - signal-exit: ^3.0.7 - string-width: ^4.2.3 - strip-ansi: ^6.0.1 - wide-align: ^1.1.5 - checksum: 788b6bfe52f1dd8e263cda800c26ac0ca2ff6de0b6eee2fe0d9e3abf15e149b651bd27bf5226be10e6e3edb5c4e5d5985a5a1a98137e7a892f75eff76467ad2d - languageName: node - linkType: hard - -"gensync@npm:^1.0.0-beta.2": - version: 1.0.0-beta.2 - resolution: "gensync@npm:1.0.0-beta.2" - checksum: a7437e58c6be12aa6c90f7730eac7fa9833dc78872b4ad2963d2031b00a3367a93f98aec75f9aaac7220848e4026d67a8655e870b24f20a543d103c0d65952ec - languageName: node - linkType: hard - -"get-caller-file@npm:^2.0.5": - version: 2.0.5 - resolution: "get-caller-file@npm:2.0.5" - checksum: b9769a836d2a98c3ee734a88ba712e62703f1df31b94b784762c433c27a386dd6029ff55c2a920c392e33657d80191edbf18c61487e198844844516f843496b9 - languageName: node - linkType: hard - -"get-package-type@npm:^0.1.0": - version: 0.1.0 - resolution: "get-package-type@npm:0.1.0" - checksum: bba0811116d11e56d702682ddef7c73ba3481f114590e705fc549f4d868972263896af313c57a25c076e3c0d567e11d919a64ba1b30c879be985fc9d44f96148 - languageName: node - linkType: hard - -"get-stream@npm:^6.0.0": - version: 6.0.1 - resolution: "get-stream@npm:6.0.1" - checksum: e04ecece32c92eebf5b8c940f51468cd53554dcbb0ea725b2748be583c9523d00128137966afce410b9b051eb2ef16d657cd2b120ca8edafcf5a65e81af63cad - languageName: node - linkType: hard - -"glob-parent@npm:^5.1.2": - version: 5.1.2 - resolution: "glob-parent@npm:5.1.2" - dependencies: - is-glob: ^4.0.1 - checksum: f4f2bfe2425296e8a47e36864e4f42be38a996db40420fe434565e4480e3322f18eb37589617a98640c5dc8fdec1a387007ee18dbb1f3f5553409c34d17f425e - languageName: node - linkType: hard - -"glob-parent@npm:^6.0.2": - version: 6.0.2 - resolution: "glob-parent@npm:6.0.2" - dependencies: - is-glob: ^4.0.3 - checksum: c13ee97978bef4f55106b71e66428eb1512e71a7466ba49025fc2aec59a5bfb0954d5abd58fc5ee6c9b076eef4e1f6d3375c2e964b88466ca390da4419a786a8 - languageName: node - linkType: hard - -"glob@npm:^7.1.3, glob@npm:^7.1.4": - version: 7.2.3 - resolution: "glob@npm:7.2.3" - dependencies: - fs.realpath: ^1.0.0 - inflight: ^1.0.4 - inherits: 2 - minimatch: ^3.1.1 - once: ^1.3.0 - path-is-absolute: ^1.0.0 - checksum: 29452e97b38fa704dabb1d1045350fb2467cf0277e155aa9ff7077e90ad81d1ea9d53d3ee63bd37c05b09a065e90f16aec4a65f5b8de401d1dac40bc5605d133 - languageName: node - linkType: hard - -"glob@npm:^8.0.1": - version: 8.1.0 - resolution: "glob@npm:8.1.0" - dependencies: - fs.realpath: ^1.0.0 - inflight: ^1.0.4 - inherits: 2 - minimatch: ^5.0.1 - once: ^1.3.0 - checksum: 92fbea3221a7d12075f26f0227abac435de868dd0736a17170663783296d0dd8d3d532a5672b4488a439bf5d7fb85cdd07c11185d6cd39184f0385cbdfb86a47 - languageName: node - linkType: hard - -"globals@npm:^11.1.0": - version: 11.12.0 - resolution: "globals@npm:11.12.0" - checksum: 67051a45eca3db904aee189dfc7cd53c20c7d881679c93f6146ddd4c9f4ab2268e68a919df740d39c71f4445d2b38ee360fc234428baea1dbdfe68bbcb46979e - languageName: node - linkType: hard - -"globals@npm:^13.19.0": - version: 13.20.0 - resolution: "globals@npm:13.20.0" - dependencies: - type-fest: ^0.20.2 - checksum: ad1ecf914bd051325faad281d02ea2c0b1df5d01bd94d368dcc5513340eac41d14b3c61af325768e3c7f8d44576e72780ec0b6f2d366121f8eec6e03c3a3b97a - languageName: node - linkType: hard - -"globby@npm:^11.1.0": - version: 11.1.0 - resolution: "globby@npm:11.1.0" - dependencies: - array-union: ^2.1.0 - dir-glob: ^3.0.1 - fast-glob: ^3.2.9 - ignore: ^5.2.0 - merge2: ^1.4.1 - slash: ^3.0.0 - checksum: b4be8885e0cfa018fc783792942d53926c35c50b3aefd3fdcfb9d22c627639dc26bd2327a40a0b74b074100ce95bb7187bfeae2f236856aa3de183af7a02aea6 - languageName: node - linkType: hard - -"graceful-fs@npm:^4.2.6, graceful-fs@npm:^4.2.9": - version: 4.2.10 - resolution: "graceful-fs@npm:4.2.10" - checksum: 3f109d70ae123951905d85032ebeae3c2a5a7a997430df00ea30df0e3a6c60cf6689b109654d6fdacd28810a053348c4d14642da1d075049e6be1ba5216218da - languageName: node - linkType: hard - -"grapheme-splitter@npm:^1.0.4": - version: 1.0.4 - resolution: "grapheme-splitter@npm:1.0.4" - checksum: 0c22ec54dee1b05cd480f78cf14f732cb5b108edc073572c4ec205df4cd63f30f8db8025afc5debc8835a8ddeacf648a1c7992fe3dcd6ad38f9a476d84906620 - languageName: node - linkType: hard - -"has-flag@npm:^3.0.0": - version: 3.0.0 - resolution: "has-flag@npm:3.0.0" - checksum: 4a15638b454bf086c8148979aae044dd6e39d63904cd452d970374fa6a87623423da485dfb814e7be882e05c096a7ccf1ebd48e7e7501d0208d8384ff4dea73b - languageName: node - linkType: hard - -"has-flag@npm:^4.0.0": - version: 4.0.0 - resolution: "has-flag@npm:4.0.0" - checksum: 261a1357037ead75e338156b1f9452c016a37dcd3283a972a30d9e4a87441ba372c8b81f818cd0fbcd9c0354b4ae7e18b9e1afa1971164aef6d18c2b6095a8ad - languageName: node - linkType: hard - -"has-unicode@npm:^2.0.1": - version: 2.0.1 - resolution: "has-unicode@npm:2.0.1" - checksum: 1eab07a7436512db0be40a710b29b5dc21fa04880b7f63c9980b706683127e3c1b57cb80ea96d47991bdae2dfe479604f6a1ba410106ee1046a41d1bd0814400 - languageName: node - linkType: hard - -"has@npm:^1.0.3": - version: 1.0.3 - resolution: "has@npm:1.0.3" - dependencies: - function-bind: ^1.1.1 - checksum: b9ad53d53be4af90ce5d1c38331e712522417d017d5ef1ebd0507e07c2fbad8686fffb8e12ddecd4c39ca9b9b47431afbb975b8abf7f3c3b82c98e9aad052792 - languageName: node - linkType: hard - -"hash-base@npm:^3.0.0": - version: 3.1.0 - resolution: "hash-base@npm:3.1.0" - dependencies: - inherits: ^2.0.4 - readable-stream: ^3.6.0 - safe-buffer: ^5.2.0 - checksum: 26b7e97ac3de13cb23fc3145e7e3450b0530274a9562144fc2bf5c1e2983afd0e09ed7cc3b20974ba66039fad316db463da80eb452e7373e780cbee9a0d2f2dc - languageName: node - linkType: hard - -"hash.js@npm:^1.0.0, hash.js@npm:^1.0.3": - version: 1.1.7 - resolution: "hash.js@npm:1.1.7" - dependencies: - inherits: ^2.0.3 - minimalistic-assert: ^1.0.1 - checksum: e350096e659c62422b85fa508e4b3669017311aa4c49b74f19f8e1bc7f3a54a584fdfd45326d4964d6011f2b2d882e38bea775a96046f2a61b7779a979629d8f - languageName: node - linkType: hard - -"hdkey@npm:^2.1.0": - version: 2.1.0 - resolution: "hdkey@npm:2.1.0" - dependencies: - bs58check: ^2.1.2 - ripemd160: ^2.0.2 - safe-buffer: ^5.1.1 - secp256k1: ^4.0.0 - checksum: 042f2d715dc4d106c868dc3791d584336845e4e53f3452e1df116d6af5d88d7084a0a73ddd8a07b4a7d9e6b29cd3b6b4174f03499f25d8ddd101642b34fabe5c - languageName: node - linkType: hard - -"hmac-drbg@npm:^1.0.1": - version: 1.0.1 - resolution: "hmac-drbg@npm:1.0.1" - dependencies: - hash.js: ^1.0.3 - minimalistic-assert: ^1.0.0 - minimalistic-crypto-utils: ^1.0.1 - checksum: bd30b6a68d7f22d63f10e1888aee497d7c2c5c0bb469e66bbdac99f143904d1dfe95f8131f95b3e86c86dd239963c9d972fcbe147e7cffa00e55d18585c43fe0 - languageName: node - linkType: hard - -"html-escaper@npm:^2.0.0": - version: 2.0.2 - resolution: "html-escaper@npm:2.0.2" - checksum: d2df2da3ad40ca9ee3a39c5cc6475ef67c8f83c234475f24d8e9ce0dc80a2c82df8e1d6fa78ddd1e9022a586ea1bd247a615e80a5cd9273d90111ddda7d9e974 - languageName: node - linkType: hard - -"http-cache-semantics@npm:^4.1.0": - version: 4.1.1 - resolution: "http-cache-semantics@npm:4.1.1" - checksum: 83ac0bc60b17a3a36f9953e7be55e5c8f41acc61b22583060e8dedc9dd5e3607c823a88d0926f9150e571f90946835c7fe150732801010845c72cd8bbff1a236 - languageName: node - linkType: hard - -"http-proxy-agent@npm:^5.0.0": - version: 5.0.0 - resolution: "http-proxy-agent@npm:5.0.0" - dependencies: - "@tootallnate/once": 2 - agent-base: 6 - debug: 4 - checksum: e2ee1ff1656a131953839b2a19cd1f3a52d97c25ba87bd2559af6ae87114abf60971e498021f9b73f9fd78aea8876d1fb0d4656aac8a03c6caa9fc175f22b786 - languageName: node - linkType: hard - -"https-proxy-agent@npm:^5.0.0": - version: 5.0.1 - resolution: "https-proxy-agent@npm:5.0.1" - dependencies: - agent-base: 6 - debug: 4 - checksum: 571fccdf38184f05943e12d37d6ce38197becdd69e58d03f43637f7fa1269cf303a7d228aa27e5b27bbd3af8f09fd938e1c91dcfefff2df7ba77c20ed8dfc765 - languageName: node - linkType: hard - -"human-signals@npm:^2.1.0": - version: 2.1.0 - resolution: "human-signals@npm:2.1.0" - checksum: b87fd89fce72391625271454e70f67fe405277415b48bcc0117ca73d31fa23a4241787afdc8d67f5a116cf37258c052f59ea82daffa72364d61351423848e3b8 - languageName: node - linkType: hard - -"humanize-ms@npm:^1.2.1": - version: 1.2.1 - resolution: "humanize-ms@npm:1.2.1" - dependencies: - ms: ^2.0.0 - checksum: 9c7a74a2827f9294c009266c82031030eae811ca87b0da3dceb8d6071b9bde22c9f3daef0469c3c533cc67a97d8a167cd9fc0389350e5f415f61a79b171ded16 - languageName: node - linkType: hard - -"iconv-lite@npm:^0.6.2": - version: 0.6.3 - resolution: "iconv-lite@npm:0.6.3" - dependencies: - safer-buffer: ">= 2.1.2 < 3.0.0" - checksum: 3f60d47a5c8fc3313317edfd29a00a692cc87a19cac0159e2ce711d0ebc9019064108323b5e493625e25594f11c6236647d8e256fbe7a58f4a3b33b89e6d30bf - languageName: node - linkType: hard - -"idna-uts46-hx@npm:^4.1.2": - version: 4.1.2 - resolution: "idna-uts46-hx@npm:4.1.2" - dependencies: - punycode: ^2.1.1 - checksum: 97772ba4e517ccf19e4552d09f1b9cccca2e6b8a3f8dd66fc5caccd1dbc41e3ff1915d899b7e9ffd518f4f2958e638d5bc6d3728f859510d64e417a7664f928a - languageName: node - linkType: hard - -"ieee754@npm:^1.2.1": - version: 1.2.1 - resolution: "ieee754@npm:1.2.1" - checksum: 5144c0c9815e54ada181d80a0b810221a253562422e7c6c3a60b1901154184f49326ec239d618c416c1c5945a2e197107aee8d986a3dd836b53dffefd99b5e7e - languageName: node - linkType: hard - -"ignore@npm:^5.2.0": - version: 5.2.4 - resolution: "ignore@npm:5.2.4" - checksum: 3d4c309c6006e2621659311783eaea7ebcd41fe4ca1d78c91c473157ad6666a57a2df790fe0d07a12300d9aac2888204d7be8d59f9aaf665b1c7fcdb432517ef - languageName: node - linkType: hard - -"import-fresh@npm:^3.0.0, import-fresh@npm:^3.2.1": - version: 3.3.0 - resolution: "import-fresh@npm:3.3.0" - dependencies: - parent-module: ^1.0.0 - resolve-from: ^4.0.0 - checksum: 2cacfad06e652b1edc50be650f7ec3be08c5e5a6f6d12d035c440a42a8cc028e60a5b99ca08a77ab4d6b1346da7d971915828f33cdab730d3d42f08242d09baa - languageName: node - linkType: hard - -"import-local@npm:^3.0.2": - version: 3.1.0 - resolution: "import-local@npm:3.1.0" - dependencies: - pkg-dir: ^4.2.0 - resolve-cwd: ^3.0.0 - bin: - import-local-fixture: fixtures/cli.js - checksum: bfcdb63b5e3c0e245e347f3107564035b128a414c4da1172a20dc67db2504e05ede4ac2eee1252359f78b0bfd7b19ef180aec427c2fce6493ae782d73a04cddd - languageName: node - linkType: hard - -"imurmurhash@npm:^0.1.4": - version: 0.1.4 - resolution: "imurmurhash@npm:0.1.4" - checksum: 7cae75c8cd9a50f57dadd77482359f659eaebac0319dd9368bcd1714f55e65badd6929ca58569da2b6494ef13fdd5598cd700b1eba23f8b79c5f19d195a3ecf7 - languageName: node - linkType: hard - -"indent-string@npm:^4.0.0": - version: 4.0.0 - resolution: "indent-string@npm:4.0.0" - checksum: 824cfb9929d031dabf059bebfe08cf3137365e112019086ed3dcff6a0a7b698cb80cf67ccccde0e25b9e2d7527aa6cc1fed1ac490c752162496caba3e6699612 - languageName: node - linkType: hard - -"infer-owner@npm:^1.0.4": - version: 1.0.4 - resolution: "infer-owner@npm:1.0.4" - checksum: 181e732764e4a0611576466b4b87dac338972b839920b2a8cde43642e4ed6bd54dc1fb0b40874728f2a2df9a1b097b8ff83b56d5f8f8e3927f837fdcb47d8a89 - languageName: node - linkType: hard - -"inflight@npm:^1.0.4": - version: 1.0.6 - resolution: "inflight@npm:1.0.6" - dependencies: - once: ^1.3.0 - wrappy: 1 - checksum: f4f76aa072ce19fae87ce1ef7d221e709afb59d445e05d47fba710e85470923a75de35bfae47da6de1b18afc3ce83d70facf44cfb0aff89f0a3f45c0a0244dfd - languageName: node - linkType: hard - -"inherits@npm:2, inherits@npm:^2.0.1, inherits@npm:^2.0.3, inherits@npm:^2.0.4": - version: 2.0.4 - resolution: "inherits@npm:2.0.4" - checksum: 4a48a733847879d6cf6691860a6b1e3f0f4754176e4d71494c41f3475553768b10f84b5ce1d40fbd0e34e6bfbb864ee35858ad4dd2cf31e02fc4a154b724d7f1 - languageName: node - linkType: hard - -"ip@npm:^2.0.0": - version: 2.0.0 - resolution: "ip@npm:2.0.0" - checksum: cfcfac6b873b701996d71ec82a7dd27ba92450afdb421e356f44044ed688df04567344c36cbacea7d01b1c39a4c732dc012570ebe9bebfb06f27314bca625349 - languageName: node - linkType: hard - -"is-arrayish@npm:^0.2.1": - version: 0.2.1 - resolution: "is-arrayish@npm:0.2.1" - checksum: eef4417e3c10e60e2c810b6084942b3ead455af16c4509959a27e490e7aee87cfb3f38e01bbde92220b528a0ee1a18d52b787e1458ee86174d8c7f0e58cd488f - languageName: node - linkType: hard - -"is-buffer@npm:^2.0.5": - version: 2.0.5 - resolution: "is-buffer@npm:2.0.5" - checksum: 764c9ad8b523a9f5a32af29bdf772b08eb48c04d2ad0a7240916ac2688c983bf5f8504bf25b35e66240edeb9d9085461f9b5dae1f3d2861c6b06a65fe983de42 - languageName: node - linkType: hard - -"is-core-module@npm:^2.1.0, is-core-module@npm:^2.9.0": - version: 2.11.0 - resolution: "is-core-module@npm:2.11.0" - dependencies: - has: ^1.0.3 - checksum: f96fd490c6b48eb4f6d10ba815c6ef13f410b0ba6f7eb8577af51697de523e5f2cd9de1c441b51d27251bf0e4aebc936545e33a5d26d5d51f28d25698d4a8bab - languageName: node - linkType: hard - -"is-extglob@npm:^2.1.1": - version: 2.1.1 - resolution: "is-extglob@npm:2.1.1" - checksum: df033653d06d0eb567461e58a7a8c9f940bd8c22274b94bf7671ab36df5719791aae15eef6d83bbb5e23283967f2f984b8914559d4449efda578c775c4be6f85 - languageName: node - linkType: hard - -"is-fullwidth-code-point@npm:^3.0.0": - version: 3.0.0 - resolution: "is-fullwidth-code-point@npm:3.0.0" - checksum: 44a30c29457c7fb8f00297bce733f0a64cd22eca270f83e58c105e0d015e45c019491a4ab2faef91ab51d4738c670daff901c799f6a700e27f7314029e99e348 - languageName: node - linkType: hard - -"is-generator-fn@npm:^2.0.0": - version: 2.1.0 - resolution: "is-generator-fn@npm:2.1.0" - checksum: a6ad5492cf9d1746f73b6744e0c43c0020510b59d56ddcb78a91cbc173f09b5e6beff53d75c9c5a29feb618bfef2bf458e025ecf3a57ad2268e2fb2569f56215 - languageName: node - linkType: hard - -"is-glob@npm:^4.0.0, is-glob@npm:^4.0.1, is-glob@npm:^4.0.3": - version: 4.0.3 - resolution: "is-glob@npm:4.0.3" - dependencies: - is-extglob: ^2.1.1 - checksum: d381c1319fcb69d341cc6e6c7cd588e17cd94722d9a32dbd60660b993c4fb7d0f19438674e68dfec686d09b7c73139c9166b47597f846af387450224a8101ab4 - languageName: node - linkType: hard - -"is-lambda@npm:^1.0.1": - version: 1.0.1 - resolution: "is-lambda@npm:1.0.1" - checksum: 93a32f01940220532e5948538699ad610d5924ac86093fcee83022252b363eb0cc99ba53ab084a04e4fb62bf7b5731f55496257a4c38adf87af9c4d352c71c35 - languageName: node - linkType: hard - -"is-number@npm:^7.0.0": - version: 7.0.0 - resolution: "is-number@npm:7.0.0" - checksum: 456ac6f8e0f3111ed34668a624e45315201dff921e5ac181f8ec24923b99e9f32ca1a194912dc79d539c97d33dba17dc635202ff0b2cf98326f608323276d27a - languageName: node - linkType: hard - -"is-path-inside@npm:^3.0.3": - version: 3.0.3 - resolution: "is-path-inside@npm:3.0.3" - checksum: abd50f06186a052b349c15e55b182326f1936c89a78bf6c8f2b707412517c097ce04bc49a0ca221787bc44e1049f51f09a2ffb63d22899051988d3a618ba13e9 - languageName: node - linkType: hard - -"is-stream@npm:^2.0.0": - version: 2.0.1 - resolution: "is-stream@npm:2.0.1" - checksum: b8e05ccdf96ac330ea83c12450304d4a591f9958c11fd17bed240af8d5ffe08aedafa4c0f4cfccd4d28dc9d4d129daca1023633d5c11601a6cbc77521f6fae66 - languageName: node - linkType: hard - -"isexe@npm:^2.0.0": - version: 2.0.0 - resolution: "isexe@npm:2.0.0" - checksum: 26bf6c5480dda5161c820c5b5c751ae1e766c587b1f951ea3fcfc973bafb7831ae5b54a31a69bd670220e42e99ec154475025a468eae58ea262f813fdc8d1c62 - languageName: node - linkType: hard - -"isomorphic-ws@npm:^5.0.0": - version: 5.0.0 - resolution: "isomorphic-ws@npm:5.0.0" - peerDependencies: - ws: "*" - checksum: e20eb2aee09ba96247465fda40c6d22c1153394c0144fa34fe6609f341af4c8c564f60ea3ba762335a7a9c306809349f9b863c8beedf2beea09b299834ad5398 - languageName: node - linkType: hard - -"istanbul-lib-coverage@npm:^3.0.0, istanbul-lib-coverage@npm:^3.2.0": - version: 3.2.0 - resolution: "istanbul-lib-coverage@npm:3.2.0" - checksum: a2a545033b9d56da04a8571ed05c8120bf10e9bce01cf8633a3a2b0d1d83dff4ac4fe78d6d5673c27fc29b7f21a41d75f83a36be09f82a61c367b56aa73c1ff9 - languageName: node - linkType: hard - -"istanbul-lib-instrument@npm:^5.0.4, istanbul-lib-instrument@npm:^5.1.0": - version: 5.2.1 - resolution: "istanbul-lib-instrument@npm:5.2.1" - dependencies: - "@babel/core": ^7.12.3 - "@babel/parser": ^7.14.7 - "@istanbuljs/schema": ^0.1.2 - istanbul-lib-coverage: ^3.2.0 - semver: ^6.3.0 - checksum: bf16f1803ba5e51b28bbd49ed955a736488381e09375d830e42ddeb403855b2006f850711d95ad726f2ba3f1ae8e7366de7e51d2b9ac67dc4d80191ef7ddf272 - languageName: node - linkType: hard - -"istanbul-lib-report@npm:^3.0.0": - version: 3.0.0 - resolution: "istanbul-lib-report@npm:3.0.0" - dependencies: - istanbul-lib-coverage: ^3.0.0 - make-dir: ^3.0.0 - supports-color: ^7.1.0 - checksum: 3f29eb3f53c59b987386e07fe772d24c7f58c6897f34c9d7a296f4000de7ae3de9eb95c3de3df91dc65b134c84dee35c54eee572a56243e8907c48064e34ff1b - languageName: node - linkType: hard - -"istanbul-lib-source-maps@npm:^4.0.0": - version: 4.0.1 - resolution: "istanbul-lib-source-maps@npm:4.0.1" - dependencies: - debug: ^4.1.1 - istanbul-lib-coverage: ^3.0.0 - source-map: ^0.6.1 - checksum: 21ad3df45db4b81852b662b8d4161f6446cd250c1ddc70ef96a585e2e85c26ed7cd9c2a396a71533cfb981d1a645508bc9618cae431e55d01a0628e7dec62ef2 - languageName: node - linkType: hard - -"istanbul-reports@npm:^3.1.3": - version: 3.1.5 - resolution: "istanbul-reports@npm:3.1.5" - dependencies: - html-escaper: ^2.0.0 - istanbul-lib-report: ^3.0.0 - checksum: 7867228f83ed39477b188ea07e7ccb9b4f5320b6f73d1db93a0981b7414fa4ef72d3f80c4692c442f90fc250d9406e71d8d7ab65bb615cb334e6292b73192b89 - languageName: node - linkType: hard - -"jest-changed-files@npm:^28.1.3": - version: 28.1.3 - resolution: "jest-changed-files@npm:28.1.3" - dependencies: - execa: ^5.0.0 - p-limit: ^3.1.0 - checksum: c78af14a68b9b19101623ae7fde15a2488f9b3dbe8cca12a05c4a223bc9bfd3bf41ee06830f20fb560c52434435d6153c9cc6cf450b1f7b03e5e7f96a953a6a6 - languageName: node - linkType: hard - -"jest-changed-files@npm:^29.5.0": - version: 29.5.0 - resolution: "jest-changed-files@npm:29.5.0" - dependencies: - execa: ^5.0.0 - p-limit: ^3.1.0 - checksum: a67a7cb3c11f8f92bd1b7c79e84f724cbd11a9ad51f3cdadafe3ce7ee3c79ee50dbea128f920f5fddc807e9e4e83f5462143094391feedd959a77dd20ab96cf3 - languageName: node - linkType: hard - -"jest-circus@npm:^28.1.3": - version: 28.1.3 - resolution: "jest-circus@npm:28.1.3" - dependencies: - "@jest/environment": ^28.1.3 - "@jest/expect": ^28.1.3 - "@jest/test-result": ^28.1.3 - "@jest/types": ^28.1.3 - "@types/node": "*" - chalk: ^4.0.0 - co: ^4.6.0 - dedent: ^0.7.0 - is-generator-fn: ^2.0.0 - jest-each: ^28.1.3 - jest-matcher-utils: ^28.1.3 - jest-message-util: ^28.1.3 - jest-runtime: ^28.1.3 - jest-snapshot: ^28.1.3 - jest-util: ^28.1.3 - p-limit: ^3.1.0 - pretty-format: ^28.1.3 - slash: ^3.0.0 - stack-utils: ^2.0.3 - checksum: b635e60a9c92adaefc3f24def8eba691e7c2fdcf6c9fa640cddf2eb8c8b26ee62eab73ebb88798fd7c52a74c1495a984e39b748429b610426f02e9d3d56e09b2 - languageName: node - linkType: hard - -"jest-circus@npm:^29.5.0": - version: 29.5.0 - resolution: "jest-circus@npm:29.5.0" - dependencies: - "@jest/environment": ^29.5.0 - "@jest/expect": ^29.5.0 - "@jest/test-result": ^29.5.0 - "@jest/types": ^29.5.0 - "@types/node": "*" - chalk: ^4.0.0 - co: ^4.6.0 - dedent: ^0.7.0 - is-generator-fn: ^2.0.0 - jest-each: ^29.5.0 - jest-matcher-utils: ^29.5.0 - jest-message-util: ^29.5.0 - jest-runtime: ^29.5.0 - jest-snapshot: ^29.5.0 - jest-util: ^29.5.0 - p-limit: ^3.1.0 - pretty-format: ^29.5.0 - pure-rand: ^6.0.0 - slash: ^3.0.0 - stack-utils: ^2.0.3 - checksum: 44ff5d06acedae6de6c866e20e3b61f83e29ab94cf9f960826e7e667de49c12dd9ab9dffd7fa3b7d1f9688a8b5bfb1ebebadbea69d9ed0d3f66af4a0ff8c2b27 - languageName: node - linkType: hard - -"jest-cli@npm:^28.1.3": - version: 28.1.3 - resolution: "jest-cli@npm:28.1.3" - dependencies: - "@jest/core": ^28.1.3 - "@jest/test-result": ^28.1.3 - "@jest/types": ^28.1.3 - chalk: ^4.0.0 - exit: ^0.1.2 - graceful-fs: ^4.2.9 - import-local: ^3.0.2 - jest-config: ^28.1.3 - jest-util: ^28.1.3 - jest-validate: ^28.1.3 - prompts: ^2.0.1 - yargs: ^17.3.1 - peerDependencies: - node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 - peerDependenciesMeta: - node-notifier: - optional: true - bin: - jest: bin/jest.js - checksum: fb424576bf38346318daddee3fcc597cd78cb8dda1759d09c529d8ba1a748f2765c17b00671072a838826e59465a810ff8a232bc6ba2395c131bf3504425a363 - languageName: node - linkType: hard - -"jest-cli@npm:^29.5.0": - version: 29.5.0 - resolution: "jest-cli@npm:29.5.0" - dependencies: - "@jest/core": ^29.5.0 - "@jest/test-result": ^29.5.0 - "@jest/types": ^29.5.0 - chalk: ^4.0.0 - exit: ^0.1.2 - graceful-fs: ^4.2.9 - import-local: ^3.0.2 - jest-config: ^29.5.0 - jest-util: ^29.5.0 - jest-validate: ^29.5.0 - prompts: ^2.0.1 - yargs: ^17.3.1 - peerDependencies: - node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 - peerDependenciesMeta: - node-notifier: - optional: true - bin: - jest: bin/jest.js - checksum: 39897bbbc0f0d8a6b975ab12fd13887eaa28d92e3dee9e0173a5cb913ae8cc2ae46e090d38c6d723e84d9d6724429cd08685b4e505fa447d31ca615630c7dbba - languageName: node - linkType: hard - -"jest-config@npm:^28.1.3": - version: 28.1.3 - resolution: "jest-config@npm:28.1.3" - dependencies: - "@babel/core": ^7.11.6 - "@jest/test-sequencer": ^28.1.3 - "@jest/types": ^28.1.3 - babel-jest: ^28.1.3 - chalk: ^4.0.0 - ci-info: ^3.2.0 - deepmerge: ^4.2.2 - glob: ^7.1.3 - graceful-fs: ^4.2.9 - jest-circus: ^28.1.3 - jest-environment-node: ^28.1.3 - jest-get-type: ^28.0.2 - jest-regex-util: ^28.0.2 - jest-resolve: ^28.1.3 - jest-runner: ^28.1.3 - jest-util: ^28.1.3 - jest-validate: ^28.1.3 - micromatch: ^4.0.4 - parse-json: ^5.2.0 - pretty-format: ^28.1.3 - slash: ^3.0.0 - strip-json-comments: ^3.1.1 - peerDependencies: - "@types/node": "*" - ts-node: ">=9.0.0" - peerDependenciesMeta: - "@types/node": - optional: true - ts-node: - optional: true - checksum: ddabffd3a3a8cb6c2f58f06cdf3535157dbf8c70bcde3e5c3de7bee6a8d617840ffc8cffb0083e38c6814f2a08c225ca19f58898efaf4f351af94679f22ce6bc - languageName: node - linkType: hard - -"jest-config@npm:^29.5.0": - version: 29.5.0 - resolution: "jest-config@npm:29.5.0" - dependencies: - "@babel/core": ^7.11.6 - "@jest/test-sequencer": ^29.5.0 - "@jest/types": ^29.5.0 - babel-jest: ^29.5.0 - chalk: ^4.0.0 - ci-info: ^3.2.0 - deepmerge: ^4.2.2 - glob: ^7.1.3 - graceful-fs: ^4.2.9 - jest-circus: ^29.5.0 - jest-environment-node: ^29.5.0 - jest-get-type: ^29.4.3 - jest-regex-util: ^29.4.3 - jest-resolve: ^29.5.0 - jest-runner: ^29.5.0 - jest-util: ^29.5.0 - jest-validate: ^29.5.0 - micromatch: ^4.0.4 - parse-json: ^5.2.0 - pretty-format: ^29.5.0 - slash: ^3.0.0 - strip-json-comments: ^3.1.1 - peerDependencies: - "@types/node": "*" - ts-node: ">=9.0.0" - peerDependenciesMeta: - "@types/node": - optional: true - ts-node: - optional: true - checksum: c37c4dab964c54ab293d4e302d40b09687037ac9d00b88348ec42366970747feeaf265e12e3750cd3660b40c518d4031335eda11ac10b70b10e60797ebbd4b9c - languageName: node - linkType: hard - -"jest-diff@npm:^28.1.3": - version: 28.1.3 - resolution: "jest-diff@npm:28.1.3" - dependencies: - chalk: ^4.0.0 - diff-sequences: ^28.1.1 - jest-get-type: ^28.0.2 - pretty-format: ^28.1.3 - checksum: fa8583e0ccbe775714ce850b009be1b0f6b17a4b6759f33ff47adef27942ebc610dbbcc8a5f7cfb7f12b3b3b05afc9fb41d5f766674616025032ff1e4f9866e0 - languageName: node - linkType: hard - -"jest-diff@npm:^29.5.0": - version: 29.5.0 - resolution: "jest-diff@npm:29.5.0" - dependencies: - chalk: ^4.0.0 - diff-sequences: ^29.4.3 - jest-get-type: ^29.4.3 - pretty-format: ^29.5.0 - checksum: dfd0f4a299b5d127779c76b40106c37854c89c3e0785098c717d52822d6620d227f6234c3a9291df204d619e799e3654159213bf93220f79c8e92a55475a3d39 - languageName: node - linkType: hard - -"jest-docblock@npm:^28.1.1": - version: 28.1.1 - resolution: "jest-docblock@npm:28.1.1" - dependencies: - detect-newline: ^3.0.0 - checksum: 22fca68d988ecb2933bc65f448facdca85fc71b4bd0a188ea09a5ae1b0cc3a049a2a6ec7e7eaa2542c1d5cb5e5145e420a3df4fa280f5070f486c44da1d36151 - languageName: node - linkType: hard - -"jest-docblock@npm:^29.4.3": - version: 29.4.3 - resolution: "jest-docblock@npm:29.4.3" - dependencies: - detect-newline: ^3.0.0 - checksum: e0e9df1485bb8926e5b33478cdf84b3387d9caf3658e7dc1eaa6dc34cb93dea0d2d74797f6e940f0233a88f3dadd60957f2288eb8f95506361f85b84bf8661df - languageName: node - linkType: hard - -"jest-each@npm:^28.1.3": - version: 28.1.3 - resolution: "jest-each@npm:28.1.3" - dependencies: - "@jest/types": ^28.1.3 - chalk: ^4.0.0 - jest-get-type: ^28.0.2 - jest-util: ^28.1.3 - pretty-format: ^28.1.3 - checksum: 5c5b8ccb1484e58b027bea682cfa020a45e5bf5379cc7c23bdec972576c1dc3c3bf03df2b78416cefc1a58859dd33b7cf5fff54c370bc3c0f14a3e509eb87282 - languageName: node - linkType: hard - -"jest-each@npm:^29.5.0": - version: 29.5.0 - resolution: "jest-each@npm:29.5.0" - dependencies: - "@jest/types": ^29.5.0 - chalk: ^4.0.0 - jest-get-type: ^29.4.3 - jest-util: ^29.5.0 - pretty-format: ^29.5.0 - checksum: b8b297534d25834c5d4e31e4c687359787b1e402519e42664eb704cc3a12a7a91a017565a75acb02e8cf9afd3f4eef3350bd785276bec0900184641b765ff7a5 - languageName: node - linkType: hard - -"jest-environment-node@npm:^28.1.3": - version: 28.1.3 - resolution: "jest-environment-node@npm:28.1.3" - dependencies: - "@jest/environment": ^28.1.3 - "@jest/fake-timers": ^28.1.3 - "@jest/types": ^28.1.3 - "@types/node": "*" - jest-mock: ^28.1.3 - jest-util: ^28.1.3 - checksum: 1048fe306a6a8b0880a4c66278ebb57479f29c12cff89aab3aa79ab77a8859cf17ab8aa9919fd21c329a7db90e35581b43664e694ad453d5b04e00f3c6420469 - languageName: node - linkType: hard - -"jest-environment-node@npm:^29.5.0": - version: 29.5.0 - resolution: "jest-environment-node@npm:29.5.0" - dependencies: - "@jest/environment": ^29.5.0 - "@jest/fake-timers": ^29.5.0 - "@jest/types": ^29.5.0 - "@types/node": "*" - jest-mock: ^29.5.0 - jest-util: ^29.5.0 - checksum: 57981911cc20a4219b0da9e22b2e3c9f31b505e43f78e61c899e3227ded455ce1a3a9483842c69cfa4532f02cfb536ae0995bf245f9211608edacfc1e478d411 - languageName: node - linkType: hard - -"jest-get-type@npm:^28.0.2": - version: 28.0.2 - resolution: "jest-get-type@npm:28.0.2" - checksum: 5281d7c89bc8156605f6d15784f45074f4548501195c26e9b188742768f72d40948252d13230ea905b5349038865a1a8eeff0e614cc530ff289dfc41fe843abd - languageName: node - linkType: hard - -"jest-get-type@npm:^29.4.3": - version: 29.4.3 - resolution: "jest-get-type@npm:29.4.3" - checksum: 6ac7f2dde1c65e292e4355b6c63b3a4897d7e92cb4c8afcf6d397f2682f8080e094c8b0b68205a74d269882ec06bf696a9de6cd3e1b7333531e5ed7b112605ce - languageName: node - linkType: hard - -"jest-haste-map@npm:^28.1.3": - version: 28.1.3 - resolution: "jest-haste-map@npm:28.1.3" - dependencies: - "@jest/types": ^28.1.3 - "@types/graceful-fs": ^4.1.3 - "@types/node": "*" - anymatch: ^3.0.3 - fb-watchman: ^2.0.0 - fsevents: ^2.3.2 - graceful-fs: ^4.2.9 - jest-regex-util: ^28.0.2 - jest-util: ^28.1.3 - jest-worker: ^28.1.3 - micromatch: ^4.0.4 - walker: ^1.0.8 - dependenciesMeta: - fsevents: - optional: true - checksum: d05fdc108645fc2b39fcd4001952cc7a8cb550e93494e98c1e9ab1fc542686f6ac67177c132e564cf94fe8f81503f3f8db8b825b9b713dc8c5748aec63ba4688 - languageName: node - linkType: hard - -"jest-haste-map@npm:^29.5.0": - version: 29.5.0 - resolution: "jest-haste-map@npm:29.5.0" - dependencies: - "@jest/types": ^29.5.0 - "@types/graceful-fs": ^4.1.3 - "@types/node": "*" - anymatch: ^3.0.3 - fb-watchman: ^2.0.0 - fsevents: ^2.3.2 - graceful-fs: ^4.2.9 - jest-regex-util: ^29.4.3 - jest-util: ^29.5.0 - jest-worker: ^29.5.0 - micromatch: ^4.0.4 - walker: ^1.0.8 - dependenciesMeta: - fsevents: - optional: true - checksum: 3828ff7783f168e34be2c63887f82a01634261f605dcae062d83f979a61c37739e21b9607ecb962256aea3fbe5a530a1acee062d0026fcb47c607c12796cf3b7 - languageName: node - linkType: hard - -"jest-leak-detector@npm:^28.1.3": - version: 28.1.3 - resolution: "jest-leak-detector@npm:28.1.3" - dependencies: - jest-get-type: ^28.0.2 - pretty-format: ^28.1.3 - checksum: 2e976a4880cf9af11f53a19f6a3820e0f90b635a900737a5427fc42e337d5628ba446dcd7c020ecea3806cf92bc0bbf6982ed62a9cd84e5a13d8751aa30fbbb7 - languageName: node - linkType: hard - -"jest-leak-detector@npm:^29.5.0": - version: 29.5.0 - resolution: "jest-leak-detector@npm:29.5.0" - dependencies: - jest-get-type: ^29.4.3 - pretty-format: ^29.5.0 - checksum: 0fb845da7ac9cdfc9b3b2e35f6f623a41c547d7dc0103ceb0349013459d00de5870b5689a625e7e37f9644934b40e8f1dcdd5422d14d57470600350364676313 - languageName: node - linkType: hard - -"jest-matcher-utils@npm:^28.1.3": - version: 28.1.3 - resolution: "jest-matcher-utils@npm:28.1.3" - dependencies: - chalk: ^4.0.0 - jest-diff: ^28.1.3 - jest-get-type: ^28.0.2 - pretty-format: ^28.1.3 - checksum: 6b34f0cf66f6781e92e3bec97bf27796bd2ba31121e5c5997218d9adba6deea38a30df5203937d6785b68023ed95cbad73663cc9aad6fb0cb59aeb5813a58daf - languageName: node - linkType: hard - -"jest-matcher-utils@npm:^29.5.0": - version: 29.5.0 - resolution: "jest-matcher-utils@npm:29.5.0" - dependencies: - chalk: ^4.0.0 - jest-diff: ^29.5.0 - jest-get-type: ^29.4.3 - pretty-format: ^29.5.0 - checksum: 1d3e8c746e484a58ce194e3aad152eff21fd0896e8b8bf3d4ab1a4e2cbfed95fb143646f4ad9fdf6e42212b9e8fc033268b58e011b044a9929df45485deb5ac9 - languageName: node - linkType: hard - -"jest-message-util@npm:^28.1.3": - version: 28.1.3 - resolution: "jest-message-util@npm:28.1.3" - dependencies: - "@babel/code-frame": ^7.12.13 - "@jest/types": ^28.1.3 - "@types/stack-utils": ^2.0.0 - chalk: ^4.0.0 - graceful-fs: ^4.2.9 - micromatch: ^4.0.4 - pretty-format: ^28.1.3 - slash: ^3.0.0 - stack-utils: ^2.0.3 - checksum: 1f266854166dcc6900d75a88b54a25225a2f3710d463063ff1c99021569045c35c7d58557b25447a17eb3a65ce763b2f9b25550248b468a9d4657db365f39e96 - languageName: node - linkType: hard - -"jest-message-util@npm:^29.5.0": - version: 29.5.0 - resolution: "jest-message-util@npm:29.5.0" - dependencies: - "@babel/code-frame": ^7.12.13 - "@jest/types": ^29.5.0 - "@types/stack-utils": ^2.0.0 - chalk: ^4.0.0 - graceful-fs: ^4.2.9 - micromatch: ^4.0.4 - pretty-format: ^29.5.0 - slash: ^3.0.0 - stack-utils: ^2.0.3 - checksum: daddece6bbf846eb6a2ab9be9f2446e54085bef4e5cecd13d2a538fa9c01cb89d38e564c6b74fd8e12d37ed9eface8a362240ae9f21d68b214590631e7a0d8bf - languageName: node - linkType: hard - -"jest-mock-extended@npm:^3.0.1": - version: 3.0.3 - resolution: "jest-mock-extended@npm:3.0.3" - dependencies: - ts-essentials: ^7.0.3 - peerDependencies: - jest: ^24.0.0 || ^25.0.0 || ^26.0.0 || ^27.0.0 || ^28.0.0 || ^29.0.0 - typescript: ^3.0.0 || ^4.0.0 - checksum: 826d619b0e9e5f4a7691259a5f8919fd40d6468d13d9c0d8c0724d8ebd106404e7416079692f4dce5b4d42e3579b5948ea789b951ab6858ab76c192113e1d759 - languageName: node - linkType: hard - -"jest-mock@npm:^28.1.3": - version: 28.1.3 - resolution: "jest-mock@npm:28.1.3" - dependencies: - "@jest/types": ^28.1.3 - "@types/node": "*" - checksum: a573bf8e5f12f4c29c661266c31b5c6b69a28d3195b83049983bce025b2b1a0152351567e89e63b102ef817034c2a3aa97eda4e776f3bae2aee54c5765573aa7 - languageName: node - linkType: hard - -"jest-mock@npm:^29.5.0": - version: 29.5.0 - resolution: "jest-mock@npm:29.5.0" - dependencies: - "@jest/types": ^29.5.0 - "@types/node": "*" - jest-util: ^29.5.0 - checksum: 2a9cf07509948fa8608898c445f04fe4dd6e2049ff431e5531eee028c808d3ba3c67f226ac87b0cf383feaa1055776900d197c895e89783016886ac17a4ff10c - languageName: node - linkType: hard - -"jest-pnp-resolver@npm:^1.2.2": - version: 1.2.3 - resolution: "jest-pnp-resolver@npm:1.2.3" - peerDependencies: - jest-resolve: "*" - peerDependenciesMeta: - jest-resolve: - optional: true - checksum: db1a8ab2cb97ca19c01b1cfa9a9c8c69a143fde833c14df1fab0766f411b1148ff0df878adea09007ac6a2085ec116ba9a996a6ad104b1e58c20adbf88eed9b2 - languageName: node - linkType: hard - -"jest-regex-util@npm:^28.0.2": - version: 28.0.2 - resolution: "jest-regex-util@npm:28.0.2" - checksum: 0ea8c5c82ec88bc85e273c0ec82e0c0f35f7a1e2d055070e50f0cc2a2177f848eec55f73e37ae0d045c3db5014c42b2f90ac62c1ab3fdb354d2abd66a9e08add - languageName: node - linkType: hard - -"jest-regex-util@npm:^29.4.3": - version: 29.4.3 - resolution: "jest-regex-util@npm:29.4.3" - checksum: 96fc7fc28cd4dd73a63c13a526202c4bd8b351d4e5b68b1a2a2c88da3308c2a16e26feaa593083eb0bac38cca1aa9dd05025412e7de013ba963fb8e66af22b8a - languageName: node - linkType: hard - -"jest-resolve-dependencies@npm:^28.1.3": - version: 28.1.3 - resolution: "jest-resolve-dependencies@npm:28.1.3" - dependencies: - jest-regex-util: ^28.0.2 - jest-snapshot: ^28.1.3 - checksum: 4eea9ec33aefc1c71dc5956391efbcc7be76bda986b366ab3931d99c5f7ed01c9ebd7520e405ea2c76e1bb2c7ce504be6eca2b9831df16564d1e625500f3bfe7 - languageName: node - linkType: hard - -"jest-resolve-dependencies@npm:^29.5.0": - version: 29.5.0 - resolution: "jest-resolve-dependencies@npm:29.5.0" - dependencies: - jest-regex-util: ^29.4.3 - jest-snapshot: ^29.5.0 - checksum: 479d2e5365d58fe23f2b87001e2e0adcbffe0147700e85abdec8f14b9703b0a55758c1929a9989e3f5d5e954fb88870ea4bfa04783523b664562fcf5f10b0edf - languageName: node - linkType: hard - -"jest-resolve@npm:^28.1.3": - version: 28.1.3 - resolution: "jest-resolve@npm:28.1.3" - dependencies: - chalk: ^4.0.0 - graceful-fs: ^4.2.9 - jest-haste-map: ^28.1.3 - jest-pnp-resolver: ^1.2.2 - jest-util: ^28.1.3 - jest-validate: ^28.1.3 - resolve: ^1.20.0 - resolve.exports: ^1.1.0 - slash: ^3.0.0 - checksum: df61a490c93f4f4cf52135e43d6a4fcacb07b0b7d4acc6319e9289529c1d14f2d8e1638e095dbf96f156834802755e38db68caca69dba21a3261ee711d4426b6 - languageName: node - linkType: hard - -"jest-resolve@npm:^29.5.0": - version: 29.5.0 - resolution: "jest-resolve@npm:29.5.0" - dependencies: - chalk: ^4.0.0 - graceful-fs: ^4.2.9 - jest-haste-map: ^29.5.0 - jest-pnp-resolver: ^1.2.2 - jest-util: ^29.5.0 - jest-validate: ^29.5.0 - resolve: ^1.20.0 - resolve.exports: ^2.0.0 - slash: ^3.0.0 - checksum: 9a125f3cf323ceef512089339d35f3ee37f79fe16a831fb6a26773ea6a229b9e490d108fec7af334142e91845b5996de8e7cdd85a4d8d617078737d804e29c8f - languageName: node - linkType: hard - -"jest-runner@npm:^28.1.3": - version: 28.1.3 - resolution: "jest-runner@npm:28.1.3" - dependencies: - "@jest/console": ^28.1.3 - "@jest/environment": ^28.1.3 - "@jest/test-result": ^28.1.3 - "@jest/transform": ^28.1.3 - "@jest/types": ^28.1.3 - "@types/node": "*" - chalk: ^4.0.0 - emittery: ^0.10.2 - graceful-fs: ^4.2.9 - jest-docblock: ^28.1.1 - jest-environment-node: ^28.1.3 - jest-haste-map: ^28.1.3 - jest-leak-detector: ^28.1.3 - jest-message-util: ^28.1.3 - jest-resolve: ^28.1.3 - jest-runtime: ^28.1.3 - jest-util: ^28.1.3 - jest-watcher: ^28.1.3 - jest-worker: ^28.1.3 - p-limit: ^3.1.0 - source-map-support: 0.5.13 - checksum: 32405cd970fa6b11e039192dae699fd1bcc6f61f67d50605af81d193f24dd4373b25f5fcc1c571a028ec1b02174e8a4b6d0d608772063fb06f08a5105693533b - languageName: node - linkType: hard - -"jest-runner@npm:^29.5.0": - version: 29.5.0 - resolution: "jest-runner@npm:29.5.0" - dependencies: - "@jest/console": ^29.5.0 - "@jest/environment": ^29.5.0 - "@jest/test-result": ^29.5.0 - "@jest/transform": ^29.5.0 - "@jest/types": ^29.5.0 - "@types/node": "*" - chalk: ^4.0.0 - emittery: ^0.13.1 - graceful-fs: ^4.2.9 - jest-docblock: ^29.4.3 - jest-environment-node: ^29.5.0 - jest-haste-map: ^29.5.0 - jest-leak-detector: ^29.5.0 - jest-message-util: ^29.5.0 - jest-resolve: ^29.5.0 - jest-runtime: ^29.5.0 - jest-util: ^29.5.0 - jest-watcher: ^29.5.0 - jest-worker: ^29.5.0 - p-limit: ^3.1.0 - source-map-support: 0.5.13 - checksum: 437dea69c5dddca22032259787bac74790d5a171c9d804711415f31e5d1abfb64fa52f54a9015bb17a12b858fd0cf3f75ef6f3c9e94255a8596e179f707229c4 - languageName: node - linkType: hard - -"jest-runtime@npm:^28.1.3": - version: 28.1.3 - resolution: "jest-runtime@npm:28.1.3" - dependencies: - "@jest/environment": ^28.1.3 - "@jest/fake-timers": ^28.1.3 - "@jest/globals": ^28.1.3 - "@jest/source-map": ^28.1.2 - "@jest/test-result": ^28.1.3 - "@jest/transform": ^28.1.3 - "@jest/types": ^28.1.3 - chalk: ^4.0.0 - cjs-module-lexer: ^1.0.0 - collect-v8-coverage: ^1.0.0 - execa: ^5.0.0 - glob: ^7.1.3 - graceful-fs: ^4.2.9 - jest-haste-map: ^28.1.3 - jest-message-util: ^28.1.3 - jest-mock: ^28.1.3 - jest-regex-util: ^28.0.2 - jest-resolve: ^28.1.3 - jest-snapshot: ^28.1.3 - jest-util: ^28.1.3 - slash: ^3.0.0 - strip-bom: ^4.0.0 - checksum: b17c40af858e74dafa4f515ef3711c1e9ef3d4ad7d74534ee0745422534bc04fd166d4eceb62a3aa7dc951505d6f6d2a81d16e90bebb032be409ec0500974a36 - languageName: node - linkType: hard - -"jest-runtime@npm:^29.5.0": - version: 29.5.0 - resolution: "jest-runtime@npm:29.5.0" - dependencies: - "@jest/environment": ^29.5.0 - "@jest/fake-timers": ^29.5.0 - "@jest/globals": ^29.5.0 - "@jest/source-map": ^29.4.3 - "@jest/test-result": ^29.5.0 - "@jest/transform": ^29.5.0 - "@jest/types": ^29.5.0 - "@types/node": "*" - chalk: ^4.0.0 - cjs-module-lexer: ^1.0.0 - collect-v8-coverage: ^1.0.0 - glob: ^7.1.3 - graceful-fs: ^4.2.9 - jest-haste-map: ^29.5.0 - jest-message-util: ^29.5.0 - jest-mock: ^29.5.0 - jest-regex-util: ^29.4.3 - jest-resolve: ^29.5.0 - jest-snapshot: ^29.5.0 - jest-util: ^29.5.0 - slash: ^3.0.0 - strip-bom: ^4.0.0 - checksum: 7af27bd9d54cf1c5735404cf8d76c6509d5610b1ec0106a21baa815c1aff15d774ce534ac2834bc440dccfe6348bae1885fd9a806f23a94ddafdc0f5bae4b09d - languageName: node - linkType: hard - -"jest-snapshot@npm:^28.1.3": - version: 28.1.3 - resolution: "jest-snapshot@npm:28.1.3" - dependencies: - "@babel/core": ^7.11.6 - "@babel/generator": ^7.7.2 - "@babel/plugin-syntax-typescript": ^7.7.2 - "@babel/traverse": ^7.7.2 - "@babel/types": ^7.3.3 - "@jest/expect-utils": ^28.1.3 - "@jest/transform": ^28.1.3 - "@jest/types": ^28.1.3 - "@types/babel__traverse": ^7.0.6 - "@types/prettier": ^2.1.5 - babel-preset-current-node-syntax: ^1.0.0 - chalk: ^4.0.0 - expect: ^28.1.3 - graceful-fs: ^4.2.9 - jest-diff: ^28.1.3 - jest-get-type: ^28.0.2 - jest-haste-map: ^28.1.3 - jest-matcher-utils: ^28.1.3 - jest-message-util: ^28.1.3 - jest-util: ^28.1.3 - natural-compare: ^1.4.0 - pretty-format: ^28.1.3 - semver: ^7.3.5 - checksum: 2a46a5493f1fb50b0a236a21f25045e7f46a244f9f3ae37ef4fbcd40249d0d68bb20c950ce77439e4e2cac985b05c3061c90b34739bf6069913a1199c8c716e1 - languageName: node - linkType: hard - -"jest-snapshot@npm:^29.5.0": - version: 29.5.0 - resolution: "jest-snapshot@npm:29.5.0" - dependencies: - "@babel/core": ^7.11.6 - "@babel/generator": ^7.7.2 - "@babel/plugin-syntax-jsx": ^7.7.2 - "@babel/plugin-syntax-typescript": ^7.7.2 - "@babel/traverse": ^7.7.2 - "@babel/types": ^7.3.3 - "@jest/expect-utils": ^29.5.0 - "@jest/transform": ^29.5.0 - "@jest/types": ^29.5.0 - "@types/babel__traverse": ^7.0.6 - "@types/prettier": ^2.1.5 - babel-preset-current-node-syntax: ^1.0.0 - chalk: ^4.0.0 - expect: ^29.5.0 - graceful-fs: ^4.2.9 - jest-diff: ^29.5.0 - jest-get-type: ^29.4.3 - jest-matcher-utils: ^29.5.0 - jest-message-util: ^29.5.0 - jest-util: ^29.5.0 - natural-compare: ^1.4.0 - pretty-format: ^29.5.0 - semver: ^7.3.5 - checksum: fe5df54122ed10eed625de6416a45bc4958d5062b018f05b152bf9785ab7f355dcd55e40cf5da63895bf8278f8d7b2bb4059b2cfbfdee18f509d455d37d8aa2b - languageName: node - linkType: hard - -"jest-util@npm:^28.0.0, jest-util@npm:^28.1.3": - version: 28.1.3 - resolution: "jest-util@npm:28.1.3" - dependencies: - "@jest/types": ^28.1.3 - "@types/node": "*" - chalk: ^4.0.0 - ci-info: ^3.2.0 - graceful-fs: ^4.2.9 - picomatch: ^2.2.3 - checksum: fd6459742c941f070223f25e38a2ac0719aad92561591e9fb2a50d602a5d19d754750b79b4074327a42b00055662b95da3b006542ceb8b54309da44d4a62e721 - languageName: node - linkType: hard - -"jest-util@npm:^29.0.0, jest-util@npm:^29.5.0": - version: 29.5.0 - resolution: "jest-util@npm:29.5.0" - dependencies: - "@jest/types": ^29.5.0 - "@types/node": "*" - chalk: ^4.0.0 - ci-info: ^3.2.0 - graceful-fs: ^4.2.9 - picomatch: ^2.2.3 - checksum: fd9212950d34d2ecad8c990dda0d8ea59a8a554b0c188b53ea5d6c4a0829a64f2e1d49e6e85e812014933d17426d7136da4785f9cf76fff1799de51b88bc85d3 - languageName: node - linkType: hard - -"jest-validate@npm:^28.1.3": - version: 28.1.3 - resolution: "jest-validate@npm:28.1.3" - dependencies: - "@jest/types": ^28.1.3 - camelcase: ^6.2.0 - chalk: ^4.0.0 - jest-get-type: ^28.0.2 - leven: ^3.1.0 - pretty-format: ^28.1.3 - checksum: 95e0513b3803c3372a145cda86edbdb33d9dfeaa18818176f2d581e821548ceac9a179f065b6d4671a941de211354efd67f1fff8789a4fb89962565c85f646db - languageName: node - linkType: hard - -"jest-validate@npm:^29.5.0": - version: 29.5.0 - resolution: "jest-validate@npm:29.5.0" - dependencies: - "@jest/types": ^29.5.0 - camelcase: ^6.2.0 - chalk: ^4.0.0 - jest-get-type: ^29.4.3 - leven: ^3.1.0 - pretty-format: ^29.5.0 - checksum: 43ca5df7cb75572a254ac3e92fbbe7be6b6a1be898cc1e887a45d55ea003f7a112717d814a674d37f9f18f52d8de40873c8f084f17664ae562736c78dd44c6a1 - languageName: node - linkType: hard - -"jest-watcher@npm:^28.1.3": - version: 28.1.3 - resolution: "jest-watcher@npm:28.1.3" - dependencies: - "@jest/test-result": ^28.1.3 - "@jest/types": ^28.1.3 - "@types/node": "*" - ansi-escapes: ^4.2.1 - chalk: ^4.0.0 - emittery: ^0.10.2 - jest-util: ^28.1.3 - string-length: ^4.0.1 - checksum: 8f6d674a4865e7df251f71544f1b51f06fd36b5a3a61f2ac81aeb81fa2a196be354fba51d0f97911c88f67cd254583b3a22ee124bf2c5b6ee2fadec27356c207 - languageName: node - linkType: hard - -"jest-watcher@npm:^29.5.0": - version: 29.5.0 - resolution: "jest-watcher@npm:29.5.0" - dependencies: - "@jest/test-result": ^29.5.0 - "@jest/types": ^29.5.0 - "@types/node": "*" - ansi-escapes: ^4.2.1 - chalk: ^4.0.0 - emittery: ^0.13.1 - jest-util: ^29.5.0 - string-length: ^4.0.1 - checksum: 62303ac7bdc7e61a8b4239a239d018f7527739da2b2be6a81a7be25b74ca769f1c43ee8558ce8e72bb857245c46d6e03af331227ffb00a57280abb2a928aa776 - languageName: node - linkType: hard - -"jest-worker@npm:^28.1.3": - version: 28.1.3 - resolution: "jest-worker@npm:28.1.3" - dependencies: - "@types/node": "*" - merge-stream: ^2.0.0 - supports-color: ^8.0.0 - checksum: e921c9a1b8f0909da9ea07dbf3592f95b653aef3a8bb0cbcd20fc7f9a795a1304adecac31eecb308992c167e8d7e75c522061fec38a5928ace0f9571c90169ca - languageName: node - linkType: hard - -"jest-worker@npm:^29.5.0": - version: 29.5.0 - resolution: "jest-worker@npm:29.5.0" - dependencies: - "@types/node": "*" - jest-util: ^29.5.0 - merge-stream: ^2.0.0 - supports-color: ^8.0.0 - checksum: 1151a1ae3602b1ea7c42a8f1efe2b5a7bf927039deaa0827bf978880169899b705744e288f80a63603fb3fc2985e0071234986af7dc2c21c7a64333d8777c7c9 - languageName: node - linkType: hard - -"jest@npm:^28.0.0, jest@npm:^28.1.3": - version: 28.1.3 - resolution: "jest@npm:28.1.3" - dependencies: - "@jest/core": ^28.1.3 - "@jest/types": ^28.1.3 - import-local: ^3.0.2 - jest-cli: ^28.1.3 - peerDependencies: - node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 - peerDependenciesMeta: - node-notifier: - optional: true - bin: - jest: bin/jest.js - checksum: b9dcb542eb7c16261c281cdc2bf37155dbb3f1205bae0b567f05051db362c85ddd4b765f126591efb88f6d298eb10336d0aa6c7d5373b4d53f918137a9a70182 - languageName: node - linkType: hard - -"jest@npm:^29.5.0": - version: 29.5.0 - resolution: "jest@npm:29.5.0" - dependencies: - "@jest/core": ^29.5.0 - "@jest/types": ^29.5.0 - import-local: ^3.0.2 - jest-cli: ^29.5.0 - peerDependencies: - node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 - peerDependenciesMeta: - node-notifier: - optional: true - bin: - jest: bin/jest.js - checksum: a8ff2eb0f421623412236e23cbe67c638127fffde466cba9606bc0c0553b4c1e5cb116d7e0ef990b5d1712851652c8ee461373b578df50857fe635b94ff455d5 - languageName: node - linkType: hard - -"jju@npm:~1.4.0": - version: 1.4.0 - resolution: "jju@npm:1.4.0" - checksum: 3790481bd2b7827dd6336e6e3dc2dcc6d425679ba7ebde7b679f61dceb4457ea0cda330972494de608571f4973c6dfb5f70fab6f3c5037dbab19ac449a60424f - languageName: node - linkType: hard - -"js-sdsl@npm:^4.1.4": - version: 4.3.0 - resolution: "js-sdsl@npm:4.3.0" - checksum: ce908257cf6909e213af580af3a691a736f5ee8b16315454768f917a682a4ea0c11bde1b241bbfaecedc0eb67b72101b2c2df2ffaed32aed5d539fca816f054e - languageName: node - linkType: hard - -"js-tokens@npm:^4.0.0": - version: 4.0.0 - resolution: "js-tokens@npm:4.0.0" - checksum: 8a95213a5a77deb6cbe94d86340e8d9ace2b93bc367790b260101d2f36a2eaf4e4e22d9fa9cf459b38af3a32fb4190e638024cf82ec95ef708680e405ea7cc78 - languageName: node - linkType: hard - -"js-yaml@npm:^3.13.1": - version: 3.14.1 - resolution: "js-yaml@npm:3.14.1" - dependencies: - argparse: ^1.0.7 - esprima: ^4.0.0 - bin: - js-yaml: bin/js-yaml.js - checksum: bef146085f472d44dee30ec34e5cf36bf89164f5d585435a3d3da89e52622dff0b188a580e4ad091c3341889e14cb88cac6e4deb16dc5b1e9623bb0601fc255c - languageName: node - linkType: hard - -"js-yaml@npm:^4.1.0": - version: 4.1.0 - resolution: "js-yaml@npm:4.1.0" - dependencies: - argparse: ^2.0.1 - bin: - js-yaml: bin/js-yaml.js - checksum: c7830dfd456c3ef2c6e355cc5a92e6700ceafa1d14bba54497b34a99f0376cecbb3e9ac14d3e5849b426d5a5140709a66237a8c991c675431271c4ce5504151a - languageName: node - linkType: hard - -"jsdoc-type-pratt-parser@npm:~4.0.0": - version: 4.0.0 - resolution: "jsdoc-type-pratt-parser@npm:4.0.0" - checksum: af0629c9517e484be778d8564440fec8de5b7610e0c9c88a3ba4554321364faf72b46689c8d8845faa12c0718437a9ed97e231977efc0f2d50e8a2dbad807eb3 - languageName: node - linkType: hard - -"jsesc@npm:^2.5.1": - version: 2.5.2 - resolution: "jsesc@npm:2.5.2" - bin: - jsesc: bin/jsesc - checksum: 4dc190771129e12023f729ce20e1e0bfceac84d73a85bc3119f7f938843fe25a4aeccb54b6494dce26fcf263d815f5f31acdefac7cc9329efb8422a4f4d9fa9d - languageName: node - linkType: hard - -"json-parse-even-better-errors@npm:^2.3.0": - version: 2.3.1 - resolution: "json-parse-even-better-errors@npm:2.3.1" - checksum: 798ed4cf3354a2d9ccd78e86d2169515a0097a5c133337807cdf7f1fc32e1391d207ccfc276518cc1d7d8d4db93288b8a50ba4293d212ad1336e52a8ec0a941f - languageName: node - linkType: hard - -"json-schema-traverse@npm:^0.4.1": - version: 0.4.1 - resolution: "json-schema-traverse@npm:0.4.1" - checksum: 7486074d3ba247769fda17d5181b345c9fb7d12e0da98b22d1d71a5db9698d8b4bd900a3ec1a4ffdd60846fc2556274a5c894d0c48795f14cb03aeae7b55260b - languageName: node - linkType: hard - -"json-stable-stringify-without-jsonify@npm:^1.0.1": - version: 1.0.1 - resolution: "json-stable-stringify-without-jsonify@npm:1.0.1" - checksum: cff44156ddce9c67c44386ad5cddf91925fe06b1d217f2da9c4910d01f358c6e3989c4d5a02683c7a5667f9727ff05831f7aa8ae66c8ff691c556f0884d49215 - languageName: node - linkType: hard - -"json5@npm:^2.2.1, json5@npm:^2.2.2, json5@npm:^2.2.3": - version: 2.2.3 - resolution: "json5@npm:2.2.3" - bin: - json5: lib/cli.js - checksum: 2a7436a93393830bce797d4626275152e37e877b265e94ca69c99e3d20c2b9dab021279146a39cdb700e71b2dd32a4cebd1514cd57cee102b1af906ce5040349 - languageName: node - linkType: hard - -"jsonc-parser@npm:^3.2.0": - version: 3.2.0 - resolution: "jsonc-parser@npm:3.2.0" - checksum: 946dd9a5f326b745aa326d48a7257e3f4a4b62c5e98ec8e49fa2bdd8d96cef7e6febf1399f5c7016114fd1f68a1c62c6138826d5d90bc650448e3cf0951c53c7 - languageName: node - linkType: hard - -"kleur@npm:^3.0.3": - version: 3.0.3 - resolution: "kleur@npm:3.0.3" - checksum: df82cd1e172f957bae9c536286265a5cdbd5eeca487cb0a3b2a7b41ef959fc61f8e7c0e9aeea9c114ccf2c166b6a8dd45a46fd619c1c569d210ecd2765ad5169 - languageName: node - linkType: hard - -"level-concat-iterator@npm:^3.0.0": - version: 3.1.0 - resolution: "level-concat-iterator@npm:3.1.0" - dependencies: - catering: ^2.1.0 - checksum: a15bc4c5fbbb30c1efa7fad06b72feaac84d90990b356b461593c198a833336f31f6daff8f40c3908fabd14cfd8856d1c5ecae9e1cb0575037b65fa607e760e9 - languageName: node - linkType: hard - -"level-errors@npm:^3.0.1": - version: 3.0.1 - resolution: "level-errors@npm:3.0.1" - checksum: fe4486c423e78ab509a8f7908b89a1692cc810dd47e02d9ceca50543b5be0ce3a4d555fb8f4d3c82122f56bd48c27e6175ca06da359b8e359ea2c7848209d8e7 - languageName: node - linkType: hard - -"level-iterator-stream@npm:^5.0.0": - version: 5.0.0 - resolution: "level-iterator-stream@npm:5.0.0" - dependencies: - inherits: ^2.0.4 - readable-stream: ^3.4.0 - checksum: 3f5bbb9caf6cf6d6c4735219194b85f903377d9da76d37db0691b836c8ea3a78e5233fb18c91f0ef8ca8faaa19bd59e46572ebe27ad2039c51cf83e6c974b9f1 - languageName: node - linkType: hard - -"level-supports@npm:^2.0.1": - version: 2.1.0 - resolution: "level-supports@npm:2.1.0" - checksum: f7b16aea7ddd13326ee4fbc2c1099bcaf8a74dc95346af9ebedea4e02518c6f7a438e829b79b7890d67489b59f615a9428369a0a065021797aa7cb6b6bd84d75 - languageName: node - linkType: hard - -"levelup@npm:^5.1.1": - version: 5.1.1 - resolution: "levelup@npm:5.1.1" - dependencies: - catering: ^2.0.0 - deferred-leveldown: ^7.0.0 - level-errors: ^3.0.1 - level-iterator-stream: ^5.0.0 - level-supports: ^2.0.1 - queue-microtask: ^1.2.3 - checksum: 3053cd3495f615874f1695a47bc7c1eaf432f4c1323b41d58770230b39f2b845100c6e6e912bcffdc504051a8540a39b5d05f3b54f65cfdcb43ce613f6182dd6 - languageName: node - linkType: hard - -"leven@npm:^3.1.0": - version: 3.1.0 - resolution: "leven@npm:3.1.0" - checksum: 638401d534585261b6003db9d99afd244dfe82d75ddb6db5c0df412842d5ab30b2ef18de471aaec70fe69a46f17b4ae3c7f01d8a4e6580ef7adb9f4273ad1e55 - languageName: node - linkType: hard - -"levn@npm:^0.4.1": - version: 0.4.1 - resolution: "levn@npm:0.4.1" - dependencies: - prelude-ls: ^1.2.1 - type-check: ~0.4.0 - checksum: 12c5021c859bd0f5248561bf139121f0358285ec545ebf48bb3d346820d5c61a4309535c7f387ed7d84361cf821e124ce346c6b7cef8ee09a67c1473b46d0fc4 - languageName: node - linkType: hard - -"lines-and-columns@npm:^1.1.6": - version: 1.2.4 - resolution: "lines-and-columns@npm:1.2.4" - checksum: 0c37f9f7fa212b38912b7145e1cd16a5f3cd34d782441c3e6ca653485d326f58b3caccda66efce1c5812bde4961bbde3374fae4b0d11bf1226152337f3894aa5 - languageName: node - linkType: hard - -"locate-path@npm:^5.0.0": - version: 5.0.0 - resolution: "locate-path@npm:5.0.0" - dependencies: - p-locate: ^4.1.0 - checksum: 83e51725e67517287d73e1ded92b28602e3ae5580b301fe54bfb76c0c723e3f285b19252e375712316774cf52006cb236aed5704692c32db0d5d089b69696e30 - languageName: node - linkType: hard - -"locate-path@npm:^6.0.0": - version: 6.0.0 - resolution: "locate-path@npm:6.0.0" - dependencies: - p-locate: ^5.0.0 - checksum: 72eb661788a0368c099a184c59d2fee760b3831c9c1c33955e8a19ae4a21b4116e53fa736dc086cdeb9fce9f7cc508f2f92d2d3aae516f133e16a2bb59a39f5a - languageName: node - linkType: hard - -"lodash.memoize@npm:4.x": - version: 4.1.2 - resolution: "lodash.memoize@npm:4.1.2" - checksum: 9ff3942feeccffa4f1fafa88d32f0d24fdc62fd15ded5a74a5f950ff5f0c6f61916157246744c620173dddf38d37095a92327d5fd3861e2063e736a5c207d089 - languageName: node - linkType: hard - -"lodash.merge@npm:^4.6.2": - version: 4.6.2 - resolution: "lodash.merge@npm:4.6.2" - checksum: ad580b4bdbb7ca1f7abf7e1bce63a9a0b98e370cf40194b03380a46b4ed799c9573029599caebc1b14e3f24b111aef72b96674a56cfa105e0f5ac70546cdc005 - languageName: node - linkType: hard - -"lru-cache@npm:^5.1.1": - version: 5.1.1 - resolution: "lru-cache@npm:5.1.1" - dependencies: - yallist: ^3.0.2 - checksum: c154ae1cbb0c2206d1501a0e94df349653c92c8cbb25236d7e85190bcaf4567a03ac6eb43166fabfa36fd35623694da7233e88d9601fbf411a9a481d85dbd2cb - languageName: node - linkType: hard - -"lru-cache@npm:^6.0.0": - version: 6.0.0 - resolution: "lru-cache@npm:6.0.0" - dependencies: - yallist: ^4.0.0 - checksum: f97f499f898f23e4585742138a22f22526254fdba6d75d41a1c2526b3b6cc5747ef59c5612ba7375f42aca4f8461950e925ba08c991ead0651b4918b7c978297 - languageName: node - linkType: hard - -"lru-cache@npm:^7.7.1": - version: 7.18.3 - resolution: "lru-cache@npm:7.18.3" - checksum: e550d772384709deea3f141af34b6d4fa392e2e418c1498c078de0ee63670f1f46f5eee746e8ef7e69e1c895af0d4224e62ee33e66a543a14763b0f2e74c1356 - languageName: node - linkType: hard - -"ltgt@npm:^2.2.0": - version: 2.2.1 - resolution: "ltgt@npm:2.2.1" - checksum: 7e3874296f7538bc8087b428ac4208008d7b76916354b34a08818ca7c83958c1df10ec427eeeaad895f6b81e41e24745b18d30f89abcc21d228b94f6961d50a2 - languageName: node - linkType: hard - -"lunr@npm:^2.3.9": - version: 2.3.9 - resolution: "lunr@npm:2.3.9" - checksum: 176719e24fcce7d3cf1baccce9dd5633cd8bdc1f41ebe6a180112e5ee99d80373fe2454f5d4624d437e5a8319698ca6837b9950566e15d2cae5f2a543a3db4b8 - languageName: node - linkType: hard - -"make-dir@npm:^3.0.0": - version: 3.1.0 - resolution: "make-dir@npm:3.1.0" - dependencies: - semver: ^6.0.0 - checksum: 484200020ab5a1fdf12f393fe5f385fc8e4378824c940fba1729dcd198ae4ff24867bc7a5646331e50cead8abff5d9270c456314386e629acec6dff4b8016b78 - languageName: node - linkType: hard - -"make-error@npm:1.x, make-error@npm:^1.1.1": - version: 1.3.6 - resolution: "make-error@npm:1.3.6" - checksum: b86e5e0e25f7f777b77fabd8e2cbf15737972869d852a22b7e73c17623928fccb826d8e46b9951501d3f20e51ad74ba8c59ed584f610526a48f8ccf88aaec402 - languageName: node - linkType: hard - -"make-fetch-happen@npm:^10.0.3": - version: 10.2.1 - resolution: "make-fetch-happen@npm:10.2.1" - dependencies: - agentkeepalive: ^4.2.1 - cacache: ^16.1.0 - http-cache-semantics: ^4.1.0 - http-proxy-agent: ^5.0.0 - https-proxy-agent: ^5.0.0 - is-lambda: ^1.0.1 - lru-cache: ^7.7.1 - minipass: ^3.1.6 - minipass-collect: ^1.0.2 - minipass-fetch: ^2.0.3 - minipass-flush: ^1.0.5 - minipass-pipeline: ^1.2.4 - negotiator: ^0.6.3 - promise-retry: ^2.0.1 - socks-proxy-agent: ^7.0.0 - ssri: ^9.0.0 - checksum: 2332eb9a8ec96f1ffeeea56ccefabcb4193693597b132cd110734d50f2928842e22b84cfa1508e921b8385cdfd06dda9ad68645fed62b50fff629a580f5fb72c - languageName: node - linkType: hard - -"makeerror@npm:1.0.12": - version: 1.0.12 - resolution: "makeerror@npm:1.0.12" - dependencies: - tmpl: 1.0.5 - checksum: b38a025a12c8146d6eeea5a7f2bf27d51d8ad6064da8ca9405fcf7bf9b54acd43e3b30ddd7abb9b1bfa4ddb266019133313482570ddb207de568f71ecfcf6060 - languageName: node - linkType: hard - -"map-stream@npm:~0.1.0": - version: 0.1.0 - resolution: "map-stream@npm:0.1.0" - checksum: 38abbe4eb883888031e6b2fc0630bc583c99396be16b8ace5794b937b682a8a081f03e8b15bfd4914d1bc88318f0e9ac73ba3512ae65955cd449f63256ddb31d - languageName: node - linkType: hard - -"marked@npm:^4.2.12": - version: 4.2.12 - resolution: "marked@npm:4.2.12" - bin: - marked: bin/marked.js - checksum: bd551cd61028ee639d4ca2ccdfcc5a6ba4227c1b143c4538f3cde27f569dcb57df8e6313560394645b418b84a7336c07ab1e438b89b6324c29d7d8cdd3102d63 - languageName: node - linkType: hard - -"md5.js@npm:^1.3.4": - version: 1.3.5 - resolution: "md5.js@npm:1.3.5" - dependencies: - hash-base: ^3.0.0 - inherits: ^2.0.1 - safe-buffer: ^5.1.2 - checksum: 098494d885684bcc4f92294b18ba61b7bd353c23147fbc4688c75b45cb8590f5a95fd4584d742415dcc52487f7a1ef6ea611cfa1543b0dc4492fe026357f3f0c - languageName: node - linkType: hard - -"memdown@npm:^6.1.1": - version: 6.1.1 - resolution: "memdown@npm:6.1.1" - dependencies: - abstract-leveldown: ^7.2.0 - buffer: ^6.0.3 - functional-red-black-tree: ^1.0.1 - inherits: ^2.0.1 - ltgt: ^2.2.0 - checksum: a8c418620781a396e650834ab18022c1ae13060b3ca47dc80152eff45caf0e4780598610fd0f9b5a50ebdf195e686ed53fadbae1272addfafad98d598a165a4b - languageName: node - linkType: hard - -"merge-stream@npm:^2.0.0": - version: 2.0.0 - resolution: "merge-stream@npm:2.0.0" - checksum: 6fa4dcc8d86629705cea944a4b88ef4cb0e07656ebf223fa287443256414283dd25d91c1cd84c77987f2aec5927af1a9db6085757cb43d90eb170ebf4b47f4f4 - languageName: node - linkType: hard - -"merge2@npm:^1.3.0, merge2@npm:^1.4.1": - version: 1.4.1 - resolution: "merge2@npm:1.4.1" - checksum: 7268db63ed5169466540b6fb947aec313200bcf6d40c5ab722c22e242f651994619bcd85601602972d3c85bd2cc45a358a4c61937e9f11a061919a1da569b0c2 - languageName: node - linkType: hard - -"micromatch@npm:^4.0.4": - version: 4.0.5 - resolution: "micromatch@npm:4.0.5" - dependencies: - braces: ^3.0.2 - picomatch: ^2.3.1 - checksum: 02a17b671c06e8fefeeb6ef996119c1e597c942e632a21ef589154f23898c9c6a9858526246abb14f8bca6e77734aa9dcf65476fca47cedfb80d9577d52843fc - languageName: node - linkType: hard - -"mimic-fn@npm:^2.1.0": - version: 2.1.0 - resolution: "mimic-fn@npm:2.1.0" - checksum: d2421a3444848ce7f84bd49115ddacff29c15745db73f54041edc906c14b131a38d05298dae3081667627a59b2eb1ca4b436ff2e1b80f69679522410418b478a - languageName: node - linkType: hard - -"minimalistic-assert@npm:^1.0.0, minimalistic-assert@npm:^1.0.1": - version: 1.0.1 - resolution: "minimalistic-assert@npm:1.0.1" - checksum: cc7974a9268fbf130fb055aff76700d7e2d8be5f761fb5c60318d0ed010d839ab3661a533ad29a5d37653133385204c503bfac995aaa4236f4e847461ea32ba7 - languageName: node - linkType: hard - -"minimalistic-crypto-utils@npm:^1.0.1": - version: 1.0.1 - resolution: "minimalistic-crypto-utils@npm:1.0.1" - checksum: 6e8a0422b30039406efd4c440829ea8f988845db02a3299f372fceba56ffa94994a9c0f2fd70c17f9969eedfbd72f34b5070ead9656a34d3f71c0bd72583a0ed - languageName: node - linkType: hard - -"minimatch@npm:^3.0.4, minimatch@npm:^3.0.5, minimatch@npm:^3.1.1, minimatch@npm:^3.1.2": - version: 3.1.2 - resolution: "minimatch@npm:3.1.2" - dependencies: - brace-expansion: ^1.1.7 - checksum: c154e566406683e7bcb746e000b84d74465b3a832c45d59912b9b55cd50dee66e5c4b1e5566dba26154040e51672f9aa450a9aef0c97cfc7336b78b7afb9540a - languageName: node - linkType: hard - -"minimatch@npm:^5.0.1": - version: 5.1.6 - resolution: "minimatch@npm:5.1.6" - dependencies: - brace-expansion: ^2.0.1 - checksum: 7564208ef81d7065a370f788d337cd80a689e981042cb9a1d0e6580b6c6a8c9279eba80010516e258835a988363f99f54a6f711a315089b8b42694f5da9d0d77 - languageName: node - linkType: hard - -"minimatch@npm:^7.1.3": - version: 7.4.2 - resolution: "minimatch@npm:7.4.2" - dependencies: - brace-expansion: ^2.0.1 - checksum: 9e341b04e69d5ab03e4206dcb61c8a158e3b8709628bf5e1a4eaa9f3b72c0ba925e24ad959b1f6ce6835caa5a927131d5087fae6836b69e7d99d7d5e63ef0bd8 - languageName: node - linkType: hard - -"minipass-collect@npm:^1.0.2": - version: 1.0.2 - resolution: "minipass-collect@npm:1.0.2" - dependencies: - minipass: ^3.0.0 - checksum: 14df761028f3e47293aee72888f2657695ec66bd7d09cae7ad558da30415fdc4752bbfee66287dcc6fd5e6a2fa3466d6c484dc1cbd986525d9393b9523d97f10 - languageName: node - linkType: hard - -"minipass-fetch@npm:^2.0.3": - version: 2.1.2 - resolution: "minipass-fetch@npm:2.1.2" - dependencies: - encoding: ^0.1.13 - minipass: ^3.1.6 - minipass-sized: ^1.0.3 - minizlib: ^2.1.2 - dependenciesMeta: - encoding: - optional: true - checksum: 3f216be79164e915fc91210cea1850e488793c740534985da017a4cbc7a5ff50506956d0f73bb0cb60e4fe91be08b6b61ef35101706d3ef5da2c8709b5f08f91 - languageName: node - linkType: hard - -"minipass-flush@npm:^1.0.5": - version: 1.0.5 - resolution: "minipass-flush@npm:1.0.5" - dependencies: - minipass: ^3.0.0 - checksum: 56269a0b22bad756a08a94b1ffc36b7c9c5de0735a4dd1ab2b06c066d795cfd1f0ac44a0fcae13eece5589b908ecddc867f04c745c7009be0b566421ea0944cf - languageName: node - linkType: hard - -"minipass-pipeline@npm:^1.2.4": - version: 1.2.4 - resolution: "minipass-pipeline@npm:1.2.4" - dependencies: - minipass: ^3.0.0 - checksum: b14240dac0d29823c3d5911c286069e36d0b81173d7bdf07a7e4a91ecdef92cdff4baaf31ea3746f1c61e0957f652e641223970870e2353593f382112257971b - languageName: node - linkType: hard - -"minipass-sized@npm:^1.0.3": - version: 1.0.3 - resolution: "minipass-sized@npm:1.0.3" - dependencies: - minipass: ^3.0.0 - checksum: 79076749fcacf21b5d16dd596d32c3b6bf4d6e62abb43868fac21674078505c8b15eaca4e47ed844985a4514854f917d78f588fcd029693709417d8f98b2bd60 - languageName: node - linkType: hard - -"minipass@npm:^3.0.0, minipass@npm:^3.1.1, minipass@npm:^3.1.6": - version: 3.3.6 - resolution: "minipass@npm:3.3.6" - dependencies: - yallist: ^4.0.0 - checksum: a30d083c8054cee83cdcdc97f97e4641a3f58ae743970457b1489ce38ee1167b3aaf7d815cd39ec7a99b9c40397fd4f686e83750e73e652b21cb516f6d845e48 - languageName: node - linkType: hard - -"minipass@npm:^4.0.0": - version: 4.2.5 - resolution: "minipass@npm:4.2.5" - checksum: 4f9c19af23a5d4a9e7156feefc9110634b178a8cff8f8271af16ec5ebf7e221725a97429952c856f5b17b30c2065ebd24c81722d90c93d2122611d75b952b48f - languageName: node - linkType: hard - -"minizlib@npm:^2.1.1, minizlib@npm:^2.1.2": - version: 2.1.2 - resolution: "minizlib@npm:2.1.2" - dependencies: - minipass: ^3.0.0 - yallist: ^4.0.0 - checksum: f1fdeac0b07cf8f30fcf12f4b586795b97be856edea22b5e9072707be51fc95d41487faec3f265b42973a304fe3a64acd91a44a3826a963e37b37bafde0212c3 - languageName: node - linkType: hard - -"mkdirp@npm:^1.0.3, mkdirp@npm:^1.0.4": - version: 1.0.4 - resolution: "mkdirp@npm:1.0.4" - bin: - mkdirp: bin/cmd.js - checksum: a96865108c6c3b1b8e1d5e9f11843de1e077e57737602de1b82030815f311be11f96f09cce59bd5b903d0b29834733e5313f9301e3ed6d6f6fba2eae0df4298f - languageName: node - linkType: hard - -"ms@npm:2.1.2": - version: 2.1.2 - resolution: "ms@npm:2.1.2" - checksum: 673cdb2c3133eb050c745908d8ce632ed2c02d85640e2edb3ace856a2266a813b30c613569bf3354fdf4ea7d1a1494add3bfa95e2713baa27d0c2c71fc44f58f - languageName: node - linkType: hard - -"ms@npm:^2.0.0": - version: 2.1.3 - resolution: "ms@npm:2.1.3" - checksum: aa92de608021b242401676e35cfa5aa42dd70cbdc082b916da7fb925c542173e36bce97ea3e804923fe92c0ad991434e4a38327e15a1b5b5f945d66df615ae6d - languageName: node - linkType: hard - -"nanoid@npm:^3.3.4": - version: 3.3.4 - resolution: "nanoid@npm:3.3.4" - bin: - nanoid: bin/nanoid.cjs - checksum: 2fddd6dee994b7676f008d3ffa4ab16035a754f4bb586c61df5a22cf8c8c94017aadd360368f47d653829e0569a92b129979152ff97af23a558331e47e37cd9c - languageName: node - linkType: hard - -"natural-compare-lite@npm:^1.4.0": - version: 1.4.0 - resolution: "natural-compare-lite@npm:1.4.0" - checksum: 5222ac3986a2b78dd6069ac62cbb52a7bf8ffc90d972ab76dfe7b01892485d229530ed20d0c62e79a6b363a663b273db3bde195a1358ce9e5f779d4453887225 - languageName: node - linkType: hard - -"natural-compare@npm:^1.4.0": - version: 1.4.0 - resolution: "natural-compare@npm:1.4.0" - checksum: 23ad088b08f898fc9b53011d7bb78ec48e79de7627e01ab5518e806033861bef68d5b0cd0e2205c2f36690ac9571ff6bcb05eb777ced2eeda8d4ac5b44592c3d - languageName: node - linkType: hard - -"negotiator@npm:^0.6.3": - version: 0.6.3 - resolution: "negotiator@npm:0.6.3" - checksum: b8ffeb1e262eff7968fc90a2b6767b04cfd9842582a9d0ece0af7049537266e7b2506dfb1d107a32f06dd849ab2aea834d5830f7f4d0e5cb7d36e1ae55d021d9 - languageName: node - linkType: hard - -"node-addon-api@npm:^2.0.0": - version: 2.0.2 - resolution: "node-addon-api@npm:2.0.2" - dependencies: - node-gyp: latest - checksum: 31fb22d674648204f8dd94167eb5aac896c841b84a9210d614bf5d97c74ef059cc6326389cf0c54d2086e35312938401d4cc82e5fcd679202503eb8ac84814f8 - languageName: node - linkType: hard - -"node-cleanup@npm:^2.1.2": - version: 2.1.2 - resolution: "node-cleanup@npm:2.1.2" - checksum: 584cdc3e42560a998b4579f91ed8f936b27011628f3102e5a1093205f0691cdf8d899287d1f2e4d2071ea4ab1d615810bad6dbe2b988ef173a1cbaa76d8165b3 - languageName: node - linkType: hard - -"node-gyp-build@npm:^4.2.0": - version: 4.6.0 - resolution: "node-gyp-build@npm:4.6.0" - bin: - node-gyp-build: bin.js - node-gyp-build-optional: optional.js - node-gyp-build-test: build-test.js - checksum: 25d78c5ef1f8c24291f4a370c47ba52fcea14f39272041a90a7894cd50d766f7c8cb8fb06c0f42bf6f69b204b49d9be3c8fc344aac09714d5bdb95965499eb15 - languageName: node - linkType: hard - -"node-gyp@npm:latest": - version: 9.3.1 - resolution: "node-gyp@npm:9.3.1" - dependencies: - env-paths: ^2.2.0 - glob: ^7.1.4 - graceful-fs: ^4.2.6 - make-fetch-happen: ^10.0.3 - nopt: ^6.0.0 - npmlog: ^6.0.0 - rimraf: ^3.0.2 - semver: ^7.3.5 - tar: ^6.1.2 - which: ^2.0.2 - bin: - node-gyp: bin/node-gyp.js - checksum: b860e9976fa645ca0789c69e25387401b4396b93c8375489b5151a6c55cf2640a3b6183c212b38625ef7c508994930b72198338e3d09b9d7ade5acc4aaf51ea7 - languageName: node - linkType: hard - -"node-int64@npm:^0.4.0": - version: 0.4.0 - resolution: "node-int64@npm:0.4.0" - checksum: d0b30b1ee6d961851c60d5eaa745d30b5c95d94bc0e74b81e5292f7c42a49e3af87f1eb9e89f59456f80645d679202537de751b7d72e9e40ceea40c5e449057e - languageName: node - linkType: hard - -"node-releases@npm:^2.0.8": - version: 2.0.10 - resolution: "node-releases@npm:2.0.10" - checksum: d784ecde25696a15d449c4433077f5cce620ed30a1656c4abf31282bfc691a70d9618bae6868d247a67914d1be5cc4fde22f65a05f4398cdfb92e0fc83cadfbc - languageName: node - linkType: hard - -"nopt@npm:^6.0.0": - version: 6.0.0 - resolution: "nopt@npm:6.0.0" - dependencies: - abbrev: ^1.0.0 - bin: - nopt: bin/nopt.js - checksum: 82149371f8be0c4b9ec2f863cc6509a7fd0fa729929c009f3a58e4eb0c9e4cae9920e8f1f8eb46e7d032fec8fb01bede7f0f41a67eb3553b7b8e14fa53de1dac - languageName: node - linkType: hard - -"normalize-path@npm:^3.0.0": - version: 3.0.0 - resolution: "normalize-path@npm:3.0.0" - checksum: 88eeb4da891e10b1318c4b2476b6e2ecbeb5ff97d946815ffea7794c31a89017c70d7f34b3c2ebf23ef4e9fc9fb99f7dffe36da22011b5b5c6ffa34f4873ec20 - languageName: node - linkType: hard - -"npm-run-path@npm:^4.0.1": - version: 4.0.1 - resolution: "npm-run-path@npm:4.0.1" - dependencies: - path-key: ^3.0.0 - checksum: 5374c0cea4b0bbfdfae62da7bbdf1e1558d338335f4cacf2515c282ff358ff27b2ecb91ffa5330a8b14390ac66a1e146e10700440c1ab868208430f56b5f4d23 - languageName: node - linkType: hard - -"npmlog@npm:^6.0.0": - version: 6.0.2 - resolution: "npmlog@npm:6.0.2" - dependencies: - are-we-there-yet: ^3.0.0 - console-control-strings: ^1.1.0 - gauge: ^4.0.3 - set-blocking: ^2.0.0 - checksum: ae238cd264a1c3f22091cdd9e2b106f684297d3c184f1146984ecbe18aaa86343953f26b9520dedd1b1372bc0316905b736c1932d778dbeb1fcf5a1001390e2a - languageName: node - linkType: hard - -"once@npm:^1.3.0": - version: 1.4.0 - resolution: "once@npm:1.4.0" - dependencies: - wrappy: 1 - checksum: cd0a88501333edd640d95f0d2700fbde6bff20b3d4d9bdc521bdd31af0656b5706570d6c6afe532045a20bb8dc0849f8332d6f2a416e0ba6d3d3b98806c7db68 - languageName: node - linkType: hard - -"onetime@npm:^5.1.2": - version: 5.1.2 - resolution: "onetime@npm:5.1.2" - dependencies: - mimic-fn: ^2.1.0 - checksum: 2478859ef817fc5d4e9c2f9e5728512ddd1dbc9fb7829ad263765bb6d3b91ce699d6e2332eef6b7dff183c2f490bd3349f1666427eaba4469fba0ac38dfd0d34 - languageName: node - linkType: hard - -"optionator@npm:^0.9.1": - version: 0.9.1 - resolution: "optionator@npm:0.9.1" - dependencies: - deep-is: ^0.1.3 - fast-levenshtein: ^2.0.6 - levn: ^0.4.1 - prelude-ls: ^1.2.1 - type-check: ^0.4.0 - word-wrap: ^1.2.3 - checksum: dbc6fa065604b24ea57d734261914e697bd73b69eff7f18e967e8912aa2a40a19a9f599a507fa805be6c13c24c4eae8c71306c239d517d42d4c041c942f508a0 - languageName: node - linkType: hard - -"p-limit@npm:^2.2.0": - version: 2.3.0 - resolution: "p-limit@npm:2.3.0" - dependencies: - p-try: ^2.0.0 - checksum: 84ff17f1a38126c3314e91ecfe56aecbf36430940e2873dadaa773ffe072dc23b7af8e46d4b6485d302a11673fe94c6b67ca2cfbb60c989848b02100d0594ac1 - languageName: node - linkType: hard - -"p-limit@npm:^3.0.2, p-limit@npm:^3.1.0": - version: 3.1.0 - resolution: "p-limit@npm:3.1.0" - dependencies: - yocto-queue: ^0.1.0 - checksum: 7c3690c4dbf62ef625671e20b7bdf1cbc9534e83352a2780f165b0d3ceba21907e77ad63401708145ca4e25bfc51636588d89a8c0aeb715e6c37d1c066430360 - languageName: node - linkType: hard - -"p-locate@npm:^4.1.0": - version: 4.1.0 - resolution: "p-locate@npm:4.1.0" - dependencies: - p-limit: ^2.2.0 - checksum: 513bd14a455f5da4ebfcb819ef706c54adb09097703de6aeaa5d26fe5ea16df92b48d1ac45e01e3944ce1e6aa2a66f7f8894742b8c9d6e276e16cd2049a2b870 - languageName: node - linkType: hard - -"p-locate@npm:^5.0.0": - version: 5.0.0 - resolution: "p-locate@npm:5.0.0" - dependencies: - p-limit: ^3.0.2 - checksum: 1623088f36cf1cbca58e9b61c4e62bf0c60a07af5ae1ca99a720837356b5b6c5ba3eb1b2127e47a06865fee59dd0453cad7cc844cda9d5a62ac1a5a51b7c86d3 - languageName: node - linkType: hard - -"p-map@npm:^4.0.0": - version: 4.0.0 - resolution: "p-map@npm:4.0.0" - dependencies: - aggregate-error: ^3.0.0 - checksum: cb0ab21ec0f32ddffd31dfc250e3afa61e103ef43d957cc45497afe37513634589316de4eb88abdfd969fe6410c22c0b93ab24328833b8eb1ccc087fc0442a1c - languageName: node - linkType: hard - -"p-try@npm:^2.0.0": - version: 2.2.0 - resolution: "p-try@npm:2.2.0" - checksum: f8a8e9a7693659383f06aec604ad5ead237c7a261c18048a6e1b5b85a5f8a067e469aa24f5bc009b991ea3b058a87f5065ef4176793a200d4917349881216cae - languageName: node - linkType: hard - -"parent-module@npm:^1.0.0": - version: 1.0.1 - resolution: "parent-module@npm:1.0.1" - dependencies: - callsites: ^3.0.0 - checksum: 6ba8b255145cae9470cf5551eb74be2d22281587af787a2626683a6c20fbb464978784661478dd2a3f1dad74d1e802d403e1b03c1a31fab310259eec8ac560ff - languageName: node - linkType: hard - -"parse-json@npm:^5.2.0": - version: 5.2.0 - resolution: "parse-json@npm:5.2.0" - dependencies: - "@babel/code-frame": ^7.0.0 - error-ex: ^1.3.1 - json-parse-even-better-errors: ^2.3.0 - lines-and-columns: ^1.1.6 - checksum: 62085b17d64da57f40f6afc2ac1f4d95def18c4323577e1eced571db75d9ab59b297d1d10582920f84b15985cbfc6b6d450ccbf317644cfa176f3ed982ad87e2 - languageName: node - linkType: hard - -"path-exists@npm:^4.0.0": - version: 4.0.0 - resolution: "path-exists@npm:4.0.0" - checksum: 505807199dfb7c50737b057dd8d351b82c033029ab94cb10a657609e00c1bc53b951cfdbccab8de04c5584d5eff31128ce6afd3db79281874a5ef2adbba55ed1 - languageName: node - linkType: hard - -"path-is-absolute@npm:^1.0.0": - version: 1.0.1 - resolution: "path-is-absolute@npm:1.0.1" - checksum: 060840f92cf8effa293bcc1bea81281bd7d363731d214cbe5c227df207c34cd727430f70c6037b5159c8a870b9157cba65e775446b0ab06fd5ecc7e54615a3b8 - languageName: node - linkType: hard - -"path-key@npm:^3.0.0, path-key@npm:^3.1.0": - version: 3.1.1 - resolution: "path-key@npm:3.1.1" - checksum: 55cd7a9dd4b343412a8386a743f9c746ef196e57c823d90ca3ab917f90ab9f13dd0ded27252ba49dbdfcab2b091d998bc446f6220cd3cea65db407502a740020 - languageName: node - linkType: hard - -"path-parse@npm:^1.0.6, path-parse@npm:^1.0.7": - version: 1.0.7 - resolution: "path-parse@npm:1.0.7" - checksum: 49abf3d81115642938a8700ec580da6e830dde670be21893c62f4e10bd7dd4c3742ddc603fe24f898cba7eb0c6bc1777f8d9ac14185d34540c6d4d80cd9cae8a - languageName: node - linkType: hard - -"path-type@npm:^4.0.0": - version: 4.0.0 - resolution: "path-type@npm:4.0.0" - checksum: 5b1e2daa247062061325b8fdbfd1fb56dde0a448fb1455453276ea18c60685bdad23a445dc148cf87bc216be1573357509b7d4060494a6fd768c7efad833ee45 - languageName: node - linkType: hard - -"pause-stream@npm:0.0.11": - version: 0.0.11 - resolution: "pause-stream@npm:0.0.11" - dependencies: - through: ~2.3 - checksum: 3c4a14052a638b92e0c96eb00c0d7977df7f79ea28395250c525d197f1fc02d34ce1165d5362e2e6ebbb251524b94a76f3f0d4abc39ab8b016d97449fe15583c - languageName: node - linkType: hard - -"pbkdf2@npm:^3.1.2": - version: 3.1.2 - resolution: "pbkdf2@npm:3.1.2" - dependencies: - create-hash: ^1.1.2 - create-hmac: ^1.1.4 - ripemd160: ^2.0.1 - safe-buffer: ^5.0.1 - sha.js: ^2.4.8 - checksum: 2c950a100b1da72123449208e231afc188d980177d021d7121e96a2de7f2abbc96ead2b87d03d8fe5c318face097f203270d7e27908af9f471c165a4e8e69c92 - languageName: node - linkType: hard - -"picocolors@npm:^1.0.0": - version: 1.0.0 - resolution: "picocolors@npm:1.0.0" - checksum: a2e8092dd86c8396bdba9f2b5481032848525b3dc295ce9b57896f931e63fc16f79805144321f72976383fc249584672a75cc18d6777c6b757603f372f745981 - languageName: node - linkType: hard - -"picomatch@npm:^2.0.4, picomatch@npm:^2.2.3, picomatch@npm:^2.3.1": - version: 2.3.1 - resolution: "picomatch@npm:2.3.1" - checksum: 050c865ce81119c4822c45d3c84f1ced46f93a0126febae20737bd05ca20589c564d6e9226977df859ed5e03dc73f02584a2b0faad36e896936238238b0446cf - languageName: node - linkType: hard - -"pirates@npm:^4.0.4": - version: 4.0.5 - resolution: "pirates@npm:4.0.5" - checksum: c9994e61b85260bec6c4fc0307016340d9b0c4f4b6550a957afaaff0c9b1ad58fbbea5cfcf083860a25cb27a375442e2b0edf52e2e1e40e69934e08dcc52d227 - languageName: node - linkType: hard - -"pkg-dir@npm:^4.2.0": - version: 4.2.0 - resolution: "pkg-dir@npm:4.2.0" - dependencies: - find-up: ^4.0.0 - checksum: 9863e3f35132bf99ae1636d31ff1e1e3501251d480336edb1c211133c8d58906bed80f154a1d723652df1fda91e01c7442c2eeaf9dc83157c7ae89087e43c8d6 - languageName: node - linkType: hard - -"postcss@npm:^8.4.21": - version: 8.4.21 - resolution: "postcss@npm:8.4.21" - dependencies: - nanoid: ^3.3.4 - picocolors: ^1.0.0 - source-map-js: ^1.0.2 - checksum: e39ac60ccd1542d4f9d93d894048aac0d686b3bb38e927d8386005718e6793dbbb46930f0a523fe382f1bbd843c6d980aaea791252bf5e176180e5a4336d9679 - languageName: node - linkType: hard - -"prelude-ls@npm:^1.2.1": - version: 1.2.1 - resolution: "prelude-ls@npm:1.2.1" - checksum: cd192ec0d0a8e4c6da3bb80e4f62afe336df3f76271ac6deb0e6a36187133b6073a19e9727a1ff108cd8b9982e4768850d413baa71214dd80c7979617dca827a - languageName: node - linkType: hard - -"prettier@npm:^2.7.1": - version: 2.8.4 - resolution: "prettier@npm:2.8.4" - bin: - prettier: bin-prettier.js - checksum: c173064bf3df57b6d93d19aa98753b9b9dd7657212e33b41ada8e2e9f9884066bb9ca0b4005b89b3ab137efffdf8fbe0b462785aba20364798ff4303aadda57e - languageName: node - linkType: hard - -"pretty-format@npm:^28.1.3": - version: 28.1.3 - resolution: "pretty-format@npm:28.1.3" - dependencies: - "@jest/schemas": ^28.1.3 - ansi-regex: ^5.0.1 - ansi-styles: ^5.0.0 - react-is: ^18.0.0 - checksum: e69f857358a3e03d271252d7524bec758c35e44680287f36c1cb905187fbc82da9981a6eb07edfd8a03bc3cbeebfa6f5234c13a3d5b59f2bbdf9b4c4053e0a7f - languageName: node - linkType: hard - -"pretty-format@npm:^29.0.0, pretty-format@npm:^29.5.0": - version: 29.5.0 - resolution: "pretty-format@npm:29.5.0" - dependencies: - "@jest/schemas": ^29.4.3 - ansi-styles: ^5.0.0 - react-is: ^18.0.0 - checksum: 4065356b558e6db25b4d41a01efb386935a6c06a0c9c104ef5ce59f2f476b8210edb8b3949b386e60ada0a6dc5ebcb2e6ccddc8c64dfd1a9943c3c3a9e7eaf89 - languageName: node - linkType: hard - -"promise-inflight@npm:^1.0.1": - version: 1.0.1 - resolution: "promise-inflight@npm:1.0.1" - checksum: 22749483091d2c594261517f4f80e05226d4d5ecc1fc917e1886929da56e22b5718b7f2a75f3807e7a7d471bc3be2907fe92e6e8f373ddf5c64bae35b5af3981 - languageName: node - linkType: hard - -"promise-retry@npm:^2.0.1": - version: 2.0.1 - resolution: "promise-retry@npm:2.0.1" - dependencies: - err-code: ^2.0.2 - retry: ^0.12.0 - checksum: f96a3f6d90b92b568a26f71e966cbbc0f63ab85ea6ff6c81284dc869b41510e6cdef99b6b65f9030f0db422bf7c96652a3fff9f2e8fb4a0f069d8f4430359429 - languageName: node - linkType: hard - -"prompts@npm:^2.0.1": - version: 2.4.2 - resolution: "prompts@npm:2.4.2" - dependencies: - kleur: ^3.0.3 - sisteransi: ^1.0.5 - checksum: d8fd1fe63820be2412c13bfc5d0a01909acc1f0367e32396962e737cb2fc52d004f3302475d5ce7d18a1e8a79985f93ff04ee03007d091029c3f9104bffc007d - languageName: node - linkType: hard - -"ps-tree@npm:^1.2.0": - version: 1.2.0 - resolution: "ps-tree@npm:1.2.0" - dependencies: - event-stream: =3.3.4 - bin: - ps-tree: ./bin/ps-tree.js - checksum: e635dd00f53d30d31696cf5f95b3a8dbdf9b1aeb36d4391578ce8e8cd22949b7c5536c73b0dc18c78615ea3ddd4be96101166be59ca2e3e3cb1e2f79ba3c7f98 - languageName: node - linkType: hard - -"punycode@npm:^2.1.0, punycode@npm:^2.1.1": - version: 2.3.0 - resolution: "punycode@npm:2.3.0" - checksum: 39f760e09a2a3bbfe8f5287cf733ecdad69d6af2fe6f97ca95f24b8921858b91e9ea3c9eeec6e08cede96181b3bb33f95c6ffd8c77e63986508aa2e8159fa200 - languageName: node - linkType: hard - -"pure-rand@npm:^6.0.0": - version: 6.0.1 - resolution: "pure-rand@npm:6.0.1" - checksum: 4bb565399993b815658a72e359f574ce4f04827a42a905105d61163ae86f456d91595a0e4241e7bce04328fae0638ae70ac0428d93ecb55971c465bd084f8648 - languageName: node - linkType: hard - -"queue-microtask@npm:^1.2.2, queue-microtask@npm:^1.2.3": - version: 1.2.3 - resolution: "queue-microtask@npm:1.2.3" - checksum: b676f8c040cdc5b12723ad2f91414d267605b26419d5c821ff03befa817ddd10e238d22b25d604920340fd73efd8ba795465a0377c4adf45a4a41e4234e42dc4 - languageName: node - linkType: hard - -"react-is@npm:^18.0.0": - version: 18.2.0 - resolution: "react-is@npm:18.2.0" - checksum: e72d0ba81b5922759e4aff17e0252bd29988f9642ed817f56b25a3e217e13eea8a7f2322af99a06edb779da12d5d636e9fda473d620df9a3da0df2a74141d53e - languageName: node - linkType: hard - -"readable-stream@npm:^3.4.0, readable-stream@npm:^3.6.0": - version: 3.6.2 - resolution: "readable-stream@npm:3.6.2" - dependencies: - inherits: ^2.0.3 - string_decoder: ^1.1.1 - util-deprecate: ^1.0.1 - checksum: bdcbe6c22e846b6af075e32cf8f4751c2576238c5043169a1c221c92ee2878458a816a4ea33f4c67623c0b6827c8a400409bfb3cf0bf3381392d0b1dfb52ac8d - languageName: node - linkType: hard - -"require-directory@npm:^2.1.1": - version: 2.1.1 - resolution: "require-directory@npm:2.1.1" - checksum: fb47e70bf0001fdeabdc0429d431863e9475e7e43ea5f94ad86503d918423c1543361cc5166d713eaa7029dd7a3d34775af04764bebff99ef413111a5af18c80 - languageName: node - linkType: hard - -"resolve-cwd@npm:^3.0.0": - version: 3.0.0 - resolution: "resolve-cwd@npm:3.0.0" - dependencies: - resolve-from: ^5.0.0 - checksum: 546e0816012d65778e580ad62b29e975a642989108d9a3c5beabfb2304192fa3c9f9146fbdfe213563c6ff51975ae41bac1d3c6e047dd9572c94863a057b4d81 - languageName: node - linkType: hard - -"resolve-from@npm:^4.0.0": - version: 4.0.0 - resolution: "resolve-from@npm:4.0.0" - checksum: f4ba0b8494846a5066328ad33ef8ac173801a51739eb4d63408c847da9a2e1c1de1e6cbbf72699211f3d13f8fc1325648b169bd15eb7da35688e30a5fb0e4a7f - languageName: node - linkType: hard - -"resolve-from@npm:^5.0.0": - version: 5.0.0 - resolution: "resolve-from@npm:5.0.0" - checksum: 4ceeb9113e1b1372d0cd969f3468fa042daa1dd9527b1b6bb88acb6ab55d8b9cd65dbf18819f9f9ddf0db804990901dcdaade80a215e7b2c23daae38e64f5bdf - languageName: node - linkType: hard - -"resolve.exports@npm:^1.1.0": - version: 1.1.1 - resolution: "resolve.exports@npm:1.1.1" - checksum: 485aa10082eb388a569d696e17ad7b16f4186efc97dd34eadd029d95b811f21ffee13b1b733198bb4584dbb3cb296aa6f141835221fb7613b9606b84f1386655 - languageName: node - linkType: hard - -"resolve.exports@npm:^2.0.0": - version: 2.0.1 - resolution: "resolve.exports@npm:2.0.1" - checksum: 03be177026b4fe8dc1b2ffb421bce9cbf7fe3446e9f0c958df9fc8e144864b3eeea19fe788e057fd8be6b5655e65ce245b4f379258c1336e2e8f9205cbd4a9b4 - languageName: node - linkType: hard - -"resolve@npm:^1.20.0, resolve@npm:^1.22.1": - version: 1.22.1 - resolution: "resolve@npm:1.22.1" - dependencies: - is-core-module: ^2.9.0 - path-parse: ^1.0.7 - supports-preserve-symlinks-flag: ^1.0.0 - bin: - resolve: bin/resolve - checksum: 07af5fc1e81aa1d866cbc9e9460fbb67318a10fa3c4deadc35c3ad8a898ee9a71a86a65e4755ac3195e0ea0cfbe201eb323ebe655ce90526fd61917313a34e4e - languageName: node - linkType: hard - -"resolve@npm:~1.19.0": - version: 1.19.0 - resolution: "resolve@npm:1.19.0" - dependencies: - is-core-module: ^2.1.0 - path-parse: ^1.0.6 - checksum: a05b356e47b85ad3613d9e2a39a824f3c27f4fcad9c9ff6c7cc71a2e314c5904a90ab37481ad0069d03cab9eaaac6eb68aca1bc3355fdb05f1045cd50e2aacea - languageName: node - linkType: hard - -"resolve@patch:resolve@^1.20.0#~builtin, resolve@patch:resolve@^1.22.1#~builtin": - version: 1.22.1 - resolution: "resolve@patch:resolve@npm%3A1.22.1#~builtin::version=1.22.1&hash=c3c19d" - dependencies: - is-core-module: ^2.9.0 - path-parse: ^1.0.7 - supports-preserve-symlinks-flag: ^1.0.0 - bin: - resolve: bin/resolve - checksum: 5656f4d0bedcf8eb52685c1abdf8fbe73a1603bb1160a24d716e27a57f6cecbe2432ff9c89c2bd57542c3a7b9d14b1882b73bfe2e9d7849c9a4c0b8b39f02b8b - languageName: node - linkType: hard - -"resolve@patch:resolve@~1.19.0#~builtin": - version: 1.19.0 - resolution: "resolve@patch:resolve@npm%3A1.19.0#~builtin::version=1.19.0&hash=c3c19d" - dependencies: - is-core-module: ^2.1.0 - path-parse: ^1.0.6 - checksum: 2443b94d347e6946c87c85faf13071f605e609e0b54784829b0ed2b917d050bfc1cbaf4ecc6453f224cfa7d0c5dcd97cbb273454cd210bee68e4af15c1a5abc9 - languageName: node - linkType: hard - -"retry@npm:^0.12.0": - version: 0.12.0 - resolution: "retry@npm:0.12.0" - checksum: 623bd7d2e5119467ba66202d733ec3c2e2e26568074923bc0585b6b99db14f357e79bdedb63cab56cec47491c4a0da7e6021a7465ca6dc4f481d3898fdd3158c - languageName: node - linkType: hard - -"reusify@npm:^1.0.4": - version: 1.0.4 - resolution: "reusify@npm:1.0.4" - checksum: c3076ebcc22a6bc252cb0b9c77561795256c22b757f40c0d8110b1300723f15ec0fc8685e8d4ea6d7666f36c79ccc793b1939c748bf36f18f542744a4e379fcc - languageName: node - linkType: hard - -"rimraf@npm:^3.0.0, rimraf@npm:^3.0.2": - version: 3.0.2 - resolution: "rimraf@npm:3.0.2" - dependencies: - glob: ^7.1.3 - bin: - rimraf: bin.js - checksum: 87f4164e396f0171b0a3386cc1877a817f572148ee13a7e113b238e48e8a9f2f31d009a92ec38a591ff1567d9662c6b67fd8818a2dbbaed74bc26a87a2a4a9a0 - languageName: node - linkType: hard - -"ripemd160@npm:^2.0.0, ripemd160@npm:^2.0.1, ripemd160@npm:^2.0.2": - version: 2.0.2 - resolution: "ripemd160@npm:2.0.2" - dependencies: - hash-base: ^3.0.0 - inherits: ^2.0.1 - checksum: 006accc40578ee2beae382757c4ce2908a826b27e2b079efdcd2959ee544ddf210b7b5d7d5e80467807604244e7388427330f5c6d4cd61e6edaddc5773ccc393 - languageName: node - linkType: hard - -"rlp@npm:^3.0.0": - version: 3.0.0 - resolution: "rlp@npm:3.0.0" - bin: - rlp: bin/rlp - checksum: d1d8003b2be0b25083d842571c0cdc3f2ed4f8b6cc2edf46239e240ba7f73b57ca419cea544394c38bd6b0125e728945af5b167370385d9462e04559b2332e69 - languageName: node - linkType: hard - -"rollup@npm:^3.18.0": - version: 3.19.1 - resolution: "rollup@npm:3.19.1" - dependencies: - fsevents: ~2.3.2 - dependenciesMeta: - fsevents: - optional: true - bin: - rollup: dist/bin/rollup - checksum: f78198c6de224b26650c70b16db156762d1fcceeb375d34fb2c76fc5b23a78f712c3c881d3248e6f277a511589e20d50c247bcf5c7920f1ddc0a43cadf9f0140 - languageName: node - linkType: hard - -"run-parallel@npm:^1.1.9": - version: 1.2.0 - resolution: "run-parallel@npm:1.2.0" - dependencies: - queue-microtask: ^1.2.2 - checksum: cb4f97ad25a75ebc11a8ef4e33bb962f8af8516bb2001082ceabd8902e15b98f4b84b4f8a9b222e5d57fc3bd1379c483886ed4619367a7680dad65316993021d - languageName: node - linkType: hard - -"safe-buffer@npm:^5.0.1, safe-buffer@npm:^5.1.1, safe-buffer@npm:^5.1.2, safe-buffer@npm:^5.2.0, safe-buffer@npm:~5.2.0": - version: 5.2.1 - resolution: "safe-buffer@npm:5.2.1" - checksum: b99c4b41fdd67a6aaf280fcd05e9ffb0813654894223afb78a31f14a19ad220bba8aba1cb14eddce1fcfb037155fe6de4e861784eb434f7d11ed58d1e70dd491 - languageName: node - linkType: hard - -"safer-buffer@npm:>= 2.1.2 < 3.0.0": - version: 2.1.2 - resolution: "safer-buffer@npm:2.1.2" - checksum: cab8f25ae6f1434abee8d80023d7e72b598cf1327164ddab31003c51215526801e40b66c5e65d658a0af1e9d6478cadcb4c745f4bd6751f97d8644786c0978b0 - languageName: node - linkType: hard - -"secp256k1@npm:^4.0.0": - version: 4.0.3 - resolution: "secp256k1@npm:4.0.3" - dependencies: - elliptic: ^6.5.4 - node-addon-api: ^2.0.0 - node-gyp: latest - node-gyp-build: ^4.2.0 - checksum: 21e219adc0024fbd75021001358780a3cc6ac21273c3fcaef46943af73969729709b03f1df7c012a0baab0830fb9a06ccc6b42f8d50050c665cb98078eab477b - languageName: node - linkType: hard - -"semver@npm:7.x, semver@npm:^7.3.5, semver@npm:^7.3.7, semver@npm:^7.3.8": - version: 7.3.8 - resolution: "semver@npm:7.3.8" - dependencies: - lru-cache: ^6.0.0 - bin: - semver: bin/semver.js - checksum: ba9c7cbbf2b7884696523450a61fee1a09930d888b7a8d7579025ad93d459b2d1949ee5bbfeb188b2be5f4ac163544c5e98491ad6152df34154feebc2cc337c1 - languageName: node - linkType: hard - -"semver@npm:^6.0.0, semver@npm:^6.3.0": - version: 6.3.0 - resolution: "semver@npm:6.3.0" - bin: - semver: ./bin/semver.js - checksum: 1b26ecf6db9e8292dd90df4e781d91875c0dcc1b1909e70f5d12959a23c7eebb8f01ea581c00783bbee72ceeaad9505797c381756326073850dc36ed284b21b9 - languageName: node - linkType: hard - -"set-blocking@npm:^2.0.0": - version: 2.0.0 - resolution: "set-blocking@npm:2.0.0" - checksum: 6e65a05f7cf7ebdf8b7c75b101e18c0b7e3dff4940d480efed8aad3a36a4005140b660fa1d804cb8bce911cac290441dc728084a30504d3516ac2ff7ad607b02 - languageName: node - linkType: hard - -"sha.js@npm:^2.4.0, sha.js@npm:^2.4.8": - version: 2.4.11 - resolution: "sha.js@npm:2.4.11" - dependencies: - inherits: ^2.0.1 - safe-buffer: ^5.0.1 - bin: - sha.js: ./bin.js - checksum: ebd3f59d4b799000699097dadb831c8e3da3eb579144fd7eb7a19484cbcbb7aca3c68ba2bb362242eb09e33217de3b4ea56e4678184c334323eca24a58e3ad07 - languageName: node - linkType: hard - -"sha256@npm:^0.2.0": - version: 0.2.0 - resolution: "sha256@npm:0.2.0" - dependencies: - convert-hex: ~0.1.0 - convert-string: ~0.1.0 - checksum: bed2d6507279e34ad2c517d18fbe871900244aca425a298d6ba10115e9beb49a8028296aeff5441b6db4902503a47198138e23ba1be440761a84288c93101ca1 - languageName: node - linkType: hard - -"sha3@npm:^2.1.4": - version: 2.1.4 - resolution: "sha3@npm:2.1.4" - dependencies: - buffer: 6.0.3 - checksum: fb49c8e18143cc46babc0e5d83d5f5d0149e645f26633a0e6a9aa2514df2ef91f10b6ece20da229e7ead8b8002d8e9514dcc747ef96a25b749294d6385c6f29f - languageName: node - linkType: hard - -"shebang-command@npm:^2.0.0": - version: 2.0.0 - resolution: "shebang-command@npm:2.0.0" - dependencies: - shebang-regex: ^3.0.0 - checksum: 6b52fe87271c12968f6a054e60f6bde5f0f3d2db483a1e5c3e12d657c488a15474121a1d55cd958f6df026a54374ec38a4a963988c213b7570e1d51575cea7fa - languageName: node - linkType: hard - -"shebang-regex@npm:^3.0.0": - version: 3.0.0 - resolution: "shebang-regex@npm:3.0.0" - checksum: 1a2bcae50de99034fcd92ad4212d8e01eedf52c7ec7830eedcf886622804fe36884278f2be8be0ea5fde3fd1c23911643a4e0f726c8685b61871c8908af01222 - languageName: node - linkType: hard - -"shiki@npm:^0.14.1": - version: 0.14.1 - resolution: "shiki@npm:0.14.1" - dependencies: - ansi-sequence-parser: ^1.1.0 - jsonc-parser: ^3.2.0 - vscode-oniguruma: ^1.7.0 - vscode-textmate: ^8.0.0 - checksum: b19ea337cc84da69d99ca39d109f82946e0c56c11cc4c67b3b91cc14a9479203365fd0c9e0dd87e908f493ab409dc6f1849175384b6ca593ce7da884ae1edca2 - languageName: node - linkType: hard - -"signal-exit@npm:^3.0.3, signal-exit@npm:^3.0.7": - version: 3.0.7 - resolution: "signal-exit@npm:3.0.7" - checksum: a2f098f247adc367dffc27845853e9959b9e88b01cb301658cfe4194352d8d2bb32e18467c786a7fe15f1d44b233ea35633d076d5e737870b7139949d1ab6318 - languageName: node - linkType: hard - -"sisteransi@npm:^1.0.5": - version: 1.0.5 - resolution: "sisteransi@npm:1.0.5" - checksum: aba6438f46d2bfcef94cf112c835ab395172c75f67453fe05c340c770d3c402363018ae1ab4172a1026a90c47eaccf3af7b6ff6fa749a680c2929bd7fa2b37a4 - languageName: node - linkType: hard - -"slash@npm:^3.0.0": - version: 3.0.0 - resolution: "slash@npm:3.0.0" - checksum: 94a93fff615f25a999ad4b83c9d5e257a7280c90a32a7cb8b4a87996e4babf322e469c42b7f649fd5796edd8687652f3fb452a86dc97a816f01113183393f11c - languageName: node - linkType: hard - -"smart-buffer@npm:^4.2.0": - version: 4.2.0 - resolution: "smart-buffer@npm:4.2.0" - checksum: b5167a7142c1da704c0e3af85c402002b597081dd9575031a90b4f229ca5678e9a36e8a374f1814c8156a725d17008ae3bde63b92f9cfd132526379e580bec8b - languageName: node - linkType: hard - -"socks-proxy-agent@npm:^7.0.0": - version: 7.0.0 - resolution: "socks-proxy-agent@npm:7.0.0" - dependencies: - agent-base: ^6.0.2 - debug: ^4.3.3 - socks: ^2.6.2 - checksum: 720554370154cbc979e2e9ce6a6ec6ced205d02757d8f5d93fe95adae454fc187a5cbfc6b022afab850a5ce9b4c7d73e0f98e381879cf45f66317a4895953846 - languageName: node - linkType: hard - -"socks@npm:^2.6.2": - version: 2.7.1 - resolution: "socks@npm:2.7.1" - dependencies: - ip: ^2.0.0 - smart-buffer: ^4.2.0 - checksum: 259d9e3e8e1c9809a7f5c32238c3d4d2a36b39b83851d0f573bfde5f21c4b1288417ce1af06af1452569cd1eb0841169afd4998f0e04ba04656f6b7f0e46d748 - languageName: node - linkType: hard - -"source-map-js@npm:^1.0.2": - version: 1.0.2 - resolution: "source-map-js@npm:1.0.2" - checksum: c049a7fc4deb9a7e9b481ae3d424cc793cb4845daa690bc5a05d428bf41bf231ced49b4cf0c9e77f9d42fdb3d20d6187619fc586605f5eabe995a316da8d377c - languageName: node - linkType: hard - -"source-map-support@npm:0.5.13": - version: 0.5.13 - resolution: "source-map-support@npm:0.5.13" - dependencies: - buffer-from: ^1.0.0 - source-map: ^0.6.0 - checksum: 933550047b6c1a2328599a21d8b7666507427c0f5ef5eaadd56b5da0fd9505e239053c66fe181bf1df469a3b7af9d775778eee283cbb7ae16b902ddc09e93a97 - languageName: node - linkType: hard - -"source-map-support@npm:^0.5.21": - version: 0.5.21 - resolution: "source-map-support@npm:0.5.21" - dependencies: - buffer-from: ^1.0.0 - source-map: ^0.6.0 - checksum: 43e98d700d79af1d36f859bdb7318e601dfc918c7ba2e98456118ebc4c4872b327773e5a1df09b0524e9e5063bb18f0934538eace60cca2710d1fa687645d137 - languageName: node - linkType: hard - -"source-map@npm:^0.6.0, source-map@npm:^0.6.1": - version: 0.6.1 - resolution: "source-map@npm:0.6.1" - checksum: 59ce8640cf3f3124f64ac289012c2b8bd377c238e316fb323ea22fbfe83da07d81e000071d7242cad7a23cd91c7de98e4df8830ec3f133cb6133a5f6e9f67bc2 - languageName: node - linkType: hard - -"spdx-exceptions@npm:^2.1.0": - version: 2.3.0 - resolution: "spdx-exceptions@npm:2.3.0" - checksum: cb69a26fa3b46305637123cd37c85f75610e8c477b6476fa7354eb67c08128d159f1d36715f19be6f9daf4b680337deb8c65acdcae7f2608ba51931540687ac0 - languageName: node - linkType: hard - -"spdx-expression-parse@npm:^3.0.1": - version: 3.0.1 - resolution: "spdx-expression-parse@npm:3.0.1" - dependencies: - spdx-exceptions: ^2.1.0 - spdx-license-ids: ^3.0.0 - checksum: a1c6e104a2cbada7a593eaa9f430bd5e148ef5290d4c0409899855ce8b1c39652bcc88a725259491a82601159d6dc790bedefc9016c7472f7de8de7361f8ccde - languageName: node - linkType: hard - -"spdx-license-ids@npm:^3.0.0": - version: 3.0.13 - resolution: "spdx-license-ids@npm:3.0.13" - checksum: 3469d85c65f3245a279fa11afc250c3dca96e9e847f2f79d57f466940c5bb8495da08a542646086d499b7f24a74b8d0b42f3fc0f95d50ff99af1f599f6360ad7 - languageName: node - linkType: hard - -"split@npm:0.3": - version: 0.3.3 - resolution: "split@npm:0.3.3" - dependencies: - through: 2 - checksum: 2e076634c9637cfdc54ab4387b6a243b8c33b360874a25adf6f327a5647f07cb3bf1c755d515248eb3afee4e382278d01f62c62d87263c118f28065b86f74f02 - languageName: node - linkType: hard - -"sprintf-js@npm:~1.0.2": - version: 1.0.3 - resolution: "sprintf-js@npm:1.0.3" - checksum: 19d79aec211f09b99ec3099b5b2ae2f6e9cdefe50bc91ac4c69144b6d3928a640bb6ae5b3def70c2e85a2c3d9f5ec2719921e3a59d3ca3ef4b2fd1a4656a0df3 - languageName: node - linkType: hard - -"ssri@npm:^9.0.0": - version: 9.0.1 - resolution: "ssri@npm:9.0.1" - dependencies: - minipass: ^3.1.1 - checksum: fb58f5e46b6923ae67b87ad5ef1c5ab6d427a17db0bead84570c2df3cd50b4ceb880ebdba2d60726588272890bae842a744e1ecce5bd2a2a582fccd5068309eb - languageName: node - linkType: hard - -"stack-utils@npm:^2.0.3": - version: 2.0.6 - resolution: "stack-utils@npm:2.0.6" - dependencies: - escape-string-regexp: ^2.0.0 - checksum: 052bf4d25bbf5f78e06c1d5e67de2e088b06871fa04107ca8d3f0e9d9263326e2942c8bedee3545795fc77d787d443a538345eef74db2f8e35db3558c6f91ff7 - languageName: node - linkType: hard - -"stream-combiner@npm:~0.0.4": - version: 0.0.4 - resolution: "stream-combiner@npm:0.0.4" - dependencies: - duplexer: ~0.1.1 - checksum: 844b622cfe8b9de45a6007404f613b60aaf85200ab9862299066204242f89a7c8033b1c356c998aa6cfc630f6cd9eba119ec1c6dc1f93e245982be4a847aee7d - languageName: node - linkType: hard - -"string-argv@npm:^0.3.1": - version: 0.3.1 - resolution: "string-argv@npm:0.3.1" - checksum: efbd0289b599bee808ce80820dfe49c9635610715429c6b7cc50750f0437e3c2f697c81e5c390208c13b5d5d12d904a1546172a88579f6ee5cbaaaa4dc9ec5cf - languageName: node - linkType: hard - -"string-length@npm:^4.0.1": - version: 4.0.2 - resolution: "string-length@npm:4.0.2" - dependencies: - char-regex: ^1.0.2 - strip-ansi: ^6.0.0 - checksum: ce85533ef5113fcb7e522bcf9e62cb33871aa99b3729cec5595f4447f660b0cefd542ca6df4150c97a677d58b0cb727a3fe09ac1de94071d05526c73579bf505 - languageName: node - linkType: hard - -"string-width@npm:^1.0.2 || 2 || 3 || 4, string-width@npm:^4.1.0, string-width@npm:^4.2.0, string-width@npm:^4.2.3": - version: 4.2.3 - resolution: "string-width@npm:4.2.3" - dependencies: - emoji-regex: ^8.0.0 - is-fullwidth-code-point: ^3.0.0 - strip-ansi: ^6.0.1 - checksum: e52c10dc3fbfcd6c3a15f159f54a90024241d0f149cf8aed2982a2d801d2e64df0bf1dc351cf8e95c3319323f9f220c16e740b06faecd53e2462df1d2b5443fb - languageName: node - linkType: hard - -"string_decoder@npm:^1.1.1": - version: 1.3.0 - resolution: "string_decoder@npm:1.3.0" - dependencies: - safe-buffer: ~5.2.0 - checksum: 8417646695a66e73aefc4420eb3b84cc9ffd89572861fe004e6aeb13c7bc00e2f616247505d2dbbef24247c372f70268f594af7126f43548565c68c117bdeb56 - languageName: node - linkType: hard - -"strip-ansi@npm:^6.0.0, strip-ansi@npm:^6.0.1": - version: 6.0.1 - resolution: "strip-ansi@npm:6.0.1" - dependencies: - ansi-regex: ^5.0.1 - checksum: f3cd25890aef3ba6e1a74e20896c21a46f482e93df4a06567cebf2b57edabb15133f1f94e57434e0a958d61186087b1008e89c94875d019910a213181a14fc8c - languageName: node - linkType: hard - -"strip-bom@npm:^4.0.0": - version: 4.0.0 - resolution: "strip-bom@npm:4.0.0" - checksum: 9dbcfbaf503c57c06af15fe2c8176fb1bf3af5ff65003851a102749f875a6dbe0ab3b30115eccf6e805e9d756830d3e40ec508b62b3f1ddf3761a20ebe29d3f3 - languageName: node - linkType: hard - -"strip-final-newline@npm:^2.0.0": - version: 2.0.0 - resolution: "strip-final-newline@npm:2.0.0" - checksum: 69412b5e25731e1938184b5d489c32e340605bb611d6140344abc3421b7f3c6f9984b21dff296dfcf056681b82caa3bb4cc996a965ce37bcfad663e92eae9c64 - languageName: node - linkType: hard - -"strip-json-comments@npm:^3.1.0, strip-json-comments@npm:^3.1.1": - version: 3.1.1 - resolution: "strip-json-comments@npm:3.1.1" - checksum: 492f73e27268f9b1c122733f28ecb0e7e8d8a531a6662efbd08e22cccb3f9475e90a1b82cab06a392f6afae6d2de636f977e231296400d0ec5304ba70f166443 - languageName: node - linkType: hard - -"supports-color@npm:^5.3.0": - version: 5.5.0 - resolution: "supports-color@npm:5.5.0" - dependencies: - has-flag: ^3.0.0 - checksum: 95f6f4ba5afdf92f495b5a912d4abee8dcba766ae719b975c56c084f5004845f6f5a5f7769f52d53f40e21952a6d87411bafe34af4a01e65f9926002e38e1dac - languageName: node - linkType: hard - -"supports-color@npm:^7.0.0, supports-color@npm:^7.1.0": - version: 7.2.0 - resolution: "supports-color@npm:7.2.0" - dependencies: - has-flag: ^4.0.0 - checksum: 3dda818de06ebbe5b9653e07842d9479f3555ebc77e9a0280caf5a14fb877ffee9ed57007c3b78f5a6324b8dbeec648d9e97a24e2ed9fdb81ddc69ea07100f4a - languageName: node - linkType: hard - -"supports-color@npm:^8.0.0": - version: 8.1.1 - resolution: "supports-color@npm:8.1.1" - dependencies: - has-flag: ^4.0.0 - checksum: c052193a7e43c6cdc741eb7f378df605636e01ad434badf7324f17fb60c69a880d8d8fcdcb562cf94c2350e57b937d7425ab5b8326c67c2adc48f7c87c1db406 - languageName: node - linkType: hard - -"supports-hyperlinks@npm:^2.0.0": - version: 2.3.0 - resolution: "supports-hyperlinks@npm:2.3.0" - dependencies: - has-flag: ^4.0.0 - supports-color: ^7.0.0 - checksum: 9ee0de3c8ce919d453511b2b1588a8205bd429d98af94a01df87411391010fe22ca463f268c84b2ce2abad019dfff8452aa02806eeb5c905a8d7ad5c4f4c52b8 - languageName: node - linkType: hard - -"supports-preserve-symlinks-flag@npm:^1.0.0": - version: 1.0.0 - resolution: "supports-preserve-symlinks-flag@npm:1.0.0" - checksum: 53b1e247e68e05db7b3808b99b892bd36fb096e6fba213a06da7fab22045e97597db425c724f2bbd6c99a3c295e1e73f3e4de78592289f38431049e1277ca0ae - languageName: node - linkType: hard - -"tar@npm:^6.1.11, tar@npm:^6.1.2": - version: 6.1.13 - resolution: "tar@npm:6.1.13" - dependencies: - chownr: ^2.0.0 - fs-minipass: ^2.0.0 - minipass: ^4.0.0 - minizlib: ^2.1.1 - mkdirp: ^1.0.3 - yallist: ^4.0.0 - checksum: 8a278bed123aa9f53549b256a36b719e317c8b96fe86a63406f3c62887f78267cea9b22dc6f7007009738509800d4a4dccc444abd71d762287c90f35b002eb1c - languageName: node - linkType: hard - -"terminal-link@npm:^2.0.0": - version: 2.1.1 - resolution: "terminal-link@npm:2.1.1" - dependencies: - ansi-escapes: ^4.2.1 - supports-hyperlinks: ^2.0.0 - checksum: ce3d2cd3a438c4a9453947aa664581519173ea40e77e2534d08c088ee6dda449eabdbe0a76d2a516b8b73c33262fedd10d5270ccf7576ae316e3db170ce6562f - languageName: node - linkType: hard - -"test-exclude@npm:^6.0.0": - version: 6.0.0 - resolution: "test-exclude@npm:6.0.0" - dependencies: - "@istanbuljs/schema": ^0.1.2 - glob: ^7.1.4 - minimatch: ^3.0.4 - checksum: 3b34a3d77165a2cb82b34014b3aba93b1c4637a5011807557dc2f3da826c59975a5ccad765721c4648b39817e3472789f9b0fa98fc854c5c1c7a1e632aacdc28 - languageName: node - linkType: hard - -"text-table@npm:^0.2.0": - version: 0.2.0 - resolution: "text-table@npm:0.2.0" - checksum: b6937a38c80c7f84d9c11dd75e49d5c44f71d95e810a3250bd1f1797fc7117c57698204adf676b71497acc205d769d65c16ae8fa10afad832ae1322630aef10a - languageName: node - linkType: hard - -"through@npm:2, through@npm:~2.3, through@npm:~2.3.1": - version: 2.3.8 - resolution: "through@npm:2.3.8" - checksum: a38c3e059853c494af95d50c072b83f8b676a9ba2818dcc5b108ef252230735c54e0185437618596c790bbba8fcdaef5b290405981ffa09dce67b1f1bf190cbd - languageName: node - linkType: hard - -"tmpl@npm:1.0.5": - version: 1.0.5 - resolution: "tmpl@npm:1.0.5" - checksum: cd922d9b853c00fe414c5a774817be65b058d54a2d01ebb415840960406c669a0fc632f66df885e24cb022ec812739199ccbdb8d1164c3e513f85bfca5ab2873 - languageName: node - linkType: hard - -"to-fast-properties@npm:^2.0.0": - version: 2.0.0 - resolution: "to-fast-properties@npm:2.0.0" - checksum: be2de62fe58ead94e3e592680052683b1ec986c72d589e7b21e5697f8744cdbf48c266fa72f6c15932894c10187b5f54573a3bcf7da0bfd964d5caf23d436168 - languageName: node - linkType: hard - -"to-regex-range@npm:^5.0.1": - version: 5.0.1 - resolution: "to-regex-range@npm:5.0.1" - dependencies: - is-number: ^7.0.0 - checksum: f76fa01b3d5be85db6a2a143e24df9f60dd047d151062d0ba3df62953f2f697b16fe5dad9b0ac6191c7efc7b1d9dcaa4b768174b7b29da89d4428e64bc0a20ed - languageName: node - linkType: hard - -"ts-essentials@npm:^7.0.3": - version: 7.0.3 - resolution: "ts-essentials@npm:7.0.3" - peerDependencies: - typescript: ">=3.7.0" - checksum: 74d75868acf7f8b95e447d8b3b7442ca21738c6894e576df9917a352423fde5eb43c5651da5f78997da6061458160ae1f6b279150b42f47ccc58b73e55acaa2f - languageName: node - linkType: hard - -"ts-jest@npm:28.0.7": - version: 28.0.7 - resolution: "ts-jest@npm:28.0.7" - dependencies: - bs-logger: 0.x - fast-json-stable-stringify: 2.x - jest-util: ^28.0.0 - json5: ^2.2.1 - lodash.memoize: 4.x - make-error: 1.x - semver: 7.x - yargs-parser: ^21.0.1 - peerDependencies: - "@babel/core": ">=7.0.0-beta.0 <8" - "@jest/types": ^28.0.0 - babel-jest: ^28.0.0 - jest: ^28.0.0 - typescript: ">=4.3" - peerDependenciesMeta: - "@babel/core": - optional: true - "@jest/types": - optional: true - babel-jest: - optional: true - esbuild: - optional: true - bin: - ts-jest: cli.js - checksum: be6ad6382e3b2e7b0c45d06616a4a02aeb6815bad2026fe8eeb4e0941205faa50ac3f5930adb7ba2fda5fea6a5739bfa507e2eac8764d2c729ddc8010681707a - languageName: node - linkType: hard - -"ts-jest@npm:^28.0.7": - version: 28.0.8 - resolution: "ts-jest@npm:28.0.8" - dependencies: - bs-logger: 0.x - fast-json-stable-stringify: 2.x - jest-util: ^28.0.0 - json5: ^2.2.1 - lodash.memoize: 4.x - make-error: 1.x - semver: 7.x - yargs-parser: ^21.0.1 - peerDependencies: - "@babel/core": ">=7.0.0-beta.0 <8" - "@jest/types": ^28.0.0 - babel-jest: ^28.0.0 - jest: ^28.0.0 - typescript: ">=4.3" - peerDependenciesMeta: - "@babel/core": - optional: true - "@jest/types": - optional: true - babel-jest: - optional: true - esbuild: - optional: true - bin: - ts-jest: cli.js - checksum: c72e9292709e77ce47ac7813cb24feaa9d01dc983598d29a821f224b5cc190dc7d67e17379cef089095404c00b9d582ee91c727916f9ec289cb1b723df408ae3 - languageName: node - linkType: hard - -"ts-jest@npm:^29.0.5": - version: 29.0.5 - resolution: "ts-jest@npm:29.0.5" - dependencies: - bs-logger: 0.x - fast-json-stable-stringify: 2.x - jest-util: ^29.0.0 - json5: ^2.2.3 - lodash.memoize: 4.x - make-error: 1.x - semver: 7.x - yargs-parser: ^21.0.1 - peerDependencies: - "@babel/core": ">=7.0.0-beta.0 <8" - "@jest/types": ^29.0.0 - babel-jest: ^29.0.0 - jest: ^29.0.0 - typescript: ">=4.3" - peerDependenciesMeta: - "@babel/core": - optional: true - "@jest/types": - optional: true - babel-jest: - optional: true - esbuild: - optional: true - bin: - ts-jest: cli.js - checksum: f60f129c2287f4c963d9ee2677132496c5c5a5d39c27ad234199a1140c26318a7d5bda34890ab0e30636ec42a8de28f84487c09e9dcec639c9c67812b3a38373 - languageName: node - linkType: hard - -"ts-node@npm:^10.9.1": - version: 10.9.1 - resolution: "ts-node@npm:10.9.1" - dependencies: - "@cspotcode/source-map-support": ^0.8.0 - "@tsconfig/node10": ^1.0.7 - "@tsconfig/node12": ^1.0.7 - "@tsconfig/node14": ^1.0.0 - "@tsconfig/node16": ^1.0.2 - acorn: ^8.4.1 - acorn-walk: ^8.1.1 - arg: ^4.1.0 - create-require: ^1.1.0 - diff: ^4.0.1 - make-error: ^1.1.1 - v8-compile-cache-lib: ^3.0.1 - yn: 3.1.1 - peerDependencies: - "@swc/core": ">=1.2.50" - "@swc/wasm": ">=1.2.50" - "@types/node": "*" - typescript: ">=2.7" - peerDependenciesMeta: - "@swc/core": - optional: true - "@swc/wasm": - optional: true - bin: - ts-node: dist/bin.js - ts-node-cwd: dist/bin-cwd.js - ts-node-esm: dist/bin-esm.js - ts-node-script: dist/bin-script.js - ts-node-transpile-only: dist/bin-transpile.js - ts-script: dist/bin-script-deprecated.js - checksum: 090adff1302ab20bd3486e6b4799e90f97726ed39e02b39e566f8ab674fd5bd5f727f43615debbfc580d33c6d9d1c6b1b3ce7d8e3cca3e20530a145ffa232c35 - languageName: node - linkType: hard - -"tsc-watch@npm:^6.0.0": - version: 6.0.0 - resolution: "tsc-watch@npm:6.0.0" - dependencies: - cross-spawn: ^7.0.3 - node-cleanup: ^2.1.2 - ps-tree: ^1.2.0 - string-argv: ^0.3.1 - peerDependencies: - typescript: "*" - bin: - tsc-watch: dist/lib/tsc-watch.js - checksum: 34e74a703ecb28689d0f6ba311781ff68be47f5f095439654b095f3ea4a5921708fca61b5727e33527639a9a147b42d10bc3fe3595afee92b41b2bacfba06043 - languageName: node - linkType: hard - -"tslib@npm:^1.8.1": - version: 1.14.1 - resolution: "tslib@npm:1.14.1" - checksum: dbe628ef87f66691d5d2959b3e41b9ca0045c3ee3c7c7b906cc1e328b39f199bb1ad9e671c39025bd56122ac57dfbf7385a94843b1cc07c60a4db74795829acd - languageName: node - linkType: hard - -"tslib@npm:^2.4.0, tslib@npm:^2.5.0": - version: 2.5.0 - resolution: "tslib@npm:2.5.0" - checksum: ae3ed5f9ce29932d049908ebfdf21b3a003a85653a9a140d614da6b767a93ef94f460e52c3d787f0e4f383546981713f165037dc2274df212ea9f8a4541004e1 - languageName: node - linkType: hard - -"tsutils@npm:^3.21.0": - version: 3.21.0 - resolution: "tsutils@npm:3.21.0" - dependencies: - tslib: ^1.8.1 - peerDependencies: - typescript: ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" - checksum: 1843f4c1b2e0f975e08c4c21caa4af4f7f65a12ac1b81b3b8489366826259323feb3fc7a243123453d2d1a02314205a7634e048d4a8009921da19f99755cdc48 - languageName: node - linkType: hard - -"type-check@npm:^0.4.0, type-check@npm:~0.4.0": - version: 0.4.0 - resolution: "type-check@npm:0.4.0" - dependencies: - prelude-ls: ^1.2.1 - checksum: ec688ebfc9c45d0c30412e41ca9c0cdbd704580eb3a9ccf07b9b576094d7b86a012baebc95681999dd38f4f444afd28504cb3a89f2ef16b31d4ab61a0739025a - languageName: node - linkType: hard - -"type-detect@npm:4.0.8": - version: 4.0.8 - resolution: "type-detect@npm:4.0.8" - checksum: 62b5628bff67c0eb0b66afa371bd73e230399a8d2ad30d852716efcc4656a7516904570cd8631a49a3ce57c10225adf5d0cbdcb47f6b0255fe6557c453925a15 - languageName: node - linkType: hard - -"type-fest@npm:^0.20.2": - version: 0.20.2 - resolution: "type-fest@npm:0.20.2" - checksum: 4fb3272df21ad1c552486f8a2f8e115c09a521ad7a8db3d56d53718d0c907b62c6e9141ba5f584af3f6830d0872c521357e512381f24f7c44acae583ad517d73 - languageName: node - linkType: hard - -"type-fest@npm:^0.21.3": - version: 0.21.3 - resolution: "type-fest@npm:0.21.3" - checksum: e6b32a3b3877f04339bae01c193b273c62ba7bfc9e325b8703c4ee1b32dc8fe4ef5dfa54bf78265e069f7667d058e360ae0f37be5af9f153b22382cd55a9afe0 - languageName: node - linkType: hard - -"typedoc@npm:^0.23.26": - version: 0.23.27 - resolution: "typedoc@npm:0.23.27" - dependencies: - lunr: ^2.3.9 - marked: ^4.2.12 - minimatch: ^7.1.3 - shiki: ^0.14.1 - peerDependencies: - typescript: 4.6.x || 4.7.x || 4.8.x || 4.9.x - bin: - typedoc: bin/typedoc - checksum: 1ddcccf0b839c708a37d18b6dc1ab57ace6e177daf8f0442ff60d6e72c23ecbd78b0e602f0e1e553c7cb0254e0c769afff7c24c58683e564a7a07a2469cf99a5 - languageName: node - linkType: hard - -"typescript@npm:^4.9.5": - version: 4.9.5 - resolution: "typescript@npm:4.9.5" - bin: - tsc: bin/tsc - tsserver: bin/tsserver - checksum: ee000bc26848147ad423b581bd250075662a354d84f0e06eb76d3b892328d8d4440b7487b5a83e851b12b255f55d71835b008a66cbf8f255a11e4400159237db - languageName: node - linkType: hard - -"typescript@patch:typescript@^4.9.5#~builtin": - version: 4.9.5 - resolution: "typescript@patch:typescript@npm%3A4.9.5#~builtin::version=4.9.5&hash=23ec76" - bin: - tsc: bin/tsc - tsserver: bin/tsserver - checksum: ab417a2f398380c90a6cf5a5f74badd17866adf57f1165617d6a551f059c3ba0a3e4da0d147b3ac5681db9ac76a303c5876394b13b3de75fdd5b1eaa06181c9d - languageName: node - linkType: hard - -"unique-filename@npm:^2.0.0": - version: 2.0.1 - resolution: "unique-filename@npm:2.0.1" - dependencies: - unique-slug: ^3.0.0 - checksum: 807acf3381aff319086b64dc7125a9a37c09c44af7620bd4f7f3247fcd5565660ac12d8b80534dcbfd067e6fe88a67e621386dd796a8af828d1337a8420a255f - languageName: node - linkType: hard - -"unique-slug@npm:^3.0.0": - version: 3.0.0 - resolution: "unique-slug@npm:3.0.0" - dependencies: - imurmurhash: ^0.1.4 - checksum: 49f8d915ba7f0101801b922062ee46b7953256c93ceca74303bd8e6413ae10aa7e8216556b54dc5382895e8221d04f1efaf75f945c2e4a515b4139f77aa6640c - languageName: node - linkType: hard - -"update-browserslist-db@npm:^1.0.10": - version: 1.0.10 - resolution: "update-browserslist-db@npm:1.0.10" - dependencies: - escalade: ^3.1.1 - picocolors: ^1.0.0 - peerDependencies: - browserslist: ">= 4.21.0" - bin: - browserslist-lint: cli.js - checksum: 12db73b4f63029ac407b153732e7cd69a1ea8206c9100b482b7d12859cd3cd0bc59c602d7ae31e652706189f1acb90d42c53ab24a5ba563ed13aebdddc5561a0 - languageName: node - linkType: hard - -"uri-js@npm:^4.2.2": - version: 4.4.1 - resolution: "uri-js@npm:4.4.1" - dependencies: - punycode: ^2.1.0 - checksum: 7167432de6817fe8e9e0c9684f1d2de2bb688c94388f7569f7dbdb1587c9f4ca2a77962f134ec90be0cc4d004c939ff0d05acc9f34a0db39a3c797dada262633 - languageName: node - linkType: hard - -"util-deprecate@npm:^1.0.1": - version: 1.0.2 - resolution: "util-deprecate@npm:1.0.2" - checksum: 474acf1146cb2701fe3b074892217553dfcf9a031280919ba1b8d651a068c9b15d863b7303cb15bd00a862b498e6cf4ad7b4a08fb134edd5a6f7641681cb54a2 - languageName: node - linkType: hard - -"uuid@npm:^9.0.0": - version: 9.0.0 - resolution: "uuid@npm:9.0.0" - bin: - uuid: dist/bin/uuid - checksum: 8dd2c83c43ddc7e1c71e36b60aea40030a6505139af6bee0f382ebcd1a56f6cd3028f7f06ffb07f8cf6ced320b76aea275284b224b002b289f89fe89c389b028 - languageName: node - linkType: hard - -"v8-compile-cache-lib@npm:^3.0.1": - version: 3.0.1 - resolution: "v8-compile-cache-lib@npm:3.0.1" - checksum: 78089ad549e21bcdbfca10c08850022b22024cdcc2da9b168bcf5a73a6ed7bf01a9cebb9eac28e03cd23a684d81e0502797e88f3ccd27a32aeab1cfc44c39da0 - languageName: node - linkType: hard - -"v8-to-istanbul@npm:^9.0.1": - version: 9.1.0 - resolution: "v8-to-istanbul@npm:9.1.0" - dependencies: - "@jridgewell/trace-mapping": ^0.3.12 - "@types/istanbul-lib-coverage": ^2.0.1 - convert-source-map: ^1.6.0 - checksum: 2069d59ee46cf8d83b4adfd8a5c1a90834caffa9f675e4360f1157ffc8578ef0f763c8f32d128334424159bb6b01f3876acd39cd13297b2769405a9da241f8d1 - languageName: node - linkType: hard - -"viem@npm:^0.1.15": - version: 0.1.21 - resolution: "viem@npm:0.1.21" - dependencies: - "@noble/hashes": ^1.1.2 - "@noble/secp256k1": ^1.7.1 - "@wagmi/chains": ~0.2.11 - abitype: ~0.7.1 - idna-uts46-hx: ^4.1.2 - isomorphic-ws: ^5.0.0 - ws: ^8.12.0 - checksum: ae7575d40db8e1f128c8f979ea550ece86444a0a198e7301a2b018b95d67942674a87752092982c1f036aae4355eb23682baf05dfb9464d7fa5c68c59db41a17 - languageName: node - linkType: hard - -"vite@npm:^4.1.4": - version: 4.2.0 - resolution: "vite@npm:4.2.0" - dependencies: - esbuild: ^0.17.5 - fsevents: ~2.3.2 - postcss: ^8.4.21 - resolve: ^1.22.1 - rollup: ^3.18.0 - peerDependencies: - "@types/node": ">= 14" - less: "*" - sass: "*" - stylus: "*" - sugarss: "*" - terser: ^5.4.0 - dependenciesMeta: - fsevents: - optional: true - peerDependenciesMeta: - "@types/node": - optional: true - less: - optional: true - sass: - optional: true - stylus: - optional: true - sugarss: - optional: true - terser: - optional: true - bin: - vite: bin/vite.js - checksum: 1088cdc0c89ab835aab07a0a114397b749e8dfb20f4b94241ba179d9c371b72d31e13782b22893860c3d65da596e43b24fce5e023f79cfde427f42549f2e1844 - languageName: node - linkType: hard - -"vscode-oniguruma@npm:^1.7.0": - version: 1.7.0 - resolution: "vscode-oniguruma@npm:1.7.0" - checksum: 53519d91d90593e6fb080260892e87d447e9b200c4964d766772b5053f5699066539d92100f77f1302c91e8fc5d9c772fbe40fe4c90f3d411a96d5a9b1e63f42 - languageName: node - linkType: hard - -"vscode-textmate@npm:^8.0.0": - version: 8.0.0 - resolution: "vscode-textmate@npm:8.0.0" - checksum: 127780dfea89559d70b8326df6ec344cfd701312dd7f3f591a718693812b7852c30b6715e3cfc8b3200a4e2515b4c96f0843c0eacc0a3020969b5de262c2a4bb - languageName: node - linkType: hard - -"walker@npm:^1.0.8": - version: 1.0.8 - resolution: "walker@npm:1.0.8" - dependencies: - makeerror: 1.0.12 - checksum: ad7a257ea1e662e57ef2e018f97b3c02a7240ad5093c392186ce0bcf1f1a60bbadd520d073b9beb921ed99f64f065efb63dfc8eec689a80e569f93c1c5d5e16c - languageName: node - linkType: hard - -"which@npm:^2.0.1, which@npm:^2.0.2": - version: 2.0.2 - resolution: "which@npm:2.0.2" - dependencies: - isexe: ^2.0.0 - bin: - node-which: ./bin/node-which - checksum: 1a5c563d3c1b52d5f893c8b61afe11abc3bab4afac492e8da5bde69d550de701cf9806235f20a47b5c8fa8a1d6a9135841de2596535e998027a54589000e66d1 - languageName: node - linkType: hard - -"wide-align@npm:^1.1.5": - version: 1.1.5 - resolution: "wide-align@npm:1.1.5" - dependencies: - string-width: ^1.0.2 || 2 || 3 || 4 - checksum: d5fc37cd561f9daee3c80e03b92ed3e84d80dde3365a8767263d03dacfc8fa06b065ffe1df00d8c2a09f731482fcacae745abfbb478d4af36d0a891fad4834d3 - languageName: node - linkType: hard - -"word-wrap@npm:^1.2.3": - version: 1.2.3 - resolution: "word-wrap@npm:1.2.3" - checksum: 30b48f91fcf12106ed3186ae4fa86a6a1842416df425be7b60485de14bec665a54a68e4b5156647dec3a70f25e84d270ca8bc8cd23182ed095f5c7206a938c1f - languageName: node - linkType: hard - -"wrap-ansi@npm:^7.0.0": - version: 7.0.0 - resolution: "wrap-ansi@npm:7.0.0" - dependencies: - ansi-styles: ^4.0.0 - string-width: ^4.1.0 - strip-ansi: ^6.0.0 - checksum: a790b846fd4505de962ba728a21aaeda189b8ee1c7568ca5e817d85930e06ef8d1689d49dbf0e881e8ef84436af3a88bc49115c2e2788d841ff1b8b5b51a608b - languageName: node - linkType: hard - -"wrappy@npm:1": - version: 1.0.2 - resolution: "wrappy@npm:1.0.2" - checksum: 159da4805f7e84a3d003d8841557196034155008f817172d4e986bd591f74aa82aa7db55929a54222309e01079a65a92a9e6414da5a6aa4b01ee44a511ac3ee5 - languageName: node - linkType: hard - -"write-file-atomic@npm:^4.0.1, write-file-atomic@npm:^4.0.2": - version: 4.0.2 - resolution: "write-file-atomic@npm:4.0.2" - dependencies: - imurmurhash: ^0.1.4 - signal-exit: ^3.0.7 - checksum: 5da60bd4eeeb935eec97ead3df6e28e5917a6bd317478e4a85a5285e8480b8ed96032bbcc6ecd07b236142a24f3ca871c924ec4a6575e623ec1b11bf8c1c253c - languageName: node - linkType: hard - -"ws@npm:^8.12.0, ws@npm:^8.13.0": - version: 8.13.0 - resolution: "ws@npm:8.13.0" - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: ">=5.0.2" - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - checksum: 53e991bbf928faf5dc6efac9b8eb9ab6497c69feeb94f963d648b7a3530a720b19ec2e0ec037344257e05a4f35bd9ad04d9de6f289615ffb133282031b18c61c - languageName: node - linkType: hard - -"y18n@npm:^5.0.5": - version: 5.0.8 - resolution: "y18n@npm:5.0.8" - checksum: 54f0fb95621ee60898a38c572c515659e51cc9d9f787fb109cef6fde4befbe1c4602dc999d30110feee37456ad0f1660fa2edcfde6a9a740f86a290999550d30 - languageName: node - linkType: hard - -"yallist@npm:^3.0.2": - version: 3.1.1 - resolution: "yallist@npm:3.1.1" - checksum: 48f7bb00dc19fc635a13a39fe547f527b10c9290e7b3e836b9a8f1ca04d4d342e85714416b3c2ab74949c9c66f9cebb0473e6bc353b79035356103b47641285d - languageName: node - linkType: hard - -"yallist@npm:^4.0.0": - version: 4.0.0 - resolution: "yallist@npm:4.0.0" - checksum: 343617202af32df2a15a3be36a5a8c0c8545208f3d3dfbc6bb7c3e3b7e8c6f8e7485432e4f3b88da3031a6e20afa7c711eded32ddfb122896ac5d914e75848d5 - languageName: node - linkType: hard - -"yargs-parser@npm:^21.0.1, yargs-parser@npm:^21.1.1": - version: 21.1.1 - resolution: "yargs-parser@npm:21.1.1" - checksum: ed2d96a616a9e3e1cc7d204c62ecc61f7aaab633dcbfab2c6df50f7f87b393993fe6640d017759fe112d0cb1e0119f2b4150a87305cc873fd90831c6a58ccf1c - languageName: node - linkType: hard - -"yargs@npm:^17.3.1": - version: 17.7.1 - resolution: "yargs@npm:17.7.1" - 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.5 - yargs-parser: ^21.1.1 - checksum: 3d8a43c336a4942bc68080768664aca85c7bd406f018bad362fd255c41c8f4e650277f42fd65d543fce99e084124ddafee7bbfc1a5c6a8fda4cec78609dcf8d4 - languageName: node - linkType: hard - -"yn@npm:3.1.1": - version: 3.1.1 - resolution: "yn@npm:3.1.1" - checksum: 2c487b0e149e746ef48cda9f8bad10fc83693cd69d7f9dcd8be4214e985de33a29c9e24f3c0d6bcf2288427040a8947406ab27f7af67ee9456e6b84854f02dd6 - languageName: node - linkType: hard - -"yocto-queue@npm:^0.1.0": - version: 0.1.0 - resolution: "yocto-queue@npm:0.1.0" - checksum: f77b3d8d00310def622123df93d4ee654fc6a0096182af8bd60679ddcdfb3474c56c6c7190817c84a2785648cdee9d721c0154eb45698c62176c322fb46fc700 - languageName: node - linkType: hard From 20219b2b7850d73d18c261570244b67ddf5744d7 Mon Sep 17 00:00:00 2001 From: PhilWindle Date: Tue, 21 Mar 2023 15:42:35 +0000 Subject: [PATCH 25/36] WIP --- bootstrap.sh | 3 +- yarn-project/archiver/package.json | 6 +- .../src/{ => archiver}/archiver.test.ts | 0 .../archiver/src/{ => archiver}/archiver.ts | 12 +- yarn-project/archiver/src/archiver/index.ts | 1 + .../archiver/src/block_downloader/index.ts | 1 + .../block_downloader}/l2_block_downloader.ts | 7 +- yarn-project/archiver/src/index.ts | 7 +- yarn-project/archiver/src/l2_block/index.ts | 2 + .../src/{ => l2_block}/l2_block_source.ts | 2 +- .../src/movetofoundation/log/console.ts | 18 - .../src/movetofoundation/log/debug.ts | 39 - .../src/movetofoundation/log/index.ts | 3 - .../movetofoundation/log/log_history.test.ts | 87 - .../src/movetofoundation/log/log_history.ts | 22 - yarn-project/archiver/src/running_promise.ts | 56 - .../src/indexed_tree/indexed_tree.test.ts | 1 + .../src/standard_tree/standard_tree.test.ts | 1 + .../merkle-tree/src/test/test_suite.ts | 17 +- yarn-project/p2p/package.json | 4 +- yarn-project/p2p/src/index.ts | 4 +- yarn-project/p2p/src/memory_p2p_client.ts | 4 +- yarn-project/p2p/src/tx.ts | 2 +- yarn-project/p2p/tsconfig.dest.json | 10 +- yarn-project/p2p/tsconfig.json | 14 +- yarn-project/package.json | 2 +- yarn-project/world-state/package.json | 4 +- yarn-project/world-state/src/index.ts | 2 - yarn-project/world-state/src/memory_fifo.ts | 103 - yarn-project/world-state/src/semaphore.ts | 26 - yarn-project/world-state/src/serial_queue.ts | 67 - yarn-project/world-state/src/sleep.ts | 43 - .../server_world_state_synchroniser.test.ts | 33 +- .../server_world_state_synchroniser.ts | 4 +- .../world-state-db/memory_world_state_db.ts | 2 +- yarn-project/world-state/tsconfig.dest.json | 7 +- yarn-project/world-state/tsconfig.json | 9 +- yarn-project/yarn.lock | 7176 +++++++++++++++++ 38 files changed, 7249 insertions(+), 552 deletions(-) rename yarn-project/archiver/src/{ => archiver}/archiver.test.ts (100%) rename yarn-project/archiver/src/{ => archiver}/archiver.ts (95%) create mode 100644 yarn-project/archiver/src/archiver/index.ts create mode 100644 yarn-project/archiver/src/block_downloader/index.ts rename yarn-project/{world-state/src => archiver/src/block_downloader}/l2_block_downloader.ts (89%) create mode 100644 yarn-project/archiver/src/l2_block/index.ts rename yarn-project/archiver/src/{ => l2_block}/l2_block_source.ts (95%) delete mode 100644 yarn-project/archiver/src/movetofoundation/log/console.ts delete mode 100644 yarn-project/archiver/src/movetofoundation/log/debug.ts delete mode 100644 yarn-project/archiver/src/movetofoundation/log/index.ts delete mode 100644 yarn-project/archiver/src/movetofoundation/log/log_history.test.ts delete mode 100644 yarn-project/archiver/src/movetofoundation/log/log_history.ts delete mode 100644 yarn-project/archiver/src/running_promise.ts delete mode 100644 yarn-project/world-state/src/memory_fifo.ts delete mode 100644 yarn-project/world-state/src/semaphore.ts delete mode 100644 yarn-project/world-state/src/serial_queue.ts delete mode 100644 yarn-project/world-state/src/sleep.ts create mode 100644 yarn-project/yarn.lock diff --git a/bootstrap.sh b/bootstrap.sh index ae07744d57b..c475148b908 100755 --- a/bootstrap.sh +++ b/bootstrap.sh @@ -50,10 +50,11 @@ PROJECTS=( # "yarn-project/circuit.js:yarn build" "yarn-project/archiver:yarn build" # "yarn-project/ethereum.js:yarn build" + "yarn-project/foundation:yarn build" # "yarn-project/kernel-simulator:yarn build" "yarn-project/key-store:yarn build" "yarn-project/merkle-tree:yarn build" - # "yarn-project/p2p:yarn build" + "yarn-project/p2p:yarn build" # "yarn-project/prover-client:yarn build" # "yarn-project/public-client:yarn build" # "yarn-project/sequencer-client:yarn build" diff --git a/yarn-project/archiver/package.json b/yarn-project/archiver/package.json index e521a28bcd6..3365eb23bc9 100644 --- a/yarn-project/archiver/package.json +++ b/yarn-project/archiver/package.json @@ -2,10 +2,7 @@ "name": "@aztec/archiver", "version": "0.0.0", "type": "module", - "exports": { - "./l2_block": "./dest/l2_block/l2_block.js", - "./l2_block_source": "./dest/l2_block_source.js" - }, + "exports": "./dest/index.js", "typedoc": { "entryPoint": "./src/index.ts", "displayName": "Archiver", @@ -29,6 +26,7 @@ "rootDir": "./src" }, "dependencies": { + "@aztec/foundation": "workspace:^", "debug": "^4.3.4", "tsc-watch": "^6.0.0", "tslib": "^2.5.0", diff --git a/yarn-project/archiver/src/archiver.test.ts b/yarn-project/archiver/src/archiver/archiver.test.ts similarity index 100% rename from yarn-project/archiver/src/archiver.test.ts rename to yarn-project/archiver/src/archiver/archiver.test.ts diff --git a/yarn-project/archiver/src/archiver.ts b/yarn-project/archiver/src/archiver/archiver.ts similarity index 95% rename from yarn-project/archiver/src/archiver.ts rename to yarn-project/archiver/src/archiver/archiver.ts index 8b4f590461c..01660a721aa 100644 --- a/yarn-project/archiver/src/archiver.ts +++ b/yarn-project/archiver/src/archiver/archiver.ts @@ -1,10 +1,10 @@ import { Address, PublicClient } from 'viem'; -import { rollupAbi } from './abis/rollup.js'; -import { yeeterAbi } from './abis/yeeter.js'; -import { ContractData, L2Block } from './l2_block/l2_block.js'; -import { randomAppendOnlyTreeSnapshot, randomBytes, randomContractData } from './l2_block/mocks.js'; -import { L2BlockSource, SyncStatus } from './l2_block_source.js'; -import { createLogger } from './movetofoundation/log/console.js'; +import { rollupAbi } from '../abis/rollup.js'; +import { yeeterAbi } from '../abis/yeeter.js'; +import { ContractData, L2Block } from '../l2_block/l2_block.js'; +import { randomAppendOnlyTreeSnapshot, randomBytes, randomContractData } from '../l2_block/mocks.js'; +import { L2BlockSource, SyncStatus } from '../l2_block/l2_block_source.js'; +import { createLogger } from '@aztec/foundation'; /** * Pulls L2 blocks in a non-blocking manner and provides interface for their retrieval. diff --git a/yarn-project/archiver/src/archiver/index.ts b/yarn-project/archiver/src/archiver/index.ts new file mode 100644 index 00000000000..661ac2ff02f --- /dev/null +++ b/yarn-project/archiver/src/archiver/index.ts @@ -0,0 +1 @@ +export * from './archiver.js'; diff --git a/yarn-project/archiver/src/block_downloader/index.ts b/yarn-project/archiver/src/block_downloader/index.ts new file mode 100644 index 00000000000..9084cc7d81a --- /dev/null +++ b/yarn-project/archiver/src/block_downloader/index.ts @@ -0,0 +1 @@ +export * from './l2_block_downloader.js'; diff --git a/yarn-project/world-state/src/l2_block_downloader.ts b/yarn-project/archiver/src/block_downloader/l2_block_downloader.ts similarity index 89% rename from yarn-project/world-state/src/l2_block_downloader.ts rename to yarn-project/archiver/src/block_downloader/l2_block_downloader.ts index 472d56f41eb..f72abbf79df 100644 --- a/yarn-project/world-state/src/l2_block_downloader.ts +++ b/yarn-project/archiver/src/block_downloader/l2_block_downloader.ts @@ -1,8 +1,5 @@ -import { L2Block } from '@aztec/archiver/l2_block'; -import { MemoryFifo } from './memory_fifo.js'; -import { Semaphore } from './semaphore.js'; -import { InterruptableSleep } from './sleep.js'; -import { L2BlockSource } from '@aztec/archiver/l2_block_source'; +import { InterruptableSleep, Semaphore, MemoryFifo } from '@aztec/foundation'; +import { L2BlockSource, L2Block } from '../index.js'; /** * Downloads L2 blocks from a L2BlockSource. diff --git a/yarn-project/archiver/src/index.ts b/yarn-project/archiver/src/index.ts index 343e570f15c..0bafa05fc41 100644 --- a/yarn-project/archiver/src/index.ts +++ b/yarn-project/archiver/src/index.ts @@ -1,6 +1,11 @@ import { createPublicClient, getAddress, http } from 'viem'; import { localhost } from 'viem/chains'; -import { Archiver } from './archiver.js'; +import { Archiver } from './archiver/archiver.js'; + +export * from './l2_block/l2_block_source.js'; +export * from './archiver/archiver.js'; +export * from './block_downloader/index.js'; +export * from './l2_block/index.js'; const { ETHEREUM_HOST = 'http://localhost:8545/', diff --git a/yarn-project/archiver/src/l2_block/index.ts b/yarn-project/archiver/src/l2_block/index.ts new file mode 100644 index 00000000000..2cc58517e00 --- /dev/null +++ b/yarn-project/archiver/src/l2_block/index.ts @@ -0,0 +1,2 @@ +export * from './l2_block.js'; +export * from './l2_block_source.js'; diff --git a/yarn-project/archiver/src/l2_block_source.ts b/yarn-project/archiver/src/l2_block/l2_block_source.ts similarity index 95% rename from yarn-project/archiver/src/l2_block_source.ts rename to yarn-project/archiver/src/l2_block/l2_block_source.ts index 4ada33cbd98..cb9f6aebf4e 100644 --- a/yarn-project/archiver/src/l2_block_source.ts +++ b/yarn-project/archiver/src/l2_block/l2_block_source.ts @@ -1,4 +1,4 @@ -import { L2Block } from './l2_block/l2_block.js'; +import { L2Block } from './index.js'; /** * Describes sync status of the archiver. diff --git a/yarn-project/archiver/src/movetofoundation/log/console.ts b/yarn-project/archiver/src/movetofoundation/log/console.ts deleted file mode 100644 index 0395ab5a2f5..00000000000 --- a/yarn-project/archiver/src/movetofoundation/log/console.ts +++ /dev/null @@ -1,18 +0,0 @@ -/* eslint-disable */ -export type Logger = (...args: any[]) => void; - -class ConsoleLogger { - constructor(private prefix: string, private logger: (...args: any[]) => void = console.log) {} - - public log(...args: any[]) { - this.logger(`${this.prefix}:`, ...args); - } -} - -export function createLogger(prefix: string): Logger { - if (prefix) { - const logger = new ConsoleLogger(prefix, console.log); - return (...args: any[]) => logger.log(...args); - } - return console.log; -} diff --git a/yarn-project/archiver/src/movetofoundation/log/debug.ts b/yarn-project/archiver/src/movetofoundation/log/debug.ts deleted file mode 100644 index 1e9733bb921..00000000000 --- a/yarn-project/archiver/src/movetofoundation/log/debug.ts +++ /dev/null @@ -1,39 +0,0 @@ -/* eslint-disable */ -import debug from 'debug'; - -let preLogHook: ((...args: any[]) => void) | undefined; -let postLogHook: ((...args: any[]) => void) | undefined; - -function theFunctionThroughWhichAllLogsPass(logger: any, ...args: any[]) { - if (!debug.enabled(logger.namespace)) { - return; - } - if (preLogHook) { - preLogHook(logger.namespace, ...args); - } - logger(...args); - if (postLogHook) { - postLogHook(logger.namespace, ...args); - } -} - -export function createDebugLogger(name: string) { - const logger = debug(name); - return (...args: any[]) => theFunctionThroughWhichAllLogsPass(logger, ...args); -} - -export function setPreDebugLogHook(fn: (...args: any[]) => void) { - preLogHook = fn; -} - -export function setPostDebugLogHook(fn: (...args: any[]) => void) { - postLogHook = fn; -} - -export function enableLogs(str: string) { - debug.enable(str); -} - -export function isLogEnabled(str: string) { - return debug.enabled(str); -} diff --git a/yarn-project/archiver/src/movetofoundation/log/index.ts b/yarn-project/archiver/src/movetofoundation/log/index.ts deleted file mode 100644 index 1705648184a..00000000000 --- a/yarn-project/archiver/src/movetofoundation/log/index.ts +++ /dev/null @@ -1,3 +0,0 @@ -export * from './console.js'; -export * from './debug.js'; -export * from './log_history.js'; diff --git a/yarn-project/archiver/src/movetofoundation/log/log_history.test.ts b/yarn-project/archiver/src/movetofoundation/log/log_history.test.ts deleted file mode 100644 index 62dc8c4ae6f..00000000000 --- a/yarn-project/archiver/src/movetofoundation/log/log_history.test.ts +++ /dev/null @@ -1,87 +0,0 @@ -import { jest } from '@jest/globals'; -import { createDebugLogger, enableLogs } from './debug.js'; -import { LogHistory } from './log_history.js'; - -jest.useFakeTimers(); - -describe('log history', () => { - let debug: (...any: any[]) => void; - let logHistory: LogHistory; - const timestemp = new Date().toISOString(); - const name = 'test:a'; - - beforeEach(() => { - debug = createDebugLogger(name); - enableLogs(name); - logHistory = new LogHistory(); - }); - - it('keeps debug logs', () => { - logHistory.enable(); - expect(logHistory.getLogs()).toEqual([]); - debug('0'); - debug('1', 2); - debug('2', { key: ['value'] }, Buffer.alloc(2)); - expect(logHistory.getLogs()).toEqual([ - [timestemp, name, '0'], - [timestemp, name, '1', 2], - [timestemp, name, '2', { key: ['value'] }, Buffer.alloc(2)], - ]); - }); - - it('does not keep logs if not enabled', () => { - debug('0'); - debug('1', 2); - expect(logHistory.getLogs()).toEqual([]); - }); - - it('returns last n logs', () => { - logHistory.enable(); - expect(logHistory.getLogs()).toEqual([]); - debug('0'); - debug('1'); - debug('2'); - debug('3'); - debug('4'); - expect(logHistory.getLogs(2)).toEqual([ - [timestemp, name, '3'], - [timestemp, name, '4'], - ]); - }); - - it('only keeps logs with enabled namespace', () => { - logHistory.enable(); - const name2 = 'test:b'; - const debug2 = createDebugLogger(name2); - debug('0'); - debug2('zero'); - expect(logHistory.getLogs()).toEqual([[timestemp, name, '0']]); - - enableLogs(`${name},${name2}`); - debug('1', 2); - debug2('one', 3); - expect(logHistory.getLogs()).toEqual([ - [timestemp, name, '0'], - [timestemp, name, '1', 2], - [timestemp, name2, 'one', 3], - ]); - }); - - it('clears all logs', () => { - logHistory.enable(); - debug('0'); - debug('1'); - debug('2'); - logHistory.clear(); - expect(logHistory.getLogs()).toEqual([]); - }); - - it('clears first n logs', () => { - logHistory.enable(); - debug('0'); - debug('1'); - debug('2'); - logHistory.clear(2); - expect(logHistory.getLogs()).toEqual([[timestemp, name, '2']]); - }); -}); diff --git a/yarn-project/archiver/src/movetofoundation/log/log_history.ts b/yarn-project/archiver/src/movetofoundation/log/log_history.ts deleted file mode 100644 index 6328c9cb5b5..00000000000 --- a/yarn-project/archiver/src/movetofoundation/log/log_history.ts +++ /dev/null @@ -1,22 +0,0 @@ -/* eslint-disable */ -import { setPreDebugLogHook } from './debug.js'; - -export class LogHistory { - private logs: any[][] = []; - - public enable() { - setPreDebugLogHook((...args: any[]) => { - this.logs.push([new Date().toISOString(), ...args]); - }); - } - - public getLogs(last = 0) { - return last ? this.logs.slice(-last) : this.logs; - } - - public clear(count = this.logs.length) { - this.logs = this.logs.slice(count); - } -} - -export const logHistory = new LogHistory(); diff --git a/yarn-project/archiver/src/running_promise.ts b/yarn-project/archiver/src/running_promise.ts deleted file mode 100644 index 05b986bfd97..00000000000 --- a/yarn-project/archiver/src/running_promise.ts +++ /dev/null @@ -1,56 +0,0 @@ -/** - * A promise that runs a function in a loop with a polling interval. - */ -export class RunningPromise { - private running = false; - private runningPromise = Promise.resolve(); - private interruptPromise = Promise.resolve(); - private interruptResolve = () => {}; - constructor(private fn: () => Promise, private pollingInterval = 10000) {} - - /** - * Starts the running promise. - */ - public start() { - this.running = true; - this.interruptPromise = new Promise(resolve => (this.interruptResolve = resolve)); - - const poll = async () => { - while (this.running) { - await this.fn(); - await this.interruptableSleep(this.pollingInterval); - } - }; - this.runningPromise = poll(); - } - - /** - * Stops the running promise. - */ - async stop(): Promise { - this.running = false; - this.interruptResolve(); - await this.runningPromise; - } - - /** - * Sleeps for a given amount of time, but can be interrupted by calling stop. - * @param timeInMs - The time to sleep in milliseconds. - */ - private async interruptableSleep(timeInMs: number): Promise { - let timeout!: NodeJS.Timeout; - const sleepPromise = new Promise(resolve => { - timeout = setTimeout(resolve, timeInMs); - }); - await Promise.race([sleepPromise, this.interruptPromise]); - clearTimeout(timeout); - } - - /** - * Returns whether the running promise is running. - * @returns Whether the running promise is running. - */ - public isRunning(): boolean { - return this.running; - } -} diff --git a/yarn-project/merkle-tree/src/indexed_tree/indexed_tree.test.ts b/yarn-project/merkle-tree/src/indexed_tree/indexed_tree.test.ts index a9cb88a5e5a..a78921a0d26 100644 --- a/yarn-project/merkle-tree/src/indexed_tree/indexed_tree.test.ts +++ b/yarn-project/merkle-tree/src/indexed_tree/indexed_tree.test.ts @@ -1,3 +1,4 @@ +/* eslint-disable jsdoc/require-jsdoc */ import { default as levelup } from 'levelup'; import { default as memdown } from 'memdown'; import { toBufferBE } from '../bigint_buffer.js'; diff --git a/yarn-project/merkle-tree/src/standard_tree/standard_tree.test.ts b/yarn-project/merkle-tree/src/standard_tree/standard_tree.test.ts index 958ebfde184..a889cfc1158 100644 --- a/yarn-project/merkle-tree/src/standard_tree/standard_tree.test.ts +++ b/yarn-project/merkle-tree/src/standard_tree/standard_tree.test.ts @@ -1,3 +1,4 @@ +/* eslint-disable jsdoc/require-jsdoc */ import { default as levelup } from 'levelup'; import { default as memdown } from 'memdown'; import { Hasher } from '../hasher.js'; diff --git a/yarn-project/merkle-tree/src/test/test_suite.ts b/yarn-project/merkle-tree/src/test/test_suite.ts index 2c55a977a61..34948a7f87d 100644 --- a/yarn-project/merkle-tree/src/test/test_suite.ts +++ b/yarn-project/merkle-tree/src/test/test_suite.ts @@ -1,7 +1,10 @@ +/* eslint-disable jsdoc/require-jsdoc */ import { default as levelup } from 'levelup'; import { default as memdown } from 'memdown'; import { Hasher, MerkleTree, Pedersen, SiblingPath } from '../index.js'; +const createMemDown = () => memdown.MemDown(); + const expectSameTrees = async (tree1: MerkleTree, tree2: MerkleTree) => { const size = tree1.getNumLeaves(); expect(size).toBe(tree2.getNumLeaves()); @@ -39,11 +42,11 @@ export const merkleTreeTestSuite = ( // }); it('should revert changes on rollback', async () => { - const levelDownEmpty = memdown(); + const levelDownEmpty = createMemDown(); const dbEmpty = levelup(levelDownEmpty); const emptyTree = await createDb(dbEmpty, pedersen, 'test', 10); - const levelDown = memdown(); + const levelDown = createMemDown(); const db = levelup(levelDown); const tree = await createDb(db, pedersen, 'test2', 10); await tree.appendLeaves(values.slice(0, 4)); @@ -69,11 +72,11 @@ export const merkleTreeTestSuite = ( }); it('should not revert changes after commit', async () => { - const levelDownEmpty = memdown(); + const levelDownEmpty = createMemDown(); const dbEmpty = levelup(levelDownEmpty); const emptyTree = await createDb(dbEmpty, pedersen, 'test', 10); - const levelDown = memdown(); + const levelDown = createMemDown(); const db = levelup(levelDown); const tree = await createDb(db, pedersen, 'test2', 10); await tree.appendLeaves(values.slice(0, 4)); @@ -87,7 +90,7 @@ export const merkleTreeTestSuite = ( }); it('should be able to restore from previous committed data', async () => { - const levelDown = memdown(); + const levelDown = createMemDown(); const db = levelup(levelDown); const tree = await createDb(db, pedersen, 'test', 10); await tree.appendLeaves(values.slice(0, 4)); @@ -103,7 +106,7 @@ export const merkleTreeTestSuite = ( }); it('should throw an error if previous data does not exist for the given name', async () => { - const db = levelup(memdown()); + const db = levelup(createMemDown()); await expect( (async () => { await createFromName(db, pedersen, 'a_whole_new_tree'); @@ -112,7 +115,7 @@ export const merkleTreeTestSuite = ( }); it('should serialize sibling path data to a buffer and be able to deserialize it back', async () => { - const db = levelup(memdown()); + const db = levelup(createMemDown()); const tree = await createDb(db, pedersen, 'test', 10); await tree.appendLeaves(values.slice(0, 1)); diff --git a/yarn-project/p2p/package.json b/yarn-project/p2p/package.json index 2a2a281b0ae..56447d58b50 100644 --- a/yarn-project/p2p/package.json +++ b/yarn-project/p2p/package.json @@ -32,7 +32,7 @@ }, "dependencies": { "@aztec/archiver": "workspace:^", - "@aztec/world-state": "workspace:^", + "@aztec/foundation": "workspace:^", "sha3": "^2.1.4", "tslib": "^2.4.0" }, @@ -47,4 +47,4 @@ "ts-node": "^10.9.1", "typescript": "^4.9.5" } -} \ No newline at end of file +} diff --git a/yarn-project/p2p/src/index.ts b/yarn-project/p2p/src/index.ts index 3e8af2e18f8..1311428c25a 100644 --- a/yarn-project/p2p/src/index.ts +++ b/yarn-project/p2p/src/index.ts @@ -1,12 +1,12 @@ import { InMemoryP2PCLient } from './memory_p2p_client.js'; -import { MockRollupSource } from './mocks.js'; +import { MockBlockSource } from './mocks.js'; /** * Main function of P2P in-memory client that runs at init. */ async function main() { // TODO: replace with actual rollup source that gets instantiated with env variables - const rollupSource = new MockRollupSource(); + const rollupSource = new MockBlockSource(); const p2pClient = new InMemoryP2PCLient(rollupSource); await p2pClient.start(); diff --git a/yarn-project/p2p/src/memory_p2p_client.ts b/yarn-project/p2p/src/memory_p2p_client.ts index 010b5a66bdf..943816c9f1d 100644 --- a/yarn-project/p2p/src/memory_p2p_client.ts +++ b/yarn-project/p2p/src/memory_p2p_client.ts @@ -1,5 +1,5 @@ -import { InterruptableSleep, L2BlockDownloader } from '@aztec/world-state'; -import { L2BlockSource, L2Block } from '@aztec/archiver'; +import { InterruptableSleep } from '@aztec/foundation'; +import { L2Block, L2BlockSource, L2BlockDownloader } from '@aztec/archiver'; import { InMemoryTxPool } from './tx_pool/memory_tx_pool.js'; import { P2P } from './p2p_client.js'; diff --git a/yarn-project/p2p/src/tx.ts b/yarn-project/p2p/src/tx.ts index 03e5d82fe70..90742e8a74b 100644 --- a/yarn-project/p2p/src/tx.ts +++ b/yarn-project/p2p/src/tx.ts @@ -23,7 +23,7 @@ export class AccumulatedTxData implements Tx { /** * Construct & return transaction ID. - * // TODO: actually construct & return tx id + * // TODO: actually construct & return tx id. * @returns The transaction's id. */ get txId() { diff --git a/yarn-project/p2p/tsconfig.dest.json b/yarn-project/p2p/tsconfig.dest.json index 85b203f9f04..895baf0f085 100644 --- a/yarn-project/p2p/tsconfig.dest.json +++ b/yarn-project/p2p/tsconfig.dest.json @@ -1,15 +1,9 @@ { "extends": ".", "references": [ - { - "path": "../world-state/tsconfig.dest.json" - }, { "path": "../archiver/tsconfig.dest.json" } ], - "exclude": [ - "**/*.test.*", - "**/fixtures/*" - ] -} \ No newline at end of file + "exclude": ["**/*.test.*", "**/fixtures/*"] +} diff --git a/yarn-project/p2p/tsconfig.json b/yarn-project/p2p/tsconfig.json index d1c52c68102..ca129bed441 100644 --- a/yarn-project/p2p/tsconfig.json +++ b/yarn-project/p2p/tsconfig.json @@ -5,20 +5,12 @@ "rootDir": "src", "tsBuildInfoFile": ".tsbuildinfo", "moduleResolution": "nodenext", - "types": [ - "node", - "jest" - ] + "types": ["node", "jest"] }, "references": [ - { - "path": "../world-state/tsconfig.dest.json" - }, { "path": "../archiver/tsconfig.dest.json" } ], - "include": [ - "src" - ] -} \ No newline at end of file + "include": ["src"] +} diff --git a/yarn-project/package.json b/yarn-project/package.json index 65a36f41224..e753fb8d479 100644 --- a/yarn-project/package.json +++ b/yarn-project/package.json @@ -37,4 +37,4 @@ "typedoc": "^0.23.26", "typescript": "^4.9.5" } -} \ No newline at end of file +} diff --git a/yarn-project/world-state/package.json b/yarn-project/world-state/package.json index 7da41b45324..d812eac9e2e 100644 --- a/yarn-project/world-state/package.json +++ b/yarn-project/world-state/package.json @@ -25,13 +25,13 @@ }, "dependencies": { "@aztec/archiver": "workspace:^", + "@aztec/foundation": "workspace:^", "@aztec/merkle-tree": "workspace:^", "levelup": "^5.1.1", "memdown": "^6.1.1", "tslib": "^2.4.0" }, "devDependencies": { - "@aztec/archiver": "workspace:^", "@aztec/eslint-config": "workspace:^", "@jest/globals": "^29.4.3", "@rushstack/eslint-patch": "^1.1.4", @@ -44,4 +44,4 @@ "ts-node": "^10.9.1", "typescript": "^4.9.5" } -} \ No newline at end of file +} diff --git a/yarn-project/world-state/src/index.ts b/yarn-project/world-state/src/index.ts index 9f841199aa3..2d348b5a90c 100644 --- a/yarn-project/world-state/src/index.ts +++ b/yarn-project/world-state/src/index.ts @@ -1,4 +1,2 @@ export * from './synchroniser/index.js'; export * from './world-state-db/index.js'; -export * from './l2_block_downloader.js'; -export * from './sleep.js'; diff --git a/yarn-project/world-state/src/memory_fifo.ts b/yarn-project/world-state/src/memory_fifo.ts deleted file mode 100644 index 854f4017c88..00000000000 --- a/yarn-project/world-state/src/memory_fifo.ts +++ /dev/null @@ -1,103 +0,0 @@ -/** - * A simple fifo queue. It can grow unbounded. It can have multiple producers and consumers. - * Putting an item onto the queue always succeeds, unless either end() or cancel() has been called in which case - * the item being pushed is simply discarded. - */ -export class MemoryFifo { - private waiting: ((item: T | null) => void)[] = []; - private items: T[] = []; - private flushing = false; - - /** - * Returns the number of items in the queue. - * @returns The number of items in the queue. - */ - public length(): number { - return this.items.length; - } - - /** - * Returns next item within the queue, or blocks until an item has been put into the queue. - * If given a timeout, the promise will reject if no item is received after `timeout` seconds. - * If the queue is flushing, `null` is returned. - * @param timeout - The number of seconds to wait for an item before rejecting the promise. - * @returns The next item in the queue, or null if the queue is flushing. - */ - public get(timeout?: number): Promise { - if (this.items.length) { - return Promise.resolve(this.items.shift()!); - } - - if (this.items.length === 0 && this.flushing) { - return Promise.resolve(null); - } - - return new Promise((resolve, reject) => { - this.waiting.push(resolve); - - if (timeout) { - setTimeout(() => { - const index = this.waiting.findIndex(r => r === resolve); - if (index > -1) { - this.waiting.splice(index, 1); - const err = new Error('Timeout getting item from queue.'); - reject(err); - } - }, timeout * 1000); - } - }); - } - - /** - * Put an item onto back of the queue. - * @param item - The item to put onto the queue. - */ - public put(item: T) { - if (this.flushing) { - return; - } else if (this.waiting.length) { - this.waiting.shift()!(item); - } else { - this.items.push(item); - } - } - - /** - * Once ended, no further items are added to queue. Consumers will consume remaining items within the queue. - * The queue is not reusable after calling `end()`. - * Any consumers waiting for an item receive null. - */ - public end() { - this.flushing = true; - this.waiting.forEach(resolve => resolve(null)); - } - - /** - * Once cancelled, all items are discarded from the queue, and no further items are added to the queue. - * The queue is not reusable after calling `cancel()`. - * Any consumers waiting for an item receive null. - */ - public cancel() { - this.flushing = true; - this.items = []; - this.waiting.forEach(resolve => resolve(null)); - } - - /** - * Helper method that can be used to continuously consume and process items on the queue. - * @param handler - The function to call for each item in the queue. - */ - public async process(handler: (item: T) => Promise) { - try { - while (true) { - const item = await this.get(); - if (item === null) { - break; - } - await handler(item); - } - } catch (err) { - console.error('Queue handler exception:', err); - } - } -} diff --git a/yarn-project/world-state/src/semaphore.ts b/yarn-project/world-state/src/semaphore.ts deleted file mode 100644 index 8837beebb3b..00000000000 --- a/yarn-project/world-state/src/semaphore.ts +++ /dev/null @@ -1,26 +0,0 @@ -import { MemoryFifo } from './memory_fifo.js'; - -/** - * Allows the acquiring of up to `size` tokens before calls to acquire block, waiting for a call to release(). - */ -export class Semaphore { - private readonly queue = new MemoryFifo(); - - constructor(size: number) { - new Array(size).fill(true).map(() => this.queue.put(true)); - } - - /** - * Acquires a token from the queue. If no token is available, blocks until a token is released. - */ - public async acquire() { - await this.queue.get(); - } - - /** - * Releases a token back into the queue. - */ - public release() { - this.queue.put(true); - } -} diff --git a/yarn-project/world-state/src/serial_queue.ts b/yarn-project/world-state/src/serial_queue.ts deleted file mode 100644 index 3c891e471c7..00000000000 --- a/yarn-project/world-state/src/serial_queue.ts +++ /dev/null @@ -1,67 +0,0 @@ -import { MemoryFifo } from './memory_fifo.js'; - -/** - * A more specialised fifo queue that enqueues functions to execute. Enqueued functions are executed in serial. - */ -export class SerialQueue { - private readonly queue = new MemoryFifo<() => Promise>(); - private runningPromise!: Promise; - - /** - * Starts the promise that executes the functions in the queue. - */ - public start() { - this.runningPromise = this.queue.process(fn => fn()); - } - - /** - * Returns the number of items in the queue. - * @returns The number of items in the queue. - */ - public length(): number { - return this.queue.length(); - } - - /** - * Cancels the queue. - * @returns A promise that resolves when the queue is empty. - */ - public cancel(): Promise { - this.queue.cancel(); - return this.runningPromise; - } - - /** - * Ends the queue (no more items can be added - existing items will be processed). - * @returns A promise that resolves when the queue is empty. - */ - public end(): Promise { - this.queue.end(); - return this.runningPromise; - } - - /** - * Enqueues `fn` for execution on the serial queue. - * @param fn - The function to enqueue. - * @returns The result of the function after execution. - */ - public put(fn: () => Promise): Promise { - return new Promise((resolve, reject) => { - this.queue.put(async () => { - try { - const res = await fn(); - resolve(res); - } catch (e) { - reject(e); - } - }); - }); - } - - /** - * Awaiting this function ensures the queue is empty before resuming. - */ - public async syncPoint() { - await this.put(async () => {}); - } -} diff --git a/yarn-project/world-state/src/sleep.ts b/yarn-project/world-state/src/sleep.ts deleted file mode 100644 index 02cf7ec553a..00000000000 --- a/yarn-project/world-state/src/sleep.ts +++ /dev/null @@ -1,43 +0,0 @@ -/** - * A class which allows you to sleep for a given number of milliseconds, and interrupt that sleep when necessary. - */ -export class InterruptableSleep { - private interruptResolve: (shouldThrow: boolean) => void = () => {}; - private interruptPromise = new Promise(resolve => (this.interruptResolve = resolve)); - private timeouts: NodeJS.Timeout[] = []; - - /** - * If awaited, will sleep for the given number of milliseconds or until interrupted. - * @param ms - The number of milliseconds to sleep for. - */ - public async sleep(ms: number) { - let timeout!: NodeJS.Timeout; - const promise = new Promise(resolve => (timeout = setTimeout(() => resolve(false), ms))); - this.timeouts.push(timeout); - const shouldThrow = await Promise.race([promise, this.interruptPromise]); - clearTimeout(timeout); - this.timeouts.splice(this.timeouts.indexOf(timeout), 1); - if (shouldThrow) { - throw new Error('Interrupted.'); - } - } - - /** - * Interrupts the sleep function. - * @param sleepShouldThrow - If true, the sleep function will throw an error if the `interruptPromise` is resolved - * first. - */ - public interrupt(sleepShouldThrow = false) { - this.interruptResolve(sleepShouldThrow); - this.interruptPromise = new Promise(resolve => (this.interruptResolve = resolve)); - } -} - -/** - * Sleeps for the given number of milliseconds. - * @param ms - The number of milliseconds to sleep for. - * @returns A promise that resolves after the given number of milliseconds. - */ -export function sleep(ms: number) { - return new Promise(resolve => setTimeout(resolve, ms)); -} diff --git a/yarn-project/world-state/src/synchroniser/server_world_state_synchroniser.test.ts b/yarn-project/world-state/src/synchroniser/server_world_state_synchroniser.test.ts index bc59a777498..abb28ad7337 100644 --- a/yarn-project/world-state/src/synchroniser/server_world_state_synchroniser.test.ts +++ b/yarn-project/world-state/src/synchroniser/server_world_state_synchroniser.test.ts @@ -1,11 +1,10 @@ -/* eslint-disable */ +/* eslint-disable jsdoc/require-jsdoc */ import { ServerWorldStateSynchroniser } from './server_world_state_synchroniser.js'; -import { L2BlockSource, SyncStatus } from '@aztec/archiver/l2_block_source'; -import { L2Block } from '@aztec/archiver/l2_block'; -import { sleep } from '../sleep.js'; +import { L2BlockSource, SyncStatus, L2Block } from '@aztec/archiver'; import { WorldStateRunningState } from './world_state_synchroniser.js'; -import { jest } from '@jest/globals'; import { Pedersen, MerkleTreeDb, MerkleTreeId, SiblingPath, StandardMerkleTree } from '@aztec/merkle-tree'; +import { sleep } from '@aztec/foundation'; +import { jest } from '@jest/globals'; type Mockify = { [P in keyof T]: jest.Mock; @@ -16,8 +15,8 @@ const syncStatus = { latestBlock: 0, } as SyncStatus; -let latestBlockNumber = 5; -const getLatestBlockNumber = () => latestBlockNumber; +const LATEST_BLOCK_NUMBER = 5; +const getLatestBlockNumber = () => LATEST_BLOCK_NUMBER; let nextBlocks: L2Block[] = []; const consumeNextBlocks = () => { const blocks = nextBlocks; @@ -78,12 +77,12 @@ describe('server_world_state_synchroniser', () => { server.start(0).catch(() => console.log('Sync not completed!!')); // now setup a loop to monitor the sync progress and push new blocks in - while (currentBlockNumber <= latestBlockNumber) { + while (currentBlockNumber <= LATEST_BLOCK_NUMBER) { status = await server.status(); expect( status.syncedToL2Block >= currentBlockNumber || status.syncedToL2Block <= currentBlockNumber + 1, ).toBeTruthy(); - if (status.syncedToL2Block === latestBlockNumber) { + if (status.syncedToL2Block === LATEST_BLOCK_NUMBER) { break; } expect( @@ -100,7 +99,7 @@ describe('server_world_state_synchroniser', () => { // check the status agian, should be fully synced status = await server.status(); expect(status.state).toEqual(WorldStateRunningState.RUNNING); - expect(status.syncedToL2Block).toEqual(latestBlockNumber); + expect(status.syncedToL2Block).toEqual(LATEST_BLOCK_NUMBER); // stop the synchroniser await server.stop(); @@ -108,7 +107,7 @@ describe('server_world_state_synchroniser', () => { // check the final status status = await server.status(); expect(status.state).toEqual(WorldStateRunningState.STOPPED); - expect(status.syncedToL2Block).toEqual(latestBlockNumber); + expect(status.syncedToL2Block).toEqual(LATEST_BLOCK_NUMBER); }); it('enables blocking until synced', async () => { @@ -116,7 +115,7 @@ describe('server_world_state_synchroniser', () => { let currentBlockNumber = -1; const newBlocks = async () => { - while (currentBlockNumber <= latestBlockNumber) { + while (currentBlockNumber <= LATEST_BLOCK_NUMBER) { await sleep(100); nextBlocks = [...nextBlocks, getMockBlock(++currentBlockNumber)]; } @@ -135,11 +134,11 @@ describe('server_world_state_synchroniser', () => { let status = await server.status(); expect(status.state).toEqual(WorldStateRunningState.RUNNING); - expect(status.syncedToL2Block).toEqual(latestBlockNumber); + expect(status.syncedToL2Block).toEqual(LATEST_BLOCK_NUMBER); await server.stop(); status = await server.status(); expect(status.state).toEqual(WorldStateRunningState.STOPPED); - expect(status.syncedToL2Block).toEqual(latestBlockNumber); + expect(status.syncedToL2Block).toEqual(LATEST_BLOCK_NUMBER); }); it('handles multiple calls to start', async () => { @@ -147,7 +146,7 @@ describe('server_world_state_synchroniser', () => { let currentBlockNumber = -1; const newBlocks = async () => { - while (currentBlockNumber < latestBlockNumber) { + while (currentBlockNumber < LATEST_BLOCK_NUMBER) { await sleep(100); const newBlock = getMockBlock(++currentBlockNumber); nextBlocks = [...nextBlocks, newBlock]; @@ -180,7 +179,7 @@ describe('server_world_state_synchroniser', () => { const status = await server.status(); expect(status.state).toBe(WorldStateRunningState.RUNNING); - expect(status.syncedToL2Block).toBe(latestBlockNumber); + expect(status.syncedToL2Block).toBe(LATEST_BLOCK_NUMBER); await server.stop(); }); @@ -198,7 +197,7 @@ describe('server_world_state_synchroniser', () => { it('updates the contract tree', async () => { merkleTreeDb.appendLeaves.mockReset(); const server = createSynchroniser(merkleTreeDb, rollupSource); - const totalBlocks = latestBlockNumber + 1; + const totalBlocks = LATEST_BLOCK_NUMBER + 1; nextBlocks = Array(totalBlocks) .fill(0) .map((_, index) => getMockBlock(index, [Buffer.alloc(32, index)])); diff --git a/yarn-project/world-state/src/synchroniser/server_world_state_synchroniser.ts b/yarn-project/world-state/src/synchroniser/server_world_state_synchroniser.ts index 834bddf7c38..82ca09fddbd 100644 --- a/yarn-project/world-state/src/synchroniser/server_world_state_synchroniser.ts +++ b/yarn-project/world-state/src/synchroniser/server_world_state_synchroniser.ts @@ -1,8 +1,6 @@ import { WorldStateRunningState, WorldStateStatus, WorldStateSynchroniser } from './world_state_synchroniser.js'; import { MerkleTreeDb, MerkleTreeId } from '@aztec/merkle-tree'; -import { L2BlockDownloader } from '../l2_block_downloader.js'; -import { L2BlockSource } from '@aztec/archiver/l2_block_source'; -import { L2Block } from '@aztec/archiver/l2_block'; +import { L2BlockSource, L2BlockDownloader, L2Block } from '@aztec/archiver'; /** * Synchronises the world state with the L2 blocks from a L2BlockSource. diff --git a/yarn-project/world-state/src/world-state-db/memory_world_state_db.ts b/yarn-project/world-state/src/world-state-db/memory_world_state_db.ts index d4333890cb8..c31c43deef0 100644 --- a/yarn-project/world-state/src/world-state-db/memory_world_state_db.ts +++ b/yarn-project/world-state/src/world-state-db/memory_world_state_db.ts @@ -10,7 +10,7 @@ import { MerkleTreeDepths, MerkleTree, } from '@aztec/merkle-tree'; -import { SerialQueue } from '../serial_queue.js'; +import { SerialQueue } from '@aztec/foundation'; /** * A convenience class for managing multiple merkle trees. diff --git a/yarn-project/world-state/tsconfig.dest.json b/yarn-project/world-state/tsconfig.dest.json index 57f19a229e9..ae55efe5e81 100644 --- a/yarn-project/world-state/tsconfig.dest.json +++ b/yarn-project/world-state/tsconfig.dest.json @@ -8,8 +8,5 @@ "path": "../merkle-tree/tsconfig.dest.json" } ], - "exclude": [ - "**/*.test.*", - "**/fixtures/*" - ] -} \ No newline at end of file + "exclude": ["**/*.test.*", "**/fixtures/*"] +} diff --git a/yarn-project/world-state/tsconfig.json b/yarn-project/world-state/tsconfig.json index 80285209fdf..5a7c5abcd80 100644 --- a/yarn-project/world-state/tsconfig.json +++ b/yarn-project/world-state/tsconfig.json @@ -5,9 +5,6 @@ "rootDir": "src", "tsBuildInfoFile": ".tsbuildinfo" }, - "references": [ - { "path": "../archiver/tsconfig.dest.json" }, - { "path": "../merkle-tree/tsconfig.dest.json" } - ], - "include": [ "src" ] -} \ No newline at end of file + "references": [{ "path": "../archiver/tsconfig.dest.json" }, { "path": "../merkle-tree/tsconfig.dest.json" }], + "include": ["src"] +} diff --git a/yarn-project/yarn.lock b/yarn-project/yarn.lock new file mode 100644 index 00000000000..d00fbb311d5 --- /dev/null +++ b/yarn-project/yarn.lock @@ -0,0 +1,7176 @@ +# This file is generated by running "yarn install" inside your project. +# Manual changes might be lost - proceed with caution! + +__metadata: + version: 6 + cacheKey: 8 + +"@ampproject/remapping@npm:^2.2.0": + version: 2.2.0 + resolution: "@ampproject/remapping@npm:2.2.0" + dependencies: + "@jridgewell/gen-mapping": ^0.1.0 + "@jridgewell/trace-mapping": ^0.3.9 + checksum: d74d170d06468913921d72430259424b7e4c826b5a7d39ff839a29d547efb97dc577caa8ba3fb5cf023624e9af9d09651afc3d4112a45e2050328abc9b3a2292 + languageName: node + linkType: hard + +"@aztec/acir-simulator@workspace:acir-simulator": + version: 0.0.0-use.local + resolution: "@aztec/acir-simulator@workspace:acir-simulator" + dependencies: + "@aztec/eslint-config": "workspace:^" + "@jest/globals": ^29.4.3 + "@rushstack/eslint-patch": ^1.1.4 + "@types/jest": ^29.4.0 + "@types/node": ^18.7.23 + jest: ^28.1.3 + ts-jest: ^28.0.7 + ts-node: ^10.9.1 + tslib: ^2.4.0 + typescript: ^4.9.5 + languageName: unknown + linkType: soft + +"@aztec/archiver@workspace:^, @aztec/archiver@workspace:archiver": + version: 0.0.0-use.local + resolution: "@aztec/archiver@workspace:archiver" + dependencies: + "@aztec/eslint-config": "workspace:^" + "@aztec/foundation": "workspace:^" + "@jest/globals": ^29.5.0 + "@rushstack/eslint-patch": ^1.2.0 + "@types/debug": ^4.1.7 + "@types/jest": ^29.4.1 + "@types/node": ^18.15.2 + "@types/ws": ^8.5.4 + debug: ^4.3.4 + jest: ^29.5.0 + ts-jest: ^29.0.5 + ts-node: ^10.9.1 + tsc-watch: ^6.0.0 + tslib: ^2.5.0 + typescript: ^4.9.5 + viem: ^0.1.15 + ws: ^8.13.0 + languageName: unknown + linkType: soft + +"@aztec/aztec-cli@workspace:aztec-cli": + version: 0.0.0-use.local + resolution: "@aztec/aztec-cli@workspace:aztec-cli" + dependencies: + "@aztec/eslint-config": "workspace:^" + "@jest/globals": ^29.4.3 + "@rushstack/eslint-patch": ^1.1.4 + "@types/jest": ^29.4.0 + "@types/node": ^18.7.23 + commander: ^9.0.0 + jest: ^28.1.3 + ts-jest: ^28.0.7 + ts-node: ^10.9.1 + tslib: ^2.4.0 + typescript: ^4.9.5 + bin: + aztec_cli: index.js + languageName: unknown + linkType: soft + +"@aztec/aztec.js@workspace:^, @aztec/aztec.js@workspace:aztec.js": + version: 0.0.0-use.local + resolution: "@aztec/aztec.js@workspace:aztec.js" + dependencies: + "@aztec/eslint-config": "workspace:^" + "@jest/globals": ^29.4.3 + "@rushstack/eslint-patch": ^1.1.4 + "@types/jest": ^29.4.0 + "@types/node": ^18.7.23 + jest: ^28.1.3 + ts-jest: ^28.0.7 + ts-node: ^10.9.1 + tslib: ^2.4.0 + typescript: ^4.9.5 + languageName: unknown + linkType: soft + +"@aztec/aztec3-packages@workspace:.": + version: 0.0.0-use.local + resolution: "@aztec/aztec3-packages@workspace:." + dependencies: + eslint: ^8.21.0 + prettier: ^2.7.1 + typedoc: ^0.23.26 + typescript: ^4.9.5 + languageName: unknown + linkType: soft + +"@aztec/barretenberg.js@workspace:barretenberg.js": + version: 0.0.0-use.local + resolution: "@aztec/barretenberg.js@workspace:barretenberg.js" + dependencies: + "@aztec/eslint-config": "workspace:^" + "@jest/globals": ^29.4.3 + "@rushstack/eslint-patch": ^1.1.4 + "@types/jest": ^29.4.0 + "@types/node": ^18.7.23 + jest: ^28.1.3 + ts-jest: ^28.0.7 + ts-node: ^10.9.1 + tslib: ^2.4.0 + typescript: ^4.9.5 + languageName: unknown + linkType: soft + +"@aztec/circuit.js@workspace:circuit.js": + version: 0.0.0-use.local + resolution: "@aztec/circuit.js@workspace:circuit.js" + dependencies: + "@aztec/eslint-config": "workspace:^" + "@jest/globals": ^29.4.3 + "@rushstack/eslint-patch": ^1.1.4 + "@types/jest": ^29.4.0 + "@types/node": ^18.7.23 + jest: ^28.1.3 + ts-jest: ^28.0.7 + ts-node: ^10.9.1 + tslib: ^2.4.0 + typescript: ^4.9.5 + languageName: unknown + linkType: soft + +"@aztec/docs@workspace:docs": + version: 0.0.0-use.local + resolution: "@aztec/docs@workspace:docs" + dependencies: + vite: ^4.1.4 + languageName: unknown + linkType: soft + +"@aztec/end-to-end@workspace:end-to-end": + version: 0.0.0-use.local + resolution: "@aztec/end-to-end@workspace:end-to-end" + dependencies: + "@aztec/aztec.js": "workspace:^" + "@aztec/eslint-config": "workspace:^" + "@jest/globals": ^29.4.3 + "@rushstack/eslint-patch": ^1.1.4 + "@types/jest": ^29.4.0 + "@types/node": ^18.7.23 + jest: ^28.1.3 + ts-jest: ^28.0.7 + ts-node: ^10.9.1 + tslib: ^2.4.0 + typescript: ^4.9.5 + languageName: unknown + linkType: soft + +"@aztec/eslint-config@workspace:^, @aztec/eslint-config@workspace:eslint-config": + version: 0.0.0-use.local + resolution: "@aztec/eslint-config@workspace:eslint-config" + dependencies: + "@typescript-eslint/eslint-plugin": ^5.38.0 + "@typescript-eslint/parser": ^5.38.0 + eslint: ^8.21.0 + eslint-config-prettier: ^8.5.0 + eslint-plugin-jsdoc: ^40.0.0 + eslint-plugin-tsdoc: ^0.2.17 + languageName: unknown + linkType: soft + +"@aztec/ethereum.js-example@workspace:ethereum.js/example": + version: 0.0.0-use.local + resolution: "@aztec/ethereum.js-example@workspace:ethereum.js/example" + dependencies: + "@aztec/eslint-config": "workspace:^" + "@aztec/ethereum.js": "workspace:^" + "@rushstack/eslint-patch": ^1.2.0 + "@types/node": ^18.15.0 + source-map-support: ^0.5.21 + typescript: ^4.9.5 + languageName: unknown + linkType: soft + +"@aztec/ethereum.js@workspace:^, @aztec/ethereum.js@workspace:ethereum.js": + version: 0.0.0-use.local + resolution: "@aztec/ethereum.js@workspace:ethereum.js" + dependencies: + "@aztec/eslint-config": "workspace:^" + "@jest/globals": ^29.5.0 + "@rushstack/eslint-patch": ^1.2.0 + "@types/elliptic": ^6.4.14 + "@types/hdkey": ^2.0.1 + "@types/jest": ^29.4.0 + "@types/node": ^18.14.6 + "@types/uuid": ^9.0.0 + bip39: ^3.0.4 + browserify-aes: ^1.2.0 + debug: ^4.3.4 + detect-node: ^2.1.0 + elliptic: ^6.5.4 + hdkey: ^2.1.0 + jest: ^28.0.0 + jest-mock-extended: ^3.0.1 + pbkdf2: ^3.1.2 + rlp: ^3.0.0 + sha3: ^2.1.4 + source-map-support: ^0.5.21 + ts-jest: 28.0.7 + typescript: ^4.9.5 + uuid: ^9.0.0 + bin: + contract_gen_def: ./dest/contract/gen_def/index.js + languageName: unknown + linkType: soft + +"@aztec/foundation@workspace:^, @aztec/foundation@workspace:foundation": + version: 0.0.0-use.local + resolution: "@aztec/foundation@workspace:foundation" + dependencies: + "@jest/globals": ^29.4.3 + "@rushstack/eslint-patch": ^1.1.4 + "@types/debug": ^4.1.7 + "@types/detect-node": ^2.0.0 + "@types/jest": ^29.4.0 + "@types/node": ^18.7.23 + "@typescript-eslint/eslint-plugin": ^5.38.0 + "@typescript-eslint/parser": ^5.38.0 + cross-fetch: ^3.1.5 + debug: ^4.3.4 + detect-node: ^2.1.0 + eslint: ^8.21.0 + eslint-config-prettier: ^8.5.0 + jest: ^28.1.3 + prettier: ^2.7.1 + ts-jest: ^28.0.7 + ts-node: ^10.9.1 + typescript: ^4.9.5 + languageName: unknown + linkType: soft + +"@aztec/kernel-simulator@workspace:kernel-simulator": + version: 0.0.0-use.local + resolution: "@aztec/kernel-simulator@workspace:kernel-simulator" + dependencies: + "@aztec/eslint-config": "workspace:^" + "@jest/globals": ^29.4.3 + "@rushstack/eslint-patch": ^1.1.4 + "@types/jest": ^29.4.0 + "@types/node": ^18.7.23 + jest: ^28.1.3 + ts-jest: ^28.0.7 + ts-node: ^10.9.1 + tslib: ^2.4.0 + typescript: ^4.9.5 + languageName: unknown + linkType: soft + +"@aztec/key-store@workspace:key-store": + version: 0.0.0-use.local + resolution: "@aztec/key-store@workspace:key-store" + dependencies: + "@aztec/eslint-config": "workspace:^" + "@jest/globals": ^29.4.3 + "@rushstack/eslint-patch": ^1.1.4 + "@types/jest": ^29.4.0 + "@types/node": ^18.7.23 + jest: ^28.1.3 + ts-jest: ^28.0.7 + ts-node: ^10.9.1 + tslib: ^2.4.0 + typescript: ^4.9.5 + languageName: unknown + linkType: soft + +"@aztec/merkle-tree@workspace:^, @aztec/merkle-tree@workspace:merkle-tree": + version: 0.0.0-use.local + resolution: "@aztec/merkle-tree@workspace:merkle-tree" + dependencies: + "@aztec/eslint-config": "workspace:^" + "@jest/globals": ^29.4.3 + "@rushstack/eslint-patch": ^1.1.4 + "@types/jest": ^29.4.0 + "@types/levelup": ^5.1.2 + "@types/memdown": ^3.0.1 + "@types/node": ^18.15.3 + "@types/sha256": ^0.2.0 + jest: ^28.1.3 + levelup: ^5.1.1 + memdown: ^6.1.1 + sha256: ^0.2.0 + ts-jest: ^28.0.7 + ts-node: ^10.9.1 + tslib: ^2.4.0 + typescript: ^4.9.5 + languageName: unknown + linkType: soft + +"@aztec/p2p@workspace:p2p": + version: 0.0.0-use.local + resolution: "@aztec/p2p@workspace:p2p" + dependencies: + "@aztec/archiver": "workspace:^" + "@aztec/eslint-config": "workspace:^" + "@aztec/foundation": "workspace:^" + "@jest/globals": ^29.4.3 + "@rushstack/eslint-patch": ^1.1.4 + "@types/jest": ^29.4.0 + "@types/node": ^18.14.6 + jest: ^28.1.3 + sha3: ^2.1.4 + ts-jest: ^28.0.7 + ts-node: ^10.9.1 + tslib: ^2.4.0 + typescript: ^4.9.5 + languageName: unknown + linkType: soft + +"@aztec/prettier-config@workspace:prettier-config": + version: 0.0.0-use.local + resolution: "@aztec/prettier-config@workspace:prettier-config" + dependencies: + prettier: ^2.7.1 + languageName: unknown + linkType: soft + +"@aztec/prover-client@workspace:prover-client": + version: 0.0.0-use.local + resolution: "@aztec/prover-client@workspace:prover-client" + dependencies: + "@aztec/eslint-config": "workspace:^" + "@jest/globals": ^29.4.3 + "@rushstack/eslint-patch": ^1.1.4 + "@types/jest": ^29.4.0 + "@types/node": ^18.7.23 + jest: ^28.1.3 + ts-jest: ^28.0.7 + ts-node: ^10.9.1 + tslib: ^2.4.0 + typescript: ^4.9.5 + languageName: unknown + linkType: soft + +"@aztec/public-client@workspace:public-client": + version: 0.0.0-use.local + resolution: "@aztec/public-client@workspace:public-client" + dependencies: + "@aztec/eslint-config": "workspace:^" + "@jest/globals": ^29.4.3 + "@rushstack/eslint-patch": ^1.1.4 + "@types/jest": ^29.4.0 + "@types/node": ^18.7.23 + jest: ^28.1.3 + ts-jest: ^28.0.7 + ts-node: ^10.9.1 + tslib: ^2.4.0 + typescript: ^4.9.5 + languageName: unknown + linkType: soft + +"@aztec/sequencer-client@workspace:sequencer-client": + version: 0.0.0-use.local + resolution: "@aztec/sequencer-client@workspace:sequencer-client" + dependencies: + "@aztec/eslint-config": "workspace:^" + "@jest/globals": ^29.4.3 + "@rushstack/eslint-patch": ^1.1.4 + "@types/jest": ^29.4.0 + "@types/node": ^18.7.23 + jest: ^28.1.3 + ts-jest: ^28.0.7 + ts-node: ^10.9.1 + tslib: ^2.4.0 + typescript: ^4.9.5 + languageName: unknown + linkType: soft + +"@aztec/wallet@workspace:wallet": + version: 0.0.0-use.local + resolution: "@aztec/wallet@workspace:wallet" + dependencies: + "@aztec/eslint-config": "workspace:^" + "@jest/globals": ^29.4.3 + "@rushstack/eslint-patch": ^1.1.4 + "@types/jest": ^29.4.0 + "@types/node": ^18.7.23 + jest: ^28.1.3 + ts-jest: ^28.0.7 + ts-node: ^10.9.1 + tslib: ^2.4.0 + typescript: ^4.9.5 + languageName: unknown + linkType: soft + +"@aztec/world-state@workspace:world-state": + version: 0.0.0-use.local + resolution: "@aztec/world-state@workspace:world-state" + dependencies: + "@aztec/archiver": "workspace:^" + "@aztec/eslint-config": "workspace:^" + "@aztec/foundation": "workspace:^" + "@aztec/merkle-tree": "workspace:^" + "@jest/globals": ^29.4.3 + "@rushstack/eslint-patch": ^1.1.4 + "@types/jest": ^29.4.0 + "@types/levelup": ^5.1.2 + "@types/memdown": ^3.0.0 + "@types/node": ^18.7.23 + jest: ^28.1.3 + levelup: ^5.1.1 + memdown: ^6.1.1 + ts-jest: ^28.0.7 + ts-node: ^10.9.1 + tslib: ^2.4.0 + typescript: ^4.9.5 + languageName: unknown + linkType: soft + +"@babel/code-frame@npm:^7.0.0, @babel/code-frame@npm:^7.12.13, @babel/code-frame@npm:^7.18.6": + version: 7.18.6 + resolution: "@babel/code-frame@npm:7.18.6" + dependencies: + "@babel/highlight": ^7.18.6 + checksum: 195e2be3172d7684bf95cff69ae3b7a15a9841ea9d27d3c843662d50cdd7d6470fd9c8e64be84d031117e4a4083486effba39f9aef6bbb2c89f7f21bcfba33ba + languageName: node + linkType: hard + +"@babel/compat-data@npm:^7.20.5": + version: 7.21.0 + resolution: "@babel/compat-data@npm:7.21.0" + checksum: dbf632c532f9c75ba0be7d1dc9f6cd3582501af52f10a6b90415d634ec5878735bd46064c91673b10317af94d4cc99c4da5bd9d955978cdccb7905fc33291e4d + languageName: node + linkType: hard + +"@babel/core@npm:^7.11.6, @babel/core@npm:^7.12.3": + version: 7.21.3 + resolution: "@babel/core@npm:7.21.3" + dependencies: + "@ampproject/remapping": ^2.2.0 + "@babel/code-frame": ^7.18.6 + "@babel/generator": ^7.21.3 + "@babel/helper-compilation-targets": ^7.20.7 + "@babel/helper-module-transforms": ^7.21.2 + "@babel/helpers": ^7.21.0 + "@babel/parser": ^7.21.3 + "@babel/template": ^7.20.7 + "@babel/traverse": ^7.21.3 + "@babel/types": ^7.21.3 + convert-source-map: ^1.7.0 + debug: ^4.1.0 + gensync: ^1.0.0-beta.2 + json5: ^2.2.2 + semver: ^6.3.0 + checksum: bef25fbea96f461bf79bd1d0e4f0cdce679fd5ada464a89c1141ddba59ae1adfdbb23e04440c266ed525712d33d5ffd818cd8b0c25b1dee0e648d5559516153a + languageName: node + linkType: hard + +"@babel/generator@npm:^7.21.3, @babel/generator@npm:^7.7.2": + version: 7.21.3 + resolution: "@babel/generator@npm:7.21.3" + dependencies: + "@babel/types": ^7.21.3 + "@jridgewell/gen-mapping": ^0.3.2 + "@jridgewell/trace-mapping": ^0.3.17 + jsesc: ^2.5.1 + checksum: be6bb5a32a0273260b91210d4137b7b5da148a2db8dd324654275cb0af865ae59de5e1536e93ac83423b2586415059e1c24cf94293026755cf995757238da749 + languageName: node + linkType: hard + +"@babel/helper-compilation-targets@npm:^7.20.7": + version: 7.20.7 + resolution: "@babel/helper-compilation-targets@npm:7.20.7" + dependencies: + "@babel/compat-data": ^7.20.5 + "@babel/helper-validator-option": ^7.18.6 + browserslist: ^4.21.3 + lru-cache: ^5.1.1 + semver: ^6.3.0 + peerDependencies: + "@babel/core": ^7.0.0 + checksum: 8c32c873ba86e2e1805b30e0807abd07188acbe00ebb97576f0b09061cc65007f1312b589eccb4349c5a8c7f8bb9f2ab199d41da7030bf103d9f347dcd3a3cf4 + languageName: node + linkType: hard + +"@babel/helper-environment-visitor@npm:^7.18.9": + version: 7.18.9 + resolution: "@babel/helper-environment-visitor@npm:7.18.9" + checksum: b25101f6162ddca2d12da73942c08ad203d7668e06663df685634a8fde54a98bc015f6f62938e8554457a592a024108d45b8f3e651fd6dcdb877275b73cc4420 + languageName: node + linkType: hard + +"@babel/helper-function-name@npm:^7.21.0": + version: 7.21.0 + resolution: "@babel/helper-function-name@npm:7.21.0" + dependencies: + "@babel/template": ^7.20.7 + "@babel/types": ^7.21.0 + checksum: d63e63c3e0e3e8b3138fa47b0cd321148a300ef12b8ee951196994dcd2a492cc708aeda94c2c53759a5c9177fffaac0fd8778791286746f72a000976968daf4e + languageName: node + linkType: hard + +"@babel/helper-hoist-variables@npm:^7.18.6": + version: 7.18.6 + resolution: "@babel/helper-hoist-variables@npm:7.18.6" + dependencies: + "@babel/types": ^7.18.6 + checksum: fd9c35bb435fda802bf9ff7b6f2df06308a21277c6dec2120a35b09f9de68f68a33972e2c15505c1a1a04b36ec64c9ace97d4a9e26d6097b76b4396b7c5fa20f + languageName: node + linkType: hard + +"@babel/helper-module-imports@npm:^7.18.6": + version: 7.18.6 + resolution: "@babel/helper-module-imports@npm:7.18.6" + dependencies: + "@babel/types": ^7.18.6 + checksum: f393f8a3b3304b1b7a288a38c10989de754f01d29caf62ce7c4e5835daf0a27b81f3ac687d9d2780d39685aae7b55267324b512150e7b2be967b0c493b6a1def + languageName: node + linkType: hard + +"@babel/helper-module-transforms@npm:^7.21.2": + version: 7.21.2 + resolution: "@babel/helper-module-transforms@npm:7.21.2" + dependencies: + "@babel/helper-environment-visitor": ^7.18.9 + "@babel/helper-module-imports": ^7.18.6 + "@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.2 + "@babel/types": ^7.21.2 + checksum: 8a1c129a4f90bdf97d8b6e7861732c9580f48f877aaaafbc376ce2482febebcb8daaa1de8bc91676d12886487603f8c62a44f9e90ee76d6cac7f9225b26a49e1 + languageName: node + linkType: hard + +"@babel/helper-plugin-utils@npm:^7.0.0, @babel/helper-plugin-utils@npm:^7.10.4, @babel/helper-plugin-utils@npm:^7.12.13, @babel/helper-plugin-utils@npm:^7.14.5, @babel/helper-plugin-utils@npm:^7.18.6, @babel/helper-plugin-utils@npm:^7.19.0, @babel/helper-plugin-utils@npm:^7.8.0": + version: 7.20.2 + resolution: "@babel/helper-plugin-utils@npm:7.20.2" + checksum: f6cae53b7fdb1bf3abd50fa61b10b4470985b400cc794d92635da1e7077bb19729f626adc0741b69403d9b6e411cddddb9c0157a709cc7c4eeb41e663be5d74b + languageName: node + linkType: hard + +"@babel/helper-simple-access@npm:^7.20.2": + version: 7.20.2 + resolution: "@babel/helper-simple-access@npm:7.20.2" + dependencies: + "@babel/types": ^7.20.2 + checksum: ad1e96ee2e5f654ffee2369a586e5e8d2722bf2d8b028a121b4c33ebae47253f64d420157b9f0a8927aea3a9e0f18c0103e74fdd531815cf3650a0a4adca11a1 + languageName: node + linkType: hard + +"@babel/helper-split-export-declaration@npm:^7.18.6": + version: 7.18.6 + resolution: "@babel/helper-split-export-declaration@npm:7.18.6" + dependencies: + "@babel/types": ^7.18.6 + checksum: c6d3dede53878f6be1d869e03e9ffbbb36f4897c7cc1527dc96c56d127d834ffe4520a6f7e467f5b6f3c2843ea0e81a7819d66ae02f707f6ac057f3d57943a2b + languageName: node + linkType: hard + +"@babel/helper-string-parser@npm:^7.19.4": + version: 7.19.4 + resolution: "@babel/helper-string-parser@npm:7.19.4" + checksum: b2f8a3920b30dfac81ec282ac4ad9598ea170648f8254b10f475abe6d944808fb006aab325d3eb5a8ad3bea8dfa888cfa6ef471050dae5748497c110ec060943 + languageName: node + linkType: hard + +"@babel/helper-validator-identifier@npm:^7.18.6, @babel/helper-validator-identifier@npm:^7.19.1": + version: 7.19.1 + resolution: "@babel/helper-validator-identifier@npm:7.19.1" + checksum: 0eca5e86a729162af569b46c6c41a63e18b43dbe09fda1d2a3c8924f7d617116af39cac5e4cd5d431bb760b4dca3c0970e0c444789b1db42bcf1fa41fbad0a3a + languageName: node + linkType: hard + +"@babel/helper-validator-option@npm:^7.18.6": + version: 7.21.0 + resolution: "@babel/helper-validator-option@npm:7.21.0" + checksum: 8ece4c78ffa5461fd8ab6b6e57cc51afad59df08192ed5d84b475af4a7193fc1cb794b59e3e7be64f3cdc4df7ac78bf3dbb20c129d7757ae078e6279ff8c2f07 + languageName: node + linkType: hard + +"@babel/helpers@npm:^7.21.0": + version: 7.21.0 + resolution: "@babel/helpers@npm:7.21.0" + dependencies: + "@babel/template": ^7.20.7 + "@babel/traverse": ^7.21.0 + "@babel/types": ^7.21.0 + checksum: 9370dad2bb665c551869a08ac87c8bdafad53dbcdce1f5c5d498f51811456a3c005d9857562715151a0f00b2e912ac8d89f56574f837b5689f5f5072221cdf54 + languageName: node + linkType: hard + +"@babel/highlight@npm:^7.18.6": + version: 7.18.6 + resolution: "@babel/highlight@npm:7.18.6" + dependencies: + "@babel/helper-validator-identifier": ^7.18.6 + chalk: ^2.0.0 + js-tokens: ^4.0.0 + checksum: 92d8ee61549de5ff5120e945e774728e5ccd57fd3b2ed6eace020ec744823d4a98e242be1453d21764a30a14769ecd62170fba28539b211799bbaf232bbb2789 + languageName: node + linkType: hard + +"@babel/parser@npm:^7.1.0, @babel/parser@npm:^7.14.7, @babel/parser@npm:^7.20.7, @babel/parser@npm:^7.21.3": + version: 7.21.3 + resolution: "@babel/parser@npm:7.21.3" + bin: + parser: ./bin/babel-parser.js + checksum: a71e6456a1260c2a943736b56cc0acdf5f2a53c6c79e545f56618967e51f9b710d1d3359264e7c979313a7153741b1d95ad8860834cc2ab4ce4f428b13cc07be + languageName: node + linkType: hard + +"@babel/plugin-syntax-async-generators@npm:^7.8.4": + version: 7.8.4 + resolution: "@babel/plugin-syntax-async-generators@npm:7.8.4" + dependencies: + "@babel/helper-plugin-utils": ^7.8.0 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 7ed1c1d9b9e5b64ef028ea5e755c0be2d4e5e4e3d6cf7df757b9a8c4cfa4193d268176d0f1f7fbecdda6fe722885c7fda681f480f3741d8a2d26854736f05367 + languageName: node + linkType: hard + +"@babel/plugin-syntax-bigint@npm:^7.8.3": + version: 7.8.3 + resolution: "@babel/plugin-syntax-bigint@npm:7.8.3" + dependencies: + "@babel/helper-plugin-utils": ^7.8.0 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 3a10849d83e47aec50f367a9e56a6b22d662ddce643334b087f9828f4c3dd73bdc5909aaeabe123fed78515767f9ca43498a0e621c438d1cd2802d7fae3c9648 + languageName: node + linkType: hard + +"@babel/plugin-syntax-class-properties@npm:^7.8.3": + version: 7.12.13 + resolution: "@babel/plugin-syntax-class-properties@npm:7.12.13" + dependencies: + "@babel/helper-plugin-utils": ^7.12.13 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 24f34b196d6342f28d4bad303612d7ff566ab0a013ce89e775d98d6f832969462e7235f3e7eaf17678a533d4be0ba45d3ae34ab4e5a9dcbda5d98d49e5efa2fc + languageName: node + linkType: hard + +"@babel/plugin-syntax-import-meta@npm:^7.8.3": + version: 7.10.4 + resolution: "@babel/plugin-syntax-import-meta@npm:7.10.4" + dependencies: + "@babel/helper-plugin-utils": ^7.10.4 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 166ac1125d10b9c0c430e4156249a13858c0366d38844883d75d27389621ebe651115cb2ceb6dc011534d5055719fa1727b59f39e1ab3ca97820eef3dcab5b9b + languageName: node + linkType: hard + +"@babel/plugin-syntax-json-strings@npm:^7.8.3": + version: 7.8.3 + resolution: "@babel/plugin-syntax-json-strings@npm:7.8.3" + dependencies: + "@babel/helper-plugin-utils": ^7.8.0 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: bf5aea1f3188c9a507e16efe030efb996853ca3cadd6512c51db7233cc58f3ac89ff8c6bdfb01d30843b161cfe7d321e1bf28da82f7ab8d7e6bc5464666f354a + languageName: node + linkType: hard + +"@babel/plugin-syntax-jsx@npm:^7.7.2": + version: 7.18.6 + resolution: "@babel/plugin-syntax-jsx@npm:7.18.6" + dependencies: + "@babel/helper-plugin-utils": ^7.18.6 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 6d37ea972970195f1ffe1a54745ce2ae456e0ac6145fae9aa1480f297248b262ea6ebb93010eddb86ebfacb94f57c05a1fc5d232b9a67325b09060299d515c67 + languageName: node + linkType: hard + +"@babel/plugin-syntax-logical-assignment-operators@npm:^7.8.3": + version: 7.10.4 + resolution: "@babel/plugin-syntax-logical-assignment-operators@npm:7.10.4" + dependencies: + "@babel/helper-plugin-utils": ^7.10.4 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: aff33577037e34e515911255cdbb1fd39efee33658aa00b8a5fd3a4b903585112d037cce1cc9e4632f0487dc554486106b79ccd5ea63a2e00df4363f6d4ff886 + languageName: node + linkType: hard + +"@babel/plugin-syntax-nullish-coalescing-operator@npm:^7.8.3": + version: 7.8.3 + resolution: "@babel/plugin-syntax-nullish-coalescing-operator@npm:7.8.3" + dependencies: + "@babel/helper-plugin-utils": ^7.8.0 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 87aca4918916020d1fedba54c0e232de408df2644a425d153be368313fdde40d96088feed6c4e5ab72aac89be5d07fef2ddf329a15109c5eb65df006bf2580d1 + languageName: node + linkType: hard + +"@babel/plugin-syntax-numeric-separator@npm:^7.8.3": + version: 7.10.4 + resolution: "@babel/plugin-syntax-numeric-separator@npm:7.10.4" + dependencies: + "@babel/helper-plugin-utils": ^7.10.4 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 01ec5547bd0497f76cc903ff4d6b02abc8c05f301c88d2622b6d834e33a5651aa7c7a3d80d8d57656a4588f7276eba357f6b7e006482f5b564b7a6488de493a1 + languageName: node + linkType: hard + +"@babel/plugin-syntax-object-rest-spread@npm:^7.8.3": + version: 7.8.3 + resolution: "@babel/plugin-syntax-object-rest-spread@npm:7.8.3" + dependencies: + "@babel/helper-plugin-utils": ^7.8.0 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: fddcf581a57f77e80eb6b981b10658421bc321ba5f0a5b754118c6a92a5448f12a0c336f77b8abf734841e102e5126d69110a306eadb03ca3e1547cab31f5cbf + languageName: node + linkType: hard + +"@babel/plugin-syntax-optional-catch-binding@npm:^7.8.3": + version: 7.8.3 + resolution: "@babel/plugin-syntax-optional-catch-binding@npm:7.8.3" + dependencies: + "@babel/helper-plugin-utils": ^7.8.0 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 910d90e72bc90ea1ce698e89c1027fed8845212d5ab588e35ef91f13b93143845f94e2539d831dc8d8ededc14ec02f04f7bd6a8179edd43a326c784e7ed7f0b9 + languageName: node + linkType: hard + +"@babel/plugin-syntax-optional-chaining@npm:^7.8.3": + version: 7.8.3 + resolution: "@babel/plugin-syntax-optional-chaining@npm:7.8.3" + dependencies: + "@babel/helper-plugin-utils": ^7.8.0 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: eef94d53a1453361553c1f98b68d17782861a04a392840341bc91780838dd4e695209c783631cf0de14c635758beafb6a3a65399846ffa4386bff90639347f30 + languageName: node + linkType: hard + +"@babel/plugin-syntax-top-level-await@npm:^7.8.3": + version: 7.14.5 + resolution: "@babel/plugin-syntax-top-level-await@npm:7.14.5" + dependencies: + "@babel/helper-plugin-utils": ^7.14.5 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: bbd1a56b095be7820029b209677b194db9b1d26691fe999856462e66b25b281f031f3dfd91b1619e9dcf95bebe336211833b854d0fb8780d618e35667c2d0d7e + languageName: node + linkType: hard + +"@babel/plugin-syntax-typescript@npm:^7.7.2": + version: 7.20.0 + resolution: "@babel/plugin-syntax-typescript@npm:7.20.0" + dependencies: + "@babel/helper-plugin-utils": ^7.19.0 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 6189c0b5c32ba3c9a80a42338bd50719d783b20ef29b853d4f03929e971913d3cefd80184e924ae98ad6db09080be8fe6f1ffde9a6db8972523234f0274d36f7 + languageName: node + linkType: hard + +"@babel/template@npm:^7.20.7, @babel/template@npm:^7.3.3": + version: 7.20.7 + resolution: "@babel/template@npm:7.20.7" + dependencies: + "@babel/code-frame": ^7.18.6 + "@babel/parser": ^7.20.7 + "@babel/types": ^7.20.7 + checksum: 2eb1a0ab8d415078776bceb3473d07ab746e6bb4c2f6ca46ee70efb284d75c4a32bb0cd6f4f4946dec9711f9c0780e8e5d64b743208deac6f8e9858afadc349e + languageName: node + linkType: hard + +"@babel/traverse@npm:^7.21.0, @babel/traverse@npm:^7.21.2, @babel/traverse@npm:^7.21.3, @babel/traverse@npm:^7.7.2": + version: 7.21.3 + resolution: "@babel/traverse@npm:7.21.3" + dependencies: + "@babel/code-frame": ^7.18.6 + "@babel/generator": ^7.21.3 + "@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.3 + "@babel/types": ^7.21.3 + debug: ^4.1.0 + globals: ^11.1.0 + checksum: 0af5bcd47a2fc501592b90ac1feae9d449afb9ab0772a4f6e68230f4cd3a475795d538c1de3f880fe3414b6c2820bac84d02c6549eea796f39d74a603717447b + languageName: node + linkType: hard + +"@babel/types@npm:^7.0.0, @babel/types@npm:^7.18.6, @babel/types@npm:^7.20.2, @babel/types@npm:^7.20.7, @babel/types@npm:^7.21.0, @babel/types@npm:^7.21.2, @babel/types@npm:^7.21.3, @babel/types@npm:^7.3.0, @babel/types@npm:^7.3.3, @babel/types@npm:^7.8.3": + version: 7.21.3 + resolution: "@babel/types@npm:7.21.3" + dependencies: + "@babel/helper-string-parser": ^7.19.4 + "@babel/helper-validator-identifier": ^7.19.1 + to-fast-properties: ^2.0.0 + checksum: b750274718ba9cefd0b81836c464009bb6ba339fccce51b9baff497a0a2d96c044c61dc90cf203cec0adc770454b53a9681c3f7716883c802b85ab84c365ba35 + languageName: node + linkType: hard + +"@bcoe/v8-coverage@npm:^0.2.3": + version: 0.2.3 + resolution: "@bcoe/v8-coverage@npm:0.2.3" + checksum: 850f9305536d0f2bd13e9e0881cb5f02e4f93fad1189f7b2d4bebf694e3206924eadee1068130d43c11b750efcc9405f88a8e42ef098b6d75239c0f047de1a27 + languageName: node + linkType: hard + +"@cspotcode/source-map-support@npm:^0.8.0": + version: 0.8.1 + resolution: "@cspotcode/source-map-support@npm:0.8.1" + dependencies: + "@jridgewell/trace-mapping": 0.3.9 + checksum: 5718f267085ed8edb3e7ef210137241775e607ee18b77d95aa5bd7514f47f5019aa2d82d96b3bf342ef7aa890a346fa1044532ff7cc3009e7d24fce3ce6200fa + languageName: node + linkType: hard + +"@es-joy/jsdoccomment@npm:~0.37.0": + version: 0.37.0 + resolution: "@es-joy/jsdoccomment@npm:0.37.0" + dependencies: + comment-parser: 1.3.1 + esquery: ^1.4.0 + jsdoc-type-pratt-parser: ~4.0.0 + checksum: 949c0d164573f189998a7ad7ace936639535e1cacf495d7daa893142dbe9e947f146602615732eaa3174b7ca08af9eea5d9fa97a68fdfe0aa14213ab0f319b13 + languageName: node + linkType: hard + +"@esbuild/android-arm64@npm:0.17.12": + version: 0.17.12 + resolution: "@esbuild/android-arm64@npm:0.17.12" + conditions: os=android & cpu=arm64 + languageName: node + linkType: hard + +"@esbuild/android-arm@npm:0.17.12": + version: 0.17.12 + resolution: "@esbuild/android-arm@npm:0.17.12" + conditions: os=android & cpu=arm + languageName: node + linkType: hard + +"@esbuild/android-x64@npm:0.17.12": + version: 0.17.12 + resolution: "@esbuild/android-x64@npm:0.17.12" + conditions: os=android & cpu=x64 + languageName: node + linkType: hard + +"@esbuild/darwin-arm64@npm:0.17.12": + version: 0.17.12 + resolution: "@esbuild/darwin-arm64@npm:0.17.12" + conditions: os=darwin & cpu=arm64 + languageName: node + linkType: hard + +"@esbuild/darwin-x64@npm:0.17.12": + version: 0.17.12 + resolution: "@esbuild/darwin-x64@npm:0.17.12" + conditions: os=darwin & cpu=x64 + languageName: node + linkType: hard + +"@esbuild/freebsd-arm64@npm:0.17.12": + version: 0.17.12 + resolution: "@esbuild/freebsd-arm64@npm:0.17.12" + conditions: os=freebsd & cpu=arm64 + languageName: node + linkType: hard + +"@esbuild/freebsd-x64@npm:0.17.12": + version: 0.17.12 + resolution: "@esbuild/freebsd-x64@npm:0.17.12" + conditions: os=freebsd & cpu=x64 + languageName: node + linkType: hard + +"@esbuild/linux-arm64@npm:0.17.12": + version: 0.17.12 + resolution: "@esbuild/linux-arm64@npm:0.17.12" + conditions: os=linux & cpu=arm64 + languageName: node + linkType: hard + +"@esbuild/linux-arm@npm:0.17.12": + version: 0.17.12 + resolution: "@esbuild/linux-arm@npm:0.17.12" + conditions: os=linux & cpu=arm + languageName: node + linkType: hard + +"@esbuild/linux-ia32@npm:0.17.12": + version: 0.17.12 + resolution: "@esbuild/linux-ia32@npm:0.17.12" + conditions: os=linux & cpu=ia32 + languageName: node + linkType: hard + +"@esbuild/linux-loong64@npm:0.17.12": + version: 0.17.12 + resolution: "@esbuild/linux-loong64@npm:0.17.12" + conditions: os=linux & cpu=loong64 + languageName: node + linkType: hard + +"@esbuild/linux-mips64el@npm:0.17.12": + version: 0.17.12 + resolution: "@esbuild/linux-mips64el@npm:0.17.12" + conditions: os=linux & cpu=mips64el + languageName: node + linkType: hard + +"@esbuild/linux-ppc64@npm:0.17.12": + version: 0.17.12 + resolution: "@esbuild/linux-ppc64@npm:0.17.12" + conditions: os=linux & cpu=ppc64 + languageName: node + linkType: hard + +"@esbuild/linux-riscv64@npm:0.17.12": + version: 0.17.12 + resolution: "@esbuild/linux-riscv64@npm:0.17.12" + conditions: os=linux & cpu=riscv64 + languageName: node + linkType: hard + +"@esbuild/linux-s390x@npm:0.17.12": + version: 0.17.12 + resolution: "@esbuild/linux-s390x@npm:0.17.12" + conditions: os=linux & cpu=s390x + languageName: node + linkType: hard + +"@esbuild/linux-x64@npm:0.17.12": + version: 0.17.12 + resolution: "@esbuild/linux-x64@npm:0.17.12" + conditions: os=linux & cpu=x64 + languageName: node + linkType: hard + +"@esbuild/netbsd-x64@npm:0.17.12": + version: 0.17.12 + resolution: "@esbuild/netbsd-x64@npm:0.17.12" + conditions: os=netbsd & cpu=x64 + languageName: node + linkType: hard + +"@esbuild/openbsd-x64@npm:0.17.12": + version: 0.17.12 + resolution: "@esbuild/openbsd-x64@npm:0.17.12" + conditions: os=openbsd & cpu=x64 + languageName: node + linkType: hard + +"@esbuild/sunos-x64@npm:0.17.12": + version: 0.17.12 + resolution: "@esbuild/sunos-x64@npm:0.17.12" + conditions: os=sunos & cpu=x64 + languageName: node + linkType: hard + +"@esbuild/win32-arm64@npm:0.17.12": + version: 0.17.12 + resolution: "@esbuild/win32-arm64@npm:0.17.12" + conditions: os=win32 & cpu=arm64 + languageName: node + linkType: hard + +"@esbuild/win32-ia32@npm:0.17.12": + version: 0.17.12 + resolution: "@esbuild/win32-ia32@npm:0.17.12" + conditions: os=win32 & cpu=ia32 + languageName: node + linkType: hard + +"@esbuild/win32-x64@npm:0.17.12": + version: 0.17.12 + resolution: "@esbuild/win32-x64@npm:0.17.12" + conditions: os=win32 & cpu=x64 + languageName: node + linkType: hard + +"@eslint-community/eslint-utils@npm:^4.2.0": + version: 4.3.0 + resolution: "@eslint-community/eslint-utils@npm:4.3.0" + dependencies: + eslint-visitor-keys: ^3.3.0 + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + checksum: f487760a692f0f1fef76e248ad72976919576ba57edc2b1b1dc1d182553bae6b5bf7b078e654da85d04f0af8a485d20bd26280002768f4fbcd2e330078340cb0 + languageName: node + linkType: hard + +"@eslint-community/regexpp@npm:^4.4.0": + version: 4.4.0 + resolution: "@eslint-community/regexpp@npm:4.4.0" + checksum: 2d127af0c752b80e8a782eacfe996a86925d21de92da3ffc6f9e615e701145e44a62e26bdd88bfac2cd76779c39ba8d9875a91046ec5e7e5f23cb647c247ea6a + languageName: node + linkType: hard + +"@eslint/eslintrc@npm:^2.0.1": + version: 2.0.1 + resolution: "@eslint/eslintrc@npm:2.0.1" + dependencies: + ajv: ^6.12.4 + debug: ^4.3.2 + espree: ^9.5.0 + globals: ^13.19.0 + ignore: ^5.2.0 + import-fresh: ^3.2.1 + js-yaml: ^4.1.0 + minimatch: ^3.1.2 + strip-json-comments: ^3.1.1 + checksum: 56b9192a687a450db53a7b883daf9f0f447c43b3510189cf88808a7a2467c2a302a42a50f184cc6d5a9faf3d1df890a2ef0fd0d60b751f32a3e9dfea717c6b48 + languageName: node + linkType: hard + +"@eslint/js@npm:8.36.0": + version: 8.36.0 + resolution: "@eslint/js@npm:8.36.0" + checksum: b7d6b84b823c8c7784be390741196617565527b1f7c0977fde9455bfb57fd88f81c074a03dd878757d2c33fa29f24291e9ecbc1425710f067917324b55e1bf3a + languageName: node + linkType: hard + +"@gar/promisify@npm:^1.1.3": + version: 1.1.3 + resolution: "@gar/promisify@npm:1.1.3" + checksum: 4059f790e2d07bf3c3ff3e0fec0daa8144fe35c1f6e0111c9921bd32106adaa97a4ab096ad7dab1e28ee6a9060083c4d1a4ada42a7f5f3f7a96b8812e2b757c1 + languageName: node + linkType: hard + +"@humanwhocodes/config-array@npm:^0.11.8": + version: 0.11.8 + resolution: "@humanwhocodes/config-array@npm:0.11.8" + dependencies: + "@humanwhocodes/object-schema": ^1.2.1 + debug: ^4.1.1 + minimatch: ^3.0.5 + checksum: 0fd6b3c54f1674ce0a224df09b9c2f9846d20b9e54fabae1281ecfc04f2e6ad69bf19e1d6af6a28f88e8aa3990168b6cb9e1ef755868c3256a630605ec2cb1d3 + languageName: node + linkType: hard + +"@humanwhocodes/module-importer@npm:^1.0.1": + version: 1.0.1 + resolution: "@humanwhocodes/module-importer@npm:1.0.1" + checksum: 0fd22007db8034a2cdf2c764b140d37d9020bbfce8a49d3ec5c05290e77d4b0263b1b972b752df8c89e5eaa94073408f2b7d977aed131faf6cf396ebb5d7fb61 + languageName: node + linkType: hard + +"@humanwhocodes/object-schema@npm:^1.2.1": + version: 1.2.1 + resolution: "@humanwhocodes/object-schema@npm:1.2.1" + checksum: a824a1ec31591231e4bad5787641f59e9633827d0a2eaae131a288d33c9ef0290bd16fda8da6f7c0fcb014147865d12118df10db57f27f41e20da92369fcb3f1 + languageName: node + linkType: hard + +"@istanbuljs/load-nyc-config@npm:^1.0.0": + version: 1.1.0 + resolution: "@istanbuljs/load-nyc-config@npm:1.1.0" + dependencies: + camelcase: ^5.3.1 + find-up: ^4.1.0 + get-package-type: ^0.1.0 + js-yaml: ^3.13.1 + resolve-from: ^5.0.0 + checksum: d578da5e2e804d5c93228450a1380e1a3c691de4953acc162f387b717258512a3e07b83510a936d9fab03eac90817473917e24f5d16297af3867f59328d58568 + languageName: node + linkType: hard + +"@istanbuljs/schema@npm:^0.1.2": + version: 0.1.3 + resolution: "@istanbuljs/schema@npm:0.1.3" + checksum: 5282759d961d61350f33d9118d16bcaed914ebf8061a52f4fa474b2cb08720c9c81d165e13b82f2e5a8a212cc5af482f0c6fc1ac27b9e067e5394c9a6ed186c9 + languageName: node + linkType: hard + +"@jest/console@npm:^28.1.3": + version: 28.1.3 + resolution: "@jest/console@npm:28.1.3" + dependencies: + "@jest/types": ^28.1.3 + "@types/node": "*" + chalk: ^4.0.0 + jest-message-util: ^28.1.3 + jest-util: ^28.1.3 + slash: ^3.0.0 + checksum: fe50d98d26d02ce2901c76dff4bd5429a33c13affb692c9ebf8a578ca2f38a5dd854363d40d6c394f215150791fd1f692afd8e730a4178dda24107c8dfd9750a + languageName: node + linkType: hard + +"@jest/console@npm:^29.5.0": + version: 29.5.0 + resolution: "@jest/console@npm:29.5.0" + dependencies: + "@jest/types": ^29.5.0 + "@types/node": "*" + chalk: ^4.0.0 + jest-message-util: ^29.5.0 + jest-util: ^29.5.0 + slash: ^3.0.0 + checksum: 9f4f4b8fabd1221361b7f2e92d4a90f5f8c2e2b29077249996ab3c8b7f765175ffee795368f8d6b5b2bb3adb32dc09319f7270c7c787b0d259e624e00e0f64a5 + languageName: node + linkType: hard + +"@jest/core@npm:^28.1.3": + version: 28.1.3 + resolution: "@jest/core@npm:28.1.3" + dependencies: + "@jest/console": ^28.1.3 + "@jest/reporters": ^28.1.3 + "@jest/test-result": ^28.1.3 + "@jest/transform": ^28.1.3 + "@jest/types": ^28.1.3 + "@types/node": "*" + ansi-escapes: ^4.2.1 + chalk: ^4.0.0 + ci-info: ^3.2.0 + exit: ^0.1.2 + graceful-fs: ^4.2.9 + jest-changed-files: ^28.1.3 + jest-config: ^28.1.3 + jest-haste-map: ^28.1.3 + jest-message-util: ^28.1.3 + jest-regex-util: ^28.0.2 + jest-resolve: ^28.1.3 + jest-resolve-dependencies: ^28.1.3 + jest-runner: ^28.1.3 + jest-runtime: ^28.1.3 + jest-snapshot: ^28.1.3 + jest-util: ^28.1.3 + jest-validate: ^28.1.3 + jest-watcher: ^28.1.3 + micromatch: ^4.0.4 + pretty-format: ^28.1.3 + rimraf: ^3.0.0 + slash: ^3.0.0 + strip-ansi: ^6.0.0 + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + checksum: cb79f34bafc4637e7130df12257f5b29075892a2be2c7f45c6d4c0420853e80b5dae11016e652530eb234f4c44c00910cdca3c2cd86275721860725073f7d9b4 + languageName: node + linkType: hard + +"@jest/core@npm:^29.5.0": + version: 29.5.0 + resolution: "@jest/core@npm:29.5.0" + dependencies: + "@jest/console": ^29.5.0 + "@jest/reporters": ^29.5.0 + "@jest/test-result": ^29.5.0 + "@jest/transform": ^29.5.0 + "@jest/types": ^29.5.0 + "@types/node": "*" + ansi-escapes: ^4.2.1 + chalk: ^4.0.0 + ci-info: ^3.2.0 + exit: ^0.1.2 + graceful-fs: ^4.2.9 + jest-changed-files: ^29.5.0 + jest-config: ^29.5.0 + jest-haste-map: ^29.5.0 + jest-message-util: ^29.5.0 + jest-regex-util: ^29.4.3 + jest-resolve: ^29.5.0 + jest-resolve-dependencies: ^29.5.0 + jest-runner: ^29.5.0 + jest-runtime: ^29.5.0 + jest-snapshot: ^29.5.0 + jest-util: ^29.5.0 + jest-validate: ^29.5.0 + jest-watcher: ^29.5.0 + micromatch: ^4.0.4 + pretty-format: ^29.5.0 + slash: ^3.0.0 + strip-ansi: ^6.0.0 + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + checksum: 9e8f5243fe82d5a57f3971e1b96f320058df7c315328a3a827263f3b17f64be10c80f4a9c1b1773628b64d2de6d607c70b5b2d5bf13e7f5ad04223e9ef6aac06 + languageName: node + linkType: hard + +"@jest/environment@npm:^28.1.3": + version: 28.1.3 + resolution: "@jest/environment@npm:28.1.3" + dependencies: + "@jest/fake-timers": ^28.1.3 + "@jest/types": ^28.1.3 + "@types/node": "*" + jest-mock: ^28.1.3 + checksum: 14c496b84aef951df33128cea68988e9de43b2e9d62be9f9c4308d4ac307fa345642813679f80d0a4cedeb900cf6f0b6bb2b92ce089528e8721f72295fdc727f + languageName: node + linkType: hard + +"@jest/environment@npm:^29.5.0": + version: 29.5.0 + resolution: "@jest/environment@npm:29.5.0" + dependencies: + "@jest/fake-timers": ^29.5.0 + "@jest/types": ^29.5.0 + "@types/node": "*" + jest-mock: ^29.5.0 + checksum: 921de6325cd4817dec6685e5ff299b499b6379f3f9cf489b4b13588ee1f3820a0c77b49e6a087996b6de8f629f6f5251e636cba08d1bdb97d8071cc7d033c88a + languageName: node + linkType: hard + +"@jest/expect-utils@npm:^28.1.3": + version: 28.1.3 + resolution: "@jest/expect-utils@npm:28.1.3" + dependencies: + jest-get-type: ^28.0.2 + checksum: 808ea3a68292a7e0b95490fdd55605c430b4cf209ea76b5b61bfb2a1badcb41bc046810fe4e364bd5fe04663978aa2bd73d8f8465a761dd7c655aeb44cf22987 + languageName: node + linkType: hard + +"@jest/expect-utils@npm:^29.5.0": + version: 29.5.0 + resolution: "@jest/expect-utils@npm:29.5.0" + dependencies: + jest-get-type: ^29.4.3 + checksum: c46fb677c88535cf83cf29f0a5b1f376c6a1109ddda266ad7da1a9cbc53cb441fa402dd61fc7b111ffc99603c11a9b3357ee41a1c0e035a58830bcb360871476 + languageName: node + linkType: hard + +"@jest/expect@npm:^28.1.3": + version: 28.1.3 + resolution: "@jest/expect@npm:28.1.3" + dependencies: + expect: ^28.1.3 + jest-snapshot: ^28.1.3 + checksum: 4197f6fdddc33dc45ba4e838f992fc61839c421d7aed0dfe665ef9c2f172bb1df8a8cac9cecee272b40e744a326da521d5e182709fe82a0b936055bfffa3b473 + languageName: node + linkType: hard + +"@jest/expect@npm:^29.5.0": + version: 29.5.0 + resolution: "@jest/expect@npm:29.5.0" + dependencies: + expect: ^29.5.0 + jest-snapshot: ^29.5.0 + checksum: bd10e295111547e6339137107d83986ab48d46561525393834d7d2d8b2ae9d5626653f3f5e48e5c3fa742ac982e97bdf1f541b53b9e1d117a247b08e938527f6 + languageName: node + linkType: hard + +"@jest/fake-timers@npm:^28.1.3": + version: 28.1.3 + resolution: "@jest/fake-timers@npm:28.1.3" + dependencies: + "@jest/types": ^28.1.3 + "@sinonjs/fake-timers": ^9.1.2 + "@types/node": "*" + jest-message-util: ^28.1.3 + jest-mock: ^28.1.3 + jest-util: ^28.1.3 + checksum: cec14d5b14913a54dce64a62912c5456235f5d90b509ceae19c727565073114dae1aaf960ac6be96b3eb94789a3a758b96b72c8fca7e49a6ccac415fbc0321e1 + languageName: node + linkType: hard + +"@jest/fake-timers@npm:^29.5.0": + version: 29.5.0 + resolution: "@jest/fake-timers@npm:29.5.0" + dependencies: + "@jest/types": ^29.5.0 + "@sinonjs/fake-timers": ^10.0.2 + "@types/node": "*" + jest-message-util: ^29.5.0 + jest-mock: ^29.5.0 + jest-util: ^29.5.0 + checksum: 69930c6922341f244151ec0d27640852ec96237f730fc024da1f53143d31b43cde75d92f9d8e5937981cdce3b31416abc3a7090a0d22c2377512c4a6613244ee + languageName: node + linkType: hard + +"@jest/globals@npm:^28.1.3": + version: 28.1.3 + resolution: "@jest/globals@npm:28.1.3" + dependencies: + "@jest/environment": ^28.1.3 + "@jest/expect": ^28.1.3 + "@jest/types": ^28.1.3 + checksum: 3504bb23de629d466c6f2b6b75d2e1c1b10caccbbcfb7eaa82d22cc37711c8e364c243929581184846605c023b475ea6c42c2e3ea5994429a988d8d527af32cd + languageName: node + linkType: hard + +"@jest/globals@npm:^29.4.3, @jest/globals@npm:^29.5.0": + version: 29.5.0 + resolution: "@jest/globals@npm:29.5.0" + dependencies: + "@jest/environment": ^29.5.0 + "@jest/expect": ^29.5.0 + "@jest/types": ^29.5.0 + jest-mock: ^29.5.0 + checksum: b309ab8f21b571a7c672608682e84bbdd3d2b554ddf81e4e32617fec0a69094a290ab42e3c8b2c66ba891882bfb1b8b2736720ea1285b3ad646d55c2abefedd9 + languageName: node + linkType: hard + +"@jest/reporters@npm:^28.1.3": + version: 28.1.3 + resolution: "@jest/reporters@npm:28.1.3" + dependencies: + "@bcoe/v8-coverage": ^0.2.3 + "@jest/console": ^28.1.3 + "@jest/test-result": ^28.1.3 + "@jest/transform": ^28.1.3 + "@jest/types": ^28.1.3 + "@jridgewell/trace-mapping": ^0.3.13 + "@types/node": "*" + chalk: ^4.0.0 + collect-v8-coverage: ^1.0.0 + exit: ^0.1.2 + glob: ^7.1.3 + graceful-fs: ^4.2.9 + istanbul-lib-coverage: ^3.0.0 + istanbul-lib-instrument: ^5.1.0 + istanbul-lib-report: ^3.0.0 + istanbul-lib-source-maps: ^4.0.0 + istanbul-reports: ^3.1.3 + jest-message-util: ^28.1.3 + jest-util: ^28.1.3 + jest-worker: ^28.1.3 + slash: ^3.0.0 + string-length: ^4.0.1 + strip-ansi: ^6.0.0 + terminal-link: ^2.0.0 + v8-to-istanbul: ^9.0.1 + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + checksum: a7440887ce837922cbeaa64c3232eb48aae02aa9123f29fc4280ad3e1afe4b35dcba171ba1d5fd219037c396c5152d9c2d102cff1798dd5ae3bd33ac4759ae0a + languageName: node + linkType: hard + +"@jest/reporters@npm:^29.5.0": + version: 29.5.0 + resolution: "@jest/reporters@npm:29.5.0" + dependencies: + "@bcoe/v8-coverage": ^0.2.3 + "@jest/console": ^29.5.0 + "@jest/test-result": ^29.5.0 + "@jest/transform": ^29.5.0 + "@jest/types": ^29.5.0 + "@jridgewell/trace-mapping": ^0.3.15 + "@types/node": "*" + chalk: ^4.0.0 + collect-v8-coverage: ^1.0.0 + exit: ^0.1.2 + glob: ^7.1.3 + graceful-fs: ^4.2.9 + istanbul-lib-coverage: ^3.0.0 + istanbul-lib-instrument: ^5.1.0 + istanbul-lib-report: ^3.0.0 + istanbul-lib-source-maps: ^4.0.0 + istanbul-reports: ^3.1.3 + jest-message-util: ^29.5.0 + jest-util: ^29.5.0 + jest-worker: ^29.5.0 + slash: ^3.0.0 + string-length: ^4.0.1 + strip-ansi: ^6.0.0 + v8-to-istanbul: ^9.0.1 + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + checksum: 481268aac9a4a75cc49c4df1273d6b111808dec815e9d009dad717c32383ebb0cebac76e820ad1ab44e207540e1c2fe1e640d44c4f262de92ab1933e057fdeeb + languageName: node + linkType: hard + +"@jest/schemas@npm:^28.1.3": + version: 28.1.3 + resolution: "@jest/schemas@npm:28.1.3" + dependencies: + "@sinclair/typebox": ^0.24.1 + checksum: 3cf1d4b66c9c4ffda58b246de1ddcba8e6ad085af63dccdf07922511f13b68c0cc480a7bc620cb4f3099a6f134801c747e1df7bfc7a4ef4dceefbdea3e31e1de + languageName: node + linkType: hard + +"@jest/schemas@npm:^29.4.3": + version: 29.4.3 + resolution: "@jest/schemas@npm:29.4.3" + dependencies: + "@sinclair/typebox": ^0.25.16 + checksum: ac754e245c19dc39e10ebd41dce09040214c96a4cd8efa143b82148e383e45128f24599195ab4f01433adae4ccfbe2db6574c90db2862ccd8551a86704b5bebd + languageName: node + linkType: hard + +"@jest/source-map@npm:^28.1.2": + version: 28.1.2 + resolution: "@jest/source-map@npm:28.1.2" + dependencies: + "@jridgewell/trace-mapping": ^0.3.13 + callsites: ^3.0.0 + graceful-fs: ^4.2.9 + checksum: b82a5c2e93d35d86779c61a02ccb967d1b5cd2e9dd67d26d8add44958637cbbb99daeeb8129c7653389cb440dc2a2f5ae4d2183dc453c67669ff98938b775a3a + languageName: node + linkType: hard + +"@jest/source-map@npm:^29.4.3": + version: 29.4.3 + resolution: "@jest/source-map@npm:29.4.3" + dependencies: + "@jridgewell/trace-mapping": ^0.3.15 + callsites: ^3.0.0 + graceful-fs: ^4.2.9 + checksum: 2301d225145f8123540c0be073f35a80fd26a2f5e59550fd68525d8cea580fb896d12bf65106591ffb7366a8a19790076dbebc70e0f5e6ceb51f81827ed1f89c + languageName: node + linkType: hard + +"@jest/test-result@npm:^28.1.3": + version: 28.1.3 + resolution: "@jest/test-result@npm:28.1.3" + dependencies: + "@jest/console": ^28.1.3 + "@jest/types": ^28.1.3 + "@types/istanbul-lib-coverage": ^2.0.0 + collect-v8-coverage: ^1.0.0 + checksum: 957a5dd2fd2e84aabe86698f93c0825e96128ccaa23abf548b159a9b08ac74e4bde7acf4bec48479243dbdb27e4ea1b68c171846d21fb64855c6b55cead9ef27 + languageName: node + linkType: hard + +"@jest/test-result@npm:^29.5.0": + version: 29.5.0 + resolution: "@jest/test-result@npm:29.5.0" + dependencies: + "@jest/console": ^29.5.0 + "@jest/types": ^29.5.0 + "@types/istanbul-lib-coverage": ^2.0.0 + collect-v8-coverage: ^1.0.0 + checksum: 2e8ff5242227ab960c520c3ea0f6544c595cc1c42fa3873c158e9f4f685f4ec9670ec08a4af94ae3885c0005a43550a9595191ffbc27a0965df27d9d98bbf901 + languageName: node + linkType: hard + +"@jest/test-sequencer@npm:^28.1.3": + version: 28.1.3 + resolution: "@jest/test-sequencer@npm:28.1.3" + dependencies: + "@jest/test-result": ^28.1.3 + graceful-fs: ^4.2.9 + jest-haste-map: ^28.1.3 + slash: ^3.0.0 + checksum: 13f8905e6d1ec8286694146f7be3cf90eff801bbdea5e5c403e6881444bb390ed15494c7b9948aa94bd7e9c9a851e0d3002ed6e7371d048b478596e5b23df953 + languageName: node + linkType: hard + +"@jest/test-sequencer@npm:^29.5.0": + version: 29.5.0 + resolution: "@jest/test-sequencer@npm:29.5.0" + dependencies: + "@jest/test-result": ^29.5.0 + graceful-fs: ^4.2.9 + jest-haste-map: ^29.5.0 + slash: ^3.0.0 + checksum: eca34b4aeb2fda6dfb7f9f4b064c858a7adf64ec5c6091b6f4ed9d3c19549177cbadcf1c615c4c182688fa1cf085c8c55c3ca6eea40719a34554b0bf071d842e + languageName: node + linkType: hard + +"@jest/transform@npm:^28.1.3": + version: 28.1.3 + resolution: "@jest/transform@npm:28.1.3" + dependencies: + "@babel/core": ^7.11.6 + "@jest/types": ^28.1.3 + "@jridgewell/trace-mapping": ^0.3.13 + babel-plugin-istanbul: ^6.1.1 + chalk: ^4.0.0 + convert-source-map: ^1.4.0 + fast-json-stable-stringify: ^2.0.0 + graceful-fs: ^4.2.9 + jest-haste-map: ^28.1.3 + jest-regex-util: ^28.0.2 + jest-util: ^28.1.3 + micromatch: ^4.0.4 + pirates: ^4.0.4 + slash: ^3.0.0 + write-file-atomic: ^4.0.1 + checksum: dadf618936e0aa84342f07f532801d5bed43cdf95d1417b929e4f8782c872cff1adc84096d5a287a796d0039a2691c06d8450cce5a713a8b52fbb9f872a1e760 + languageName: node + linkType: hard + +"@jest/transform@npm:^29.5.0": + version: 29.5.0 + resolution: "@jest/transform@npm:29.5.0" + dependencies: + "@babel/core": ^7.11.6 + "@jest/types": ^29.5.0 + "@jridgewell/trace-mapping": ^0.3.15 + babel-plugin-istanbul: ^6.1.1 + chalk: ^4.0.0 + convert-source-map: ^2.0.0 + fast-json-stable-stringify: ^2.1.0 + graceful-fs: ^4.2.9 + jest-haste-map: ^29.5.0 + jest-regex-util: ^29.4.3 + jest-util: ^29.5.0 + micromatch: ^4.0.4 + pirates: ^4.0.4 + slash: ^3.0.0 + write-file-atomic: ^4.0.2 + checksum: d55d604085c157cf5112e165ff5ac1fa788873b3b31265fb4734ca59892ee24e44119964cc47eb6d178dd9512bbb6c576d1e20e51a201ff4e24d31e818a1c92d + languageName: node + linkType: hard + +"@jest/types@npm:^28.1.3": + version: 28.1.3 + resolution: "@jest/types@npm:28.1.3" + dependencies: + "@jest/schemas": ^28.1.3 + "@types/istanbul-lib-coverage": ^2.0.0 + "@types/istanbul-reports": ^3.0.0 + "@types/node": "*" + "@types/yargs": ^17.0.8 + chalk: ^4.0.0 + checksum: 1e258d9c063fcf59ebc91e46d5ea5984674ac7ae6cae3e50aa780d22b4405bf2c925f40350bf30013839eb5d4b5e521d956ddf8f3b7c78debef0e75a07f57350 + languageName: node + linkType: hard + +"@jest/types@npm:^29.5.0": + version: 29.5.0 + resolution: "@jest/types@npm:29.5.0" + dependencies: + "@jest/schemas": ^29.4.3 + "@types/istanbul-lib-coverage": ^2.0.0 + "@types/istanbul-reports": ^3.0.0 + "@types/node": "*" + "@types/yargs": ^17.0.8 + chalk: ^4.0.0 + checksum: 1811f94b19cf8a9460a289c4f056796cfc373480e0492692a6125a553cd1a63824bd846d7bb78820b7b6f758f6dd3c2d4558293bb676d541b2fa59c70fdf9d39 + languageName: node + linkType: hard + +"@jridgewell/gen-mapping@npm:^0.1.0": + version: 0.1.1 + resolution: "@jridgewell/gen-mapping@npm:0.1.1" + dependencies: + "@jridgewell/set-array": ^1.0.0 + "@jridgewell/sourcemap-codec": ^1.4.10 + checksum: 3bcc21fe786de6ffbf35c399a174faab05eb23ce6a03e8769569de28abbf4facc2db36a9ddb0150545ae23a8d35a7cf7237b2aa9e9356a7c626fb4698287d5cc + languageName: node + linkType: hard + +"@jridgewell/gen-mapping@npm:^0.3.2": + version: 0.3.2 + resolution: "@jridgewell/gen-mapping@npm:0.3.2" + dependencies: + "@jridgewell/set-array": ^1.0.1 + "@jridgewell/sourcemap-codec": ^1.4.10 + "@jridgewell/trace-mapping": ^0.3.9 + checksum: 1832707a1c476afebe4d0fbbd4b9434fdb51a4c3e009ab1e9938648e21b7a97049fa6009393bdf05cab7504108413441df26d8a3c12193996e65493a4efb6882 + languageName: node + linkType: hard + +"@jridgewell/resolve-uri@npm:3.1.0, @jridgewell/resolve-uri@npm:^3.0.3": + version: 3.1.0 + resolution: "@jridgewell/resolve-uri@npm:3.1.0" + checksum: b5ceaaf9a110fcb2780d1d8f8d4a0bfd216702f31c988d8042e5f8fbe353c55d9b0f55a1733afdc64806f8e79c485d2464680ac48a0d9fcadb9548ee6b81d267 + languageName: node + linkType: hard + +"@jridgewell/set-array@npm:^1.0.0, @jridgewell/set-array@npm:^1.0.1": + version: 1.1.2 + resolution: "@jridgewell/set-array@npm:1.1.2" + checksum: 69a84d5980385f396ff60a175f7177af0b8da4ddb81824cb7016a9ef914eee9806c72b6b65942003c63f7983d4f39a5c6c27185bbca88eb4690b62075602e28e + languageName: node + linkType: hard + +"@jridgewell/sourcemap-codec@npm:1.4.14, @jridgewell/sourcemap-codec@npm:^1.4.10": + version: 1.4.14 + resolution: "@jridgewell/sourcemap-codec@npm:1.4.14" + checksum: 61100637b6d173d3ba786a5dff019e1a74b1f394f323c1fee337ff390239f053b87266c7a948777f4b1ee68c01a8ad0ab61e5ff4abb5a012a0b091bec391ab97 + languageName: node + linkType: hard + +"@jridgewell/trace-mapping@npm:0.3.9": + version: 0.3.9 + resolution: "@jridgewell/trace-mapping@npm:0.3.9" + dependencies: + "@jridgewell/resolve-uri": ^3.0.3 + "@jridgewell/sourcemap-codec": ^1.4.10 + checksum: d89597752fd88d3f3480845691a05a44bd21faac18e2185b6f436c3b0fd0c5a859fbbd9aaa92050c4052caf325ad3e10e2e1d1b64327517471b7d51babc0ddef + languageName: node + linkType: hard + +"@jridgewell/trace-mapping@npm:^0.3.12, @jridgewell/trace-mapping@npm:^0.3.13, @jridgewell/trace-mapping@npm:^0.3.15, @jridgewell/trace-mapping@npm:^0.3.17, @jridgewell/trace-mapping@npm:^0.3.9": + version: 0.3.17 + resolution: "@jridgewell/trace-mapping@npm:0.3.17" + dependencies: + "@jridgewell/resolve-uri": 3.1.0 + "@jridgewell/sourcemap-codec": 1.4.14 + checksum: 9d703b859cff5cd83b7308fd457a431387db5db96bd781a63bf48e183418dd9d3d44e76b9e4ae13237f6abeeb25d739ec9215c1d5bfdd08f66f750a50074a339 + languageName: node + linkType: hard + +"@microsoft/tsdoc-config@npm:0.16.2": + version: 0.16.2 + resolution: "@microsoft/tsdoc-config@npm:0.16.2" + dependencies: + "@microsoft/tsdoc": 0.14.2 + ajv: ~6.12.6 + jju: ~1.4.0 + resolve: ~1.19.0 + checksum: 12b0d703154076bcaac75ca42e804e4fc292672396441e54346d7eadd0d6b57f90980eda2b1bab89b224af86da34a2389f9054002e282011e795ca5919a4386f + languageName: node + linkType: hard + +"@microsoft/tsdoc@npm:0.14.2": + version: 0.14.2 + resolution: "@microsoft/tsdoc@npm:0.14.2" + checksum: b167c89e916ba73ee20b9c9d5dba6aa3a0de25ed3d50050e8a344dca7cd43cb2e1059bd515c820369b6e708901dd3fda476a42bc643ca74a35671ce77f724a3a + languageName: node + linkType: hard + +"@noble/hashes@npm:^1.1.2, @noble/hashes@npm:^1.2.0": + version: 1.3.0 + resolution: "@noble/hashes@npm:1.3.0" + checksum: d7ddb6d7c60f1ce1f87facbbef5b724cdea536fc9e7f59ae96e0fc9de96c8f1a2ae2bdedbce10f7dcc621338dfef8533daa73c873f2b5c87fa1a4e05a95c2e2e + languageName: node + linkType: hard + +"@noble/secp256k1@npm:^1.7.1": + version: 1.7.1 + resolution: "@noble/secp256k1@npm:1.7.1" + checksum: d2301f1f7690368d8409a3152450458f27e54df47e3f917292de3de82c298770890c2de7c967d237eff9c95b70af485389a9695f73eb05a43e2bd562d18b18cb + languageName: node + linkType: hard + +"@nodelib/fs.scandir@npm:2.1.5": + version: 2.1.5 + resolution: "@nodelib/fs.scandir@npm:2.1.5" + dependencies: + "@nodelib/fs.stat": 2.0.5 + run-parallel: ^1.1.9 + checksum: a970d595bd23c66c880e0ef1817791432dbb7acbb8d44b7e7d0e7a22f4521260d4a83f7f9fd61d44fda4610105577f8f58a60718105fb38352baed612fd79e59 + languageName: node + linkType: hard + +"@nodelib/fs.stat@npm:2.0.5, @nodelib/fs.stat@npm:^2.0.2": + version: 2.0.5 + resolution: "@nodelib/fs.stat@npm:2.0.5" + checksum: 012480b5ca9d97bff9261571dbbec7bbc6033f69cc92908bc1ecfad0792361a5a1994bc48674b9ef76419d056a03efadfce5a6cf6dbc0a36559571a7a483f6f0 + languageName: node + linkType: hard + +"@nodelib/fs.walk@npm:^1.2.3, @nodelib/fs.walk@npm:^1.2.8": + version: 1.2.8 + resolution: "@nodelib/fs.walk@npm:1.2.8" + dependencies: + "@nodelib/fs.scandir": 2.1.5 + fastq: ^1.6.0 + checksum: 190c643f156d8f8f277bf2a6078af1ffde1fd43f498f187c2db24d35b4b4b5785c02c7dc52e356497b9a1b65b13edc996de08de0b961c32844364da02986dc53 + languageName: node + linkType: hard + +"@npmcli/fs@npm:^2.1.0": + version: 2.1.2 + resolution: "@npmcli/fs@npm:2.1.2" + dependencies: + "@gar/promisify": ^1.1.3 + semver: ^7.3.5 + checksum: 405074965e72d4c9d728931b64d2d38e6ea12066d4fad651ac253d175e413c06fe4350970c783db0d749181da8fe49c42d3880bd1cbc12cd68e3a7964d820225 + languageName: node + linkType: hard + +"@npmcli/move-file@npm:^2.0.0": + version: 2.0.1 + resolution: "@npmcli/move-file@npm:2.0.1" + dependencies: + mkdirp: ^1.0.4 + rimraf: ^3.0.2 + checksum: 52dc02259d98da517fae4cb3a0a3850227bdae4939dda1980b788a7670636ca2b4a01b58df03dd5f65c1e3cb70c50fa8ce5762b582b3f499ec30ee5ce1fd9380 + languageName: node + linkType: hard + +"@rushstack/eslint-patch@npm:^1.1.4, @rushstack/eslint-patch@npm:^1.2.0": + version: 1.2.0 + resolution: "@rushstack/eslint-patch@npm:1.2.0" + checksum: faa749faae0e83c26ae9eb00ad36a897ac78f3cf27da8e8ff21c00bcf7973b598d823d8f2b3957ef66079288bcf577f94df831eae2d65f3f68d8ca32f18b6aff + languageName: node + linkType: hard + +"@sinclair/typebox@npm:^0.24.1": + version: 0.24.51 + resolution: "@sinclair/typebox@npm:0.24.51" + checksum: fd0d855e748ef767eb19da1a60ed0ab928e91e0f358c1dd198d600762c0015440b15755e96d1176e2a0db7e09c6a64ed487828ee10dd0c3e22f61eb09c478cd0 + languageName: node + linkType: hard + +"@sinclair/typebox@npm:^0.25.16": + version: 0.25.24 + resolution: "@sinclair/typebox@npm:0.25.24" + checksum: 10219c58f40b8414c50b483b0550445e9710d4fe7b2c4dccb9b66533dd90ba8e024acc776026cebe81e87f06fa24b07fdd7bc30dd277eb9cc386ec50151a3026 + languageName: node + linkType: hard + +"@sinonjs/commons@npm:^1.7.0": + version: 1.8.6 + resolution: "@sinonjs/commons@npm:1.8.6" + dependencies: + type-detect: 4.0.8 + checksum: 7d3f8c1e85f30cd4e83594fc19b7a657f14d49eb8d95a30095631ce15e906c869e0eff96c5b93dffea7490c00418b07f54582ba49c6560feb2a8c34c0b16832d + languageName: node + linkType: hard + +"@sinonjs/commons@npm:^2.0.0": + version: 2.0.0 + resolution: "@sinonjs/commons@npm:2.0.0" + dependencies: + type-detect: 4.0.8 + checksum: 5023ba17edf2b85ed58262313b8e9b59e23c6860681a9af0200f239fe939e2b79736d04a260e8270ddd57196851dde3ba754d7230be5c5234e777ae2ca8af137 + languageName: node + linkType: hard + +"@sinonjs/fake-timers@npm:^10.0.2": + version: 10.0.2 + resolution: "@sinonjs/fake-timers@npm:10.0.2" + dependencies: + "@sinonjs/commons": ^2.0.0 + checksum: c62aa98e7cefda8dedc101ce227abc888dc46b8ff9706c5f0a8dfd9c3ada97d0a5611384738d9ba0b26b59f99c2ba24efece8e779bb08329e9e87358fa309824 + languageName: node + linkType: hard + +"@sinonjs/fake-timers@npm:^9.1.2": + version: 9.1.2 + resolution: "@sinonjs/fake-timers@npm:9.1.2" + dependencies: + "@sinonjs/commons": ^1.7.0 + checksum: 7d3aef54e17c1073101cb64d953157c19d62a40e261a30923fa1ee337b049c5f29cc47b1f0c477880f42b5659848ba9ab897607ac8ea4acd5c30ddcfac57fca6 + languageName: node + linkType: hard + +"@tootallnate/once@npm:2": + version: 2.0.0 + resolution: "@tootallnate/once@npm:2.0.0" + checksum: ad87447820dd3f24825d2d947ebc03072b20a42bfc96cbafec16bff8bbda6c1a81fcb0be56d5b21968560c5359a0af4038a68ba150c3e1694fe4c109a063bed8 + languageName: node + linkType: hard + +"@tsconfig/node10@npm:^1.0.7": + version: 1.0.9 + resolution: "@tsconfig/node10@npm:1.0.9" + checksum: a33ae4dc2a621c0678ac8ac4bceb8e512ae75dac65417a2ad9b022d9b5411e863c4c198b6ba9ef659e14b9fb609bbec680841a2e84c1172df7a5ffcf076539df + languageName: node + linkType: hard + +"@tsconfig/node12@npm:^1.0.7": + version: 1.0.11 + resolution: "@tsconfig/node12@npm:1.0.11" + checksum: 5ce29a41b13e7897a58b8e2df11269c5395999e588b9a467386f99d1d26f6c77d1af2719e407621412520ea30517d718d5192a32403b8dfcc163bf33e40a338a + languageName: node + linkType: hard + +"@tsconfig/node14@npm:^1.0.0": + version: 1.0.3 + resolution: "@tsconfig/node14@npm:1.0.3" + checksum: 19275fe80c4c8d0ad0abed6a96dbf00642e88b220b090418609c4376e1cef81bf16237bf170ad1b341452feddb8115d8dd2e5acdfdea1b27422071163dc9ba9d + languageName: node + linkType: hard + +"@tsconfig/node16@npm:^1.0.2": + version: 1.0.3 + resolution: "@tsconfig/node16@npm:1.0.3" + checksum: 3a8b657dd047495b7ad23437d6afd20297ce90380ff0bdee93fc7d39a900dbd8d9e26e53ff6b465e7967ce2adf0b218782590ce9013285121e6a5928fbd6819f + languageName: node + linkType: hard + +"@types/abstract-leveldown@npm:*": + version: 7.2.1 + resolution: "@types/abstract-leveldown@npm:7.2.1" + checksum: 20689e7d144ce26d2384e2e151eed59046c95d573a6988da5e77e3076808eb4f435f474a0387af9ac786bfbfc7089e277dcfd9572ae902553d5c018e9b527a30 + languageName: node + linkType: hard + +"@types/babel__core@npm:^7.1.14": + version: 7.20.0 + resolution: "@types/babel__core@npm:7.20.0" + dependencies: + "@babel/parser": ^7.20.7 + "@babel/types": ^7.20.7 + "@types/babel__generator": "*" + "@types/babel__template": "*" + "@types/babel__traverse": "*" + checksum: 49b601a0a7637f1f387442c8156bd086cfd10ff4b82b0e1994e73a6396643b5435366fb33d6b604eade8467cca594ef97adcbc412aede90bb112ebe88d0ad6df + languageName: node + linkType: hard + +"@types/babel__generator@npm:*": + version: 7.6.4 + resolution: "@types/babel__generator@npm:7.6.4" + dependencies: + "@babel/types": ^7.0.0 + checksum: 20effbbb5f8a3a0211e95959d06ae70c097fb6191011b73b38fe86deebefad8e09ee014605e0fd3cdaedc73d158be555866810e9166e1f09e4cfd880b874dcb0 + languageName: node + linkType: hard + +"@types/babel__template@npm:*": + version: 7.4.1 + resolution: "@types/babel__template@npm:7.4.1" + dependencies: + "@babel/parser": ^7.1.0 + "@babel/types": ^7.0.0 + checksum: 649fe8b42c2876be1fd28c6ed9b276f78152d5904ec290b6c861d9ef324206e0a5c242e8305c421ac52ecf6358fa7e32ab7a692f55370484825c1df29b1596ee + languageName: node + linkType: hard + +"@types/babel__traverse@npm:*, @types/babel__traverse@npm:^7.0.6": + version: 7.18.3 + resolution: "@types/babel__traverse@npm:7.18.3" + dependencies: + "@babel/types": ^7.3.0 + checksum: d20953338b2f012ab7750932ece0a78e7d1645b0a6ff42d49be90f55e9998085da1374a9786a7da252df89555c6586695ba4d1d4b4e88ab2b9f306bcd35e00d3 + languageName: node + linkType: hard + +"@types/bn.js@npm:*": + version: 5.1.1 + resolution: "@types/bn.js@npm:5.1.1" + dependencies: + "@types/node": "*" + checksum: e50ed2dd3abe997e047caf90e0352c71e54fc388679735217978b4ceb7e336e51477791b715f49fd77195ac26dd296c7bad08a3be9750e235f9b2e1edb1b51c2 + languageName: node + linkType: hard + +"@types/debug@npm:^4.1.7": + version: 4.1.7 + resolution: "@types/debug@npm:4.1.7" + dependencies: + "@types/ms": "*" + checksum: 0a7b89d8ed72526858f0b61c6fd81f477853e8c4415bb97f48b1b5545248d2ae389931680b94b393b993a7cfe893537a200647d93defe6d87159b96812305adc + languageName: node + linkType: hard + +"@types/detect-node@npm:^2.0.0": + version: 2.0.0 + resolution: "@types/detect-node@npm:2.0.0" + checksum: f0f5c8ec948f5d4a40944773c8f81460ca7fa08fddf53330166feff1f8e28719bba9a01984872c5823c5de00c8223984381640a41b3c541bc57f3b2d529a0024 + languageName: node + linkType: hard + +"@types/elliptic@npm:^6.4.14": + version: 6.4.14 + resolution: "@types/elliptic@npm:6.4.14" + dependencies: + "@types/bn.js": "*" + checksum: d5a64f540e0ed4b74a12dfa5cc88c0aa7b531eab3b7a9fab17948ffbfc6e01814230e63d7417ce1b607dbd8b5d70e1b64f5afac632deabf96e44875aaac0ae1b + languageName: node + linkType: hard + +"@types/graceful-fs@npm:^4.1.3": + version: 4.1.6 + resolution: "@types/graceful-fs@npm:4.1.6" + dependencies: + "@types/node": "*" + checksum: c3070ccdc9ca0f40df747bced1c96c71a61992d6f7c767e8fd24bb6a3c2de26e8b84135ede000b7e79db530a23e7e88dcd9db60eee6395d0f4ce1dae91369dd4 + languageName: node + linkType: hard + +"@types/hdkey@npm:^2.0.1": + version: 2.0.1 + resolution: "@types/hdkey@npm:2.0.1" + dependencies: + "@types/node": "*" + checksum: 2593145197b17c7867987428c568f2840cbdd00eae8cfe43538dbb60b158c9e6ca2094007643f51e8dd392d00fc0e806ee22e2755180d94b19dbe3d508ecb23f + languageName: node + linkType: hard + +"@types/istanbul-lib-coverage@npm:*, @types/istanbul-lib-coverage@npm:^2.0.0, @types/istanbul-lib-coverage@npm:^2.0.1": + version: 2.0.4 + resolution: "@types/istanbul-lib-coverage@npm:2.0.4" + checksum: a25d7589ee65c94d31464c16b72a9dc81dfa0bea9d3e105ae03882d616e2a0712a9c101a599ec482d297c3591e16336962878cb3eb1a0a62d5b76d277a890ce7 + languageName: node + linkType: hard + +"@types/istanbul-lib-report@npm:*": + version: 3.0.0 + resolution: "@types/istanbul-lib-report@npm:3.0.0" + dependencies: + "@types/istanbul-lib-coverage": "*" + checksum: 656398b62dc288e1b5226f8880af98087233cdb90100655c989a09f3052b5775bf98ba58a16c5ae642fb66c61aba402e07a9f2bff1d1569e3b306026c59f3f36 + languageName: node + linkType: hard + +"@types/istanbul-reports@npm:^3.0.0": + version: 3.0.1 + resolution: "@types/istanbul-reports@npm:3.0.1" + dependencies: + "@types/istanbul-lib-report": "*" + checksum: f1ad54bc68f37f60b30c7915886b92f86b847033e597f9b34f2415acdbe5ed742fa559a0a40050d74cdba3b6a63c342cac1f3a64dba5b68b66a6941f4abd7903 + languageName: node + linkType: hard + +"@types/jest@npm:^29.4.0, @types/jest@npm:^29.4.1": + version: 29.5.0 + resolution: "@types/jest@npm:29.5.0" + dependencies: + expect: ^29.0.0 + pretty-format: ^29.0.0 + checksum: cd877e5c56d299cceb8bfdcbb1a77723c706750dd3c3bc47403bc3599b8faff590a3b009c68bb5b11bf7a8c77d1fb01de5e124329b4a08e65f1cdda28b0ecdb8 + languageName: node + linkType: hard + +"@types/json-schema@npm:^7.0.9": + version: 7.0.11 + resolution: "@types/json-schema@npm:7.0.11" + checksum: 527bddfe62db9012fccd7627794bd4c71beb77601861055d87e3ee464f2217c85fca7a4b56ae677478367bbd248dbde13553312b7d4dbc702a2f2bbf60c4018d + languageName: node + linkType: hard + +"@types/level-errors@npm:*": + version: 3.0.0 + resolution: "@types/level-errors@npm:3.0.0" + checksum: ad9392663439306677ac9cb704f8fa0b64c300dfea4f3494369eb78a2e09c194156cbab2b52c71a361a09b735d54a2de65195dcadba0ec7db1d14a320198133e + languageName: node + linkType: hard + +"@types/levelup@npm:^5.1.2": + version: 5.1.2 + resolution: "@types/levelup@npm:5.1.2" + dependencies: + "@types/abstract-leveldown": "*" + "@types/level-errors": "*" + "@types/node": "*" + checksum: 6740284488b6806ba398bc38842fa789edd5667a342830c544a6b3611ebeed957a08d03dc8bde1e32fe03ac9c439341647c044c1ff0f73a26bcded9ca302a009 + languageName: node + linkType: hard + +"@types/memdown@npm:^3.0.0, @types/memdown@npm:^3.0.1": + version: 3.0.1 + resolution: "@types/memdown@npm:3.0.1" + dependencies: + "@types/abstract-leveldown": "*" + checksum: 08085fff44f1868d352ec3be81890cfd0034ad1086f3dbc8bbfc412d55434bb6f5bbd512a22a92f2f9c416ccb0784815ecaa0a6fada4478c9a39db3f0f7a1a43 + languageName: node + linkType: hard + +"@types/ms@npm:*": + version: 0.7.31 + resolution: "@types/ms@npm:0.7.31" + checksum: daadd354aedde024cce6f5aa873fefe7b71b22cd0e28632a69e8b677aeb48ae8caa1c60e5919bb781df040d116b01cb4316335167a3fc0ef6a63fa3614c0f6da + languageName: node + linkType: hard + +"@types/node@npm:*, @types/node@npm:^18.14.6, @types/node@npm:^18.15.0, @types/node@npm:^18.15.2, @types/node@npm:^18.15.3, @types/node@npm:^18.7.23": + version: 18.15.5 + resolution: "@types/node@npm:18.15.5" + checksum: 5fbf3453bd5ce1402bb2964e55d928fc8a8a7de5451b1b0fe66587fecb8a3eb86854ca9cefa5076a5971e2cff00e1773ceeb5d872a54f6c6ddfbbc1064b4e91a + languageName: node + linkType: hard + +"@types/prettier@npm:^2.1.5": + version: 2.7.2 + resolution: "@types/prettier@npm:2.7.2" + checksum: b47d76a5252265f8d25dd2fe2a5a61dc43ba0e6a96ffdd00c594cb4fd74c1982c2e346497e3472805d97915407a09423804cc2110a0b8e1b22cffcab246479b7 + languageName: node + linkType: hard + +"@types/semver@npm:^7.3.12": + version: 7.3.13 + resolution: "@types/semver@npm:7.3.13" + checksum: 00c0724d54757c2f4bc60b5032fe91cda6410e48689633d5f35ece8a0a66445e3e57fa1d6e07eb780f792e82ac542948ec4d0b76eb3484297b79bd18b8cf1cb0 + languageName: node + linkType: hard + +"@types/sha256@npm:^0.2.0": + version: 0.2.0 + resolution: "@types/sha256@npm:0.2.0" + dependencies: + "@types/node": "*" + checksum: f3c8e0dcaf11d833292b7dd19db567ef41b23036b2fb9ea7335cba100aac8c56e1346171fae6c63885f6c0e1048550506fd165628bc0001902fea010a16d3842 + languageName: node + linkType: hard + +"@types/stack-utils@npm:^2.0.0": + version: 2.0.1 + resolution: "@types/stack-utils@npm:2.0.1" + checksum: 205fdbe3326b7046d7eaf5e494d8084f2659086a266f3f9cf00bccc549c8e36e407f88168ad4383c8b07099957ad669f75f2532ed4bc70be2b037330f7bae019 + languageName: node + linkType: hard + +"@types/uuid@npm:^9.0.0": + version: 9.0.1 + resolution: "@types/uuid@npm:9.0.1" + checksum: c472b8a77cbeded4bc529220b8611afa39bd64677f507838f8083d8aac8033b1f88cb9ddaa2f8589e0dcd2317291d0f6e1379f82d5ceebd6f74f3b4825288e00 + languageName: node + linkType: hard + +"@types/ws@npm:^8.5.4": + version: 8.5.4 + resolution: "@types/ws@npm:8.5.4" + dependencies: + "@types/node": "*" + checksum: fefbad20d211929bb996285c4e6f699b12192548afedbe4930ab4384f8a94577c9cd421acaad163cacd36b88649509970a05a0b8f20615b30c501ed5269038d1 + languageName: node + linkType: hard + +"@types/yargs-parser@npm:*": + version: 21.0.0 + resolution: "@types/yargs-parser@npm:21.0.0" + checksum: b2f4c8d12ac18a567440379909127cf2cec393daffb73f246d0a25df36ea983b93b7e9e824251f959e9f928cbc7c1aab6728d0a0ff15d6145f66cec2be67d9a2 + languageName: node + linkType: hard + +"@types/yargs@npm:^17.0.8": + version: 17.0.23 + resolution: "@types/yargs@npm:17.0.23" + dependencies: + "@types/yargs-parser": "*" + checksum: c5f787d7a9a36ea94ba5d3f340fc5d93d2860eff8fa9731cd614ed23212e4fca75637e2386e37e376a720e4bf088ceed6f39050f1c3638fc1b75bce5c70b1ad4 + languageName: node + linkType: hard + +"@typescript-eslint/eslint-plugin@npm:^5.38.0": + version: 5.56.0 + resolution: "@typescript-eslint/eslint-plugin@npm:5.56.0" + dependencies: + "@eslint-community/regexpp": ^4.4.0 + "@typescript-eslint/scope-manager": 5.56.0 + "@typescript-eslint/type-utils": 5.56.0 + "@typescript-eslint/utils": 5.56.0 + debug: ^4.3.4 + grapheme-splitter: ^1.0.4 + ignore: ^5.2.0 + natural-compare-lite: ^1.4.0 + semver: ^7.3.7 + tsutils: ^3.21.0 + peerDependencies: + "@typescript-eslint/parser": ^5.0.0 + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + peerDependenciesMeta: + typescript: + optional: true + checksum: 2eed4a4ed8279950ad553252e8623e947ffdee39b0d677a13f6e4e2d863ea1cbc5d683ff189e55d0de6fd5a25afd72d3c3a9ab7ae417d5405a21ead907e1b154 + languageName: node + linkType: hard + +"@typescript-eslint/parser@npm:^5.38.0": + version: 5.56.0 + resolution: "@typescript-eslint/parser@npm:5.56.0" + dependencies: + "@typescript-eslint/scope-manager": 5.56.0 + "@typescript-eslint/types": 5.56.0 + "@typescript-eslint/typescript-estree": 5.56.0 + debug: ^4.3.4 + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + peerDependenciesMeta: + typescript: + optional: true + checksum: eb25490290bd5e22f9c42603dedc0d2d8ee845553e3cf48ea377bd5dc22440d3463f8b84be637b6a2b37cd9ea56b21e4e43007a0a69998948d9c8965c03fe1aa + languageName: node + linkType: hard + +"@typescript-eslint/scope-manager@npm:5.56.0": + version: 5.56.0 + resolution: "@typescript-eslint/scope-manager@npm:5.56.0" + dependencies: + "@typescript-eslint/types": 5.56.0 + "@typescript-eslint/visitor-keys": 5.56.0 + checksum: bacac255ee52148cee6622be2811c0d7e25419058b89f1a11f4c1303faef4535a0a1237549f9556ec1d7a297c640ce4357183a1a8465d72e1393b7d8fb43874b + languageName: node + linkType: hard + +"@typescript-eslint/type-utils@npm:5.56.0": + version: 5.56.0 + resolution: "@typescript-eslint/type-utils@npm:5.56.0" + dependencies: + "@typescript-eslint/typescript-estree": 5.56.0 + "@typescript-eslint/utils": 5.56.0 + debug: ^4.3.4 + tsutils: ^3.21.0 + peerDependencies: + eslint: "*" + peerDependenciesMeta: + typescript: + optional: true + checksum: 3dd1fcfadad18790b900a3d90f6617904adb6b0e2bd1e1edb6ebf239e1399865ca9098647405385feb4252d8b2b4577883e6fd3ef8d00bdd521d6070972d486b + languageName: node + linkType: hard + +"@typescript-eslint/types@npm:5.56.0": + version: 5.56.0 + resolution: "@typescript-eslint/types@npm:5.56.0" + checksum: 82ca11553bbb1bbfcaf7e7760b03c0d898940238dc002552c21af3e58f7d482c64c3c6cf0666521aff2a1e7b4b58bb6e4d9a00b1e4998a16b5039f5d288d003a + languageName: node + linkType: hard + +"@typescript-eslint/typescript-estree@npm:5.56.0": + version: 5.56.0 + resolution: "@typescript-eslint/typescript-estree@npm:5.56.0" + dependencies: + "@typescript-eslint/types": 5.56.0 + "@typescript-eslint/visitor-keys": 5.56.0 + debug: ^4.3.4 + globby: ^11.1.0 + is-glob: ^4.0.3 + semver: ^7.3.7 + tsutils: ^3.21.0 + peerDependenciesMeta: + typescript: + optional: true + checksum: ec3e85201786aa9adddba7cb834a9f330a7f55c729ee9ccf847dbdc2f7437b760f3774152ccad6d0aa48d13fd78df766c880e3a7ca42e01a20aba0e1a1ed61c5 + languageName: node + linkType: hard + +"@typescript-eslint/utils@npm:5.56.0": + version: 5.56.0 + resolution: "@typescript-eslint/utils@npm:5.56.0" + dependencies: + "@eslint-community/eslint-utils": ^4.2.0 + "@types/json-schema": ^7.0.9 + "@types/semver": ^7.3.12 + "@typescript-eslint/scope-manager": 5.56.0 + "@typescript-eslint/types": 5.56.0 + "@typescript-eslint/typescript-estree": 5.56.0 + eslint-scope: ^5.1.1 + semver: ^7.3.7 + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + checksum: 413e8d4bf7023ee5ba4f695b62e796a1f94930bb92fe5aa0cee58f63b9837116c23f618825a9c671f610e50f5630188b6059b4ed6b05a2a3336f01d8e977becb + languageName: node + linkType: hard + +"@typescript-eslint/visitor-keys@npm:5.56.0": + version: 5.56.0 + resolution: "@typescript-eslint/visitor-keys@npm:5.56.0" + dependencies: + "@typescript-eslint/types": 5.56.0 + eslint-visitor-keys: ^3.3.0 + checksum: 568fda40134e153d7befb59b55698f7919ba780d2d3431d8745feabf2e0fbb8aa7a02173b3c467dd20a0f6594e5248a1f82bb25d6c37827716d77452e86cad29 + languageName: node + linkType: hard + +"@wagmi/chains@npm:~0.2.11": + version: 0.2.14 + resolution: "@wagmi/chains@npm:0.2.14" + peerDependencies: + typescript: ">=4.9.4" + peerDependenciesMeta: + typescript: + optional: true + checksum: c2fbb6b886bec5715354dcca536579f9e416b8330ab2bae615148f9780d4da0b8e4ff12e1faee2e9a5f06c5c7803318c21e6f09667124e766071e871f1b86bd2 + languageName: node + linkType: hard + +"abbrev@npm:^1.0.0": + version: 1.1.1 + resolution: "abbrev@npm:1.1.1" + checksum: a4a97ec07d7ea112c517036882b2ac22f3109b7b19077dc656316d07d308438aac28e4d9746dc4d84bf6b1e75b4a7b0a5f3cb30592419f128ca9a8cee3bcfa17 + languageName: node + linkType: hard + +"abitype@npm:~0.7.1": + version: 0.7.1 + resolution: "abitype@npm:0.7.1" + peerDependencies: + typescript: ">=4.9.4" + zod: ^3 >=3.19.1 + peerDependenciesMeta: + zod: + optional: true + checksum: de0d7082d28a4835b3d8dc4d8c75e9222c95a1f9eed13d6b2381403b46f46b68ea7a281e8ba6628d259a98c54ea466ebc206eec21db6205fa1641c7393854f5e + languageName: node + linkType: hard + +"abstract-leveldown@npm:^7.2.0": + version: 7.2.0 + resolution: "abstract-leveldown@npm:7.2.0" + dependencies: + buffer: ^6.0.3 + catering: ^2.0.0 + is-buffer: ^2.0.5 + level-concat-iterator: ^3.0.0 + level-supports: ^2.0.1 + queue-microtask: ^1.2.3 + checksum: d558111f2d123da95ac80b8ba3b9b0a5bc8cd87296e64b05dca693f5f4839aa0e2fc97bad56a101766f499824e2962611750f8a76bbac4a5db35801968fbbe02 + languageName: node + linkType: hard + +"acorn-jsx@npm:^5.3.2": + version: 5.3.2 + resolution: "acorn-jsx@npm:5.3.2" + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + checksum: c3d3b2a89c9a056b205b69530a37b972b404ee46ec8e5b341666f9513d3163e2a4f214a71f4dfc7370f5a9c07472d2fd1c11c91c3f03d093e37637d95da98950 + languageName: node + linkType: hard + +"acorn-walk@npm:^8.1.1": + version: 8.2.0 + resolution: "acorn-walk@npm:8.2.0" + checksum: 1715e76c01dd7b2d4ca472f9c58968516a4899378a63ad5b6c2d668bba8da21a71976c14ec5f5b75f887b6317c4ae0b897ab141c831d741dc76024d8745f1ad1 + languageName: node + linkType: hard + +"acorn@npm:^8.4.1, acorn@npm:^8.8.0": + version: 8.8.2 + resolution: "acorn@npm:8.8.2" + bin: + acorn: bin/acorn + checksum: f790b99a1bf63ef160c967e23c46feea7787e531292bb827126334612c234ed489a0dc2c7ba33156416f0ffa8d25bf2b0fdb7f35c2ba60eb3e960572bece4001 + languageName: node + linkType: hard + +"agent-base@npm:6, agent-base@npm:^6.0.2": + version: 6.0.2 + resolution: "agent-base@npm:6.0.2" + dependencies: + debug: 4 + checksum: f52b6872cc96fd5f622071b71ef200e01c7c4c454ee68bc9accca90c98cfb39f2810e3e9aa330435835eedc8c23f4f8a15267f67c6e245d2b33757575bdac49d + languageName: node + linkType: hard + +"agentkeepalive@npm:^4.2.1": + version: 4.3.0 + resolution: "agentkeepalive@npm:4.3.0" + dependencies: + debug: ^4.1.0 + depd: ^2.0.0 + humanize-ms: ^1.2.1 + checksum: 982453aa44c11a06826c836025e5162c846e1200adb56f2d075400da7d32d87021b3b0a58768d949d824811f5654223d5a8a3dad120921a2439625eb847c6260 + languageName: node + linkType: hard + +"aggregate-error@npm:^3.0.0": + version: 3.1.0 + resolution: "aggregate-error@npm:3.1.0" + dependencies: + clean-stack: ^2.0.0 + indent-string: ^4.0.0 + checksum: 1101a33f21baa27a2fa8e04b698271e64616b886795fd43c31068c07533c7b3facfcaf4e9e0cab3624bd88f729a592f1c901a1a229c9e490eafce411a8644b79 + languageName: node + linkType: hard + +"ajv@npm:^6.10.0, ajv@npm:^6.12.4, ajv@npm:~6.12.6": + version: 6.12.6 + resolution: "ajv@npm:6.12.6" + dependencies: + fast-deep-equal: ^3.1.1 + fast-json-stable-stringify: ^2.0.0 + json-schema-traverse: ^0.4.1 + uri-js: ^4.2.2 + checksum: 874972efe5c4202ab0a68379481fbd3d1b5d0a7bd6d3cc21d40d3536ebff3352a2a1fabb632d4fd2cc7fe4cbdcd5ed6782084c9bbf7f32a1536d18f9da5007d4 + languageName: node + linkType: hard + +"ansi-escapes@npm:^4.2.1": + version: 4.3.2 + resolution: "ansi-escapes@npm:4.3.2" + dependencies: + type-fest: ^0.21.3 + checksum: 93111c42189c0a6bed9cdb4d7f2829548e943827ee8479c74d6e0b22ee127b2a21d3f8b5ca57723b8ef78ce011fbfc2784350eb2bde3ccfccf2f575fa8489815 + languageName: node + linkType: hard + +"ansi-regex@npm:^5.0.1": + version: 5.0.1 + resolution: "ansi-regex@npm:5.0.1" + checksum: 2aa4bb54caf2d622f1afdad09441695af2a83aa3fe8b8afa581d205e57ed4261c183c4d3877cee25794443fde5876417d859c108078ab788d6af7e4fe52eb66b + languageName: node + linkType: hard + +"ansi-sequence-parser@npm:^1.1.0": + version: 1.1.0 + resolution: "ansi-sequence-parser@npm:1.1.0" + checksum: 75f4d3a4c555655a698aec05b5763cbddcd16ccccdbfd178fb0aa471ab74fdf98e031b875ef26e64be6a95cf970c89238744b26de6e34af97f316d5186b1df53 + languageName: node + linkType: hard + +"ansi-styles@npm:^3.2.1": + version: 3.2.1 + resolution: "ansi-styles@npm:3.2.1" + dependencies: + color-convert: ^1.9.0 + checksum: d85ade01c10e5dd77b6c89f34ed7531da5830d2cb5882c645f330079975b716438cd7ebb81d0d6e6b4f9c577f19ae41ab55f07f19786b02f9dfd9e0377395665 + languageName: node + linkType: hard + +"ansi-styles@npm:^4.0.0, ansi-styles@npm:^4.1.0": + version: 4.3.0 + resolution: "ansi-styles@npm:4.3.0" + dependencies: + color-convert: ^2.0.1 + checksum: 513b44c3b2105dd14cc42a19271e80f386466c4be574bccf60b627432f9198571ebf4ab1e4c3ba17347658f4ee1711c163d574248c0c1cdc2d5917a0ad582ec4 + languageName: node + linkType: hard + +"ansi-styles@npm:^5.0.0": + version: 5.2.0 + resolution: "ansi-styles@npm:5.2.0" + checksum: d7f4e97ce0623aea6bc0d90dcd28881ee04cba06c570b97fd3391bd7a268eedfd9d5e2dd4fdcbdd82b8105df5faf6f24aaedc08eaf3da898e702db5948f63469 + languageName: node + linkType: hard + +"anymatch@npm:^3.0.3": + version: 3.1.3 + resolution: "anymatch@npm:3.1.3" + dependencies: + normalize-path: ^3.0.0 + picomatch: ^2.0.4 + checksum: 3e044fd6d1d26545f235a9fe4d7a534e2029d8e59fa7fd9f2a6eb21230f6b5380ea1eaf55136e60cbf8e613544b3b766e7a6fa2102e2a3a117505466e3025dc2 + languageName: node + linkType: hard + +"aproba@npm:^1.0.3 || ^2.0.0": + version: 2.0.0 + resolution: "aproba@npm:2.0.0" + checksum: 5615cadcfb45289eea63f8afd064ab656006361020e1735112e346593856f87435e02d8dcc7ff0d11928bc7d425f27bc7c2a84f6c0b35ab0ff659c814c138a24 + languageName: node + linkType: hard + +"are-we-there-yet@npm:^3.0.0": + version: 3.0.1 + resolution: "are-we-there-yet@npm:3.0.1" + dependencies: + delegates: ^1.0.0 + readable-stream: ^3.6.0 + checksum: 52590c24860fa7173bedeb69a4c05fb573473e860197f618b9a28432ee4379049336727ae3a1f9c4cb083114601c1140cee578376164d0e651217a9843f9fe83 + languageName: node + linkType: hard + +"arg@npm:^4.1.0": + version: 4.1.3 + resolution: "arg@npm:4.1.3" + checksum: 544af8dd3f60546d3e4aff084d451b96961d2267d668670199692f8d054f0415d86fc5497d0e641e91546f0aa920e7c29e5250e99fc89f5552a34b5d93b77f43 + languageName: node + linkType: hard + +"argparse@npm:^1.0.7": + version: 1.0.10 + resolution: "argparse@npm:1.0.10" + dependencies: + sprintf-js: ~1.0.2 + checksum: 7ca6e45583a28de7258e39e13d81e925cfa25d7d4aacbf806a382d3c02fcb13403a07fb8aeef949f10a7cfe4a62da0e2e807b348a5980554cc28ee573ef95945 + languageName: node + linkType: hard + +"argparse@npm:^2.0.1": + version: 2.0.1 + resolution: "argparse@npm:2.0.1" + checksum: 83644b56493e89a254bae05702abf3a1101b4fa4d0ca31df1c9985275a5a5bd47b3c27b7fa0b71098d41114d8ca000e6ed90cad764b306f8a503665e4d517ced + languageName: node + linkType: hard + +"array-union@npm:^2.1.0": + version: 2.1.0 + resolution: "array-union@npm:2.1.0" + checksum: 5bee12395cba82da674931df6d0fea23c4aa4660cb3b338ced9f828782a65caa232573e6bf3968f23e0c5eb301764a382cef2f128b170a9dc59de0e36c39f98d + languageName: node + linkType: hard + +"babel-jest@npm:^28.1.3": + version: 28.1.3 + resolution: "babel-jest@npm:28.1.3" + dependencies: + "@jest/transform": ^28.1.3 + "@types/babel__core": ^7.1.14 + babel-plugin-istanbul: ^6.1.1 + babel-preset-jest: ^28.1.3 + chalk: ^4.0.0 + graceful-fs: ^4.2.9 + slash: ^3.0.0 + peerDependencies: + "@babel/core": ^7.8.0 + checksum: 57ccd2296e1839687b5df2fd138c3d00717e0369e385254b012ccd4ee70e75f5d5c8e6cfcdf92d155015b468cfebb847b38e69bb5805d8aaf730e20575127cc6 + languageName: node + linkType: hard + +"babel-jest@npm:^29.5.0": + version: 29.5.0 + resolution: "babel-jest@npm:29.5.0" + dependencies: + "@jest/transform": ^29.5.0 + "@types/babel__core": ^7.1.14 + babel-plugin-istanbul: ^6.1.1 + babel-preset-jest: ^29.5.0 + chalk: ^4.0.0 + graceful-fs: ^4.2.9 + slash: ^3.0.0 + peerDependencies: + "@babel/core": ^7.8.0 + checksum: eafb6d37deb71f0c80bf3c80215aa46732153e5e8bcd73f6ff47d92e5c0c98c8f7f75995d0efec6289c371edad3693cd8fa2367b0661c4deb71a3a7117267ede + languageName: node + linkType: hard + +"babel-plugin-istanbul@npm:^6.1.1": + version: 6.1.1 + resolution: "babel-plugin-istanbul@npm:6.1.1" + dependencies: + "@babel/helper-plugin-utils": ^7.0.0 + "@istanbuljs/load-nyc-config": ^1.0.0 + "@istanbuljs/schema": ^0.1.2 + istanbul-lib-instrument: ^5.0.4 + test-exclude: ^6.0.0 + checksum: cb4fd95738219f232f0aece1116628cccff16db891713c4ccb501cddbbf9272951a5df81f2f2658dfdf4b3e7b236a9d5cbcf04d5d8c07dd5077297339598061a + languageName: node + linkType: hard + +"babel-plugin-jest-hoist@npm:^28.1.3": + version: 28.1.3 + resolution: "babel-plugin-jest-hoist@npm:28.1.3" + dependencies: + "@babel/template": ^7.3.3 + "@babel/types": ^7.3.3 + "@types/babel__core": ^7.1.14 + "@types/babel__traverse": ^7.0.6 + checksum: 648d89f9d80f6450ce7e50d0c32eb91b7f26269b47c3e37aaf2e0f2f66a980978345bd6b8c9b8c3aa6a8252ad2bc2c9fb50630e9895622c9a0972af5f70ed20e + languageName: node + linkType: hard + +"babel-plugin-jest-hoist@npm:^29.5.0": + version: 29.5.0 + resolution: "babel-plugin-jest-hoist@npm:29.5.0" + dependencies: + "@babel/template": ^7.3.3 + "@babel/types": ^7.3.3 + "@types/babel__core": ^7.1.14 + "@types/babel__traverse": ^7.0.6 + checksum: 099b5254073b6bc985b6d2d045ad26fb8ed30ff8ae6404c4fe8ee7cd0e98a820f69e3dfb871c7c65aae0f4b65af77046244c07bb92d49ef9005c90eedf681539 + languageName: node + linkType: hard + +"babel-preset-current-node-syntax@npm:^1.0.0": + version: 1.0.1 + resolution: "babel-preset-current-node-syntax@npm:1.0.1" + dependencies: + "@babel/plugin-syntax-async-generators": ^7.8.4 + "@babel/plugin-syntax-bigint": ^7.8.3 + "@babel/plugin-syntax-class-properties": ^7.8.3 + "@babel/plugin-syntax-import-meta": ^7.8.3 + "@babel/plugin-syntax-json-strings": ^7.8.3 + "@babel/plugin-syntax-logical-assignment-operators": ^7.8.3 + "@babel/plugin-syntax-nullish-coalescing-operator": ^7.8.3 + "@babel/plugin-syntax-numeric-separator": ^7.8.3 + "@babel/plugin-syntax-object-rest-spread": ^7.8.3 + "@babel/plugin-syntax-optional-catch-binding": ^7.8.3 + "@babel/plugin-syntax-optional-chaining": ^7.8.3 + "@babel/plugin-syntax-top-level-await": ^7.8.3 + peerDependencies: + "@babel/core": ^7.0.0 + checksum: d118c2742498c5492c095bc8541f4076b253e705b5f1ad9a2e7d302d81a84866f0070346662355c8e25fc02caa28dc2da8d69bcd67794a0d60c4d6fab6913cc8 + languageName: node + linkType: hard + +"babel-preset-jest@npm:^28.1.3": + version: 28.1.3 + resolution: "babel-preset-jest@npm:28.1.3" + dependencies: + babel-plugin-jest-hoist: ^28.1.3 + babel-preset-current-node-syntax: ^1.0.0 + peerDependencies: + "@babel/core": ^7.0.0 + checksum: 8248a4a5ca4242cc06ad13b10b9183ad2664da8fb0da060c352223dcf286f0ce9c708fa17901dc44ecabec25e6d309e5e5b9830a61dd777c3925f187a345a47d + languageName: node + linkType: hard + +"babel-preset-jest@npm:^29.5.0": + version: 29.5.0 + resolution: "babel-preset-jest@npm:29.5.0" + dependencies: + babel-plugin-jest-hoist: ^29.5.0 + babel-preset-current-node-syntax: ^1.0.0 + peerDependencies: + "@babel/core": ^7.0.0 + checksum: 5566ca2762766c9319b4973d018d2fa08c0fcf6415c72cc54f4c8e7199e851ea8f5e6c6730f03ed7ed44fc8beefa959dd15911f2647dee47c615ff4faeddb1ad + languageName: node + linkType: hard + +"balanced-match@npm:^1.0.0": + version: 1.0.2 + resolution: "balanced-match@npm:1.0.2" + checksum: 9706c088a283058a8a99e0bf91b0a2f75497f185980d9ffa8b304de1d9e58ebda7c72c07ebf01dadedaac5b2907b2c6f566f660d62bd336c3468e960403b9d65 + languageName: node + linkType: hard + +"base-x@npm:^3.0.2": + version: 3.0.9 + resolution: "base-x@npm:3.0.9" + dependencies: + safe-buffer: ^5.0.1 + checksum: 957101d6fd09e1903e846fd8f69fd7e5e3e50254383e61ab667c725866bec54e5ece5ba49ce385128ae48f9ec93a26567d1d5ebb91f4d56ef4a9cc0d5a5481e8 + languageName: node + linkType: hard + +"base64-js@npm:^1.3.1": + version: 1.5.1 + resolution: "base64-js@npm:1.5.1" + checksum: 669632eb3745404c2f822a18fc3a0122d2f9a7a13f7fb8b5823ee19d1d2ff9ee5b52c53367176ea4ad093c332fd5ab4bd0ebae5a8e27917a4105a4cfc86b1005 + languageName: node + linkType: hard + +"bip39@npm:^3.0.4": + version: 3.1.0 + resolution: "bip39@npm:3.1.0" + dependencies: + "@noble/hashes": ^1.2.0 + checksum: 1224e763ffc6b097052ed8abd57f0e521ad6d31f1645be0d0a15f4417c13f8461f00e47e9cf7c8c784bd533f4fb1ee3ab020f258c7df45ee5dc722b4b0336cfc + languageName: node + linkType: hard + +"bn.js@npm:^4.11.9": + version: 4.12.0 + resolution: "bn.js@npm:4.12.0" + checksum: 39afb4f15f4ea537b55eaf1446c896af28ac948fdcf47171961475724d1bb65118cca49fa6e3d67706e4790955ec0e74de584e45c8f1ef89f46c812bee5b5a12 + languageName: node + linkType: hard + +"brace-expansion@npm:^1.1.7": + version: 1.1.11 + resolution: "brace-expansion@npm:1.1.11" + dependencies: + balanced-match: ^1.0.0 + concat-map: 0.0.1 + checksum: faf34a7bb0c3fcf4b59c7808bc5d2a96a40988addf2e7e09dfbb67a2251800e0d14cd2bfc1aa79174f2f5095c54ff27f46fb1289fe2d77dac755b5eb3434cc07 + languageName: node + linkType: hard + +"brace-expansion@npm:^2.0.1": + version: 2.0.1 + resolution: "brace-expansion@npm:2.0.1" + dependencies: + balanced-match: ^1.0.0 + checksum: a61e7cd2e8a8505e9f0036b3b6108ba5e926b4b55089eeb5550cd04a471fe216c96d4fe7e4c7f995c728c554ae20ddfc4244cad10aef255e72b62930afd233d1 + languageName: node + linkType: hard + +"braces@npm:^3.0.2": + version: 3.0.2 + resolution: "braces@npm:3.0.2" + dependencies: + fill-range: ^7.0.1 + checksum: e2a8e769a863f3d4ee887b5fe21f63193a891c68b612ddb4b68d82d1b5f3ff9073af066c343e9867a393fe4c2555dcb33e89b937195feb9c1613d259edfcd459 + languageName: node + linkType: hard + +"brorand@npm:^1.1.0": + version: 1.1.0 + resolution: "brorand@npm:1.1.0" + checksum: 8a05c9f3c4b46572dec6ef71012b1946db6cae8c7bb60ccd4b7dd5a84655db49fe043ecc6272e7ef1f69dc53d6730b9e2a3a03a8310509a3d797a618cbee52be + languageName: node + linkType: hard + +"browserify-aes@npm:^1.2.0": + version: 1.2.0 + resolution: "browserify-aes@npm:1.2.0" + dependencies: + buffer-xor: ^1.0.3 + cipher-base: ^1.0.0 + create-hash: ^1.1.0 + evp_bytestokey: ^1.0.3 + inherits: ^2.0.1 + safe-buffer: ^5.0.1 + checksum: 4a17c3eb55a2aa61c934c286f34921933086bf6d67f02d4adb09fcc6f2fc93977b47d9d884c25619144fccd47b3b3a399e1ad8b3ff5a346be47270114bcf7104 + languageName: node + linkType: hard + +"browserslist@npm:^4.21.3": + version: 4.21.5 + resolution: "browserslist@npm:4.21.5" + dependencies: + caniuse-lite: ^1.0.30001449 + electron-to-chromium: ^1.4.284 + node-releases: ^2.0.8 + update-browserslist-db: ^1.0.10 + bin: + browserslist: cli.js + checksum: 9755986b22e73a6a1497fd8797aedd88e04270be33ce66ed5d85a1c8a798292a65e222b0f251bafa1c2522261e237d73b08b58689d4920a607e5a53d56dc4706 + languageName: node + linkType: hard + +"bs-logger@npm:0.x": + version: 0.2.6 + resolution: "bs-logger@npm:0.2.6" + dependencies: + fast-json-stable-stringify: 2.x + checksum: d34bdaf68c64bd099ab97c3ea608c9ae7d3f5faa1178b3f3f345acd94e852e608b2d4f9103fb2e503f5e69780e98293df41691b84be909b41cf5045374d54606 + languageName: node + linkType: hard + +"bs58@npm:^4.0.0": + version: 4.0.1 + resolution: "bs58@npm:4.0.1" + dependencies: + base-x: ^3.0.2 + checksum: b3c5365bb9e0c561e1a82f1a2d809a1a692059fae016be233a6127ad2f50a6b986467c3a50669ce4c18929dcccb297c5909314dd347a25a68c21b68eb3e95ac2 + languageName: node + linkType: hard + +"bs58check@npm:^2.1.2": + version: 2.1.2 + resolution: "bs58check@npm:2.1.2" + dependencies: + bs58: ^4.0.0 + create-hash: ^1.1.0 + safe-buffer: ^5.1.2 + checksum: 43bdf08a5dd04581b78f040bc4169480e17008da482ffe2a6507327bbc4fc5c28de0501f7faf22901cfe57fbca79cbb202ca529003fedb4cb8dccd265b38e54d + languageName: node + linkType: hard + +"bser@npm:2.1.1": + version: 2.1.1 + resolution: "bser@npm:2.1.1" + dependencies: + node-int64: ^0.4.0 + checksum: 9ba4dc58ce86300c862bffc3ae91f00b2a03b01ee07f3564beeeaf82aa243b8b03ba53f123b0b842c190d4399b94697970c8e7cf7b1ea44b61aa28c3526a4449 + languageName: node + linkType: hard + +"buffer-from@npm:^1.0.0": + version: 1.1.2 + resolution: "buffer-from@npm:1.1.2" + checksum: 0448524a562b37d4d7ed9efd91685a5b77a50672c556ea254ac9a6d30e3403a517d8981f10e565db24e8339413b43c97ca2951f10e399c6125a0d8911f5679bb + languageName: node + linkType: hard + +"buffer-xor@npm:^1.0.3": + version: 1.0.3 + resolution: "buffer-xor@npm:1.0.3" + checksum: 10c520df29d62fa6e785e2800e586a20fc4f6dfad84bcdbd12e1e8a83856de1cb75c7ebd7abe6d036bbfab738a6cf18a3ae9c8e5a2e2eb3167ca7399ce65373a + languageName: node + linkType: hard + +"buffer@npm:6.0.3, buffer@npm:^6.0.3": + version: 6.0.3 + resolution: "buffer@npm:6.0.3" + dependencies: + base64-js: ^1.3.1 + ieee754: ^1.2.1 + checksum: 5ad23293d9a731e4318e420025800b42bf0d264004c0286c8cc010af7a270c7a0f6522e84f54b9ad65cbd6db20b8badbfd8d2ebf4f80fa03dab093b89e68c3f9 + languageName: node + linkType: hard + +"cacache@npm:^16.1.0": + version: 16.1.3 + resolution: "cacache@npm:16.1.3" + dependencies: + "@npmcli/fs": ^2.1.0 + "@npmcli/move-file": ^2.0.0 + chownr: ^2.0.0 + fs-minipass: ^2.1.0 + glob: ^8.0.1 + infer-owner: ^1.0.4 + lru-cache: ^7.7.1 + minipass: ^3.1.6 + minipass-collect: ^1.0.2 + minipass-flush: ^1.0.5 + minipass-pipeline: ^1.2.4 + mkdirp: ^1.0.4 + p-map: ^4.0.0 + promise-inflight: ^1.0.1 + rimraf: ^3.0.2 + ssri: ^9.0.0 + tar: ^6.1.11 + unique-filename: ^2.0.0 + checksum: d91409e6e57d7d9a3a25e5dcc589c84e75b178ae8ea7de05cbf6b783f77a5fae938f6e8fda6f5257ed70000be27a681e1e44829251bfffe4c10216002f8f14e6 + languageName: node + linkType: hard + +"callsites@npm:^3.0.0": + version: 3.1.0 + resolution: "callsites@npm:3.1.0" + checksum: 072d17b6abb459c2ba96598918b55868af677154bec7e73d222ef95a8fdb9bbf7dae96a8421085cdad8cd190d86653b5b6dc55a4484f2e5b2e27d5e0c3fc15b3 + languageName: node + linkType: hard + +"camelcase@npm:^5.3.1": + version: 5.3.1 + resolution: "camelcase@npm:5.3.1" + checksum: e6effce26b9404e3c0f301498184f243811c30dfe6d0b9051863bd8e4034d09c8c2923794f280d6827e5aa055f6c434115ff97864a16a963366fb35fd673024b + languageName: node + linkType: hard + +"camelcase@npm:^6.2.0": + version: 6.3.0 + resolution: "camelcase@npm:6.3.0" + checksum: 8c96818a9076434998511251dcb2761a94817ea17dbdc37f47ac080bd088fc62c7369429a19e2178b993497132c8cbcf5cc1f44ba963e76782ba469c0474938d + languageName: node + linkType: hard + +"caniuse-lite@npm:^1.0.30001449": + version: 1.0.30001469 + resolution: "caniuse-lite@npm:1.0.30001469" + checksum: 8e496509d7e9ff189c72205675b5db0c5f1b6a09917027441e835efae0848a468a8c4e7d2b409ffc202438fcd23ae53e017f976a03c22c04d12d3c0e1e33e5de + languageName: node + linkType: hard + +"catering@npm:^2.0.0, catering@npm:^2.1.0": + version: 2.1.1 + resolution: "catering@npm:2.1.1" + checksum: 205daefa69c935b0c19f3d8f2e0a520dd69aebe9bda55902958003f7c9cff8f967dfb90071b421bd6eb618576f657a89d2bc0986872c9bc04bbd66655e9d4bd6 + languageName: node + linkType: hard + +"chalk@npm:^2.0.0": + version: 2.4.2 + resolution: "chalk@npm:2.4.2" + dependencies: + ansi-styles: ^3.2.1 + escape-string-regexp: ^1.0.5 + supports-color: ^5.3.0 + checksum: ec3661d38fe77f681200f878edbd9448821924e0f93a9cefc0e26a33b145f1027a2084bf19967160d11e1f03bfe4eaffcabf5493b89098b2782c3fe0b03d80c2 + languageName: node + linkType: hard + +"chalk@npm:^4.0.0": + version: 4.1.2 + resolution: "chalk@npm:4.1.2" + dependencies: + ansi-styles: ^4.1.0 + supports-color: ^7.1.0 + checksum: fe75c9d5c76a7a98d45495b91b2172fa3b7a09e0cc9370e5c8feb1c567b85c4288e2b3fded7cfdd7359ac28d6b3844feb8b82b8686842e93d23c827c417e83fc + languageName: node + linkType: hard + +"char-regex@npm:^1.0.2": + version: 1.0.2 + resolution: "char-regex@npm:1.0.2" + checksum: b563e4b6039b15213114626621e7a3d12f31008bdce20f9c741d69987f62aeaace7ec30f6018890ad77b2e9b4d95324c9f5acfca58a9441e3b1dcdd1e2525d17 + languageName: node + linkType: hard + +"chownr@npm:^2.0.0": + version: 2.0.0 + resolution: "chownr@npm:2.0.0" + checksum: c57cf9dd0791e2f18a5ee9c1a299ae6e801ff58fee96dc8bfd0dcb4738a6ce58dd252a3605b1c93c6418fe4f9d5093b28ffbf4d66648cb2a9c67eaef9679be2f + languageName: node + linkType: hard + +"ci-info@npm:^3.2.0": + version: 3.8.0 + resolution: "ci-info@npm:3.8.0" + checksum: d0a4d3160497cae54294974a7246202244fff031b0a6ea20dd57b10ec510aa17399c41a1b0982142c105f3255aff2173e5c0dd7302ee1b2f28ba3debda375098 + languageName: node + linkType: hard + +"cipher-base@npm:^1.0.0, cipher-base@npm:^1.0.1, cipher-base@npm:^1.0.3": + version: 1.0.4 + resolution: "cipher-base@npm:1.0.4" + dependencies: + inherits: ^2.0.1 + safe-buffer: ^5.0.1 + checksum: 47d3568dbc17431a339bad1fe7dff83ac0891be8206911ace3d3b818fc695f376df809bea406e759cdea07fff4b454fa25f1013e648851bec790c1d75763032e + languageName: node + linkType: hard + +"cjs-module-lexer@npm:^1.0.0": + version: 1.2.2 + resolution: "cjs-module-lexer@npm:1.2.2" + checksum: 977f3f042bd4f08e368c890d91eecfbc4f91da0bc009a3c557bc4dfbf32022ad1141244ac1178d44de70fc9f3dea7add7cd9a658a34b9fae98a55d8f92331ce5 + languageName: node + linkType: hard + +"clean-stack@npm:^2.0.0": + version: 2.2.0 + resolution: "clean-stack@npm:2.2.0" + checksum: 2ac8cd2b2f5ec986a3c743935ec85b07bc174d5421a5efc8017e1f146a1cf5f781ae962618f416352103b32c9cd7e203276e8c28241bbe946160cab16149fb68 + languageName: node + linkType: hard + +"cliui@npm:^8.0.1": + version: 8.0.1 + resolution: "cliui@npm:8.0.1" + dependencies: + string-width: ^4.2.0 + strip-ansi: ^6.0.1 + wrap-ansi: ^7.0.0 + checksum: 79648b3b0045f2e285b76fb2e24e207c6db44323581e421c3acbd0e86454cba1b37aea976ab50195a49e7384b871e6dfb2247ad7dec53c02454ac6497394cb56 + languageName: node + linkType: hard + +"co@npm:^4.6.0": + version: 4.6.0 + resolution: "co@npm:4.6.0" + checksum: 5210d9223010eb95b29df06a91116f2cf7c8e0748a9013ed853b53f362ea0e822f1e5bb054fb3cefc645239a4cf966af1f6133a3b43f40d591f3b68ed6cf0510 + languageName: node + linkType: hard + +"collect-v8-coverage@npm:^1.0.0": + version: 1.0.1 + resolution: "collect-v8-coverage@npm:1.0.1" + checksum: 4efe0a1fccd517b65478a2364b33dadd0a43fc92a56f59aaece9b6186fe5177b2de471253587de7c91516f07c7268c2f6770b6cbcffc0e0ece353b766ec87e55 + languageName: node + linkType: hard + +"color-convert@npm:^1.9.0": + version: 1.9.3 + resolution: "color-convert@npm:1.9.3" + dependencies: + color-name: 1.1.3 + checksum: fd7a64a17cde98fb923b1dd05c5f2e6f7aefda1b60d67e8d449f9328b4e53b228a428fd38bfeaeb2db2ff6b6503a776a996150b80cdf224062af08a5c8a3a203 + languageName: node + linkType: hard + +"color-convert@npm:^2.0.1": + version: 2.0.1 + resolution: "color-convert@npm:2.0.1" + dependencies: + color-name: ~1.1.4 + checksum: 79e6bdb9fd479a205c71d89574fccfb22bd9053bd98c6c4d870d65c132e5e904e6034978e55b43d69fcaa7433af2016ee203ce76eeba9cfa554b373e7f7db336 + languageName: node + linkType: hard + +"color-name@npm:1.1.3": + version: 1.1.3 + resolution: "color-name@npm:1.1.3" + checksum: 09c5d3e33d2105850153b14466501f2bfb30324a2f76568a408763a3b7433b0e50e5b4ab1947868e65cb101bb7cb75029553f2c333b6d4b8138a73fcc133d69d + languageName: node + linkType: hard + +"color-name@npm:~1.1.4": + version: 1.1.4 + resolution: "color-name@npm:1.1.4" + checksum: b0445859521eb4021cd0fb0cc1a75cecf67fceecae89b63f62b201cca8d345baf8b952c966862a9d9a2632987d4f6581f0ec8d957dfacece86f0a7919316f610 + languageName: node + linkType: hard + +"color-support@npm:^1.1.3": + version: 1.1.3 + resolution: "color-support@npm:1.1.3" + bin: + color-support: bin.js + checksum: 9b7356817670b9a13a26ca5af1c21615463b500783b739b7634a0c2047c16cef4b2865d7576875c31c3cddf9dd621fa19285e628f20198b233a5cfdda6d0793b + languageName: node + linkType: hard + +"commander@npm:^9.0.0": + version: 9.5.0 + resolution: "commander@npm:9.5.0" + checksum: c7a3e27aa59e913b54a1bafd366b88650bc41d6651f0cbe258d4ff09d43d6a7394232a4dadd0bf518b3e696fdf595db1028a0d82c785b88bd61f8a440cecfade + languageName: node + linkType: hard + +"comment-parser@npm:1.3.1": + version: 1.3.1 + resolution: "comment-parser@npm:1.3.1" + checksum: 421e6a113a3afd548500e7174ab46a2049dccf92e82bbaa3b209031b1bdf97552aabfa1ae2a120c0b62df17e1ba70e0d8b05d68504fee78e1ef974c59bcfe718 + languageName: node + linkType: hard + +"concat-map@npm:0.0.1": + version: 0.0.1 + resolution: "concat-map@npm:0.0.1" + checksum: 902a9f5d8967a3e2faf138d5cb784b9979bad2e6db5357c5b21c568df4ebe62bcb15108af1b2253744844eb964fc023fbd9afbbbb6ddd0bcc204c6fb5b7bf3af + languageName: node + linkType: hard + +"console-control-strings@npm:^1.1.0": + version: 1.1.0 + resolution: "console-control-strings@npm:1.1.0" + checksum: 8755d76787f94e6cf79ce4666f0c5519906d7f5b02d4b884cf41e11dcd759ed69c57da0670afd9236d229a46e0f9cf519db0cd829c6dca820bb5a5c3def584ed + languageName: node + linkType: hard + +"convert-hex@npm:~0.1.0": + version: 0.1.0 + resolution: "convert-hex@npm:0.1.0" + checksum: eacb880dbc45a36a0e6b5f5674f7e57bdce59bbf5a3ebfba980f694e2be81f1b2c81c9c89834f8054f23cc9c21d1fd210265e2000287a1cd0426657797b2f462 + languageName: node + linkType: hard + +"convert-source-map@npm:^1.4.0, convert-source-map@npm:^1.6.0, convert-source-map@npm:^1.7.0": + version: 1.9.0 + resolution: "convert-source-map@npm:1.9.0" + checksum: dc55a1f28ddd0e9485ef13565f8f756b342f9a46c4ae18b843fe3c30c675d058d6a4823eff86d472f187b176f0adf51ea7b69ea38be34be4a63cbbf91b0593c8 + languageName: node + linkType: hard + +"convert-source-map@npm:^2.0.0": + version: 2.0.0 + resolution: "convert-source-map@npm:2.0.0" + checksum: 63ae9933be5a2b8d4509daca5124e20c14d023c820258e484e32dc324d34c2754e71297c94a05784064ad27615037ef677e3f0c00469fb55f409d2bb21261035 + languageName: node + linkType: hard + +"convert-string@npm:~0.1.0": + version: 0.1.0 + resolution: "convert-string@npm:0.1.0" + checksum: a1775cb186d2fbf175486f02e3f7cc68c75e7a0c7609bf434d2a933e801b3a0499ab57de4230919ec824351dc344055bf639a1db5e44a976787145817106d9aa + languageName: node + linkType: hard + +"create-hash@npm:^1.1.0, create-hash@npm:^1.1.2": + version: 1.2.0 + resolution: "create-hash@npm:1.2.0" + dependencies: + cipher-base: ^1.0.1 + inherits: ^2.0.1 + md5.js: ^1.3.4 + ripemd160: ^2.0.1 + sha.js: ^2.4.0 + checksum: 02a6ae3bb9cd4afee3fabd846c1d8426a0e6b495560a977ba46120c473cb283be6aa1cace76b5f927cf4e499c6146fb798253e48e83d522feba807d6b722eaa9 + languageName: node + linkType: hard + +"create-hmac@npm:^1.1.4": + version: 1.1.7 + resolution: "create-hmac@npm:1.1.7" + dependencies: + cipher-base: ^1.0.3 + create-hash: ^1.1.0 + inherits: ^2.0.1 + ripemd160: ^2.0.0 + safe-buffer: ^5.0.1 + sha.js: ^2.4.8 + checksum: ba12bb2257b585a0396108c72830e85f882ab659c3320c83584b1037f8ab72415095167ced80dc4ce8e446a8ecc4b2acf36d87befe0707d73b26cf9dc77440ed + languageName: node + linkType: hard + +"create-require@npm:^1.1.0": + version: 1.1.1 + resolution: "create-require@npm:1.1.1" + checksum: a9a1503d4390d8b59ad86f4607de7870b39cad43d929813599a23714831e81c520bddf61bcdd1f8e30f05fd3a2b71ae8538e946eb2786dc65c2bbc520f692eff + languageName: node + linkType: hard + +"cross-fetch@npm:^3.1.5": + version: 3.1.5 + resolution: "cross-fetch@npm:3.1.5" + dependencies: + node-fetch: 2.6.7 + checksum: f6b8c6ee3ef993ace6277fd789c71b6acf1b504fd5f5c7128df4ef2f125a429e29cd62dc8c127523f04a5f2fa4771ed80e3f3d9695617f441425045f505cf3bb + languageName: node + linkType: hard + +"cross-spawn@npm:^7.0.2, cross-spawn@npm:^7.0.3": + version: 7.0.3 + resolution: "cross-spawn@npm:7.0.3" + dependencies: + path-key: ^3.1.0 + shebang-command: ^2.0.0 + which: ^2.0.1 + checksum: 671cc7c7288c3a8406f3c69a3ae2fc85555c04169e9d611def9a675635472614f1c0ed0ef80955d5b6d4e724f6ced67f0ad1bb006c2ea643488fcfef994d7f52 + languageName: node + linkType: hard + +"debug@npm:4, debug@npm:^4.1.0, debug@npm:^4.1.1, debug@npm:^4.3.2, debug@npm:^4.3.3, debug@npm:^4.3.4": + version: 4.3.4 + resolution: "debug@npm:4.3.4" + dependencies: + ms: 2.1.2 + peerDependenciesMeta: + supports-color: + optional: true + checksum: 3dbad3f94ea64f34431a9cbf0bafb61853eda57bff2880036153438f50fb5a84f27683ba0d8e5426bf41a8c6ff03879488120cf5b3a761e77953169c0600a708 + languageName: node + linkType: hard + +"dedent@npm:^0.7.0": + version: 0.7.0 + resolution: "dedent@npm:0.7.0" + checksum: 87de191050d9a40dd70cad01159a0bcf05ecb59750951242070b6abf9569088684880d00ba92a955b4058804f16eeaf91d604f283929b4f614d181cd7ae633d2 + languageName: node + linkType: hard + +"deep-is@npm:^0.1.3": + version: 0.1.4 + resolution: "deep-is@npm:0.1.4" + checksum: edb65dd0d7d1b9c40b2f50219aef30e116cedd6fc79290e740972c132c09106d2e80aa0bc8826673dd5a00222d4179c84b36a790eef63a4c4bca75a37ef90804 + languageName: node + linkType: hard + +"deepmerge@npm:^4.2.2": + version: 4.3.1 + resolution: "deepmerge@npm:4.3.1" + checksum: 2024c6a980a1b7128084170c4cf56b0fd58a63f2da1660dcfe977415f27b17dbe5888668b59d0b063753f3220719d5e400b7f113609489c90160bb9a5518d052 + languageName: node + linkType: hard + +"deferred-leveldown@npm:^7.0.0": + version: 7.0.0 + resolution: "deferred-leveldown@npm:7.0.0" + dependencies: + abstract-leveldown: ^7.2.0 + inherits: ^2.0.3 + checksum: 1ed5eb73e381aeb36d7153bf94dd957060b0294903660c1c8123a375e2b5cd5b3865428d7490aa1561c6ea08a5559563751e59e468d5786c99c765d2a868c658 + languageName: node + linkType: hard + +"delegates@npm:^1.0.0": + version: 1.0.0 + resolution: "delegates@npm:1.0.0" + checksum: a51744d9b53c164ba9c0492471a1a2ffa0b6727451bdc89e31627fdf4adda9d51277cfcbfb20f0a6f08ccb3c436f341df3e92631a3440226d93a8971724771fd + languageName: node + linkType: hard + +"depd@npm:^2.0.0": + version: 2.0.0 + resolution: "depd@npm:2.0.0" + checksum: abbe19c768c97ee2eed6282d8ce3031126662252c58d711f646921c9623f9052e3e1906443066beec1095832f534e57c523b7333f8e7e0d93051ab6baef5ab3a + languageName: node + linkType: hard + +"detect-newline@npm:^3.0.0": + version: 3.1.0 + resolution: "detect-newline@npm:3.1.0" + checksum: ae6cd429c41ad01b164c59ea36f264a2c479598e61cba7c99da24175a7ab80ddf066420f2bec9a1c57a6bead411b4655ff15ad7d281c000a89791f48cbe939e7 + languageName: node + linkType: hard + +"detect-node@npm:^2.1.0": + version: 2.1.0 + resolution: "detect-node@npm:2.1.0" + checksum: 832184ec458353e41533ac9c622f16c19f7c02d8b10c303dfd3a756f56be93e903616c0bb2d4226183c9351c15fc0b3dba41a17a2308262afabcfa3776e6ae6e + languageName: node + linkType: hard + +"diff-sequences@npm:^28.1.1": + version: 28.1.1 + resolution: "diff-sequences@npm:28.1.1" + checksum: e2529036505567c7ca5a2dea86b6bcd1ca0e3ae63bf8ebf529b8a99cfa915bbf194b7021dc1c57361a4017a6d95578d4ceb29fabc3232a4f4cb866a2726c7690 + languageName: node + linkType: hard + +"diff-sequences@npm:^29.4.3": + version: 29.4.3 + resolution: "diff-sequences@npm:29.4.3" + checksum: 28b265e04fdddcf7f9f814effe102cc95a9dec0564a579b5aed140edb24fc345c611ca52d76d725a3cab55d3888b915b5e8a4702e0f6058968a90fa5f41fcde7 + languageName: node + linkType: hard + +"diff@npm:^4.0.1": + version: 4.0.2 + resolution: "diff@npm:4.0.2" + checksum: f2c09b0ce4e6b301c221addd83bf3f454c0bc00caa3dd837cf6c127d6edf7223aa2bbe3b688feea110b7f262adbfc845b757c44c8a9f8c0c5b15d8fa9ce9d20d + languageName: node + linkType: hard + +"dir-glob@npm:^3.0.1": + version: 3.0.1 + resolution: "dir-glob@npm:3.0.1" + dependencies: + path-type: ^4.0.0 + checksum: fa05e18324510d7283f55862f3161c6759a3f2f8dbce491a2fc14c8324c498286c54282c1f0e933cb930da8419b30679389499b919122952a4f8592362ef4615 + languageName: node + linkType: hard + +"doctrine@npm:^3.0.0": + version: 3.0.0 + resolution: "doctrine@npm:3.0.0" + dependencies: + esutils: ^2.0.2 + checksum: fd7673ca77fe26cd5cba38d816bc72d641f500f1f9b25b83e8ce28827fe2da7ad583a8da26ab6af85f834138cf8dae9f69b0cd6ab925f52ddab1754db44d99ce + languageName: node + linkType: hard + +"duplexer@npm:~0.1.1": + version: 0.1.2 + resolution: "duplexer@npm:0.1.2" + checksum: 62ba61a830c56801db28ff6305c7d289b6dc9f859054e8c982abd8ee0b0a14d2e9a8e7d086ffee12e868d43e2bbe8a964be55ddbd8c8957714c87373c7a4f9b0 + languageName: node + linkType: hard + +"electron-to-chromium@npm:^1.4.284": + version: 1.4.334 + resolution: "electron-to-chromium@npm:1.4.334" + checksum: 8092fd18e30c68f68b197f7c151c149806fe307210d86a74c0544e05540c49b3de17e48def6c04af7886cefb927c45910cc18fddc475c0ed17ff0a1ddbc94268 + languageName: node + linkType: hard + +"elliptic@npm:^6.5.4": + version: 6.5.4 + resolution: "elliptic@npm:6.5.4" + dependencies: + bn.js: ^4.11.9 + brorand: ^1.1.0 + hash.js: ^1.0.0 + hmac-drbg: ^1.0.1 + inherits: ^2.0.4 + minimalistic-assert: ^1.0.1 + minimalistic-crypto-utils: ^1.0.1 + checksum: d56d21fd04e97869f7ffcc92e18903b9f67f2d4637a23c860492fbbff5a3155fd9ca0184ce0c865dd6eb2487d234ce9551335c021c376cd2d3b7cb749c7d10f4 + languageName: node + linkType: hard + +"emittery@npm:^0.10.2": + version: 0.10.2 + resolution: "emittery@npm:0.10.2" + checksum: ee3e21788b043b90885b18ea756ec3105c1cedc50b29709c92b01e239c7e55345d4bb6d3aef4ddbaf528eef448a40b3bb831bad9ee0fc9c25cbf1367ab1ab5ac + languageName: node + linkType: hard + +"emittery@npm:^0.13.1": + version: 0.13.1 + resolution: "emittery@npm:0.13.1" + checksum: 2b089ab6306f38feaabf4f6f02792f9ec85fc054fda79f44f6790e61bbf6bc4e1616afb9b232e0c5ec5289a8a452f79bfa6d905a6fd64e94b49981f0934001c6 + languageName: node + linkType: hard + +"emoji-regex@npm:^8.0.0": + version: 8.0.0 + resolution: "emoji-regex@npm:8.0.0" + checksum: d4c5c39d5a9868b5fa152f00cada8a936868fd3367f33f71be515ecee4c803132d11b31a6222b2571b1e5f7e13890156a94880345594d0ce7e3c9895f560f192 + languageName: node + linkType: hard + +"encoding@npm:^0.1.13": + version: 0.1.13 + resolution: "encoding@npm:0.1.13" + dependencies: + iconv-lite: ^0.6.2 + checksum: bb98632f8ffa823996e508ce6a58ffcf5856330fde839ae42c9e1f436cc3b5cc651d4aeae72222916545428e54fd0f6aa8862fd8d25bdbcc4589f1e3f3715e7f + languageName: node + linkType: hard + +"env-paths@npm:^2.2.0": + version: 2.2.1 + resolution: "env-paths@npm:2.2.1" + checksum: 65b5df55a8bab92229ab2b40dad3b387fad24613263d103a97f91c9fe43ceb21965cd3392b1ccb5d77088021e525c4e0481adb309625d0cb94ade1d1fb8dc17e + languageName: node + linkType: hard + +"err-code@npm:^2.0.2": + version: 2.0.3 + resolution: "err-code@npm:2.0.3" + checksum: 8b7b1be20d2de12d2255c0bc2ca638b7af5171142693299416e6a9339bd7d88fc8d7707d913d78e0993176005405a236b066b45666b27b797252c771156ace54 + languageName: node + linkType: hard + +"error-ex@npm:^1.3.1": + version: 1.3.2 + resolution: "error-ex@npm:1.3.2" + dependencies: + is-arrayish: ^0.2.1 + checksum: c1c2b8b65f9c91b0f9d75f0debaa7ec5b35c266c2cac5de412c1a6de86d4cbae04ae44e510378cb14d032d0645a36925d0186f8bb7367bcc629db256b743a001 + languageName: node + linkType: hard + +"esbuild@npm:^0.17.5": + version: 0.17.12 + resolution: "esbuild@npm:0.17.12" + dependencies: + "@esbuild/android-arm": 0.17.12 + "@esbuild/android-arm64": 0.17.12 + "@esbuild/android-x64": 0.17.12 + "@esbuild/darwin-arm64": 0.17.12 + "@esbuild/darwin-x64": 0.17.12 + "@esbuild/freebsd-arm64": 0.17.12 + "@esbuild/freebsd-x64": 0.17.12 + "@esbuild/linux-arm": 0.17.12 + "@esbuild/linux-arm64": 0.17.12 + "@esbuild/linux-ia32": 0.17.12 + "@esbuild/linux-loong64": 0.17.12 + "@esbuild/linux-mips64el": 0.17.12 + "@esbuild/linux-ppc64": 0.17.12 + "@esbuild/linux-riscv64": 0.17.12 + "@esbuild/linux-s390x": 0.17.12 + "@esbuild/linux-x64": 0.17.12 + "@esbuild/netbsd-x64": 0.17.12 + "@esbuild/openbsd-x64": 0.17.12 + "@esbuild/sunos-x64": 0.17.12 + "@esbuild/win32-arm64": 0.17.12 + "@esbuild/win32-ia32": 0.17.12 + "@esbuild/win32-x64": 0.17.12 + dependenciesMeta: + "@esbuild/android-arm": + optional: true + "@esbuild/android-arm64": + optional: true + "@esbuild/android-x64": + optional: true + "@esbuild/darwin-arm64": + optional: true + "@esbuild/darwin-x64": + optional: true + "@esbuild/freebsd-arm64": + optional: true + "@esbuild/freebsd-x64": + optional: true + "@esbuild/linux-arm": + optional: true + "@esbuild/linux-arm64": + optional: true + "@esbuild/linux-ia32": + optional: true + "@esbuild/linux-loong64": + optional: true + "@esbuild/linux-mips64el": + optional: true + "@esbuild/linux-ppc64": + optional: true + "@esbuild/linux-riscv64": + optional: true + "@esbuild/linux-s390x": + optional: true + "@esbuild/linux-x64": + optional: true + "@esbuild/netbsd-x64": + optional: true + "@esbuild/openbsd-x64": + optional: true + "@esbuild/sunos-x64": + optional: true + "@esbuild/win32-arm64": + optional: true + "@esbuild/win32-ia32": + optional: true + "@esbuild/win32-x64": + optional: true + bin: + esbuild: bin/esbuild + checksum: ea6d33eb1bc6c9e00dcee5e253c7e935251b4801d376661fd9f19a9dcffc27f970078a6f7116d6c78ee825ceff9b974594b0b616bd560ce4d875a951aa92977b + languageName: node + linkType: hard + +"escalade@npm:^3.1.1": + version: 3.1.1 + resolution: "escalade@npm:3.1.1" + checksum: a3e2a99f07acb74b3ad4989c48ca0c3140f69f923e56d0cba0526240ee470b91010f9d39001f2a4a313841d237ede70a729e92125191ba5d21e74b106800b133 + languageName: node + linkType: hard + +"escape-string-regexp@npm:^1.0.5": + version: 1.0.5 + resolution: "escape-string-regexp@npm:1.0.5" + checksum: 6092fda75c63b110c706b6a9bfde8a612ad595b628f0bd2147eea1d3406723020810e591effc7db1da91d80a71a737a313567c5abb3813e8d9c71f4aa595b410 + languageName: node + linkType: hard + +"escape-string-regexp@npm:^2.0.0": + version: 2.0.0 + resolution: "escape-string-regexp@npm:2.0.0" + checksum: 9f8a2d5743677c16e85c810e3024d54f0c8dea6424fad3c79ef6666e81dd0846f7437f5e729dfcdac8981bc9e5294c39b4580814d114076b8d36318f46ae4395 + languageName: node + linkType: hard + +"escape-string-regexp@npm:^4.0.0": + version: 4.0.0 + resolution: "escape-string-regexp@npm:4.0.0" + checksum: 98b48897d93060f2322108bf29db0feba7dd774be96cd069458d1453347b25ce8682ecc39859d4bca2203cc0ab19c237bcc71755eff49a0f8d90beadeeba5cc5 + languageName: node + linkType: hard + +"eslint-config-prettier@npm:^8.5.0": + version: 8.8.0 + resolution: "eslint-config-prettier@npm:8.8.0" + peerDependencies: + eslint: ">=7.0.0" + bin: + eslint-config-prettier: bin/cli.js + checksum: 1e94c3882c4d5e41e1dcfa2c368dbccbfe3134f6ac7d40101644d3bfbe3eb2f2ffac757f3145910b5eacf20c0e85e02b91293d3126d770cbf3dc390b3564681c + languageName: node + linkType: hard + +"eslint-plugin-jsdoc@npm:^40.0.0": + version: 40.1.0 + resolution: "eslint-plugin-jsdoc@npm:40.1.0" + dependencies: + "@es-joy/jsdoccomment": ~0.37.0 + comment-parser: 1.3.1 + debug: ^4.3.4 + escape-string-regexp: ^4.0.0 + esquery: ^1.5.0 + semver: ^7.3.8 + spdx-expression-parse: ^3.0.1 + peerDependencies: + eslint: ^7.0.0 || ^8.0.0 + checksum: 58e7d5b5d44af92dff844b3012e46fd52c8afea1f44ac1837ed85a6f5ff02cbd1bc4df04f84d47afce8ec69ae2aa8e137cd89b6cb39e3c389dbe978f260aa6ea + languageName: node + linkType: hard + +"eslint-plugin-tsdoc@npm:^0.2.17": + version: 0.2.17 + resolution: "eslint-plugin-tsdoc@npm:0.2.17" + dependencies: + "@microsoft/tsdoc": 0.14.2 + "@microsoft/tsdoc-config": 0.16.2 + checksum: d143a5f1c5967812d75f246ae2776cb030f6e7966b981406c9df9352a9ab02b035f294cedb30054eac2c4a217ee4ab2ed9fb76292bdccda9438e54d2d7b0146e + languageName: node + linkType: hard + +"eslint-scope@npm:^5.1.1": + version: 5.1.1 + resolution: "eslint-scope@npm:5.1.1" + dependencies: + esrecurse: ^4.3.0 + estraverse: ^4.1.1 + checksum: 47e4b6a3f0cc29c7feedee6c67b225a2da7e155802c6ea13bbef4ac6b9e10c66cd2dcb987867ef176292bf4e64eccc680a49e35e9e9c669f4a02bac17e86abdb + languageName: node + linkType: hard + +"eslint-scope@npm:^7.1.1": + version: 7.1.1 + resolution: "eslint-scope@npm:7.1.1" + dependencies: + esrecurse: ^4.3.0 + estraverse: ^5.2.0 + checksum: 9f6e974ab2db641ca8ab13508c405b7b859e72afe9f254e8131ff154d2f40c99ad4545ce326fd9fde3212ff29707102562a4834f1c48617b35d98c71a97fbf3e + languageName: node + linkType: hard + +"eslint-visitor-keys@npm:^3.3.0": + version: 3.3.0 + resolution: "eslint-visitor-keys@npm:3.3.0" + checksum: d59e68a7c5a6d0146526b0eec16ce87fbf97fe46b8281e0d41384224375c4e52f5ffb9e16d48f4ea50785cde93f766b0c898e31ab89978d88b0e1720fbfb7808 + languageName: node + linkType: hard + +"eslint@npm:^8.21.0": + version: 8.36.0 + resolution: "eslint@npm:8.36.0" + dependencies: + "@eslint-community/eslint-utils": ^4.2.0 + "@eslint-community/regexpp": ^4.4.0 + "@eslint/eslintrc": ^2.0.1 + "@eslint/js": 8.36.0 + "@humanwhocodes/config-array": ^0.11.8 + "@humanwhocodes/module-importer": ^1.0.1 + "@nodelib/fs.walk": ^1.2.8 + ajv: ^6.10.0 + chalk: ^4.0.0 + cross-spawn: ^7.0.2 + debug: ^4.3.2 + doctrine: ^3.0.0 + escape-string-regexp: ^4.0.0 + eslint-scope: ^7.1.1 + eslint-visitor-keys: ^3.3.0 + espree: ^9.5.0 + esquery: ^1.4.2 + esutils: ^2.0.2 + fast-deep-equal: ^3.1.3 + file-entry-cache: ^6.0.1 + find-up: ^5.0.0 + glob-parent: ^6.0.2 + globals: ^13.19.0 + grapheme-splitter: ^1.0.4 + ignore: ^5.2.0 + import-fresh: ^3.0.0 + imurmurhash: ^0.1.4 + is-glob: ^4.0.0 + is-path-inside: ^3.0.3 + js-sdsl: ^4.1.4 + js-yaml: ^4.1.0 + json-stable-stringify-without-jsonify: ^1.0.1 + levn: ^0.4.1 + lodash.merge: ^4.6.2 + minimatch: ^3.1.2 + natural-compare: ^1.4.0 + optionator: ^0.9.1 + strip-ansi: ^6.0.1 + strip-json-comments: ^3.1.0 + text-table: ^0.2.0 + bin: + eslint: bin/eslint.js + checksum: e9a961fc3b3de5cff5a1cb2c92eeffaa7e155a715489e30b3e1e76f186bd1255e0481e09564f2094733c0b1dbd3453499fb72ae7c043c83156e11e6d965b2304 + languageName: node + linkType: hard + +"espree@npm:^9.5.0": + version: 9.5.0 + resolution: "espree@npm:9.5.0" + dependencies: + acorn: ^8.8.0 + acorn-jsx: ^5.3.2 + eslint-visitor-keys: ^3.3.0 + checksum: a7f110aefb6407e0d3237aa635ab3cea87106ae63748dd23c67031afccc640d04c4209fca2daf16e2233c82efb505faead0fb84097478fd9cc6e8f8dd80bf99d + languageName: node + linkType: hard + +"esprima@npm:^4.0.0": + version: 4.0.1 + resolution: "esprima@npm:4.0.1" + bin: + esparse: ./bin/esparse.js + esvalidate: ./bin/esvalidate.js + checksum: b45bc805a613dbea2835278c306b91aff6173c8d034223fa81498c77dcbce3b2931bf6006db816f62eacd9fd4ea975dfd85a5b7f3c6402cfd050d4ca3c13a628 + languageName: node + linkType: hard + +"esquery@npm:^1.4.0, esquery@npm:^1.4.2, esquery@npm:^1.5.0": + version: 1.5.0 + resolution: "esquery@npm:1.5.0" + dependencies: + estraverse: ^5.1.0 + checksum: aefb0d2596c230118656cd4ec7532d447333a410a48834d80ea648b1e7b5c9bc9ed8b5e33a89cb04e487b60d622f44cf5713bf4abed7c97343edefdc84a35900 + languageName: node + linkType: hard + +"esrecurse@npm:^4.3.0": + version: 4.3.0 + resolution: "esrecurse@npm:4.3.0" + dependencies: + estraverse: ^5.2.0 + checksum: ebc17b1a33c51cef46fdc28b958994b1dc43cd2e86237515cbc3b4e5d2be6a811b2315d0a1a4d9d340b6d2308b15322f5c8291059521cc5f4802f65e7ec32837 + languageName: node + linkType: hard + +"estraverse@npm:^4.1.1": + version: 4.3.0 + resolution: "estraverse@npm:4.3.0" + checksum: a6299491f9940bb246124a8d44b7b7a413a8336f5436f9837aaa9330209bd9ee8af7e91a654a3545aee9c54b3308e78ee360cef1d777d37cfef77d2fa33b5827 + languageName: node + linkType: hard + +"estraverse@npm:^5.1.0, estraverse@npm:^5.2.0": + version: 5.3.0 + resolution: "estraverse@npm:5.3.0" + checksum: 072780882dc8416ad144f8fe199628d2b3e7bbc9989d9ed43795d2c90309a2047e6bc5979d7e2322a341163d22cfad9e21f4110597fe487519697389497e4e2b + languageName: node + linkType: hard + +"esutils@npm:^2.0.2": + version: 2.0.3 + resolution: "esutils@npm:2.0.3" + checksum: 22b5b08f74737379a840b8ed2036a5fb35826c709ab000683b092d9054e5c2a82c27818f12604bfc2a9a76b90b6834ef081edbc1c7ae30d1627012e067c6ec87 + languageName: node + linkType: hard + +"event-stream@npm:=3.3.4": + version: 3.3.4 + resolution: "event-stream@npm:3.3.4" + dependencies: + duplexer: ~0.1.1 + from: ~0 + map-stream: ~0.1.0 + pause-stream: 0.0.11 + split: 0.3 + stream-combiner: ~0.0.4 + through: ~2.3.1 + checksum: 80b467820b6daf824d9fb4345d2daf115a056e5c104463f2e98534e92d196a27f2df5ea2aa085624db26f4c45698905499e881d13bc7c01f7a13eac85be72a22 + languageName: node + linkType: hard + +"evp_bytestokey@npm:^1.0.3": + version: 1.0.3 + resolution: "evp_bytestokey@npm:1.0.3" + dependencies: + md5.js: ^1.3.4 + node-gyp: latest + safe-buffer: ^5.1.1 + checksum: ad4e1577f1a6b721c7800dcc7c733fe01f6c310732bb5bf2240245c2a5b45a38518b91d8be2c610611623160b9d1c0e91f1ce96d639f8b53e8894625cf20fa45 + languageName: node + linkType: hard + +"execa@npm:^5.0.0": + version: 5.1.1 + resolution: "execa@npm:5.1.1" + dependencies: + cross-spawn: ^7.0.3 + get-stream: ^6.0.0 + human-signals: ^2.1.0 + is-stream: ^2.0.0 + merge-stream: ^2.0.0 + npm-run-path: ^4.0.1 + onetime: ^5.1.2 + signal-exit: ^3.0.3 + strip-final-newline: ^2.0.0 + checksum: fba9022c8c8c15ed862847e94c252b3d946036d7547af310e344a527e59021fd8b6bb0723883ea87044dc4f0201f949046993124a42ccb0855cae5bf8c786343 + languageName: node + linkType: hard + +"exit@npm:^0.1.2": + version: 0.1.2 + resolution: "exit@npm:0.1.2" + checksum: abc407f07a875c3961e4781dfcb743b58d6c93de9ab263f4f8c9d23bb6da5f9b7764fc773f86b43dd88030444d5ab8abcb611cb680fba8ca075362b77114bba3 + languageName: node + linkType: hard + +"expect@npm:^28.1.3": + version: 28.1.3 + resolution: "expect@npm:28.1.3" + dependencies: + "@jest/expect-utils": ^28.1.3 + jest-get-type: ^28.0.2 + jest-matcher-utils: ^28.1.3 + jest-message-util: ^28.1.3 + jest-util: ^28.1.3 + checksum: 101e0090de300bcafedb7dbfd19223368a2251ce5fe0105bbb6de5720100b89fb6b64290ebfb42febc048324c76d6a4979cdc4b61eb77747857daf7a5de9b03d + languageName: node + linkType: hard + +"expect@npm:^29.0.0, expect@npm:^29.5.0": + version: 29.5.0 + resolution: "expect@npm:29.5.0" + dependencies: + "@jest/expect-utils": ^29.5.0 + jest-get-type: ^29.4.3 + jest-matcher-utils: ^29.5.0 + jest-message-util: ^29.5.0 + jest-util: ^29.5.0 + checksum: 58f70b38693df6e5c6892db1bcd050f0e518d6f785175dc53917d4fa6a7359a048e5690e19ddcb96b65c4493881dd89a3dabdab1a84dfa55c10cdbdabf37b2d7 + languageName: node + linkType: hard + +"fast-deep-equal@npm:^3.1.1, fast-deep-equal@npm:^3.1.3": + version: 3.1.3 + resolution: "fast-deep-equal@npm:3.1.3" + checksum: e21a9d8d84f53493b6aa15efc9cfd53dd5b714a1f23f67fb5dc8f574af80df889b3bce25dc081887c6d25457cce704e636395333abad896ccdec03abaf1f3f9d + languageName: node + linkType: hard + +"fast-glob@npm:^3.2.9": + version: 3.2.12 + resolution: "fast-glob@npm:3.2.12" + dependencies: + "@nodelib/fs.stat": ^2.0.2 + "@nodelib/fs.walk": ^1.2.3 + glob-parent: ^5.1.2 + merge2: ^1.3.0 + micromatch: ^4.0.4 + checksum: 0b1990f6ce831c7e28c4d505edcdaad8e27e88ab9fa65eedadb730438cfc7cde4910d6c975d6b7b8dc8a73da4773702ebcfcd6e3518e73938bb1383badfe01c2 + languageName: node + linkType: hard + +"fast-json-stable-stringify@npm:2.x, fast-json-stable-stringify@npm:^2.0.0, fast-json-stable-stringify@npm:^2.1.0": + version: 2.1.0 + resolution: "fast-json-stable-stringify@npm:2.1.0" + checksum: b191531e36c607977e5b1c47811158733c34ccb3bfde92c44798929e9b4154884378536d26ad90dfecd32e1ffc09c545d23535ad91b3161a27ddbb8ebe0cbecb + languageName: node + linkType: hard + +"fast-levenshtein@npm:^2.0.6": + version: 2.0.6 + resolution: "fast-levenshtein@npm:2.0.6" + checksum: 92cfec0a8dfafd9c7a15fba8f2cc29cd0b62b85f056d99ce448bbcd9f708e18ab2764bda4dd5158364f4145a7c72788538994f0d1787b956ef0d1062b0f7c24c + languageName: node + linkType: hard + +"fastq@npm:^1.6.0": + version: 1.15.0 + resolution: "fastq@npm:1.15.0" + dependencies: + reusify: ^1.0.4 + checksum: 0170e6bfcd5d57a70412440b8ef600da6de3b2a6c5966aeaf0a852d542daff506a0ee92d6de7679d1de82e644bce69d7a574a6c93f0b03964b5337eed75ada1a + languageName: node + linkType: hard + +"fb-watchman@npm:^2.0.0": + version: 2.0.2 + resolution: "fb-watchman@npm:2.0.2" + dependencies: + bser: 2.1.1 + checksum: b15a124cef28916fe07b400eb87cbc73ca082c142abf7ca8e8de6af43eca79ca7bd13eb4d4d48240b3bd3136eaac40d16e42d6edf87a8e5d1dd8070626860c78 + languageName: node + linkType: hard + +"file-entry-cache@npm:^6.0.1": + version: 6.0.1 + resolution: "file-entry-cache@npm:6.0.1" + dependencies: + flat-cache: ^3.0.4 + checksum: f49701feaa6314c8127c3c2f6173cfefff17612f5ed2daaafc6da13b5c91fd43e3b2a58fd0d63f9f94478a501b167615931e7200e31485e320f74a33885a9c74 + languageName: node + linkType: hard + +"fill-range@npm:^7.0.1": + version: 7.0.1 + resolution: "fill-range@npm:7.0.1" + dependencies: + to-regex-range: ^5.0.1 + checksum: cc283f4e65b504259e64fd969bcf4def4eb08d85565e906b7d36516e87819db52029a76b6363d0f02d0d532f0033c9603b9e2d943d56ee3b0d4f7ad3328ff917 + languageName: node + linkType: hard + +"find-up@npm:^4.0.0, find-up@npm:^4.1.0": + version: 4.1.0 + resolution: "find-up@npm:4.1.0" + dependencies: + locate-path: ^5.0.0 + path-exists: ^4.0.0 + checksum: 4c172680e8f8c1f78839486e14a43ef82e9decd0e74145f40707cc42e7420506d5ec92d9a11c22bd2c48fb0c384ea05dd30e10dd152fefeec6f2f75282a8b844 + languageName: node + linkType: hard + +"find-up@npm:^5.0.0": + version: 5.0.0 + resolution: "find-up@npm:5.0.0" + dependencies: + locate-path: ^6.0.0 + path-exists: ^4.0.0 + checksum: 07955e357348f34660bde7920783204ff5a26ac2cafcaa28bace494027158a97b9f56faaf2d89a6106211a8174db650dd9f503f9c0d526b1202d5554a00b9095 + languageName: node + linkType: hard + +"flat-cache@npm:^3.0.4": + version: 3.0.4 + resolution: "flat-cache@npm:3.0.4" + dependencies: + flatted: ^3.1.0 + rimraf: ^3.0.2 + checksum: 4fdd10ecbcbf7d520f9040dd1340eb5dfe951e6f0ecf2252edeec03ee68d989ec8b9a20f4434270e71bcfd57800dc09b3344fca3966b2eb8f613072c7d9a2365 + languageName: node + linkType: hard + +"flatted@npm:^3.1.0": + version: 3.2.7 + resolution: "flatted@npm:3.2.7" + checksum: 427633049d55bdb80201c68f7eb1cbd533e03eac541f97d3aecab8c5526f12a20ccecaeede08b57503e772c769e7f8680b37e8d482d1e5f8d7e2194687f9ea35 + languageName: node + linkType: hard + +"from@npm:~0": + version: 0.1.7 + resolution: "from@npm:0.1.7" + checksum: b85125b7890489656eb2e4f208f7654a93ec26e3aefaf3bbbcc0d496fc1941e4405834fcc9fe7333192aa2187905510ace70417bbf9ac6f6f4784a731d986939 + languageName: node + linkType: hard + +"fs-minipass@npm:^2.0.0, fs-minipass@npm:^2.1.0": + version: 2.1.0 + resolution: "fs-minipass@npm:2.1.0" + dependencies: + minipass: ^3.0.0 + checksum: 1b8d128dae2ac6cc94230cc5ead341ba3e0efaef82dab46a33d171c044caaa6ca001364178d42069b2809c35a1c3c35079a32107c770e9ffab3901b59af8c8b1 + languageName: node + linkType: hard + +"fs.realpath@npm:^1.0.0": + version: 1.0.0 + resolution: "fs.realpath@npm:1.0.0" + checksum: 99ddea01a7e75aa276c250a04eedeffe5662bce66c65c07164ad6264f9de18fb21be9433ead460e54cff20e31721c811f4fb5d70591799df5f85dce6d6746fd0 + languageName: node + linkType: hard + +"fsevents@npm:^2.3.2, fsevents@npm:~2.3.2": + version: 2.3.2 + resolution: "fsevents@npm:2.3.2" + dependencies: + node-gyp: latest + checksum: 97ade64e75091afee5265e6956cb72ba34db7819b4c3e94c431d4be2b19b8bb7a2d4116da417950c3425f17c8fe693d25e20212cac583ac1521ad066b77ae31f + conditions: os=darwin + languageName: node + linkType: hard + +"fsevents@patch:fsevents@^2.3.2#~builtin, fsevents@patch:fsevents@~2.3.2#~builtin": + version: 2.3.2 + resolution: "fsevents@patch:fsevents@npm%3A2.3.2#~builtin::version=2.3.2&hash=df0bf1" + dependencies: + node-gyp: latest + conditions: os=darwin + languageName: node + linkType: hard + +"function-bind@npm:^1.1.1": + version: 1.1.1 + resolution: "function-bind@npm:1.1.1" + checksum: b32fbaebb3f8ec4969f033073b43f5c8befbb58f1a79e12f1d7490358150359ebd92f49e72ff0144f65f2c48ea2a605bff2d07965f548f6474fd8efd95bf361a + languageName: node + linkType: hard + +"functional-red-black-tree@npm:^1.0.1": + version: 1.0.1 + resolution: "functional-red-black-tree@npm:1.0.1" + checksum: ca6c170f37640e2d94297da8bb4bf27a1d12bea3e00e6a3e007fd7aa32e37e000f5772acf941b4e4f3cf1c95c3752033d0c509af157ad8f526e7f00723b9eb9f + languageName: node + linkType: hard + +"gauge@npm:^4.0.3": + version: 4.0.4 + resolution: "gauge@npm:4.0.4" + dependencies: + aproba: ^1.0.3 || ^2.0.0 + color-support: ^1.1.3 + console-control-strings: ^1.1.0 + has-unicode: ^2.0.1 + signal-exit: ^3.0.7 + string-width: ^4.2.3 + strip-ansi: ^6.0.1 + wide-align: ^1.1.5 + checksum: 788b6bfe52f1dd8e263cda800c26ac0ca2ff6de0b6eee2fe0d9e3abf15e149b651bd27bf5226be10e6e3edb5c4e5d5985a5a1a98137e7a892f75eff76467ad2d + languageName: node + linkType: hard + +"gensync@npm:^1.0.0-beta.2": + version: 1.0.0-beta.2 + resolution: "gensync@npm:1.0.0-beta.2" + checksum: a7437e58c6be12aa6c90f7730eac7fa9833dc78872b4ad2963d2031b00a3367a93f98aec75f9aaac7220848e4026d67a8655e870b24f20a543d103c0d65952ec + languageName: node + linkType: hard + +"get-caller-file@npm:^2.0.5": + version: 2.0.5 + resolution: "get-caller-file@npm:2.0.5" + checksum: b9769a836d2a98c3ee734a88ba712e62703f1df31b94b784762c433c27a386dd6029ff55c2a920c392e33657d80191edbf18c61487e198844844516f843496b9 + languageName: node + linkType: hard + +"get-package-type@npm:^0.1.0": + version: 0.1.0 + resolution: "get-package-type@npm:0.1.0" + checksum: bba0811116d11e56d702682ddef7c73ba3481f114590e705fc549f4d868972263896af313c57a25c076e3c0d567e11d919a64ba1b30c879be985fc9d44f96148 + languageName: node + linkType: hard + +"get-stream@npm:^6.0.0": + version: 6.0.1 + resolution: "get-stream@npm:6.0.1" + checksum: e04ecece32c92eebf5b8c940f51468cd53554dcbb0ea725b2748be583c9523d00128137966afce410b9b051eb2ef16d657cd2b120ca8edafcf5a65e81af63cad + languageName: node + linkType: hard + +"glob-parent@npm:^5.1.2": + version: 5.1.2 + resolution: "glob-parent@npm:5.1.2" + dependencies: + is-glob: ^4.0.1 + checksum: f4f2bfe2425296e8a47e36864e4f42be38a996db40420fe434565e4480e3322f18eb37589617a98640c5dc8fdec1a387007ee18dbb1f3f5553409c34d17f425e + languageName: node + linkType: hard + +"glob-parent@npm:^6.0.2": + version: 6.0.2 + resolution: "glob-parent@npm:6.0.2" + dependencies: + is-glob: ^4.0.3 + checksum: c13ee97978bef4f55106b71e66428eb1512e71a7466ba49025fc2aec59a5bfb0954d5abd58fc5ee6c9b076eef4e1f6d3375c2e964b88466ca390da4419a786a8 + languageName: node + linkType: hard + +"glob@npm:^7.1.3, glob@npm:^7.1.4": + version: 7.2.3 + resolution: "glob@npm:7.2.3" + dependencies: + fs.realpath: ^1.0.0 + inflight: ^1.0.4 + inherits: 2 + minimatch: ^3.1.1 + once: ^1.3.0 + path-is-absolute: ^1.0.0 + checksum: 29452e97b38fa704dabb1d1045350fb2467cf0277e155aa9ff7077e90ad81d1ea9d53d3ee63bd37c05b09a065e90f16aec4a65f5b8de401d1dac40bc5605d133 + languageName: node + linkType: hard + +"glob@npm:^8.0.1": + version: 8.1.0 + resolution: "glob@npm:8.1.0" + dependencies: + fs.realpath: ^1.0.0 + inflight: ^1.0.4 + inherits: 2 + minimatch: ^5.0.1 + once: ^1.3.0 + checksum: 92fbea3221a7d12075f26f0227abac435de868dd0736a17170663783296d0dd8d3d532a5672b4488a439bf5d7fb85cdd07c11185d6cd39184f0385cbdfb86a47 + languageName: node + linkType: hard + +"globals@npm:^11.1.0": + version: 11.12.0 + resolution: "globals@npm:11.12.0" + checksum: 67051a45eca3db904aee189dfc7cd53c20c7d881679c93f6146ddd4c9f4ab2268e68a919df740d39c71f4445d2b38ee360fc234428baea1dbdfe68bbcb46979e + languageName: node + linkType: hard + +"globals@npm:^13.19.0": + version: 13.20.0 + resolution: "globals@npm:13.20.0" + dependencies: + type-fest: ^0.20.2 + checksum: ad1ecf914bd051325faad281d02ea2c0b1df5d01bd94d368dcc5513340eac41d14b3c61af325768e3c7f8d44576e72780ec0b6f2d366121f8eec6e03c3a3b97a + languageName: node + linkType: hard + +"globby@npm:^11.1.0": + version: 11.1.0 + resolution: "globby@npm:11.1.0" + dependencies: + array-union: ^2.1.0 + dir-glob: ^3.0.1 + fast-glob: ^3.2.9 + ignore: ^5.2.0 + merge2: ^1.4.1 + slash: ^3.0.0 + checksum: b4be8885e0cfa018fc783792942d53926c35c50b3aefd3fdcfb9d22c627639dc26bd2327a40a0b74b074100ce95bb7187bfeae2f236856aa3de183af7a02aea6 + languageName: node + linkType: hard + +"graceful-fs@npm:^4.2.6, graceful-fs@npm:^4.2.9": + version: 4.2.11 + resolution: "graceful-fs@npm:4.2.11" + checksum: ac85f94da92d8eb6b7f5a8b20ce65e43d66761c55ce85ac96df6865308390da45a8d3f0296dd3a663de65d30ba497bd46c696cc1e248c72b13d6d567138a4fc7 + languageName: node + linkType: hard + +"grapheme-splitter@npm:^1.0.4": + version: 1.0.4 + resolution: "grapheme-splitter@npm:1.0.4" + checksum: 0c22ec54dee1b05cd480f78cf14f732cb5b108edc073572c4ec205df4cd63f30f8db8025afc5debc8835a8ddeacf648a1c7992fe3dcd6ad38f9a476d84906620 + languageName: node + linkType: hard + +"has-flag@npm:^3.0.0": + version: 3.0.0 + resolution: "has-flag@npm:3.0.0" + checksum: 4a15638b454bf086c8148979aae044dd6e39d63904cd452d970374fa6a87623423da485dfb814e7be882e05c096a7ccf1ebd48e7e7501d0208d8384ff4dea73b + languageName: node + linkType: hard + +"has-flag@npm:^4.0.0": + version: 4.0.0 + resolution: "has-flag@npm:4.0.0" + checksum: 261a1357037ead75e338156b1f9452c016a37dcd3283a972a30d9e4a87441ba372c8b81f818cd0fbcd9c0354b4ae7e18b9e1afa1971164aef6d18c2b6095a8ad + languageName: node + linkType: hard + +"has-unicode@npm:^2.0.1": + version: 2.0.1 + resolution: "has-unicode@npm:2.0.1" + checksum: 1eab07a7436512db0be40a710b29b5dc21fa04880b7f63c9980b706683127e3c1b57cb80ea96d47991bdae2dfe479604f6a1ba410106ee1046a41d1bd0814400 + languageName: node + linkType: hard + +"has@npm:^1.0.3": + version: 1.0.3 + resolution: "has@npm:1.0.3" + dependencies: + function-bind: ^1.1.1 + checksum: b9ad53d53be4af90ce5d1c38331e712522417d017d5ef1ebd0507e07c2fbad8686fffb8e12ddecd4c39ca9b9b47431afbb975b8abf7f3c3b82c98e9aad052792 + languageName: node + linkType: hard + +"hash-base@npm:^3.0.0": + version: 3.1.0 + resolution: "hash-base@npm:3.1.0" + dependencies: + inherits: ^2.0.4 + readable-stream: ^3.6.0 + safe-buffer: ^5.2.0 + checksum: 26b7e97ac3de13cb23fc3145e7e3450b0530274a9562144fc2bf5c1e2983afd0e09ed7cc3b20974ba66039fad316db463da80eb452e7373e780cbee9a0d2f2dc + languageName: node + linkType: hard + +"hash.js@npm:^1.0.0, hash.js@npm:^1.0.3": + version: 1.1.7 + resolution: "hash.js@npm:1.1.7" + dependencies: + inherits: ^2.0.3 + minimalistic-assert: ^1.0.1 + checksum: e350096e659c62422b85fa508e4b3669017311aa4c49b74f19f8e1bc7f3a54a584fdfd45326d4964d6011f2b2d882e38bea775a96046f2a61b7779a979629d8f + languageName: node + linkType: hard + +"hdkey@npm:^2.1.0": + version: 2.1.0 + resolution: "hdkey@npm:2.1.0" + dependencies: + bs58check: ^2.1.2 + ripemd160: ^2.0.2 + safe-buffer: ^5.1.1 + secp256k1: ^4.0.0 + checksum: 042f2d715dc4d106c868dc3791d584336845e4e53f3452e1df116d6af5d88d7084a0a73ddd8a07b4a7d9e6b29cd3b6b4174f03499f25d8ddd101642b34fabe5c + languageName: node + linkType: hard + +"hmac-drbg@npm:^1.0.1": + version: 1.0.1 + resolution: "hmac-drbg@npm:1.0.1" + dependencies: + hash.js: ^1.0.3 + minimalistic-assert: ^1.0.0 + minimalistic-crypto-utils: ^1.0.1 + checksum: bd30b6a68d7f22d63f10e1888aee497d7c2c5c0bb469e66bbdac99f143904d1dfe95f8131f95b3e86c86dd239963c9d972fcbe147e7cffa00e55d18585c43fe0 + languageName: node + linkType: hard + +"html-escaper@npm:^2.0.0": + version: 2.0.2 + resolution: "html-escaper@npm:2.0.2" + checksum: d2df2da3ad40ca9ee3a39c5cc6475ef67c8f83c234475f24d8e9ce0dc80a2c82df8e1d6fa78ddd1e9022a586ea1bd247a615e80a5cd9273d90111ddda7d9e974 + languageName: node + linkType: hard + +"http-cache-semantics@npm:^4.1.0": + version: 4.1.1 + resolution: "http-cache-semantics@npm:4.1.1" + checksum: 83ac0bc60b17a3a36f9953e7be55e5c8f41acc61b22583060e8dedc9dd5e3607c823a88d0926f9150e571f90946835c7fe150732801010845c72cd8bbff1a236 + languageName: node + linkType: hard + +"http-proxy-agent@npm:^5.0.0": + version: 5.0.0 + resolution: "http-proxy-agent@npm:5.0.0" + dependencies: + "@tootallnate/once": 2 + agent-base: 6 + debug: 4 + checksum: e2ee1ff1656a131953839b2a19cd1f3a52d97c25ba87bd2559af6ae87114abf60971e498021f9b73f9fd78aea8876d1fb0d4656aac8a03c6caa9fc175f22b786 + languageName: node + linkType: hard + +"https-proxy-agent@npm:^5.0.0": + version: 5.0.1 + resolution: "https-proxy-agent@npm:5.0.1" + dependencies: + agent-base: 6 + debug: 4 + checksum: 571fccdf38184f05943e12d37d6ce38197becdd69e58d03f43637f7fa1269cf303a7d228aa27e5b27bbd3af8f09fd938e1c91dcfefff2df7ba77c20ed8dfc765 + languageName: node + linkType: hard + +"human-signals@npm:^2.1.0": + version: 2.1.0 + resolution: "human-signals@npm:2.1.0" + checksum: b87fd89fce72391625271454e70f67fe405277415b48bcc0117ca73d31fa23a4241787afdc8d67f5a116cf37258c052f59ea82daffa72364d61351423848e3b8 + languageName: node + linkType: hard + +"humanize-ms@npm:^1.2.1": + version: 1.2.1 + resolution: "humanize-ms@npm:1.2.1" + dependencies: + ms: ^2.0.0 + checksum: 9c7a74a2827f9294c009266c82031030eae811ca87b0da3dceb8d6071b9bde22c9f3daef0469c3c533cc67a97d8a167cd9fc0389350e5f415f61a79b171ded16 + languageName: node + linkType: hard + +"iconv-lite@npm:^0.6.2": + version: 0.6.3 + resolution: "iconv-lite@npm:0.6.3" + dependencies: + safer-buffer: ">= 2.1.2 < 3.0.0" + checksum: 3f60d47a5c8fc3313317edfd29a00a692cc87a19cac0159e2ce711d0ebc9019064108323b5e493625e25594f11c6236647d8e256fbe7a58f4a3b33b89e6d30bf + languageName: node + linkType: hard + +"idna-uts46-hx@npm:^4.1.2": + version: 4.1.2 + resolution: "idna-uts46-hx@npm:4.1.2" + dependencies: + punycode: ^2.1.1 + checksum: 97772ba4e517ccf19e4552d09f1b9cccca2e6b8a3f8dd66fc5caccd1dbc41e3ff1915d899b7e9ffd518f4f2958e638d5bc6d3728f859510d64e417a7664f928a + languageName: node + linkType: hard + +"ieee754@npm:^1.2.1": + version: 1.2.1 + resolution: "ieee754@npm:1.2.1" + checksum: 5144c0c9815e54ada181d80a0b810221a253562422e7c6c3a60b1901154184f49326ec239d618c416c1c5945a2e197107aee8d986a3dd836b53dffefd99b5e7e + languageName: node + linkType: hard + +"ignore@npm:^5.2.0": + version: 5.2.4 + resolution: "ignore@npm:5.2.4" + checksum: 3d4c309c6006e2621659311783eaea7ebcd41fe4ca1d78c91c473157ad6666a57a2df790fe0d07a12300d9aac2888204d7be8d59f9aaf665b1c7fcdb432517ef + languageName: node + linkType: hard + +"import-fresh@npm:^3.0.0, import-fresh@npm:^3.2.1": + version: 3.3.0 + resolution: "import-fresh@npm:3.3.0" + dependencies: + parent-module: ^1.0.0 + resolve-from: ^4.0.0 + checksum: 2cacfad06e652b1edc50be650f7ec3be08c5e5a6f6d12d035c440a42a8cc028e60a5b99ca08a77ab4d6b1346da7d971915828f33cdab730d3d42f08242d09baa + languageName: node + linkType: hard + +"import-local@npm:^3.0.2": + version: 3.1.0 + resolution: "import-local@npm:3.1.0" + dependencies: + pkg-dir: ^4.2.0 + resolve-cwd: ^3.0.0 + bin: + import-local-fixture: fixtures/cli.js + checksum: bfcdb63b5e3c0e245e347f3107564035b128a414c4da1172a20dc67db2504e05ede4ac2eee1252359f78b0bfd7b19ef180aec427c2fce6493ae782d73a04cddd + languageName: node + linkType: hard + +"imurmurhash@npm:^0.1.4": + version: 0.1.4 + resolution: "imurmurhash@npm:0.1.4" + checksum: 7cae75c8cd9a50f57dadd77482359f659eaebac0319dd9368bcd1714f55e65badd6929ca58569da2b6494ef13fdd5598cd700b1eba23f8b79c5f19d195a3ecf7 + languageName: node + linkType: hard + +"indent-string@npm:^4.0.0": + version: 4.0.0 + resolution: "indent-string@npm:4.0.0" + checksum: 824cfb9929d031dabf059bebfe08cf3137365e112019086ed3dcff6a0a7b698cb80cf67ccccde0e25b9e2d7527aa6cc1fed1ac490c752162496caba3e6699612 + languageName: node + linkType: hard + +"infer-owner@npm:^1.0.4": + version: 1.0.4 + resolution: "infer-owner@npm:1.0.4" + checksum: 181e732764e4a0611576466b4b87dac338972b839920b2a8cde43642e4ed6bd54dc1fb0b40874728f2a2df9a1b097b8ff83b56d5f8f8e3927f837fdcb47d8a89 + languageName: node + linkType: hard + +"inflight@npm:^1.0.4": + version: 1.0.6 + resolution: "inflight@npm:1.0.6" + dependencies: + once: ^1.3.0 + wrappy: 1 + checksum: f4f76aa072ce19fae87ce1ef7d221e709afb59d445e05d47fba710e85470923a75de35bfae47da6de1b18afc3ce83d70facf44cfb0aff89f0a3f45c0a0244dfd + languageName: node + linkType: hard + +"inherits@npm:2, inherits@npm:^2.0.1, inherits@npm:^2.0.3, inherits@npm:^2.0.4": + version: 2.0.4 + resolution: "inherits@npm:2.0.4" + checksum: 4a48a733847879d6cf6691860a6b1e3f0f4754176e4d71494c41f3475553768b10f84b5ce1d40fbd0e34e6bfbb864ee35858ad4dd2cf31e02fc4a154b724d7f1 + languageName: node + linkType: hard + +"ip@npm:^2.0.0": + version: 2.0.0 + resolution: "ip@npm:2.0.0" + checksum: cfcfac6b873b701996d71ec82a7dd27ba92450afdb421e356f44044ed688df04567344c36cbacea7d01b1c39a4c732dc012570ebe9bebfb06f27314bca625349 + languageName: node + linkType: hard + +"is-arrayish@npm:^0.2.1": + version: 0.2.1 + resolution: "is-arrayish@npm:0.2.1" + checksum: eef4417e3c10e60e2c810b6084942b3ead455af16c4509959a27e490e7aee87cfb3f38e01bbde92220b528a0ee1a18d52b787e1458ee86174d8c7f0e58cd488f + languageName: node + linkType: hard + +"is-buffer@npm:^2.0.5": + version: 2.0.5 + resolution: "is-buffer@npm:2.0.5" + checksum: 764c9ad8b523a9f5a32af29bdf772b08eb48c04d2ad0a7240916ac2688c983bf5f8504bf25b35e66240edeb9d9085461f9b5dae1f3d2861c6b06a65fe983de42 + languageName: node + linkType: hard + +"is-core-module@npm:^2.1.0, is-core-module@npm:^2.9.0": + version: 2.11.0 + resolution: "is-core-module@npm:2.11.0" + dependencies: + has: ^1.0.3 + checksum: f96fd490c6b48eb4f6d10ba815c6ef13f410b0ba6f7eb8577af51697de523e5f2cd9de1c441b51d27251bf0e4aebc936545e33a5d26d5d51f28d25698d4a8bab + languageName: node + linkType: hard + +"is-extglob@npm:^2.1.1": + version: 2.1.1 + resolution: "is-extglob@npm:2.1.1" + checksum: df033653d06d0eb567461e58a7a8c9f940bd8c22274b94bf7671ab36df5719791aae15eef6d83bbb5e23283967f2f984b8914559d4449efda578c775c4be6f85 + languageName: node + linkType: hard + +"is-fullwidth-code-point@npm:^3.0.0": + version: 3.0.0 + resolution: "is-fullwidth-code-point@npm:3.0.0" + checksum: 44a30c29457c7fb8f00297bce733f0a64cd22eca270f83e58c105e0d015e45c019491a4ab2faef91ab51d4738c670daff901c799f6a700e27f7314029e99e348 + languageName: node + linkType: hard + +"is-generator-fn@npm:^2.0.0": + version: 2.1.0 + resolution: "is-generator-fn@npm:2.1.0" + checksum: a6ad5492cf9d1746f73b6744e0c43c0020510b59d56ddcb78a91cbc173f09b5e6beff53d75c9c5a29feb618bfef2bf458e025ecf3a57ad2268e2fb2569f56215 + languageName: node + linkType: hard + +"is-glob@npm:^4.0.0, is-glob@npm:^4.0.1, is-glob@npm:^4.0.3": + version: 4.0.3 + resolution: "is-glob@npm:4.0.3" + dependencies: + is-extglob: ^2.1.1 + checksum: d381c1319fcb69d341cc6e6c7cd588e17cd94722d9a32dbd60660b993c4fb7d0f19438674e68dfec686d09b7c73139c9166b47597f846af387450224a8101ab4 + languageName: node + linkType: hard + +"is-lambda@npm:^1.0.1": + version: 1.0.1 + resolution: "is-lambda@npm:1.0.1" + checksum: 93a32f01940220532e5948538699ad610d5924ac86093fcee83022252b363eb0cc99ba53ab084a04e4fb62bf7b5731f55496257a4c38adf87af9c4d352c71c35 + languageName: node + linkType: hard + +"is-number@npm:^7.0.0": + version: 7.0.0 + resolution: "is-number@npm:7.0.0" + checksum: 456ac6f8e0f3111ed34668a624e45315201dff921e5ac181f8ec24923b99e9f32ca1a194912dc79d539c97d33dba17dc635202ff0b2cf98326f608323276d27a + languageName: node + linkType: hard + +"is-path-inside@npm:^3.0.3": + version: 3.0.3 + resolution: "is-path-inside@npm:3.0.3" + checksum: abd50f06186a052b349c15e55b182326f1936c89a78bf6c8f2b707412517c097ce04bc49a0ca221787bc44e1049f51f09a2ffb63d22899051988d3a618ba13e9 + languageName: node + linkType: hard + +"is-stream@npm:^2.0.0": + version: 2.0.1 + resolution: "is-stream@npm:2.0.1" + checksum: b8e05ccdf96ac330ea83c12450304d4a591f9958c11fd17bed240af8d5ffe08aedafa4c0f4cfccd4d28dc9d4d129daca1023633d5c11601a6cbc77521f6fae66 + languageName: node + linkType: hard + +"isexe@npm:^2.0.0": + version: 2.0.0 + resolution: "isexe@npm:2.0.0" + checksum: 26bf6c5480dda5161c820c5b5c751ae1e766c587b1f951ea3fcfc973bafb7831ae5b54a31a69bd670220e42e99ec154475025a468eae58ea262f813fdc8d1c62 + languageName: node + linkType: hard + +"isomorphic-ws@npm:^5.0.0": + version: 5.0.0 + resolution: "isomorphic-ws@npm:5.0.0" + peerDependencies: + ws: "*" + checksum: e20eb2aee09ba96247465fda40c6d22c1153394c0144fa34fe6609f341af4c8c564f60ea3ba762335a7a9c306809349f9b863c8beedf2beea09b299834ad5398 + languageName: node + linkType: hard + +"istanbul-lib-coverage@npm:^3.0.0, istanbul-lib-coverage@npm:^3.2.0": + version: 3.2.0 + resolution: "istanbul-lib-coverage@npm:3.2.0" + checksum: a2a545033b9d56da04a8571ed05c8120bf10e9bce01cf8633a3a2b0d1d83dff4ac4fe78d6d5673c27fc29b7f21a41d75f83a36be09f82a61c367b56aa73c1ff9 + languageName: node + linkType: hard + +"istanbul-lib-instrument@npm:^5.0.4, istanbul-lib-instrument@npm:^5.1.0": + version: 5.2.1 + resolution: "istanbul-lib-instrument@npm:5.2.1" + dependencies: + "@babel/core": ^7.12.3 + "@babel/parser": ^7.14.7 + "@istanbuljs/schema": ^0.1.2 + istanbul-lib-coverage: ^3.2.0 + semver: ^6.3.0 + checksum: bf16f1803ba5e51b28bbd49ed955a736488381e09375d830e42ddeb403855b2006f850711d95ad726f2ba3f1ae8e7366de7e51d2b9ac67dc4d80191ef7ddf272 + languageName: node + linkType: hard + +"istanbul-lib-report@npm:^3.0.0": + version: 3.0.0 + resolution: "istanbul-lib-report@npm:3.0.0" + dependencies: + istanbul-lib-coverage: ^3.0.0 + make-dir: ^3.0.0 + supports-color: ^7.1.0 + checksum: 3f29eb3f53c59b987386e07fe772d24c7f58c6897f34c9d7a296f4000de7ae3de9eb95c3de3df91dc65b134c84dee35c54eee572a56243e8907c48064e34ff1b + languageName: node + linkType: hard + +"istanbul-lib-source-maps@npm:^4.0.0": + version: 4.0.1 + resolution: "istanbul-lib-source-maps@npm:4.0.1" + dependencies: + debug: ^4.1.1 + istanbul-lib-coverage: ^3.0.0 + source-map: ^0.6.1 + checksum: 21ad3df45db4b81852b662b8d4161f6446cd250c1ddc70ef96a585e2e85c26ed7cd9c2a396a71533cfb981d1a645508bc9618cae431e55d01a0628e7dec62ef2 + languageName: node + linkType: hard + +"istanbul-reports@npm:^3.1.3": + version: 3.1.5 + resolution: "istanbul-reports@npm:3.1.5" + dependencies: + html-escaper: ^2.0.0 + istanbul-lib-report: ^3.0.0 + checksum: 7867228f83ed39477b188ea07e7ccb9b4f5320b6f73d1db93a0981b7414fa4ef72d3f80c4692c442f90fc250d9406e71d8d7ab65bb615cb334e6292b73192b89 + languageName: node + linkType: hard + +"jest-changed-files@npm:^28.1.3": + version: 28.1.3 + resolution: "jest-changed-files@npm:28.1.3" + dependencies: + execa: ^5.0.0 + p-limit: ^3.1.0 + checksum: c78af14a68b9b19101623ae7fde15a2488f9b3dbe8cca12a05c4a223bc9bfd3bf41ee06830f20fb560c52434435d6153c9cc6cf450b1f7b03e5e7f96a953a6a6 + languageName: node + linkType: hard + +"jest-changed-files@npm:^29.5.0": + version: 29.5.0 + resolution: "jest-changed-files@npm:29.5.0" + dependencies: + execa: ^5.0.0 + p-limit: ^3.1.0 + checksum: a67a7cb3c11f8f92bd1b7c79e84f724cbd11a9ad51f3cdadafe3ce7ee3c79ee50dbea128f920f5fddc807e9e4e83f5462143094391feedd959a77dd20ab96cf3 + languageName: node + linkType: hard + +"jest-circus@npm:^28.1.3": + version: 28.1.3 + resolution: "jest-circus@npm:28.1.3" + dependencies: + "@jest/environment": ^28.1.3 + "@jest/expect": ^28.1.3 + "@jest/test-result": ^28.1.3 + "@jest/types": ^28.1.3 + "@types/node": "*" + chalk: ^4.0.0 + co: ^4.6.0 + dedent: ^0.7.0 + is-generator-fn: ^2.0.0 + jest-each: ^28.1.3 + jest-matcher-utils: ^28.1.3 + jest-message-util: ^28.1.3 + jest-runtime: ^28.1.3 + jest-snapshot: ^28.1.3 + jest-util: ^28.1.3 + p-limit: ^3.1.0 + pretty-format: ^28.1.3 + slash: ^3.0.0 + stack-utils: ^2.0.3 + checksum: b635e60a9c92adaefc3f24def8eba691e7c2fdcf6c9fa640cddf2eb8c8b26ee62eab73ebb88798fd7c52a74c1495a984e39b748429b610426f02e9d3d56e09b2 + languageName: node + linkType: hard + +"jest-circus@npm:^29.5.0": + version: 29.5.0 + resolution: "jest-circus@npm:29.5.0" + dependencies: + "@jest/environment": ^29.5.0 + "@jest/expect": ^29.5.0 + "@jest/test-result": ^29.5.0 + "@jest/types": ^29.5.0 + "@types/node": "*" + chalk: ^4.0.0 + co: ^4.6.0 + dedent: ^0.7.0 + is-generator-fn: ^2.0.0 + jest-each: ^29.5.0 + jest-matcher-utils: ^29.5.0 + jest-message-util: ^29.5.0 + jest-runtime: ^29.5.0 + jest-snapshot: ^29.5.0 + jest-util: ^29.5.0 + p-limit: ^3.1.0 + pretty-format: ^29.5.0 + pure-rand: ^6.0.0 + slash: ^3.0.0 + stack-utils: ^2.0.3 + checksum: 44ff5d06acedae6de6c866e20e3b61f83e29ab94cf9f960826e7e667de49c12dd9ab9dffd7fa3b7d1f9688a8b5bfb1ebebadbea69d9ed0d3f66af4a0ff8c2b27 + languageName: node + linkType: hard + +"jest-cli@npm:^28.1.3": + version: 28.1.3 + resolution: "jest-cli@npm:28.1.3" + dependencies: + "@jest/core": ^28.1.3 + "@jest/test-result": ^28.1.3 + "@jest/types": ^28.1.3 + chalk: ^4.0.0 + exit: ^0.1.2 + graceful-fs: ^4.2.9 + import-local: ^3.0.2 + jest-config: ^28.1.3 + jest-util: ^28.1.3 + jest-validate: ^28.1.3 + prompts: ^2.0.1 + yargs: ^17.3.1 + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + bin: + jest: bin/jest.js + checksum: fb424576bf38346318daddee3fcc597cd78cb8dda1759d09c529d8ba1a748f2765c17b00671072a838826e59465a810ff8a232bc6ba2395c131bf3504425a363 + languageName: node + linkType: hard + +"jest-cli@npm:^29.5.0": + version: 29.5.0 + resolution: "jest-cli@npm:29.5.0" + dependencies: + "@jest/core": ^29.5.0 + "@jest/test-result": ^29.5.0 + "@jest/types": ^29.5.0 + chalk: ^4.0.0 + exit: ^0.1.2 + graceful-fs: ^4.2.9 + import-local: ^3.0.2 + jest-config: ^29.5.0 + jest-util: ^29.5.0 + jest-validate: ^29.5.0 + prompts: ^2.0.1 + yargs: ^17.3.1 + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + bin: + jest: bin/jest.js + checksum: 39897bbbc0f0d8a6b975ab12fd13887eaa28d92e3dee9e0173a5cb913ae8cc2ae46e090d38c6d723e84d9d6724429cd08685b4e505fa447d31ca615630c7dbba + languageName: node + linkType: hard + +"jest-config@npm:^28.1.3": + version: 28.1.3 + resolution: "jest-config@npm:28.1.3" + dependencies: + "@babel/core": ^7.11.6 + "@jest/test-sequencer": ^28.1.3 + "@jest/types": ^28.1.3 + babel-jest: ^28.1.3 + chalk: ^4.0.0 + ci-info: ^3.2.0 + deepmerge: ^4.2.2 + glob: ^7.1.3 + graceful-fs: ^4.2.9 + jest-circus: ^28.1.3 + jest-environment-node: ^28.1.3 + jest-get-type: ^28.0.2 + jest-regex-util: ^28.0.2 + jest-resolve: ^28.1.3 + jest-runner: ^28.1.3 + jest-util: ^28.1.3 + jest-validate: ^28.1.3 + micromatch: ^4.0.4 + parse-json: ^5.2.0 + pretty-format: ^28.1.3 + slash: ^3.0.0 + strip-json-comments: ^3.1.1 + peerDependencies: + "@types/node": "*" + ts-node: ">=9.0.0" + peerDependenciesMeta: + "@types/node": + optional: true + ts-node: + optional: true + checksum: ddabffd3a3a8cb6c2f58f06cdf3535157dbf8c70bcde3e5c3de7bee6a8d617840ffc8cffb0083e38c6814f2a08c225ca19f58898efaf4f351af94679f22ce6bc + languageName: node + linkType: hard + +"jest-config@npm:^29.5.0": + version: 29.5.0 + resolution: "jest-config@npm:29.5.0" + dependencies: + "@babel/core": ^7.11.6 + "@jest/test-sequencer": ^29.5.0 + "@jest/types": ^29.5.0 + babel-jest: ^29.5.0 + chalk: ^4.0.0 + ci-info: ^3.2.0 + deepmerge: ^4.2.2 + glob: ^7.1.3 + graceful-fs: ^4.2.9 + jest-circus: ^29.5.0 + jest-environment-node: ^29.5.0 + jest-get-type: ^29.4.3 + jest-regex-util: ^29.4.3 + jest-resolve: ^29.5.0 + jest-runner: ^29.5.0 + jest-util: ^29.5.0 + jest-validate: ^29.5.0 + micromatch: ^4.0.4 + parse-json: ^5.2.0 + pretty-format: ^29.5.0 + slash: ^3.0.0 + strip-json-comments: ^3.1.1 + peerDependencies: + "@types/node": "*" + ts-node: ">=9.0.0" + peerDependenciesMeta: + "@types/node": + optional: true + ts-node: + optional: true + checksum: c37c4dab964c54ab293d4e302d40b09687037ac9d00b88348ec42366970747feeaf265e12e3750cd3660b40c518d4031335eda11ac10b70b10e60797ebbd4b9c + languageName: node + linkType: hard + +"jest-diff@npm:^28.1.3": + version: 28.1.3 + resolution: "jest-diff@npm:28.1.3" + dependencies: + chalk: ^4.0.0 + diff-sequences: ^28.1.1 + jest-get-type: ^28.0.2 + pretty-format: ^28.1.3 + checksum: fa8583e0ccbe775714ce850b009be1b0f6b17a4b6759f33ff47adef27942ebc610dbbcc8a5f7cfb7f12b3b3b05afc9fb41d5f766674616025032ff1e4f9866e0 + languageName: node + linkType: hard + +"jest-diff@npm:^29.5.0": + version: 29.5.0 + resolution: "jest-diff@npm:29.5.0" + dependencies: + chalk: ^4.0.0 + diff-sequences: ^29.4.3 + jest-get-type: ^29.4.3 + pretty-format: ^29.5.0 + checksum: dfd0f4a299b5d127779c76b40106c37854c89c3e0785098c717d52822d6620d227f6234c3a9291df204d619e799e3654159213bf93220f79c8e92a55475a3d39 + languageName: node + linkType: hard + +"jest-docblock@npm:^28.1.1": + version: 28.1.1 + resolution: "jest-docblock@npm:28.1.1" + dependencies: + detect-newline: ^3.0.0 + checksum: 22fca68d988ecb2933bc65f448facdca85fc71b4bd0a188ea09a5ae1b0cc3a049a2a6ec7e7eaa2542c1d5cb5e5145e420a3df4fa280f5070f486c44da1d36151 + languageName: node + linkType: hard + +"jest-docblock@npm:^29.4.3": + version: 29.4.3 + resolution: "jest-docblock@npm:29.4.3" + dependencies: + detect-newline: ^3.0.0 + checksum: e0e9df1485bb8926e5b33478cdf84b3387d9caf3658e7dc1eaa6dc34cb93dea0d2d74797f6e940f0233a88f3dadd60957f2288eb8f95506361f85b84bf8661df + languageName: node + linkType: hard + +"jest-each@npm:^28.1.3": + version: 28.1.3 + resolution: "jest-each@npm:28.1.3" + dependencies: + "@jest/types": ^28.1.3 + chalk: ^4.0.0 + jest-get-type: ^28.0.2 + jest-util: ^28.1.3 + pretty-format: ^28.1.3 + checksum: 5c5b8ccb1484e58b027bea682cfa020a45e5bf5379cc7c23bdec972576c1dc3c3bf03df2b78416cefc1a58859dd33b7cf5fff54c370bc3c0f14a3e509eb87282 + languageName: node + linkType: hard + +"jest-each@npm:^29.5.0": + version: 29.5.0 + resolution: "jest-each@npm:29.5.0" + dependencies: + "@jest/types": ^29.5.0 + chalk: ^4.0.0 + jest-get-type: ^29.4.3 + jest-util: ^29.5.0 + pretty-format: ^29.5.0 + checksum: b8b297534d25834c5d4e31e4c687359787b1e402519e42664eb704cc3a12a7a91a017565a75acb02e8cf9afd3f4eef3350bd785276bec0900184641b765ff7a5 + languageName: node + linkType: hard + +"jest-environment-node@npm:^28.1.3": + version: 28.1.3 + resolution: "jest-environment-node@npm:28.1.3" + dependencies: + "@jest/environment": ^28.1.3 + "@jest/fake-timers": ^28.1.3 + "@jest/types": ^28.1.3 + "@types/node": "*" + jest-mock: ^28.1.3 + jest-util: ^28.1.3 + checksum: 1048fe306a6a8b0880a4c66278ebb57479f29c12cff89aab3aa79ab77a8859cf17ab8aa9919fd21c329a7db90e35581b43664e694ad453d5b04e00f3c6420469 + languageName: node + linkType: hard + +"jest-environment-node@npm:^29.5.0": + version: 29.5.0 + resolution: "jest-environment-node@npm:29.5.0" + dependencies: + "@jest/environment": ^29.5.0 + "@jest/fake-timers": ^29.5.0 + "@jest/types": ^29.5.0 + "@types/node": "*" + jest-mock: ^29.5.0 + jest-util: ^29.5.0 + checksum: 57981911cc20a4219b0da9e22b2e3c9f31b505e43f78e61c899e3227ded455ce1a3a9483842c69cfa4532f02cfb536ae0995bf245f9211608edacfc1e478d411 + languageName: node + linkType: hard + +"jest-get-type@npm:^28.0.2": + version: 28.0.2 + resolution: "jest-get-type@npm:28.0.2" + checksum: 5281d7c89bc8156605f6d15784f45074f4548501195c26e9b188742768f72d40948252d13230ea905b5349038865a1a8eeff0e614cc530ff289dfc41fe843abd + languageName: node + linkType: hard + +"jest-get-type@npm:^29.4.3": + version: 29.4.3 + resolution: "jest-get-type@npm:29.4.3" + checksum: 6ac7f2dde1c65e292e4355b6c63b3a4897d7e92cb4c8afcf6d397f2682f8080e094c8b0b68205a74d269882ec06bf696a9de6cd3e1b7333531e5ed7b112605ce + languageName: node + linkType: hard + +"jest-haste-map@npm:^28.1.3": + version: 28.1.3 + resolution: "jest-haste-map@npm:28.1.3" + dependencies: + "@jest/types": ^28.1.3 + "@types/graceful-fs": ^4.1.3 + "@types/node": "*" + anymatch: ^3.0.3 + fb-watchman: ^2.0.0 + fsevents: ^2.3.2 + graceful-fs: ^4.2.9 + jest-regex-util: ^28.0.2 + jest-util: ^28.1.3 + jest-worker: ^28.1.3 + micromatch: ^4.0.4 + walker: ^1.0.8 + dependenciesMeta: + fsevents: + optional: true + checksum: d05fdc108645fc2b39fcd4001952cc7a8cb550e93494e98c1e9ab1fc542686f6ac67177c132e564cf94fe8f81503f3f8db8b825b9b713dc8c5748aec63ba4688 + languageName: node + linkType: hard + +"jest-haste-map@npm:^29.5.0": + version: 29.5.0 + resolution: "jest-haste-map@npm:29.5.0" + dependencies: + "@jest/types": ^29.5.0 + "@types/graceful-fs": ^4.1.3 + "@types/node": "*" + anymatch: ^3.0.3 + fb-watchman: ^2.0.0 + fsevents: ^2.3.2 + graceful-fs: ^4.2.9 + jest-regex-util: ^29.4.3 + jest-util: ^29.5.0 + jest-worker: ^29.5.0 + micromatch: ^4.0.4 + walker: ^1.0.8 + dependenciesMeta: + fsevents: + optional: true + checksum: 3828ff7783f168e34be2c63887f82a01634261f605dcae062d83f979a61c37739e21b9607ecb962256aea3fbe5a530a1acee062d0026fcb47c607c12796cf3b7 + languageName: node + linkType: hard + +"jest-leak-detector@npm:^28.1.3": + version: 28.1.3 + resolution: "jest-leak-detector@npm:28.1.3" + dependencies: + jest-get-type: ^28.0.2 + pretty-format: ^28.1.3 + checksum: 2e976a4880cf9af11f53a19f6a3820e0f90b635a900737a5427fc42e337d5628ba446dcd7c020ecea3806cf92bc0bbf6982ed62a9cd84e5a13d8751aa30fbbb7 + languageName: node + linkType: hard + +"jest-leak-detector@npm:^29.5.0": + version: 29.5.0 + resolution: "jest-leak-detector@npm:29.5.0" + dependencies: + jest-get-type: ^29.4.3 + pretty-format: ^29.5.0 + checksum: 0fb845da7ac9cdfc9b3b2e35f6f623a41c547d7dc0103ceb0349013459d00de5870b5689a625e7e37f9644934b40e8f1dcdd5422d14d57470600350364676313 + languageName: node + linkType: hard + +"jest-matcher-utils@npm:^28.1.3": + version: 28.1.3 + resolution: "jest-matcher-utils@npm:28.1.3" + dependencies: + chalk: ^4.0.0 + jest-diff: ^28.1.3 + jest-get-type: ^28.0.2 + pretty-format: ^28.1.3 + checksum: 6b34f0cf66f6781e92e3bec97bf27796bd2ba31121e5c5997218d9adba6deea38a30df5203937d6785b68023ed95cbad73663cc9aad6fb0cb59aeb5813a58daf + languageName: node + linkType: hard + +"jest-matcher-utils@npm:^29.5.0": + version: 29.5.0 + resolution: "jest-matcher-utils@npm:29.5.0" + dependencies: + chalk: ^4.0.0 + jest-diff: ^29.5.0 + jest-get-type: ^29.4.3 + pretty-format: ^29.5.0 + checksum: 1d3e8c746e484a58ce194e3aad152eff21fd0896e8b8bf3d4ab1a4e2cbfed95fb143646f4ad9fdf6e42212b9e8fc033268b58e011b044a9929df45485deb5ac9 + languageName: node + linkType: hard + +"jest-message-util@npm:^28.1.3": + version: 28.1.3 + resolution: "jest-message-util@npm:28.1.3" + dependencies: + "@babel/code-frame": ^7.12.13 + "@jest/types": ^28.1.3 + "@types/stack-utils": ^2.0.0 + chalk: ^4.0.0 + graceful-fs: ^4.2.9 + micromatch: ^4.0.4 + pretty-format: ^28.1.3 + slash: ^3.0.0 + stack-utils: ^2.0.3 + checksum: 1f266854166dcc6900d75a88b54a25225a2f3710d463063ff1c99021569045c35c7d58557b25447a17eb3a65ce763b2f9b25550248b468a9d4657db365f39e96 + languageName: node + linkType: hard + +"jest-message-util@npm:^29.5.0": + version: 29.5.0 + resolution: "jest-message-util@npm:29.5.0" + dependencies: + "@babel/code-frame": ^7.12.13 + "@jest/types": ^29.5.0 + "@types/stack-utils": ^2.0.0 + chalk: ^4.0.0 + graceful-fs: ^4.2.9 + micromatch: ^4.0.4 + pretty-format: ^29.5.0 + slash: ^3.0.0 + stack-utils: ^2.0.3 + checksum: daddece6bbf846eb6a2ab9be9f2446e54085bef4e5cecd13d2a538fa9c01cb89d38e564c6b74fd8e12d37ed9eface8a362240ae9f21d68b214590631e7a0d8bf + languageName: node + linkType: hard + +"jest-mock-extended@npm:^3.0.1": + version: 3.0.3 + resolution: "jest-mock-extended@npm:3.0.3" + dependencies: + ts-essentials: ^7.0.3 + peerDependencies: + jest: ^24.0.0 || ^25.0.0 || ^26.0.0 || ^27.0.0 || ^28.0.0 || ^29.0.0 + typescript: ^3.0.0 || ^4.0.0 + checksum: 826d619b0e9e5f4a7691259a5f8919fd40d6468d13d9c0d8c0724d8ebd106404e7416079692f4dce5b4d42e3579b5948ea789b951ab6858ab76c192113e1d759 + languageName: node + linkType: hard + +"jest-mock@npm:^28.1.3": + version: 28.1.3 + resolution: "jest-mock@npm:28.1.3" + dependencies: + "@jest/types": ^28.1.3 + "@types/node": "*" + checksum: a573bf8e5f12f4c29c661266c31b5c6b69a28d3195b83049983bce025b2b1a0152351567e89e63b102ef817034c2a3aa97eda4e776f3bae2aee54c5765573aa7 + languageName: node + linkType: hard + +"jest-mock@npm:^29.5.0": + version: 29.5.0 + resolution: "jest-mock@npm:29.5.0" + dependencies: + "@jest/types": ^29.5.0 + "@types/node": "*" + jest-util: ^29.5.0 + checksum: 2a9cf07509948fa8608898c445f04fe4dd6e2049ff431e5531eee028c808d3ba3c67f226ac87b0cf383feaa1055776900d197c895e89783016886ac17a4ff10c + languageName: node + linkType: hard + +"jest-pnp-resolver@npm:^1.2.2": + version: 1.2.3 + resolution: "jest-pnp-resolver@npm:1.2.3" + peerDependencies: + jest-resolve: "*" + peerDependenciesMeta: + jest-resolve: + optional: true + checksum: db1a8ab2cb97ca19c01b1cfa9a9c8c69a143fde833c14df1fab0766f411b1148ff0df878adea09007ac6a2085ec116ba9a996a6ad104b1e58c20adbf88eed9b2 + languageName: node + linkType: hard + +"jest-regex-util@npm:^28.0.2": + version: 28.0.2 + resolution: "jest-regex-util@npm:28.0.2" + checksum: 0ea8c5c82ec88bc85e273c0ec82e0c0f35f7a1e2d055070e50f0cc2a2177f848eec55f73e37ae0d045c3db5014c42b2f90ac62c1ab3fdb354d2abd66a9e08add + languageName: node + linkType: hard + +"jest-regex-util@npm:^29.4.3": + version: 29.4.3 + resolution: "jest-regex-util@npm:29.4.3" + checksum: 96fc7fc28cd4dd73a63c13a526202c4bd8b351d4e5b68b1a2a2c88da3308c2a16e26feaa593083eb0bac38cca1aa9dd05025412e7de013ba963fb8e66af22b8a + languageName: node + linkType: hard + +"jest-resolve-dependencies@npm:^28.1.3": + version: 28.1.3 + resolution: "jest-resolve-dependencies@npm:28.1.3" + dependencies: + jest-regex-util: ^28.0.2 + jest-snapshot: ^28.1.3 + checksum: 4eea9ec33aefc1c71dc5956391efbcc7be76bda986b366ab3931d99c5f7ed01c9ebd7520e405ea2c76e1bb2c7ce504be6eca2b9831df16564d1e625500f3bfe7 + languageName: node + linkType: hard + +"jest-resolve-dependencies@npm:^29.5.0": + version: 29.5.0 + resolution: "jest-resolve-dependencies@npm:29.5.0" + dependencies: + jest-regex-util: ^29.4.3 + jest-snapshot: ^29.5.0 + checksum: 479d2e5365d58fe23f2b87001e2e0adcbffe0147700e85abdec8f14b9703b0a55758c1929a9989e3f5d5e954fb88870ea4bfa04783523b664562fcf5f10b0edf + languageName: node + linkType: hard + +"jest-resolve@npm:^28.1.3": + version: 28.1.3 + resolution: "jest-resolve@npm:28.1.3" + dependencies: + chalk: ^4.0.0 + graceful-fs: ^4.2.9 + jest-haste-map: ^28.1.3 + jest-pnp-resolver: ^1.2.2 + jest-util: ^28.1.3 + jest-validate: ^28.1.3 + resolve: ^1.20.0 + resolve.exports: ^1.1.0 + slash: ^3.0.0 + checksum: df61a490c93f4f4cf52135e43d6a4fcacb07b0b7d4acc6319e9289529c1d14f2d8e1638e095dbf96f156834802755e38db68caca69dba21a3261ee711d4426b6 + languageName: node + linkType: hard + +"jest-resolve@npm:^29.5.0": + version: 29.5.0 + resolution: "jest-resolve@npm:29.5.0" + dependencies: + chalk: ^4.0.0 + graceful-fs: ^4.2.9 + jest-haste-map: ^29.5.0 + jest-pnp-resolver: ^1.2.2 + jest-util: ^29.5.0 + jest-validate: ^29.5.0 + resolve: ^1.20.0 + resolve.exports: ^2.0.0 + slash: ^3.0.0 + checksum: 9a125f3cf323ceef512089339d35f3ee37f79fe16a831fb6a26773ea6a229b9e490d108fec7af334142e91845b5996de8e7cdd85a4d8d617078737d804e29c8f + languageName: node + linkType: hard + +"jest-runner@npm:^28.1.3": + version: 28.1.3 + resolution: "jest-runner@npm:28.1.3" + dependencies: + "@jest/console": ^28.1.3 + "@jest/environment": ^28.1.3 + "@jest/test-result": ^28.1.3 + "@jest/transform": ^28.1.3 + "@jest/types": ^28.1.3 + "@types/node": "*" + chalk: ^4.0.0 + emittery: ^0.10.2 + graceful-fs: ^4.2.9 + jest-docblock: ^28.1.1 + jest-environment-node: ^28.1.3 + jest-haste-map: ^28.1.3 + jest-leak-detector: ^28.1.3 + jest-message-util: ^28.1.3 + jest-resolve: ^28.1.3 + jest-runtime: ^28.1.3 + jest-util: ^28.1.3 + jest-watcher: ^28.1.3 + jest-worker: ^28.1.3 + p-limit: ^3.1.0 + source-map-support: 0.5.13 + checksum: 32405cd970fa6b11e039192dae699fd1bcc6f61f67d50605af81d193f24dd4373b25f5fcc1c571a028ec1b02174e8a4b6d0d608772063fb06f08a5105693533b + languageName: node + linkType: hard + +"jest-runner@npm:^29.5.0": + version: 29.5.0 + resolution: "jest-runner@npm:29.5.0" + dependencies: + "@jest/console": ^29.5.0 + "@jest/environment": ^29.5.0 + "@jest/test-result": ^29.5.0 + "@jest/transform": ^29.5.0 + "@jest/types": ^29.5.0 + "@types/node": "*" + chalk: ^4.0.0 + emittery: ^0.13.1 + graceful-fs: ^4.2.9 + jest-docblock: ^29.4.3 + jest-environment-node: ^29.5.0 + jest-haste-map: ^29.5.0 + jest-leak-detector: ^29.5.0 + jest-message-util: ^29.5.0 + jest-resolve: ^29.5.0 + jest-runtime: ^29.5.0 + jest-util: ^29.5.0 + jest-watcher: ^29.5.0 + jest-worker: ^29.5.0 + p-limit: ^3.1.0 + source-map-support: 0.5.13 + checksum: 437dea69c5dddca22032259787bac74790d5a171c9d804711415f31e5d1abfb64fa52f54a9015bb17a12b858fd0cf3f75ef6f3c9e94255a8596e179f707229c4 + languageName: node + linkType: hard + +"jest-runtime@npm:^28.1.3": + version: 28.1.3 + resolution: "jest-runtime@npm:28.1.3" + dependencies: + "@jest/environment": ^28.1.3 + "@jest/fake-timers": ^28.1.3 + "@jest/globals": ^28.1.3 + "@jest/source-map": ^28.1.2 + "@jest/test-result": ^28.1.3 + "@jest/transform": ^28.1.3 + "@jest/types": ^28.1.3 + chalk: ^4.0.0 + cjs-module-lexer: ^1.0.0 + collect-v8-coverage: ^1.0.0 + execa: ^5.0.0 + glob: ^7.1.3 + graceful-fs: ^4.2.9 + jest-haste-map: ^28.1.3 + jest-message-util: ^28.1.3 + jest-mock: ^28.1.3 + jest-regex-util: ^28.0.2 + jest-resolve: ^28.1.3 + jest-snapshot: ^28.1.3 + jest-util: ^28.1.3 + slash: ^3.0.0 + strip-bom: ^4.0.0 + checksum: b17c40af858e74dafa4f515ef3711c1e9ef3d4ad7d74534ee0745422534bc04fd166d4eceb62a3aa7dc951505d6f6d2a81d16e90bebb032be409ec0500974a36 + languageName: node + linkType: hard + +"jest-runtime@npm:^29.5.0": + version: 29.5.0 + resolution: "jest-runtime@npm:29.5.0" + dependencies: + "@jest/environment": ^29.5.0 + "@jest/fake-timers": ^29.5.0 + "@jest/globals": ^29.5.0 + "@jest/source-map": ^29.4.3 + "@jest/test-result": ^29.5.0 + "@jest/transform": ^29.5.0 + "@jest/types": ^29.5.0 + "@types/node": "*" + chalk: ^4.0.0 + cjs-module-lexer: ^1.0.0 + collect-v8-coverage: ^1.0.0 + glob: ^7.1.3 + graceful-fs: ^4.2.9 + jest-haste-map: ^29.5.0 + jest-message-util: ^29.5.0 + jest-mock: ^29.5.0 + jest-regex-util: ^29.4.3 + jest-resolve: ^29.5.0 + jest-snapshot: ^29.5.0 + jest-util: ^29.5.0 + slash: ^3.0.0 + strip-bom: ^4.0.0 + checksum: 7af27bd9d54cf1c5735404cf8d76c6509d5610b1ec0106a21baa815c1aff15d774ce534ac2834bc440dccfe6348bae1885fd9a806f23a94ddafdc0f5bae4b09d + languageName: node + linkType: hard + +"jest-snapshot@npm:^28.1.3": + version: 28.1.3 + resolution: "jest-snapshot@npm:28.1.3" + dependencies: + "@babel/core": ^7.11.6 + "@babel/generator": ^7.7.2 + "@babel/plugin-syntax-typescript": ^7.7.2 + "@babel/traverse": ^7.7.2 + "@babel/types": ^7.3.3 + "@jest/expect-utils": ^28.1.3 + "@jest/transform": ^28.1.3 + "@jest/types": ^28.1.3 + "@types/babel__traverse": ^7.0.6 + "@types/prettier": ^2.1.5 + babel-preset-current-node-syntax: ^1.0.0 + chalk: ^4.0.0 + expect: ^28.1.3 + graceful-fs: ^4.2.9 + jest-diff: ^28.1.3 + jest-get-type: ^28.0.2 + jest-haste-map: ^28.1.3 + jest-matcher-utils: ^28.1.3 + jest-message-util: ^28.1.3 + jest-util: ^28.1.3 + natural-compare: ^1.4.0 + pretty-format: ^28.1.3 + semver: ^7.3.5 + checksum: 2a46a5493f1fb50b0a236a21f25045e7f46a244f9f3ae37ef4fbcd40249d0d68bb20c950ce77439e4e2cac985b05c3061c90b34739bf6069913a1199c8c716e1 + languageName: node + linkType: hard + +"jest-snapshot@npm:^29.5.0": + version: 29.5.0 + resolution: "jest-snapshot@npm:29.5.0" + dependencies: + "@babel/core": ^7.11.6 + "@babel/generator": ^7.7.2 + "@babel/plugin-syntax-jsx": ^7.7.2 + "@babel/plugin-syntax-typescript": ^7.7.2 + "@babel/traverse": ^7.7.2 + "@babel/types": ^7.3.3 + "@jest/expect-utils": ^29.5.0 + "@jest/transform": ^29.5.0 + "@jest/types": ^29.5.0 + "@types/babel__traverse": ^7.0.6 + "@types/prettier": ^2.1.5 + babel-preset-current-node-syntax: ^1.0.0 + chalk: ^4.0.0 + expect: ^29.5.0 + graceful-fs: ^4.2.9 + jest-diff: ^29.5.0 + jest-get-type: ^29.4.3 + jest-matcher-utils: ^29.5.0 + jest-message-util: ^29.5.0 + jest-util: ^29.5.0 + natural-compare: ^1.4.0 + pretty-format: ^29.5.0 + semver: ^7.3.5 + checksum: fe5df54122ed10eed625de6416a45bc4958d5062b018f05b152bf9785ab7f355dcd55e40cf5da63895bf8278f8d7b2bb4059b2cfbfdee18f509d455d37d8aa2b + languageName: node + linkType: hard + +"jest-util@npm:^28.0.0, jest-util@npm:^28.1.3": + version: 28.1.3 + resolution: "jest-util@npm:28.1.3" + dependencies: + "@jest/types": ^28.1.3 + "@types/node": "*" + chalk: ^4.0.0 + ci-info: ^3.2.0 + graceful-fs: ^4.2.9 + picomatch: ^2.2.3 + checksum: fd6459742c941f070223f25e38a2ac0719aad92561591e9fb2a50d602a5d19d754750b79b4074327a42b00055662b95da3b006542ceb8b54309da44d4a62e721 + languageName: node + linkType: hard + +"jest-util@npm:^29.0.0, jest-util@npm:^29.5.0": + version: 29.5.0 + resolution: "jest-util@npm:29.5.0" + dependencies: + "@jest/types": ^29.5.0 + "@types/node": "*" + chalk: ^4.0.0 + ci-info: ^3.2.0 + graceful-fs: ^4.2.9 + picomatch: ^2.2.3 + checksum: fd9212950d34d2ecad8c990dda0d8ea59a8a554b0c188b53ea5d6c4a0829a64f2e1d49e6e85e812014933d17426d7136da4785f9cf76fff1799de51b88bc85d3 + languageName: node + linkType: hard + +"jest-validate@npm:^28.1.3": + version: 28.1.3 + resolution: "jest-validate@npm:28.1.3" + dependencies: + "@jest/types": ^28.1.3 + camelcase: ^6.2.0 + chalk: ^4.0.0 + jest-get-type: ^28.0.2 + leven: ^3.1.0 + pretty-format: ^28.1.3 + checksum: 95e0513b3803c3372a145cda86edbdb33d9dfeaa18818176f2d581e821548ceac9a179f065b6d4671a941de211354efd67f1fff8789a4fb89962565c85f646db + languageName: node + linkType: hard + +"jest-validate@npm:^29.5.0": + version: 29.5.0 + resolution: "jest-validate@npm:29.5.0" + dependencies: + "@jest/types": ^29.5.0 + camelcase: ^6.2.0 + chalk: ^4.0.0 + jest-get-type: ^29.4.3 + leven: ^3.1.0 + pretty-format: ^29.5.0 + checksum: 43ca5df7cb75572a254ac3e92fbbe7be6b6a1be898cc1e887a45d55ea003f7a112717d814a674d37f9f18f52d8de40873c8f084f17664ae562736c78dd44c6a1 + languageName: node + linkType: hard + +"jest-watcher@npm:^28.1.3": + version: 28.1.3 + resolution: "jest-watcher@npm:28.1.3" + dependencies: + "@jest/test-result": ^28.1.3 + "@jest/types": ^28.1.3 + "@types/node": "*" + ansi-escapes: ^4.2.1 + chalk: ^4.0.0 + emittery: ^0.10.2 + jest-util: ^28.1.3 + string-length: ^4.0.1 + checksum: 8f6d674a4865e7df251f71544f1b51f06fd36b5a3a61f2ac81aeb81fa2a196be354fba51d0f97911c88f67cd254583b3a22ee124bf2c5b6ee2fadec27356c207 + languageName: node + linkType: hard + +"jest-watcher@npm:^29.5.0": + version: 29.5.0 + resolution: "jest-watcher@npm:29.5.0" + dependencies: + "@jest/test-result": ^29.5.0 + "@jest/types": ^29.5.0 + "@types/node": "*" + ansi-escapes: ^4.2.1 + chalk: ^4.0.0 + emittery: ^0.13.1 + jest-util: ^29.5.0 + string-length: ^4.0.1 + checksum: 62303ac7bdc7e61a8b4239a239d018f7527739da2b2be6a81a7be25b74ca769f1c43ee8558ce8e72bb857245c46d6e03af331227ffb00a57280abb2a928aa776 + languageName: node + linkType: hard + +"jest-worker@npm:^28.1.3": + version: 28.1.3 + resolution: "jest-worker@npm:28.1.3" + dependencies: + "@types/node": "*" + merge-stream: ^2.0.0 + supports-color: ^8.0.0 + checksum: e921c9a1b8f0909da9ea07dbf3592f95b653aef3a8bb0cbcd20fc7f9a795a1304adecac31eecb308992c167e8d7e75c522061fec38a5928ace0f9571c90169ca + languageName: node + linkType: hard + +"jest-worker@npm:^29.5.0": + version: 29.5.0 + resolution: "jest-worker@npm:29.5.0" + dependencies: + "@types/node": "*" + jest-util: ^29.5.0 + merge-stream: ^2.0.0 + supports-color: ^8.0.0 + checksum: 1151a1ae3602b1ea7c42a8f1efe2b5a7bf927039deaa0827bf978880169899b705744e288f80a63603fb3fc2985e0071234986af7dc2c21c7a64333d8777c7c9 + languageName: node + linkType: hard + +"jest@npm:^28.0.0, jest@npm:^28.1.3": + version: 28.1.3 + resolution: "jest@npm:28.1.3" + dependencies: + "@jest/core": ^28.1.3 + "@jest/types": ^28.1.3 + import-local: ^3.0.2 + jest-cli: ^28.1.3 + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + bin: + jest: bin/jest.js + checksum: b9dcb542eb7c16261c281cdc2bf37155dbb3f1205bae0b567f05051db362c85ddd4b765f126591efb88f6d298eb10336d0aa6c7d5373b4d53f918137a9a70182 + languageName: node + linkType: hard + +"jest@npm:^29.5.0": + version: 29.5.0 + resolution: "jest@npm:29.5.0" + dependencies: + "@jest/core": ^29.5.0 + "@jest/types": ^29.5.0 + import-local: ^3.0.2 + jest-cli: ^29.5.0 + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + bin: + jest: bin/jest.js + checksum: a8ff2eb0f421623412236e23cbe67c638127fffde466cba9606bc0c0553b4c1e5cb116d7e0ef990b5d1712851652c8ee461373b578df50857fe635b94ff455d5 + languageName: node + linkType: hard + +"jju@npm:~1.4.0": + version: 1.4.0 + resolution: "jju@npm:1.4.0" + checksum: 3790481bd2b7827dd6336e6e3dc2dcc6d425679ba7ebde7b679f61dceb4457ea0cda330972494de608571f4973c6dfb5f70fab6f3c5037dbab19ac449a60424f + languageName: node + linkType: hard + +"js-sdsl@npm:^4.1.4": + version: 4.3.0 + resolution: "js-sdsl@npm:4.3.0" + checksum: ce908257cf6909e213af580af3a691a736f5ee8b16315454768f917a682a4ea0c11bde1b241bbfaecedc0eb67b72101b2c2df2ffaed32aed5d539fca816f054e + languageName: node + linkType: hard + +"js-tokens@npm:^4.0.0": + version: 4.0.0 + resolution: "js-tokens@npm:4.0.0" + checksum: 8a95213a5a77deb6cbe94d86340e8d9ace2b93bc367790b260101d2f36a2eaf4e4e22d9fa9cf459b38af3a32fb4190e638024cf82ec95ef708680e405ea7cc78 + languageName: node + linkType: hard + +"js-yaml@npm:^3.13.1": + version: 3.14.1 + resolution: "js-yaml@npm:3.14.1" + dependencies: + argparse: ^1.0.7 + esprima: ^4.0.0 + bin: + js-yaml: bin/js-yaml.js + checksum: bef146085f472d44dee30ec34e5cf36bf89164f5d585435a3d3da89e52622dff0b188a580e4ad091c3341889e14cb88cac6e4deb16dc5b1e9623bb0601fc255c + languageName: node + linkType: hard + +"js-yaml@npm:^4.1.0": + version: 4.1.0 + resolution: "js-yaml@npm:4.1.0" + dependencies: + argparse: ^2.0.1 + bin: + js-yaml: bin/js-yaml.js + checksum: c7830dfd456c3ef2c6e355cc5a92e6700ceafa1d14bba54497b34a99f0376cecbb3e9ac14d3e5849b426d5a5140709a66237a8c991c675431271c4ce5504151a + languageName: node + linkType: hard + +"jsdoc-type-pratt-parser@npm:~4.0.0": + version: 4.0.0 + resolution: "jsdoc-type-pratt-parser@npm:4.0.0" + checksum: af0629c9517e484be778d8564440fec8de5b7610e0c9c88a3ba4554321364faf72b46689c8d8845faa12c0718437a9ed97e231977efc0f2d50e8a2dbad807eb3 + languageName: node + linkType: hard + +"jsesc@npm:^2.5.1": + version: 2.5.2 + resolution: "jsesc@npm:2.5.2" + bin: + jsesc: bin/jsesc + checksum: 4dc190771129e12023f729ce20e1e0bfceac84d73a85bc3119f7f938843fe25a4aeccb54b6494dce26fcf263d815f5f31acdefac7cc9329efb8422a4f4d9fa9d + languageName: node + linkType: hard + +"json-parse-even-better-errors@npm:^2.3.0": + version: 2.3.1 + resolution: "json-parse-even-better-errors@npm:2.3.1" + checksum: 798ed4cf3354a2d9ccd78e86d2169515a0097a5c133337807cdf7f1fc32e1391d207ccfc276518cc1d7d8d4db93288b8a50ba4293d212ad1336e52a8ec0a941f + languageName: node + linkType: hard + +"json-schema-traverse@npm:^0.4.1": + version: 0.4.1 + resolution: "json-schema-traverse@npm:0.4.1" + checksum: 7486074d3ba247769fda17d5181b345c9fb7d12e0da98b22d1d71a5db9698d8b4bd900a3ec1a4ffdd60846fc2556274a5c894d0c48795f14cb03aeae7b55260b + languageName: node + linkType: hard + +"json-stable-stringify-without-jsonify@npm:^1.0.1": + version: 1.0.1 + resolution: "json-stable-stringify-without-jsonify@npm:1.0.1" + checksum: cff44156ddce9c67c44386ad5cddf91925fe06b1d217f2da9c4910d01f358c6e3989c4d5a02683c7a5667f9727ff05831f7aa8ae66c8ff691c556f0884d49215 + languageName: node + linkType: hard + +"json5@npm:^2.2.1, json5@npm:^2.2.2, json5@npm:^2.2.3": + version: 2.2.3 + resolution: "json5@npm:2.2.3" + bin: + json5: lib/cli.js + checksum: 2a7436a93393830bce797d4626275152e37e877b265e94ca69c99e3d20c2b9dab021279146a39cdb700e71b2dd32a4cebd1514cd57cee102b1af906ce5040349 + languageName: node + linkType: hard + +"jsonc-parser@npm:^3.2.0": + version: 3.2.0 + resolution: "jsonc-parser@npm:3.2.0" + checksum: 946dd9a5f326b745aa326d48a7257e3f4a4b62c5e98ec8e49fa2bdd8d96cef7e6febf1399f5c7016114fd1f68a1c62c6138826d5d90bc650448e3cf0951c53c7 + languageName: node + linkType: hard + +"kleur@npm:^3.0.3": + version: 3.0.3 + resolution: "kleur@npm:3.0.3" + checksum: df82cd1e172f957bae9c536286265a5cdbd5eeca487cb0a3b2a7b41ef959fc61f8e7c0e9aeea9c114ccf2c166b6a8dd45a46fd619c1c569d210ecd2765ad5169 + languageName: node + linkType: hard + +"level-concat-iterator@npm:^3.0.0": + version: 3.1.0 + resolution: "level-concat-iterator@npm:3.1.0" + dependencies: + catering: ^2.1.0 + checksum: a15bc4c5fbbb30c1efa7fad06b72feaac84d90990b356b461593c198a833336f31f6daff8f40c3908fabd14cfd8856d1c5ecae9e1cb0575037b65fa607e760e9 + languageName: node + linkType: hard + +"level-errors@npm:^3.0.1": + version: 3.0.1 + resolution: "level-errors@npm:3.0.1" + checksum: fe4486c423e78ab509a8f7908b89a1692cc810dd47e02d9ceca50543b5be0ce3a4d555fb8f4d3c82122f56bd48c27e6175ca06da359b8e359ea2c7848209d8e7 + languageName: node + linkType: hard + +"level-iterator-stream@npm:^5.0.0": + version: 5.0.0 + resolution: "level-iterator-stream@npm:5.0.0" + dependencies: + inherits: ^2.0.4 + readable-stream: ^3.4.0 + checksum: 3f5bbb9caf6cf6d6c4735219194b85f903377d9da76d37db0691b836c8ea3a78e5233fb18c91f0ef8ca8faaa19bd59e46572ebe27ad2039c51cf83e6c974b9f1 + languageName: node + linkType: hard + +"level-supports@npm:^2.0.1": + version: 2.1.0 + resolution: "level-supports@npm:2.1.0" + checksum: f7b16aea7ddd13326ee4fbc2c1099bcaf8a74dc95346af9ebedea4e02518c6f7a438e829b79b7890d67489b59f615a9428369a0a065021797aa7cb6b6bd84d75 + languageName: node + linkType: hard + +"levelup@npm:^5.1.1": + version: 5.1.1 + resolution: "levelup@npm:5.1.1" + dependencies: + catering: ^2.0.0 + deferred-leveldown: ^7.0.0 + level-errors: ^3.0.1 + level-iterator-stream: ^5.0.0 + level-supports: ^2.0.1 + queue-microtask: ^1.2.3 + checksum: 3053cd3495f615874f1695a47bc7c1eaf432f4c1323b41d58770230b39f2b845100c6e6e912bcffdc504051a8540a39b5d05f3b54f65cfdcb43ce613f6182dd6 + languageName: node + linkType: hard + +"leven@npm:^3.1.0": + version: 3.1.0 + resolution: "leven@npm:3.1.0" + checksum: 638401d534585261b6003db9d99afd244dfe82d75ddb6db5c0df412842d5ab30b2ef18de471aaec70fe69a46f17b4ae3c7f01d8a4e6580ef7adb9f4273ad1e55 + languageName: node + linkType: hard + +"levn@npm:^0.4.1": + version: 0.4.1 + resolution: "levn@npm:0.4.1" + dependencies: + prelude-ls: ^1.2.1 + type-check: ~0.4.0 + checksum: 12c5021c859bd0f5248561bf139121f0358285ec545ebf48bb3d346820d5c61a4309535c7f387ed7d84361cf821e124ce346c6b7cef8ee09a67c1473b46d0fc4 + languageName: node + linkType: hard + +"lines-and-columns@npm:^1.1.6": + version: 1.2.4 + resolution: "lines-and-columns@npm:1.2.4" + checksum: 0c37f9f7fa212b38912b7145e1cd16a5f3cd34d782441c3e6ca653485d326f58b3caccda66efce1c5812bde4961bbde3374fae4b0d11bf1226152337f3894aa5 + languageName: node + linkType: hard + +"locate-path@npm:^5.0.0": + version: 5.0.0 + resolution: "locate-path@npm:5.0.0" + dependencies: + p-locate: ^4.1.0 + checksum: 83e51725e67517287d73e1ded92b28602e3ae5580b301fe54bfb76c0c723e3f285b19252e375712316774cf52006cb236aed5704692c32db0d5d089b69696e30 + languageName: node + linkType: hard + +"locate-path@npm:^6.0.0": + version: 6.0.0 + resolution: "locate-path@npm:6.0.0" + dependencies: + p-locate: ^5.0.0 + checksum: 72eb661788a0368c099a184c59d2fee760b3831c9c1c33955e8a19ae4a21b4116e53fa736dc086cdeb9fce9f7cc508f2f92d2d3aae516f133e16a2bb59a39f5a + languageName: node + linkType: hard + +"lodash.memoize@npm:4.x": + version: 4.1.2 + resolution: "lodash.memoize@npm:4.1.2" + checksum: 9ff3942feeccffa4f1fafa88d32f0d24fdc62fd15ded5a74a5f950ff5f0c6f61916157246744c620173dddf38d37095a92327d5fd3861e2063e736a5c207d089 + languageName: node + linkType: hard + +"lodash.merge@npm:^4.6.2": + version: 4.6.2 + resolution: "lodash.merge@npm:4.6.2" + checksum: ad580b4bdbb7ca1f7abf7e1bce63a9a0b98e370cf40194b03380a46b4ed799c9573029599caebc1b14e3f24b111aef72b96674a56cfa105e0f5ac70546cdc005 + languageName: node + linkType: hard + +"lru-cache@npm:^5.1.1": + version: 5.1.1 + resolution: "lru-cache@npm:5.1.1" + dependencies: + yallist: ^3.0.2 + checksum: c154ae1cbb0c2206d1501a0e94df349653c92c8cbb25236d7e85190bcaf4567a03ac6eb43166fabfa36fd35623694da7233e88d9601fbf411a9a481d85dbd2cb + languageName: node + linkType: hard + +"lru-cache@npm:^6.0.0": + version: 6.0.0 + resolution: "lru-cache@npm:6.0.0" + dependencies: + yallist: ^4.0.0 + checksum: f97f499f898f23e4585742138a22f22526254fdba6d75d41a1c2526b3b6cc5747ef59c5612ba7375f42aca4f8461950e925ba08c991ead0651b4918b7c978297 + languageName: node + linkType: hard + +"lru-cache@npm:^7.7.1": + version: 7.18.3 + resolution: "lru-cache@npm:7.18.3" + checksum: e550d772384709deea3f141af34b6d4fa392e2e418c1498c078de0ee63670f1f46f5eee746e8ef7e69e1c895af0d4224e62ee33e66a543a14763b0f2e74c1356 + languageName: node + linkType: hard + +"ltgt@npm:^2.2.0": + version: 2.2.1 + resolution: "ltgt@npm:2.2.1" + checksum: 7e3874296f7538bc8087b428ac4208008d7b76916354b34a08818ca7c83958c1df10ec427eeeaad895f6b81e41e24745b18d30f89abcc21d228b94f6961d50a2 + languageName: node + linkType: hard + +"lunr@npm:^2.3.9": + version: 2.3.9 + resolution: "lunr@npm:2.3.9" + checksum: 176719e24fcce7d3cf1baccce9dd5633cd8bdc1f41ebe6a180112e5ee99d80373fe2454f5d4624d437e5a8319698ca6837b9950566e15d2cae5f2a543a3db4b8 + languageName: node + linkType: hard + +"make-dir@npm:^3.0.0": + version: 3.1.0 + resolution: "make-dir@npm:3.1.0" + dependencies: + semver: ^6.0.0 + checksum: 484200020ab5a1fdf12f393fe5f385fc8e4378824c940fba1729dcd198ae4ff24867bc7a5646331e50cead8abff5d9270c456314386e629acec6dff4b8016b78 + languageName: node + linkType: hard + +"make-error@npm:1.x, make-error@npm:^1.1.1": + version: 1.3.6 + resolution: "make-error@npm:1.3.6" + checksum: b86e5e0e25f7f777b77fabd8e2cbf15737972869d852a22b7e73c17623928fccb826d8e46b9951501d3f20e51ad74ba8c59ed584f610526a48f8ccf88aaec402 + languageName: node + linkType: hard + +"make-fetch-happen@npm:^10.0.3": + version: 10.2.1 + resolution: "make-fetch-happen@npm:10.2.1" + dependencies: + agentkeepalive: ^4.2.1 + cacache: ^16.1.0 + http-cache-semantics: ^4.1.0 + http-proxy-agent: ^5.0.0 + https-proxy-agent: ^5.0.0 + is-lambda: ^1.0.1 + lru-cache: ^7.7.1 + minipass: ^3.1.6 + minipass-collect: ^1.0.2 + minipass-fetch: ^2.0.3 + minipass-flush: ^1.0.5 + minipass-pipeline: ^1.2.4 + negotiator: ^0.6.3 + promise-retry: ^2.0.1 + socks-proxy-agent: ^7.0.0 + ssri: ^9.0.0 + checksum: 2332eb9a8ec96f1ffeeea56ccefabcb4193693597b132cd110734d50f2928842e22b84cfa1508e921b8385cdfd06dda9ad68645fed62b50fff629a580f5fb72c + languageName: node + linkType: hard + +"makeerror@npm:1.0.12": + version: 1.0.12 + resolution: "makeerror@npm:1.0.12" + dependencies: + tmpl: 1.0.5 + checksum: b38a025a12c8146d6eeea5a7f2bf27d51d8ad6064da8ca9405fcf7bf9b54acd43e3b30ddd7abb9b1bfa4ddb266019133313482570ddb207de568f71ecfcf6060 + languageName: node + linkType: hard + +"map-stream@npm:~0.1.0": + version: 0.1.0 + resolution: "map-stream@npm:0.1.0" + checksum: 38abbe4eb883888031e6b2fc0630bc583c99396be16b8ace5794b937b682a8a081f03e8b15bfd4914d1bc88318f0e9ac73ba3512ae65955cd449f63256ddb31d + languageName: node + linkType: hard + +"marked@npm:^4.2.12": + version: 4.2.12 + resolution: "marked@npm:4.2.12" + bin: + marked: bin/marked.js + checksum: bd551cd61028ee639d4ca2ccdfcc5a6ba4227c1b143c4538f3cde27f569dcb57df8e6313560394645b418b84a7336c07ab1e438b89b6324c29d7d8cdd3102d63 + languageName: node + linkType: hard + +"md5.js@npm:^1.3.4": + version: 1.3.5 + resolution: "md5.js@npm:1.3.5" + dependencies: + hash-base: ^3.0.0 + inherits: ^2.0.1 + safe-buffer: ^5.1.2 + checksum: 098494d885684bcc4f92294b18ba61b7bd353c23147fbc4688c75b45cb8590f5a95fd4584d742415dcc52487f7a1ef6ea611cfa1543b0dc4492fe026357f3f0c + languageName: node + linkType: hard + +"memdown@npm:^6.1.1": + version: 6.1.1 + resolution: "memdown@npm:6.1.1" + dependencies: + abstract-leveldown: ^7.2.0 + buffer: ^6.0.3 + functional-red-black-tree: ^1.0.1 + inherits: ^2.0.1 + ltgt: ^2.2.0 + checksum: a8c418620781a396e650834ab18022c1ae13060b3ca47dc80152eff45caf0e4780598610fd0f9b5a50ebdf195e686ed53fadbae1272addfafad98d598a165a4b + languageName: node + linkType: hard + +"merge-stream@npm:^2.0.0": + version: 2.0.0 + resolution: "merge-stream@npm:2.0.0" + checksum: 6fa4dcc8d86629705cea944a4b88ef4cb0e07656ebf223fa287443256414283dd25d91c1cd84c77987f2aec5927af1a9db6085757cb43d90eb170ebf4b47f4f4 + languageName: node + linkType: hard + +"merge2@npm:^1.3.0, merge2@npm:^1.4.1": + version: 1.4.1 + resolution: "merge2@npm:1.4.1" + checksum: 7268db63ed5169466540b6fb947aec313200bcf6d40c5ab722c22e242f651994619bcd85601602972d3c85bd2cc45a358a4c61937e9f11a061919a1da569b0c2 + languageName: node + linkType: hard + +"micromatch@npm:^4.0.4": + version: 4.0.5 + resolution: "micromatch@npm:4.0.5" + dependencies: + braces: ^3.0.2 + picomatch: ^2.3.1 + checksum: 02a17b671c06e8fefeeb6ef996119c1e597c942e632a21ef589154f23898c9c6a9858526246abb14f8bca6e77734aa9dcf65476fca47cedfb80d9577d52843fc + languageName: node + linkType: hard + +"mimic-fn@npm:^2.1.0": + version: 2.1.0 + resolution: "mimic-fn@npm:2.1.0" + checksum: d2421a3444848ce7f84bd49115ddacff29c15745db73f54041edc906c14b131a38d05298dae3081667627a59b2eb1ca4b436ff2e1b80f69679522410418b478a + languageName: node + linkType: hard + +"minimalistic-assert@npm:^1.0.0, minimalistic-assert@npm:^1.0.1": + version: 1.0.1 + resolution: "minimalistic-assert@npm:1.0.1" + checksum: cc7974a9268fbf130fb055aff76700d7e2d8be5f761fb5c60318d0ed010d839ab3661a533ad29a5d37653133385204c503bfac995aaa4236f4e847461ea32ba7 + languageName: node + linkType: hard + +"minimalistic-crypto-utils@npm:^1.0.1": + version: 1.0.1 + resolution: "minimalistic-crypto-utils@npm:1.0.1" + checksum: 6e8a0422b30039406efd4c440829ea8f988845db02a3299f372fceba56ffa94994a9c0f2fd70c17f9969eedfbd72f34b5070ead9656a34d3f71c0bd72583a0ed + languageName: node + linkType: hard + +"minimatch@npm:^3.0.4, minimatch@npm:^3.0.5, minimatch@npm:^3.1.1, minimatch@npm:^3.1.2": + version: 3.1.2 + resolution: "minimatch@npm:3.1.2" + dependencies: + brace-expansion: ^1.1.7 + checksum: c154e566406683e7bcb746e000b84d74465b3a832c45d59912b9b55cd50dee66e5c4b1e5566dba26154040e51672f9aa450a9aef0c97cfc7336b78b7afb9540a + languageName: node + linkType: hard + +"minimatch@npm:^5.0.1": + version: 5.1.6 + resolution: "minimatch@npm:5.1.6" + dependencies: + brace-expansion: ^2.0.1 + checksum: 7564208ef81d7065a370f788d337cd80a689e981042cb9a1d0e6580b6c6a8c9279eba80010516e258835a988363f99f54a6f711a315089b8b42694f5da9d0d77 + languageName: node + linkType: hard + +"minimatch@npm:^7.1.3": + version: 7.4.2 + resolution: "minimatch@npm:7.4.2" + dependencies: + brace-expansion: ^2.0.1 + checksum: 9e341b04e69d5ab03e4206dcb61c8a158e3b8709628bf5e1a4eaa9f3b72c0ba925e24ad959b1f6ce6835caa5a927131d5087fae6836b69e7d99d7d5e63ef0bd8 + languageName: node + linkType: hard + +"minipass-collect@npm:^1.0.2": + version: 1.0.2 + resolution: "minipass-collect@npm:1.0.2" + dependencies: + minipass: ^3.0.0 + checksum: 14df761028f3e47293aee72888f2657695ec66bd7d09cae7ad558da30415fdc4752bbfee66287dcc6fd5e6a2fa3466d6c484dc1cbd986525d9393b9523d97f10 + languageName: node + linkType: hard + +"minipass-fetch@npm:^2.0.3": + version: 2.1.2 + resolution: "minipass-fetch@npm:2.1.2" + dependencies: + encoding: ^0.1.13 + minipass: ^3.1.6 + minipass-sized: ^1.0.3 + minizlib: ^2.1.2 + dependenciesMeta: + encoding: + optional: true + checksum: 3f216be79164e915fc91210cea1850e488793c740534985da017a4cbc7a5ff50506956d0f73bb0cb60e4fe91be08b6b61ef35101706d3ef5da2c8709b5f08f91 + languageName: node + linkType: hard + +"minipass-flush@npm:^1.0.5": + version: 1.0.5 + resolution: "minipass-flush@npm:1.0.5" + dependencies: + minipass: ^3.0.0 + checksum: 56269a0b22bad756a08a94b1ffc36b7c9c5de0735a4dd1ab2b06c066d795cfd1f0ac44a0fcae13eece5589b908ecddc867f04c745c7009be0b566421ea0944cf + languageName: node + linkType: hard + +"minipass-pipeline@npm:^1.2.4": + version: 1.2.4 + resolution: "minipass-pipeline@npm:1.2.4" + dependencies: + minipass: ^3.0.0 + checksum: b14240dac0d29823c3d5911c286069e36d0b81173d7bdf07a7e4a91ecdef92cdff4baaf31ea3746f1c61e0957f652e641223970870e2353593f382112257971b + languageName: node + linkType: hard + +"minipass-sized@npm:^1.0.3": + version: 1.0.3 + resolution: "minipass-sized@npm:1.0.3" + dependencies: + minipass: ^3.0.0 + checksum: 79076749fcacf21b5d16dd596d32c3b6bf4d6e62abb43868fac21674078505c8b15eaca4e47ed844985a4514854f917d78f588fcd029693709417d8f98b2bd60 + languageName: node + linkType: hard + +"minipass@npm:^3.0.0, minipass@npm:^3.1.1, minipass@npm:^3.1.6": + version: 3.3.6 + resolution: "minipass@npm:3.3.6" + dependencies: + yallist: ^4.0.0 + checksum: a30d083c8054cee83cdcdc97f97e4641a3f58ae743970457b1489ce38ee1167b3aaf7d815cd39ec7a99b9c40397fd4f686e83750e73e652b21cb516f6d845e48 + languageName: node + linkType: hard + +"minipass@npm:^4.0.0": + version: 4.2.5 + resolution: "minipass@npm:4.2.5" + checksum: 4f9c19af23a5d4a9e7156feefc9110634b178a8cff8f8271af16ec5ebf7e221725a97429952c856f5b17b30c2065ebd24c81722d90c93d2122611d75b952b48f + languageName: node + linkType: hard + +"minizlib@npm:^2.1.1, minizlib@npm:^2.1.2": + version: 2.1.2 + resolution: "minizlib@npm:2.1.2" + dependencies: + minipass: ^3.0.0 + yallist: ^4.0.0 + checksum: f1fdeac0b07cf8f30fcf12f4b586795b97be856edea22b5e9072707be51fc95d41487faec3f265b42973a304fe3a64acd91a44a3826a963e37b37bafde0212c3 + languageName: node + linkType: hard + +"mkdirp@npm:^1.0.3, mkdirp@npm:^1.0.4": + version: 1.0.4 + resolution: "mkdirp@npm:1.0.4" + bin: + mkdirp: bin/cmd.js + checksum: a96865108c6c3b1b8e1d5e9f11843de1e077e57737602de1b82030815f311be11f96f09cce59bd5b903d0b29834733e5313f9301e3ed6d6f6fba2eae0df4298f + languageName: node + linkType: hard + +"ms@npm:2.1.2": + version: 2.1.2 + resolution: "ms@npm:2.1.2" + checksum: 673cdb2c3133eb050c745908d8ce632ed2c02d85640e2edb3ace856a2266a813b30c613569bf3354fdf4ea7d1a1494add3bfa95e2713baa27d0c2c71fc44f58f + languageName: node + linkType: hard + +"ms@npm:^2.0.0": + version: 2.1.3 + resolution: "ms@npm:2.1.3" + checksum: aa92de608021b242401676e35cfa5aa42dd70cbdc082b916da7fb925c542173e36bce97ea3e804923fe92c0ad991434e4a38327e15a1b5b5f945d66df615ae6d + languageName: node + linkType: hard + +"nanoid@npm:^3.3.4": + version: 3.3.4 + resolution: "nanoid@npm:3.3.4" + bin: + nanoid: bin/nanoid.cjs + checksum: 2fddd6dee994b7676f008d3ffa4ab16035a754f4bb586c61df5a22cf8c8c94017aadd360368f47d653829e0569a92b129979152ff97af23a558331e47e37cd9c + languageName: node + linkType: hard + +"natural-compare-lite@npm:^1.4.0": + version: 1.4.0 + resolution: "natural-compare-lite@npm:1.4.0" + checksum: 5222ac3986a2b78dd6069ac62cbb52a7bf8ffc90d972ab76dfe7b01892485d229530ed20d0c62e79a6b363a663b273db3bde195a1358ce9e5f779d4453887225 + languageName: node + linkType: hard + +"natural-compare@npm:^1.4.0": + version: 1.4.0 + resolution: "natural-compare@npm:1.4.0" + checksum: 23ad088b08f898fc9b53011d7bb78ec48e79de7627e01ab5518e806033861bef68d5b0cd0e2205c2f36690ac9571ff6bcb05eb777ced2eeda8d4ac5b44592c3d + languageName: node + linkType: hard + +"negotiator@npm:^0.6.3": + version: 0.6.3 + resolution: "negotiator@npm:0.6.3" + checksum: b8ffeb1e262eff7968fc90a2b6767b04cfd9842582a9d0ece0af7049537266e7b2506dfb1d107a32f06dd849ab2aea834d5830f7f4d0e5cb7d36e1ae55d021d9 + languageName: node + linkType: hard + +"node-addon-api@npm:^2.0.0": + version: 2.0.2 + resolution: "node-addon-api@npm:2.0.2" + dependencies: + node-gyp: latest + checksum: 31fb22d674648204f8dd94167eb5aac896c841b84a9210d614bf5d97c74ef059cc6326389cf0c54d2086e35312938401d4cc82e5fcd679202503eb8ac84814f8 + languageName: node + linkType: hard + +"node-cleanup@npm:^2.1.2": + version: 2.1.2 + resolution: "node-cleanup@npm:2.1.2" + checksum: 584cdc3e42560a998b4579f91ed8f936b27011628f3102e5a1093205f0691cdf8d899287d1f2e4d2071ea4ab1d615810bad6dbe2b988ef173a1cbaa76d8165b3 + languageName: node + linkType: hard + +"node-fetch@npm:2.6.7": + version: 2.6.7 + resolution: "node-fetch@npm:2.6.7" + dependencies: + whatwg-url: ^5.0.0 + peerDependencies: + encoding: ^0.1.0 + peerDependenciesMeta: + encoding: + optional: true + checksum: 8d816ffd1ee22cab8301c7756ef04f3437f18dace86a1dae22cf81db8ef29c0bf6655f3215cb0cdb22b420b6fe141e64b26905e7f33f9377a7fa59135ea3e10b + languageName: node + linkType: hard + +"node-gyp-build@npm:^4.2.0": + version: 4.6.0 + resolution: "node-gyp-build@npm:4.6.0" + bin: + node-gyp-build: bin.js + node-gyp-build-optional: optional.js + node-gyp-build-test: build-test.js + checksum: 25d78c5ef1f8c24291f4a370c47ba52fcea14f39272041a90a7894cd50d766f7c8cb8fb06c0f42bf6f69b204b49d9be3c8fc344aac09714d5bdb95965499eb15 + languageName: node + linkType: hard + +"node-gyp@npm:latest": + version: 9.3.1 + resolution: "node-gyp@npm:9.3.1" + dependencies: + env-paths: ^2.2.0 + glob: ^7.1.4 + graceful-fs: ^4.2.6 + make-fetch-happen: ^10.0.3 + nopt: ^6.0.0 + npmlog: ^6.0.0 + rimraf: ^3.0.2 + semver: ^7.3.5 + tar: ^6.1.2 + which: ^2.0.2 + bin: + node-gyp: bin/node-gyp.js + checksum: b860e9976fa645ca0789c69e25387401b4396b93c8375489b5151a6c55cf2640a3b6183c212b38625ef7c508994930b72198338e3d09b9d7ade5acc4aaf51ea7 + languageName: node + linkType: hard + +"node-int64@npm:^0.4.0": + version: 0.4.0 + resolution: "node-int64@npm:0.4.0" + checksum: d0b30b1ee6d961851c60d5eaa745d30b5c95d94bc0e74b81e5292f7c42a49e3af87f1eb9e89f59456f80645d679202537de751b7d72e9e40ceea40c5e449057e + languageName: node + linkType: hard + +"node-releases@npm:^2.0.8": + version: 2.0.10 + resolution: "node-releases@npm:2.0.10" + checksum: d784ecde25696a15d449c4433077f5cce620ed30a1656c4abf31282bfc691a70d9618bae6868d247a67914d1be5cc4fde22f65a05f4398cdfb92e0fc83cadfbc + languageName: node + linkType: hard + +"nopt@npm:^6.0.0": + version: 6.0.0 + resolution: "nopt@npm:6.0.0" + dependencies: + abbrev: ^1.0.0 + bin: + nopt: bin/nopt.js + checksum: 82149371f8be0c4b9ec2f863cc6509a7fd0fa729929c009f3a58e4eb0c9e4cae9920e8f1f8eb46e7d032fec8fb01bede7f0f41a67eb3553b7b8e14fa53de1dac + languageName: node + linkType: hard + +"normalize-path@npm:^3.0.0": + version: 3.0.0 + resolution: "normalize-path@npm:3.0.0" + checksum: 88eeb4da891e10b1318c4b2476b6e2ecbeb5ff97d946815ffea7794c31a89017c70d7f34b3c2ebf23ef4e9fc9fb99f7dffe36da22011b5b5c6ffa34f4873ec20 + languageName: node + linkType: hard + +"npm-run-path@npm:^4.0.1": + version: 4.0.1 + resolution: "npm-run-path@npm:4.0.1" + dependencies: + path-key: ^3.0.0 + checksum: 5374c0cea4b0bbfdfae62da7bbdf1e1558d338335f4cacf2515c282ff358ff27b2ecb91ffa5330a8b14390ac66a1e146e10700440c1ab868208430f56b5f4d23 + languageName: node + linkType: hard + +"npmlog@npm:^6.0.0": + version: 6.0.2 + resolution: "npmlog@npm:6.0.2" + dependencies: + are-we-there-yet: ^3.0.0 + console-control-strings: ^1.1.0 + gauge: ^4.0.3 + set-blocking: ^2.0.0 + checksum: ae238cd264a1c3f22091cdd9e2b106f684297d3c184f1146984ecbe18aaa86343953f26b9520dedd1b1372bc0316905b736c1932d778dbeb1fcf5a1001390e2a + languageName: node + linkType: hard + +"once@npm:^1.3.0": + version: 1.4.0 + resolution: "once@npm:1.4.0" + dependencies: + wrappy: 1 + checksum: cd0a88501333edd640d95f0d2700fbde6bff20b3d4d9bdc521bdd31af0656b5706570d6c6afe532045a20bb8dc0849f8332d6f2a416e0ba6d3d3b98806c7db68 + languageName: node + linkType: hard + +"onetime@npm:^5.1.2": + version: 5.1.2 + resolution: "onetime@npm:5.1.2" + dependencies: + mimic-fn: ^2.1.0 + checksum: 2478859ef817fc5d4e9c2f9e5728512ddd1dbc9fb7829ad263765bb6d3b91ce699d6e2332eef6b7dff183c2f490bd3349f1666427eaba4469fba0ac38dfd0d34 + languageName: node + linkType: hard + +"optionator@npm:^0.9.1": + version: 0.9.1 + resolution: "optionator@npm:0.9.1" + dependencies: + deep-is: ^0.1.3 + fast-levenshtein: ^2.0.6 + levn: ^0.4.1 + prelude-ls: ^1.2.1 + type-check: ^0.4.0 + word-wrap: ^1.2.3 + checksum: dbc6fa065604b24ea57d734261914e697bd73b69eff7f18e967e8912aa2a40a19a9f599a507fa805be6c13c24c4eae8c71306c239d517d42d4c041c942f508a0 + languageName: node + linkType: hard + +"p-limit@npm:^2.2.0": + version: 2.3.0 + resolution: "p-limit@npm:2.3.0" + dependencies: + p-try: ^2.0.0 + checksum: 84ff17f1a38126c3314e91ecfe56aecbf36430940e2873dadaa773ffe072dc23b7af8e46d4b6485d302a11673fe94c6b67ca2cfbb60c989848b02100d0594ac1 + languageName: node + linkType: hard + +"p-limit@npm:^3.0.2, p-limit@npm:^3.1.0": + version: 3.1.0 + resolution: "p-limit@npm:3.1.0" + dependencies: + yocto-queue: ^0.1.0 + checksum: 7c3690c4dbf62ef625671e20b7bdf1cbc9534e83352a2780f165b0d3ceba21907e77ad63401708145ca4e25bfc51636588d89a8c0aeb715e6c37d1c066430360 + languageName: node + linkType: hard + +"p-locate@npm:^4.1.0": + version: 4.1.0 + resolution: "p-locate@npm:4.1.0" + dependencies: + p-limit: ^2.2.0 + checksum: 513bd14a455f5da4ebfcb819ef706c54adb09097703de6aeaa5d26fe5ea16df92b48d1ac45e01e3944ce1e6aa2a66f7f8894742b8c9d6e276e16cd2049a2b870 + languageName: node + linkType: hard + +"p-locate@npm:^5.0.0": + version: 5.0.0 + resolution: "p-locate@npm:5.0.0" + dependencies: + p-limit: ^3.0.2 + checksum: 1623088f36cf1cbca58e9b61c4e62bf0c60a07af5ae1ca99a720837356b5b6c5ba3eb1b2127e47a06865fee59dd0453cad7cc844cda9d5a62ac1a5a51b7c86d3 + languageName: node + linkType: hard + +"p-map@npm:^4.0.0": + version: 4.0.0 + resolution: "p-map@npm:4.0.0" + dependencies: + aggregate-error: ^3.0.0 + checksum: cb0ab21ec0f32ddffd31dfc250e3afa61e103ef43d957cc45497afe37513634589316de4eb88abdfd969fe6410c22c0b93ab24328833b8eb1ccc087fc0442a1c + languageName: node + linkType: hard + +"p-try@npm:^2.0.0": + version: 2.2.0 + resolution: "p-try@npm:2.2.0" + checksum: f8a8e9a7693659383f06aec604ad5ead237c7a261c18048a6e1b5b85a5f8a067e469aa24f5bc009b991ea3b058a87f5065ef4176793a200d4917349881216cae + languageName: node + linkType: hard + +"parent-module@npm:^1.0.0": + version: 1.0.1 + resolution: "parent-module@npm:1.0.1" + dependencies: + callsites: ^3.0.0 + checksum: 6ba8b255145cae9470cf5551eb74be2d22281587af787a2626683a6c20fbb464978784661478dd2a3f1dad74d1e802d403e1b03c1a31fab310259eec8ac560ff + languageName: node + linkType: hard + +"parse-json@npm:^5.2.0": + version: 5.2.0 + resolution: "parse-json@npm:5.2.0" + dependencies: + "@babel/code-frame": ^7.0.0 + error-ex: ^1.3.1 + json-parse-even-better-errors: ^2.3.0 + lines-and-columns: ^1.1.6 + checksum: 62085b17d64da57f40f6afc2ac1f4d95def18c4323577e1eced571db75d9ab59b297d1d10582920f84b15985cbfc6b6d450ccbf317644cfa176f3ed982ad87e2 + languageName: node + linkType: hard + +"path-exists@npm:^4.0.0": + version: 4.0.0 + resolution: "path-exists@npm:4.0.0" + checksum: 505807199dfb7c50737b057dd8d351b82c033029ab94cb10a657609e00c1bc53b951cfdbccab8de04c5584d5eff31128ce6afd3db79281874a5ef2adbba55ed1 + languageName: node + linkType: hard + +"path-is-absolute@npm:^1.0.0": + version: 1.0.1 + resolution: "path-is-absolute@npm:1.0.1" + checksum: 060840f92cf8effa293bcc1bea81281bd7d363731d214cbe5c227df207c34cd727430f70c6037b5159c8a870b9157cba65e775446b0ab06fd5ecc7e54615a3b8 + languageName: node + linkType: hard + +"path-key@npm:^3.0.0, path-key@npm:^3.1.0": + version: 3.1.1 + resolution: "path-key@npm:3.1.1" + checksum: 55cd7a9dd4b343412a8386a743f9c746ef196e57c823d90ca3ab917f90ab9f13dd0ded27252ba49dbdfcab2b091d998bc446f6220cd3cea65db407502a740020 + languageName: node + linkType: hard + +"path-parse@npm:^1.0.6, path-parse@npm:^1.0.7": + version: 1.0.7 + resolution: "path-parse@npm:1.0.7" + checksum: 49abf3d81115642938a8700ec580da6e830dde670be21893c62f4e10bd7dd4c3742ddc603fe24f898cba7eb0c6bc1777f8d9ac14185d34540c6d4d80cd9cae8a + languageName: node + linkType: hard + +"path-type@npm:^4.0.0": + version: 4.0.0 + resolution: "path-type@npm:4.0.0" + checksum: 5b1e2daa247062061325b8fdbfd1fb56dde0a448fb1455453276ea18c60685bdad23a445dc148cf87bc216be1573357509b7d4060494a6fd768c7efad833ee45 + languageName: node + linkType: hard + +"pause-stream@npm:0.0.11": + version: 0.0.11 + resolution: "pause-stream@npm:0.0.11" + dependencies: + through: ~2.3 + checksum: 3c4a14052a638b92e0c96eb00c0d7977df7f79ea28395250c525d197f1fc02d34ce1165d5362e2e6ebbb251524b94a76f3f0d4abc39ab8b016d97449fe15583c + languageName: node + linkType: hard + +"pbkdf2@npm:^3.1.2": + version: 3.1.2 + resolution: "pbkdf2@npm:3.1.2" + dependencies: + create-hash: ^1.1.2 + create-hmac: ^1.1.4 + ripemd160: ^2.0.1 + safe-buffer: ^5.0.1 + sha.js: ^2.4.8 + checksum: 2c950a100b1da72123449208e231afc188d980177d021d7121e96a2de7f2abbc96ead2b87d03d8fe5c318face097f203270d7e27908af9f471c165a4e8e69c92 + languageName: node + linkType: hard + +"picocolors@npm:^1.0.0": + version: 1.0.0 + resolution: "picocolors@npm:1.0.0" + checksum: a2e8092dd86c8396bdba9f2b5481032848525b3dc295ce9b57896f931e63fc16f79805144321f72976383fc249584672a75cc18d6777c6b757603f372f745981 + languageName: node + linkType: hard + +"picomatch@npm:^2.0.4, picomatch@npm:^2.2.3, picomatch@npm:^2.3.1": + version: 2.3.1 + resolution: "picomatch@npm:2.3.1" + checksum: 050c865ce81119c4822c45d3c84f1ced46f93a0126febae20737bd05ca20589c564d6e9226977df859ed5e03dc73f02584a2b0faad36e896936238238b0446cf + languageName: node + linkType: hard + +"pirates@npm:^4.0.4": + version: 4.0.5 + resolution: "pirates@npm:4.0.5" + checksum: c9994e61b85260bec6c4fc0307016340d9b0c4f4b6550a957afaaff0c9b1ad58fbbea5cfcf083860a25cb27a375442e2b0edf52e2e1e40e69934e08dcc52d227 + languageName: node + linkType: hard + +"pkg-dir@npm:^4.2.0": + version: 4.2.0 + resolution: "pkg-dir@npm:4.2.0" + dependencies: + find-up: ^4.0.0 + checksum: 9863e3f35132bf99ae1636d31ff1e1e3501251d480336edb1c211133c8d58906bed80f154a1d723652df1fda91e01c7442c2eeaf9dc83157c7ae89087e43c8d6 + languageName: node + linkType: hard + +"postcss@npm:^8.4.21": + version: 8.4.21 + resolution: "postcss@npm:8.4.21" + dependencies: + nanoid: ^3.3.4 + picocolors: ^1.0.0 + source-map-js: ^1.0.2 + checksum: e39ac60ccd1542d4f9d93d894048aac0d686b3bb38e927d8386005718e6793dbbb46930f0a523fe382f1bbd843c6d980aaea791252bf5e176180e5a4336d9679 + languageName: node + linkType: hard + +"prelude-ls@npm:^1.2.1": + version: 1.2.1 + resolution: "prelude-ls@npm:1.2.1" + checksum: cd192ec0d0a8e4c6da3bb80e4f62afe336df3f76271ac6deb0e6a36187133b6073a19e9727a1ff108cd8b9982e4768850d413baa71214dd80c7979617dca827a + languageName: node + linkType: hard + +"prettier@npm:^2.7.1": + version: 2.8.6 + resolution: "prettier@npm:2.8.6" + bin: + prettier: bin-prettier.js + checksum: 8ac94fa67aec0e65743ea15ebf954ef2f1e52638abd129dc04e8b49e8bb3224c0233c98df6b5c98efd31bd2a43866590486559438ee4ead09dc81be389068572 + languageName: node + linkType: hard + +"pretty-format@npm:^28.1.3": + version: 28.1.3 + resolution: "pretty-format@npm:28.1.3" + dependencies: + "@jest/schemas": ^28.1.3 + ansi-regex: ^5.0.1 + ansi-styles: ^5.0.0 + react-is: ^18.0.0 + checksum: e69f857358a3e03d271252d7524bec758c35e44680287f36c1cb905187fbc82da9981a6eb07edfd8a03bc3cbeebfa6f5234c13a3d5b59f2bbdf9b4c4053e0a7f + languageName: node + linkType: hard + +"pretty-format@npm:^29.0.0, pretty-format@npm:^29.5.0": + version: 29.5.0 + resolution: "pretty-format@npm:29.5.0" + dependencies: + "@jest/schemas": ^29.4.3 + ansi-styles: ^5.0.0 + react-is: ^18.0.0 + checksum: 4065356b558e6db25b4d41a01efb386935a6c06a0c9c104ef5ce59f2f476b8210edb8b3949b386e60ada0a6dc5ebcb2e6ccddc8c64dfd1a9943c3c3a9e7eaf89 + languageName: node + linkType: hard + +"promise-inflight@npm:^1.0.1": + version: 1.0.1 + resolution: "promise-inflight@npm:1.0.1" + checksum: 22749483091d2c594261517f4f80e05226d4d5ecc1fc917e1886929da56e22b5718b7f2a75f3807e7a7d471bc3be2907fe92e6e8f373ddf5c64bae35b5af3981 + languageName: node + linkType: hard + +"promise-retry@npm:^2.0.1": + version: 2.0.1 + resolution: "promise-retry@npm:2.0.1" + dependencies: + err-code: ^2.0.2 + retry: ^0.12.0 + checksum: f96a3f6d90b92b568a26f71e966cbbc0f63ab85ea6ff6c81284dc869b41510e6cdef99b6b65f9030f0db422bf7c96652a3fff9f2e8fb4a0f069d8f4430359429 + languageName: node + linkType: hard + +"prompts@npm:^2.0.1": + version: 2.4.2 + resolution: "prompts@npm:2.4.2" + dependencies: + kleur: ^3.0.3 + sisteransi: ^1.0.5 + checksum: d8fd1fe63820be2412c13bfc5d0a01909acc1f0367e32396962e737cb2fc52d004f3302475d5ce7d18a1e8a79985f93ff04ee03007d091029c3f9104bffc007d + languageName: node + linkType: hard + +"ps-tree@npm:^1.2.0": + version: 1.2.0 + resolution: "ps-tree@npm:1.2.0" + dependencies: + event-stream: =3.3.4 + bin: + ps-tree: ./bin/ps-tree.js + checksum: e635dd00f53d30d31696cf5f95b3a8dbdf9b1aeb36d4391578ce8e8cd22949b7c5536c73b0dc18c78615ea3ddd4be96101166be59ca2e3e3cb1e2f79ba3c7f98 + languageName: node + linkType: hard + +"punycode@npm:^2.1.0, punycode@npm:^2.1.1": + version: 2.3.0 + resolution: "punycode@npm:2.3.0" + checksum: 39f760e09a2a3bbfe8f5287cf733ecdad69d6af2fe6f97ca95f24b8921858b91e9ea3c9eeec6e08cede96181b3bb33f95c6ffd8c77e63986508aa2e8159fa200 + languageName: node + linkType: hard + +"pure-rand@npm:^6.0.0": + version: 6.0.1 + resolution: "pure-rand@npm:6.0.1" + checksum: 4bb565399993b815658a72e359f574ce4f04827a42a905105d61163ae86f456d91595a0e4241e7bce04328fae0638ae70ac0428d93ecb55971c465bd084f8648 + languageName: node + linkType: hard + +"queue-microtask@npm:^1.2.2, queue-microtask@npm:^1.2.3": + version: 1.2.3 + resolution: "queue-microtask@npm:1.2.3" + checksum: b676f8c040cdc5b12723ad2f91414d267605b26419d5c821ff03befa817ddd10e238d22b25d604920340fd73efd8ba795465a0377c4adf45a4a41e4234e42dc4 + languageName: node + linkType: hard + +"react-is@npm:^18.0.0": + version: 18.2.0 + resolution: "react-is@npm:18.2.0" + checksum: e72d0ba81b5922759e4aff17e0252bd29988f9642ed817f56b25a3e217e13eea8a7f2322af99a06edb779da12d5d636e9fda473d620df9a3da0df2a74141d53e + languageName: node + linkType: hard + +"readable-stream@npm:^3.4.0, readable-stream@npm:^3.6.0": + version: 3.6.2 + resolution: "readable-stream@npm:3.6.2" + dependencies: + inherits: ^2.0.3 + string_decoder: ^1.1.1 + util-deprecate: ^1.0.1 + checksum: bdcbe6c22e846b6af075e32cf8f4751c2576238c5043169a1c221c92ee2878458a816a4ea33f4c67623c0b6827c8a400409bfb3cf0bf3381392d0b1dfb52ac8d + languageName: node + linkType: hard + +"require-directory@npm:^2.1.1": + version: 2.1.1 + resolution: "require-directory@npm:2.1.1" + checksum: fb47e70bf0001fdeabdc0429d431863e9475e7e43ea5f94ad86503d918423c1543361cc5166d713eaa7029dd7a3d34775af04764bebff99ef413111a5af18c80 + languageName: node + linkType: hard + +"resolve-cwd@npm:^3.0.0": + version: 3.0.0 + resolution: "resolve-cwd@npm:3.0.0" + dependencies: + resolve-from: ^5.0.0 + checksum: 546e0816012d65778e580ad62b29e975a642989108d9a3c5beabfb2304192fa3c9f9146fbdfe213563c6ff51975ae41bac1d3c6e047dd9572c94863a057b4d81 + languageName: node + linkType: hard + +"resolve-from@npm:^4.0.0": + version: 4.0.0 + resolution: "resolve-from@npm:4.0.0" + checksum: f4ba0b8494846a5066328ad33ef8ac173801a51739eb4d63408c847da9a2e1c1de1e6cbbf72699211f3d13f8fc1325648b169bd15eb7da35688e30a5fb0e4a7f + languageName: node + linkType: hard + +"resolve-from@npm:^5.0.0": + version: 5.0.0 + resolution: "resolve-from@npm:5.0.0" + checksum: 4ceeb9113e1b1372d0cd969f3468fa042daa1dd9527b1b6bb88acb6ab55d8b9cd65dbf18819f9f9ddf0db804990901dcdaade80a215e7b2c23daae38e64f5bdf + languageName: node + linkType: hard + +"resolve.exports@npm:^1.1.0": + version: 1.1.1 + resolution: "resolve.exports@npm:1.1.1" + checksum: 485aa10082eb388a569d696e17ad7b16f4186efc97dd34eadd029d95b811f21ffee13b1b733198bb4584dbb3cb296aa6f141835221fb7613b9606b84f1386655 + languageName: node + linkType: hard + +"resolve.exports@npm:^2.0.0": + version: 2.0.1 + resolution: "resolve.exports@npm:2.0.1" + checksum: 03be177026b4fe8dc1b2ffb421bce9cbf7fe3446e9f0c958df9fc8e144864b3eeea19fe788e057fd8be6b5655e65ce245b4f379258c1336e2e8f9205cbd4a9b4 + languageName: node + linkType: hard + +"resolve@npm:^1.20.0, resolve@npm:^1.22.1": + version: 1.22.1 + resolution: "resolve@npm:1.22.1" + dependencies: + is-core-module: ^2.9.0 + path-parse: ^1.0.7 + supports-preserve-symlinks-flag: ^1.0.0 + bin: + resolve: bin/resolve + checksum: 07af5fc1e81aa1d866cbc9e9460fbb67318a10fa3c4deadc35c3ad8a898ee9a71a86a65e4755ac3195e0ea0cfbe201eb323ebe655ce90526fd61917313a34e4e + languageName: node + linkType: hard + +"resolve@npm:~1.19.0": + version: 1.19.0 + resolution: "resolve@npm:1.19.0" + dependencies: + is-core-module: ^2.1.0 + path-parse: ^1.0.6 + checksum: a05b356e47b85ad3613d9e2a39a824f3c27f4fcad9c9ff6c7cc71a2e314c5904a90ab37481ad0069d03cab9eaaac6eb68aca1bc3355fdb05f1045cd50e2aacea + languageName: node + linkType: hard + +"resolve@patch:resolve@^1.20.0#~builtin, resolve@patch:resolve@^1.22.1#~builtin": + version: 1.22.1 + resolution: "resolve@patch:resolve@npm%3A1.22.1#~builtin::version=1.22.1&hash=c3c19d" + dependencies: + is-core-module: ^2.9.0 + path-parse: ^1.0.7 + supports-preserve-symlinks-flag: ^1.0.0 + bin: + resolve: bin/resolve + checksum: 5656f4d0bedcf8eb52685c1abdf8fbe73a1603bb1160a24d716e27a57f6cecbe2432ff9c89c2bd57542c3a7b9d14b1882b73bfe2e9d7849c9a4c0b8b39f02b8b + languageName: node + linkType: hard + +"resolve@patch:resolve@~1.19.0#~builtin": + version: 1.19.0 + resolution: "resolve@patch:resolve@npm%3A1.19.0#~builtin::version=1.19.0&hash=c3c19d" + dependencies: + is-core-module: ^2.1.0 + path-parse: ^1.0.6 + checksum: 2443b94d347e6946c87c85faf13071f605e609e0b54784829b0ed2b917d050bfc1cbaf4ecc6453f224cfa7d0c5dcd97cbb273454cd210bee68e4af15c1a5abc9 + languageName: node + linkType: hard + +"retry@npm:^0.12.0": + version: 0.12.0 + resolution: "retry@npm:0.12.0" + checksum: 623bd7d2e5119467ba66202d733ec3c2e2e26568074923bc0585b6b99db14f357e79bdedb63cab56cec47491c4a0da7e6021a7465ca6dc4f481d3898fdd3158c + languageName: node + linkType: hard + +"reusify@npm:^1.0.4": + version: 1.0.4 + resolution: "reusify@npm:1.0.4" + checksum: c3076ebcc22a6bc252cb0b9c77561795256c22b757f40c0d8110b1300723f15ec0fc8685e8d4ea6d7666f36c79ccc793b1939c748bf36f18f542744a4e379fcc + languageName: node + linkType: hard + +"rimraf@npm:^3.0.0, rimraf@npm:^3.0.2": + version: 3.0.2 + resolution: "rimraf@npm:3.0.2" + dependencies: + glob: ^7.1.3 + bin: + rimraf: bin.js + checksum: 87f4164e396f0171b0a3386cc1877a817f572148ee13a7e113b238e48e8a9f2f31d009a92ec38a591ff1567d9662c6b67fd8818a2dbbaed74bc26a87a2a4a9a0 + languageName: node + linkType: hard + +"ripemd160@npm:^2.0.0, ripemd160@npm:^2.0.1, ripemd160@npm:^2.0.2": + version: 2.0.2 + resolution: "ripemd160@npm:2.0.2" + dependencies: + hash-base: ^3.0.0 + inherits: ^2.0.1 + checksum: 006accc40578ee2beae382757c4ce2908a826b27e2b079efdcd2959ee544ddf210b7b5d7d5e80467807604244e7388427330f5c6d4cd61e6edaddc5773ccc393 + languageName: node + linkType: hard + +"rlp@npm:^3.0.0": + version: 3.0.0 + resolution: "rlp@npm:3.0.0" + bin: + rlp: bin/rlp + checksum: d1d8003b2be0b25083d842571c0cdc3f2ed4f8b6cc2edf46239e240ba7f73b57ca419cea544394c38bd6b0125e728945af5b167370385d9462e04559b2332e69 + languageName: node + linkType: hard + +"rollup@npm:^3.18.0": + version: 3.20.0 + resolution: "rollup@npm:3.20.0" + dependencies: + fsevents: ~2.3.2 + dependenciesMeta: + fsevents: + optional: true + bin: + rollup: dist/bin/rollup + checksum: ebf75f48eb81234f8233b4ed145b00841cefba26802d4f069f161247ffba085ca5bb165cc3cd662d9c36cfc135a67660dfff9088d3da2d2c6a70addc15f3233a + languageName: node + linkType: hard + +"run-parallel@npm:^1.1.9": + version: 1.2.0 + resolution: "run-parallel@npm:1.2.0" + dependencies: + queue-microtask: ^1.2.2 + checksum: cb4f97ad25a75ebc11a8ef4e33bb962f8af8516bb2001082ceabd8902e15b98f4b84b4f8a9b222e5d57fc3bd1379c483886ed4619367a7680dad65316993021d + languageName: node + linkType: hard + +"safe-buffer@npm:^5.0.1, safe-buffer@npm:^5.1.1, safe-buffer@npm:^5.1.2, safe-buffer@npm:^5.2.0, safe-buffer@npm:~5.2.0": + version: 5.2.1 + resolution: "safe-buffer@npm:5.2.1" + checksum: b99c4b41fdd67a6aaf280fcd05e9ffb0813654894223afb78a31f14a19ad220bba8aba1cb14eddce1fcfb037155fe6de4e861784eb434f7d11ed58d1e70dd491 + languageName: node + linkType: hard + +"safer-buffer@npm:>= 2.1.2 < 3.0.0": + version: 2.1.2 + resolution: "safer-buffer@npm:2.1.2" + checksum: cab8f25ae6f1434abee8d80023d7e72b598cf1327164ddab31003c51215526801e40b66c5e65d658a0af1e9d6478cadcb4c745f4bd6751f97d8644786c0978b0 + languageName: node + linkType: hard + +"secp256k1@npm:^4.0.0": + version: 4.0.3 + resolution: "secp256k1@npm:4.0.3" + dependencies: + elliptic: ^6.5.4 + node-addon-api: ^2.0.0 + node-gyp: latest + node-gyp-build: ^4.2.0 + checksum: 21e219adc0024fbd75021001358780a3cc6ac21273c3fcaef46943af73969729709b03f1df7c012a0baab0830fb9a06ccc6b42f8d50050c665cb98078eab477b + languageName: node + linkType: hard + +"semver@npm:7.x, semver@npm:^7.3.5, semver@npm:^7.3.7, semver@npm:^7.3.8": + version: 7.3.8 + resolution: "semver@npm:7.3.8" + dependencies: + lru-cache: ^6.0.0 + bin: + semver: bin/semver.js + checksum: ba9c7cbbf2b7884696523450a61fee1a09930d888b7a8d7579025ad93d459b2d1949ee5bbfeb188b2be5f4ac163544c5e98491ad6152df34154feebc2cc337c1 + languageName: node + linkType: hard + +"semver@npm:^6.0.0, semver@npm:^6.3.0": + version: 6.3.0 + resolution: "semver@npm:6.3.0" + bin: + semver: ./bin/semver.js + checksum: 1b26ecf6db9e8292dd90df4e781d91875c0dcc1b1909e70f5d12959a23c7eebb8f01ea581c00783bbee72ceeaad9505797c381756326073850dc36ed284b21b9 + languageName: node + linkType: hard + +"set-blocking@npm:^2.0.0": + version: 2.0.0 + resolution: "set-blocking@npm:2.0.0" + checksum: 6e65a05f7cf7ebdf8b7c75b101e18c0b7e3dff4940d480efed8aad3a36a4005140b660fa1d804cb8bce911cac290441dc728084a30504d3516ac2ff7ad607b02 + languageName: node + linkType: hard + +"sha.js@npm:^2.4.0, sha.js@npm:^2.4.8": + version: 2.4.11 + resolution: "sha.js@npm:2.4.11" + dependencies: + inherits: ^2.0.1 + safe-buffer: ^5.0.1 + bin: + sha.js: ./bin.js + checksum: ebd3f59d4b799000699097dadb831c8e3da3eb579144fd7eb7a19484cbcbb7aca3c68ba2bb362242eb09e33217de3b4ea56e4678184c334323eca24a58e3ad07 + languageName: node + linkType: hard + +"sha256@npm:^0.2.0": + version: 0.2.0 + resolution: "sha256@npm:0.2.0" + dependencies: + convert-hex: ~0.1.0 + convert-string: ~0.1.0 + checksum: bed2d6507279e34ad2c517d18fbe871900244aca425a298d6ba10115e9beb49a8028296aeff5441b6db4902503a47198138e23ba1be440761a84288c93101ca1 + languageName: node + linkType: hard + +"sha3@npm:^2.1.4": + version: 2.1.4 + resolution: "sha3@npm:2.1.4" + dependencies: + buffer: 6.0.3 + checksum: fb49c8e18143cc46babc0e5d83d5f5d0149e645f26633a0e6a9aa2514df2ef91f10b6ece20da229e7ead8b8002d8e9514dcc747ef96a25b749294d6385c6f29f + languageName: node + linkType: hard + +"shebang-command@npm:^2.0.0": + version: 2.0.0 + resolution: "shebang-command@npm:2.0.0" + dependencies: + shebang-regex: ^3.0.0 + checksum: 6b52fe87271c12968f6a054e60f6bde5f0f3d2db483a1e5c3e12d657c488a15474121a1d55cd958f6df026a54374ec38a4a963988c213b7570e1d51575cea7fa + languageName: node + linkType: hard + +"shebang-regex@npm:^3.0.0": + version: 3.0.0 + resolution: "shebang-regex@npm:3.0.0" + checksum: 1a2bcae50de99034fcd92ad4212d8e01eedf52c7ec7830eedcf886622804fe36884278f2be8be0ea5fde3fd1c23911643a4e0f726c8685b61871c8908af01222 + languageName: node + linkType: hard + +"shiki@npm:^0.14.1": + version: 0.14.1 + resolution: "shiki@npm:0.14.1" + dependencies: + ansi-sequence-parser: ^1.1.0 + jsonc-parser: ^3.2.0 + vscode-oniguruma: ^1.7.0 + vscode-textmate: ^8.0.0 + checksum: b19ea337cc84da69d99ca39d109f82946e0c56c11cc4c67b3b91cc14a9479203365fd0c9e0dd87e908f493ab409dc6f1849175384b6ca593ce7da884ae1edca2 + languageName: node + linkType: hard + +"signal-exit@npm:^3.0.3, signal-exit@npm:^3.0.7": + version: 3.0.7 + resolution: "signal-exit@npm:3.0.7" + checksum: a2f098f247adc367dffc27845853e9959b9e88b01cb301658cfe4194352d8d2bb32e18467c786a7fe15f1d44b233ea35633d076d5e737870b7139949d1ab6318 + languageName: node + linkType: hard + +"sisteransi@npm:^1.0.5": + version: 1.0.5 + resolution: "sisteransi@npm:1.0.5" + checksum: aba6438f46d2bfcef94cf112c835ab395172c75f67453fe05c340c770d3c402363018ae1ab4172a1026a90c47eaccf3af7b6ff6fa749a680c2929bd7fa2b37a4 + languageName: node + linkType: hard + +"slash@npm:^3.0.0": + version: 3.0.0 + resolution: "slash@npm:3.0.0" + checksum: 94a93fff615f25a999ad4b83c9d5e257a7280c90a32a7cb8b4a87996e4babf322e469c42b7f649fd5796edd8687652f3fb452a86dc97a816f01113183393f11c + languageName: node + linkType: hard + +"smart-buffer@npm:^4.2.0": + version: 4.2.0 + resolution: "smart-buffer@npm:4.2.0" + checksum: b5167a7142c1da704c0e3af85c402002b597081dd9575031a90b4f229ca5678e9a36e8a374f1814c8156a725d17008ae3bde63b92f9cfd132526379e580bec8b + languageName: node + linkType: hard + +"socks-proxy-agent@npm:^7.0.0": + version: 7.0.0 + resolution: "socks-proxy-agent@npm:7.0.0" + dependencies: + agent-base: ^6.0.2 + debug: ^4.3.3 + socks: ^2.6.2 + checksum: 720554370154cbc979e2e9ce6a6ec6ced205d02757d8f5d93fe95adae454fc187a5cbfc6b022afab850a5ce9b4c7d73e0f98e381879cf45f66317a4895953846 + languageName: node + linkType: hard + +"socks@npm:^2.6.2": + version: 2.7.1 + resolution: "socks@npm:2.7.1" + dependencies: + ip: ^2.0.0 + smart-buffer: ^4.2.0 + checksum: 259d9e3e8e1c9809a7f5c32238c3d4d2a36b39b83851d0f573bfde5f21c4b1288417ce1af06af1452569cd1eb0841169afd4998f0e04ba04656f6b7f0e46d748 + languageName: node + linkType: hard + +"source-map-js@npm:^1.0.2": + version: 1.0.2 + resolution: "source-map-js@npm:1.0.2" + checksum: c049a7fc4deb9a7e9b481ae3d424cc793cb4845daa690bc5a05d428bf41bf231ced49b4cf0c9e77f9d42fdb3d20d6187619fc586605f5eabe995a316da8d377c + languageName: node + linkType: hard + +"source-map-support@npm:0.5.13": + version: 0.5.13 + resolution: "source-map-support@npm:0.5.13" + dependencies: + buffer-from: ^1.0.0 + source-map: ^0.6.0 + checksum: 933550047b6c1a2328599a21d8b7666507427c0f5ef5eaadd56b5da0fd9505e239053c66fe181bf1df469a3b7af9d775778eee283cbb7ae16b902ddc09e93a97 + languageName: node + linkType: hard + +"source-map-support@npm:^0.5.21": + version: 0.5.21 + resolution: "source-map-support@npm:0.5.21" + dependencies: + buffer-from: ^1.0.0 + source-map: ^0.6.0 + checksum: 43e98d700d79af1d36f859bdb7318e601dfc918c7ba2e98456118ebc4c4872b327773e5a1df09b0524e9e5063bb18f0934538eace60cca2710d1fa687645d137 + languageName: node + linkType: hard + +"source-map@npm:^0.6.0, source-map@npm:^0.6.1": + version: 0.6.1 + resolution: "source-map@npm:0.6.1" + checksum: 59ce8640cf3f3124f64ac289012c2b8bd377c238e316fb323ea22fbfe83da07d81e000071d7242cad7a23cd91c7de98e4df8830ec3f133cb6133a5f6e9f67bc2 + languageName: node + linkType: hard + +"spdx-exceptions@npm:^2.1.0": + version: 2.3.0 + resolution: "spdx-exceptions@npm:2.3.0" + checksum: cb69a26fa3b46305637123cd37c85f75610e8c477b6476fa7354eb67c08128d159f1d36715f19be6f9daf4b680337deb8c65acdcae7f2608ba51931540687ac0 + languageName: node + linkType: hard + +"spdx-expression-parse@npm:^3.0.1": + version: 3.0.1 + resolution: "spdx-expression-parse@npm:3.0.1" + dependencies: + spdx-exceptions: ^2.1.0 + spdx-license-ids: ^3.0.0 + checksum: a1c6e104a2cbada7a593eaa9f430bd5e148ef5290d4c0409899855ce8b1c39652bcc88a725259491a82601159d6dc790bedefc9016c7472f7de8de7361f8ccde + languageName: node + linkType: hard + +"spdx-license-ids@npm:^3.0.0": + version: 3.0.13 + resolution: "spdx-license-ids@npm:3.0.13" + checksum: 3469d85c65f3245a279fa11afc250c3dca96e9e847f2f79d57f466940c5bb8495da08a542646086d499b7f24a74b8d0b42f3fc0f95d50ff99af1f599f6360ad7 + languageName: node + linkType: hard + +"split@npm:0.3": + version: 0.3.3 + resolution: "split@npm:0.3.3" + dependencies: + through: 2 + checksum: 2e076634c9637cfdc54ab4387b6a243b8c33b360874a25adf6f327a5647f07cb3bf1c755d515248eb3afee4e382278d01f62c62d87263c118f28065b86f74f02 + languageName: node + linkType: hard + +"sprintf-js@npm:~1.0.2": + version: 1.0.3 + resolution: "sprintf-js@npm:1.0.3" + checksum: 19d79aec211f09b99ec3099b5b2ae2f6e9cdefe50bc91ac4c69144b6d3928a640bb6ae5b3def70c2e85a2c3d9f5ec2719921e3a59d3ca3ef4b2fd1a4656a0df3 + languageName: node + linkType: hard + +"ssri@npm:^9.0.0": + version: 9.0.1 + resolution: "ssri@npm:9.0.1" + dependencies: + minipass: ^3.1.1 + checksum: fb58f5e46b6923ae67b87ad5ef1c5ab6d427a17db0bead84570c2df3cd50b4ceb880ebdba2d60726588272890bae842a744e1ecce5bd2a2a582fccd5068309eb + languageName: node + linkType: hard + +"stack-utils@npm:^2.0.3": + version: 2.0.6 + resolution: "stack-utils@npm:2.0.6" + dependencies: + escape-string-regexp: ^2.0.0 + checksum: 052bf4d25bbf5f78e06c1d5e67de2e088b06871fa04107ca8d3f0e9d9263326e2942c8bedee3545795fc77d787d443a538345eef74db2f8e35db3558c6f91ff7 + languageName: node + linkType: hard + +"stream-combiner@npm:~0.0.4": + version: 0.0.4 + resolution: "stream-combiner@npm:0.0.4" + dependencies: + duplexer: ~0.1.1 + checksum: 844b622cfe8b9de45a6007404f613b60aaf85200ab9862299066204242f89a7c8033b1c356c998aa6cfc630f6cd9eba119ec1c6dc1f93e245982be4a847aee7d + languageName: node + linkType: hard + +"string-argv@npm:^0.3.1": + version: 0.3.1 + resolution: "string-argv@npm:0.3.1" + checksum: efbd0289b599bee808ce80820dfe49c9635610715429c6b7cc50750f0437e3c2f697c81e5c390208c13b5d5d12d904a1546172a88579f6ee5cbaaaa4dc9ec5cf + languageName: node + linkType: hard + +"string-length@npm:^4.0.1": + version: 4.0.2 + resolution: "string-length@npm:4.0.2" + dependencies: + char-regex: ^1.0.2 + strip-ansi: ^6.0.0 + checksum: ce85533ef5113fcb7e522bcf9e62cb33871aa99b3729cec5595f4447f660b0cefd542ca6df4150c97a677d58b0cb727a3fe09ac1de94071d05526c73579bf505 + languageName: node + linkType: hard + +"string-width@npm:^1.0.2 || 2 || 3 || 4, string-width@npm:^4.1.0, string-width@npm:^4.2.0, string-width@npm:^4.2.3": + version: 4.2.3 + resolution: "string-width@npm:4.2.3" + dependencies: + emoji-regex: ^8.0.0 + is-fullwidth-code-point: ^3.0.0 + strip-ansi: ^6.0.1 + checksum: e52c10dc3fbfcd6c3a15f159f54a90024241d0f149cf8aed2982a2d801d2e64df0bf1dc351cf8e95c3319323f9f220c16e740b06faecd53e2462df1d2b5443fb + languageName: node + linkType: hard + +"string_decoder@npm:^1.1.1": + version: 1.3.0 + resolution: "string_decoder@npm:1.3.0" + dependencies: + safe-buffer: ~5.2.0 + checksum: 8417646695a66e73aefc4420eb3b84cc9ffd89572861fe004e6aeb13c7bc00e2f616247505d2dbbef24247c372f70268f594af7126f43548565c68c117bdeb56 + languageName: node + linkType: hard + +"strip-ansi@npm:^6.0.0, strip-ansi@npm:^6.0.1": + version: 6.0.1 + resolution: "strip-ansi@npm:6.0.1" + dependencies: + ansi-regex: ^5.0.1 + checksum: f3cd25890aef3ba6e1a74e20896c21a46f482e93df4a06567cebf2b57edabb15133f1f94e57434e0a958d61186087b1008e89c94875d019910a213181a14fc8c + languageName: node + linkType: hard + +"strip-bom@npm:^4.0.0": + version: 4.0.0 + resolution: "strip-bom@npm:4.0.0" + checksum: 9dbcfbaf503c57c06af15fe2c8176fb1bf3af5ff65003851a102749f875a6dbe0ab3b30115eccf6e805e9d756830d3e40ec508b62b3f1ddf3761a20ebe29d3f3 + languageName: node + linkType: hard + +"strip-final-newline@npm:^2.0.0": + version: 2.0.0 + resolution: "strip-final-newline@npm:2.0.0" + checksum: 69412b5e25731e1938184b5d489c32e340605bb611d6140344abc3421b7f3c6f9984b21dff296dfcf056681b82caa3bb4cc996a965ce37bcfad663e92eae9c64 + languageName: node + linkType: hard + +"strip-json-comments@npm:^3.1.0, strip-json-comments@npm:^3.1.1": + version: 3.1.1 + resolution: "strip-json-comments@npm:3.1.1" + checksum: 492f73e27268f9b1c122733f28ecb0e7e8d8a531a6662efbd08e22cccb3f9475e90a1b82cab06a392f6afae6d2de636f977e231296400d0ec5304ba70f166443 + languageName: node + linkType: hard + +"supports-color@npm:^5.3.0": + version: 5.5.0 + resolution: "supports-color@npm:5.5.0" + dependencies: + has-flag: ^3.0.0 + checksum: 95f6f4ba5afdf92f495b5a912d4abee8dcba766ae719b975c56c084f5004845f6f5a5f7769f52d53f40e21952a6d87411bafe34af4a01e65f9926002e38e1dac + languageName: node + linkType: hard + +"supports-color@npm:^7.0.0, supports-color@npm:^7.1.0": + version: 7.2.0 + resolution: "supports-color@npm:7.2.0" + dependencies: + has-flag: ^4.0.0 + checksum: 3dda818de06ebbe5b9653e07842d9479f3555ebc77e9a0280caf5a14fb877ffee9ed57007c3b78f5a6324b8dbeec648d9e97a24e2ed9fdb81ddc69ea07100f4a + languageName: node + linkType: hard + +"supports-color@npm:^8.0.0": + version: 8.1.1 + resolution: "supports-color@npm:8.1.1" + dependencies: + has-flag: ^4.0.0 + checksum: c052193a7e43c6cdc741eb7f378df605636e01ad434badf7324f17fb60c69a880d8d8fcdcb562cf94c2350e57b937d7425ab5b8326c67c2adc48f7c87c1db406 + languageName: node + linkType: hard + +"supports-hyperlinks@npm:^2.0.0": + version: 2.3.0 + resolution: "supports-hyperlinks@npm:2.3.0" + dependencies: + has-flag: ^4.0.0 + supports-color: ^7.0.0 + checksum: 9ee0de3c8ce919d453511b2b1588a8205bd429d98af94a01df87411391010fe22ca463f268c84b2ce2abad019dfff8452aa02806eeb5c905a8d7ad5c4f4c52b8 + languageName: node + linkType: hard + +"supports-preserve-symlinks-flag@npm:^1.0.0": + version: 1.0.0 + resolution: "supports-preserve-symlinks-flag@npm:1.0.0" + checksum: 53b1e247e68e05db7b3808b99b892bd36fb096e6fba213a06da7fab22045e97597db425c724f2bbd6c99a3c295e1e73f3e4de78592289f38431049e1277ca0ae + languageName: node + linkType: hard + +"tar@npm:^6.1.11, tar@npm:^6.1.2": + version: 6.1.13 + resolution: "tar@npm:6.1.13" + dependencies: + chownr: ^2.0.0 + fs-minipass: ^2.0.0 + minipass: ^4.0.0 + minizlib: ^2.1.1 + mkdirp: ^1.0.3 + yallist: ^4.0.0 + checksum: 8a278bed123aa9f53549b256a36b719e317c8b96fe86a63406f3c62887f78267cea9b22dc6f7007009738509800d4a4dccc444abd71d762287c90f35b002eb1c + languageName: node + linkType: hard + +"terminal-link@npm:^2.0.0": + version: 2.1.1 + resolution: "terminal-link@npm:2.1.1" + dependencies: + ansi-escapes: ^4.2.1 + supports-hyperlinks: ^2.0.0 + checksum: ce3d2cd3a438c4a9453947aa664581519173ea40e77e2534d08c088ee6dda449eabdbe0a76d2a516b8b73c33262fedd10d5270ccf7576ae316e3db170ce6562f + languageName: node + linkType: hard + +"test-exclude@npm:^6.0.0": + version: 6.0.0 + resolution: "test-exclude@npm:6.0.0" + dependencies: + "@istanbuljs/schema": ^0.1.2 + glob: ^7.1.4 + minimatch: ^3.0.4 + checksum: 3b34a3d77165a2cb82b34014b3aba93b1c4637a5011807557dc2f3da826c59975a5ccad765721c4648b39817e3472789f9b0fa98fc854c5c1c7a1e632aacdc28 + languageName: node + linkType: hard + +"text-table@npm:^0.2.0": + version: 0.2.0 + resolution: "text-table@npm:0.2.0" + checksum: b6937a38c80c7f84d9c11dd75e49d5c44f71d95e810a3250bd1f1797fc7117c57698204adf676b71497acc205d769d65c16ae8fa10afad832ae1322630aef10a + languageName: node + linkType: hard + +"through@npm:2, through@npm:~2.3, through@npm:~2.3.1": + version: 2.3.8 + resolution: "through@npm:2.3.8" + checksum: a38c3e059853c494af95d50c072b83f8b676a9ba2818dcc5b108ef252230735c54e0185437618596c790bbba8fcdaef5b290405981ffa09dce67b1f1bf190cbd + languageName: node + linkType: hard + +"tmpl@npm:1.0.5": + version: 1.0.5 + resolution: "tmpl@npm:1.0.5" + checksum: cd922d9b853c00fe414c5a774817be65b058d54a2d01ebb415840960406c669a0fc632f66df885e24cb022ec812739199ccbdb8d1164c3e513f85bfca5ab2873 + languageName: node + linkType: hard + +"to-fast-properties@npm:^2.0.0": + version: 2.0.0 + resolution: "to-fast-properties@npm:2.0.0" + checksum: be2de62fe58ead94e3e592680052683b1ec986c72d589e7b21e5697f8744cdbf48c266fa72f6c15932894c10187b5f54573a3bcf7da0bfd964d5caf23d436168 + languageName: node + linkType: hard + +"to-regex-range@npm:^5.0.1": + version: 5.0.1 + resolution: "to-regex-range@npm:5.0.1" + dependencies: + is-number: ^7.0.0 + checksum: f76fa01b3d5be85db6a2a143e24df9f60dd047d151062d0ba3df62953f2f697b16fe5dad9b0ac6191c7efc7b1d9dcaa4b768174b7b29da89d4428e64bc0a20ed + languageName: node + linkType: hard + +"tr46@npm:~0.0.3": + version: 0.0.3 + resolution: "tr46@npm:0.0.3" + checksum: 726321c5eaf41b5002e17ffbd1fb7245999a073e8979085dacd47c4b4e8068ff5777142fc6726d6ca1fd2ff16921b48788b87225cbc57c72636f6efa8efbffe3 + languageName: node + linkType: hard + +"ts-essentials@npm:^7.0.3": + version: 7.0.3 + resolution: "ts-essentials@npm:7.0.3" + peerDependencies: + typescript: ">=3.7.0" + checksum: 74d75868acf7f8b95e447d8b3b7442ca21738c6894e576df9917a352423fde5eb43c5651da5f78997da6061458160ae1f6b279150b42f47ccc58b73e55acaa2f + languageName: node + linkType: hard + +"ts-jest@npm:28.0.7": + version: 28.0.7 + resolution: "ts-jest@npm:28.0.7" + dependencies: + bs-logger: 0.x + fast-json-stable-stringify: 2.x + jest-util: ^28.0.0 + json5: ^2.2.1 + lodash.memoize: 4.x + make-error: 1.x + semver: 7.x + yargs-parser: ^21.0.1 + peerDependencies: + "@babel/core": ">=7.0.0-beta.0 <8" + "@jest/types": ^28.0.0 + babel-jest: ^28.0.0 + jest: ^28.0.0 + typescript: ">=4.3" + peerDependenciesMeta: + "@babel/core": + optional: true + "@jest/types": + optional: true + babel-jest: + optional: true + esbuild: + optional: true + bin: + ts-jest: cli.js + checksum: be6ad6382e3b2e7b0c45d06616a4a02aeb6815bad2026fe8eeb4e0941205faa50ac3f5930adb7ba2fda5fea6a5739bfa507e2eac8764d2c729ddc8010681707a + languageName: node + linkType: hard + +"ts-jest@npm:^28.0.7": + version: 28.0.8 + resolution: "ts-jest@npm:28.0.8" + dependencies: + bs-logger: 0.x + fast-json-stable-stringify: 2.x + jest-util: ^28.0.0 + json5: ^2.2.1 + lodash.memoize: 4.x + make-error: 1.x + semver: 7.x + yargs-parser: ^21.0.1 + peerDependencies: + "@babel/core": ">=7.0.0-beta.0 <8" + "@jest/types": ^28.0.0 + babel-jest: ^28.0.0 + jest: ^28.0.0 + typescript: ">=4.3" + peerDependenciesMeta: + "@babel/core": + optional: true + "@jest/types": + optional: true + babel-jest: + optional: true + esbuild: + optional: true + bin: + ts-jest: cli.js + checksum: c72e9292709e77ce47ac7813cb24feaa9d01dc983598d29a821f224b5cc190dc7d67e17379cef089095404c00b9d582ee91c727916f9ec289cb1b723df408ae3 + languageName: node + linkType: hard + +"ts-jest@npm:^29.0.5": + version: 29.0.5 + resolution: "ts-jest@npm:29.0.5" + dependencies: + bs-logger: 0.x + fast-json-stable-stringify: 2.x + jest-util: ^29.0.0 + json5: ^2.2.3 + lodash.memoize: 4.x + make-error: 1.x + semver: 7.x + yargs-parser: ^21.0.1 + peerDependencies: + "@babel/core": ">=7.0.0-beta.0 <8" + "@jest/types": ^29.0.0 + babel-jest: ^29.0.0 + jest: ^29.0.0 + typescript: ">=4.3" + peerDependenciesMeta: + "@babel/core": + optional: true + "@jest/types": + optional: true + babel-jest: + optional: true + esbuild: + optional: true + bin: + ts-jest: cli.js + checksum: f60f129c2287f4c963d9ee2677132496c5c5a5d39c27ad234199a1140c26318a7d5bda34890ab0e30636ec42a8de28f84487c09e9dcec639c9c67812b3a38373 + languageName: node + linkType: hard + +"ts-node@npm:^10.9.1": + version: 10.9.1 + resolution: "ts-node@npm:10.9.1" + dependencies: + "@cspotcode/source-map-support": ^0.8.0 + "@tsconfig/node10": ^1.0.7 + "@tsconfig/node12": ^1.0.7 + "@tsconfig/node14": ^1.0.0 + "@tsconfig/node16": ^1.0.2 + acorn: ^8.4.1 + acorn-walk: ^8.1.1 + arg: ^4.1.0 + create-require: ^1.1.0 + diff: ^4.0.1 + make-error: ^1.1.1 + v8-compile-cache-lib: ^3.0.1 + yn: 3.1.1 + peerDependencies: + "@swc/core": ">=1.2.50" + "@swc/wasm": ">=1.2.50" + "@types/node": "*" + typescript: ">=2.7" + peerDependenciesMeta: + "@swc/core": + optional: true + "@swc/wasm": + optional: true + bin: + ts-node: dist/bin.js + ts-node-cwd: dist/bin-cwd.js + ts-node-esm: dist/bin-esm.js + ts-node-script: dist/bin-script.js + ts-node-transpile-only: dist/bin-transpile.js + ts-script: dist/bin-script-deprecated.js + checksum: 090adff1302ab20bd3486e6b4799e90f97726ed39e02b39e566f8ab674fd5bd5f727f43615debbfc580d33c6d9d1c6b1b3ce7d8e3cca3e20530a145ffa232c35 + languageName: node + linkType: hard + +"tsc-watch@npm:^6.0.0": + version: 6.0.0 + resolution: "tsc-watch@npm:6.0.0" + dependencies: + cross-spawn: ^7.0.3 + node-cleanup: ^2.1.2 + ps-tree: ^1.2.0 + string-argv: ^0.3.1 + peerDependencies: + typescript: "*" + bin: + tsc-watch: dist/lib/tsc-watch.js + checksum: 34e74a703ecb28689d0f6ba311781ff68be47f5f095439654b095f3ea4a5921708fca61b5727e33527639a9a147b42d10bc3fe3595afee92b41b2bacfba06043 + languageName: node + linkType: hard + +"tslib@npm:^1.8.1": + version: 1.14.1 + resolution: "tslib@npm:1.14.1" + checksum: dbe628ef87f66691d5d2959b3e41b9ca0045c3ee3c7c7b906cc1e328b39f199bb1ad9e671c39025bd56122ac57dfbf7385a94843b1cc07c60a4db74795829acd + languageName: node + linkType: hard + +"tslib@npm:^2.4.0, tslib@npm:^2.5.0": + version: 2.5.0 + resolution: "tslib@npm:2.5.0" + checksum: ae3ed5f9ce29932d049908ebfdf21b3a003a85653a9a140d614da6b767a93ef94f460e52c3d787f0e4f383546981713f165037dc2274df212ea9f8a4541004e1 + languageName: node + linkType: hard + +"tsutils@npm:^3.21.0": + version: 3.21.0 + resolution: "tsutils@npm:3.21.0" + dependencies: + tslib: ^1.8.1 + peerDependencies: + typescript: ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" + checksum: 1843f4c1b2e0f975e08c4c21caa4af4f7f65a12ac1b81b3b8489366826259323feb3fc7a243123453d2d1a02314205a7634e048d4a8009921da19f99755cdc48 + languageName: node + linkType: hard + +"type-check@npm:^0.4.0, type-check@npm:~0.4.0": + version: 0.4.0 + resolution: "type-check@npm:0.4.0" + dependencies: + prelude-ls: ^1.2.1 + checksum: ec688ebfc9c45d0c30412e41ca9c0cdbd704580eb3a9ccf07b9b576094d7b86a012baebc95681999dd38f4f444afd28504cb3a89f2ef16b31d4ab61a0739025a + languageName: node + linkType: hard + +"type-detect@npm:4.0.8": + version: 4.0.8 + resolution: "type-detect@npm:4.0.8" + checksum: 62b5628bff67c0eb0b66afa371bd73e230399a8d2ad30d852716efcc4656a7516904570cd8631a49a3ce57c10225adf5d0cbdcb47f6b0255fe6557c453925a15 + languageName: node + linkType: hard + +"type-fest@npm:^0.20.2": + version: 0.20.2 + resolution: "type-fest@npm:0.20.2" + checksum: 4fb3272df21ad1c552486f8a2f8e115c09a521ad7a8db3d56d53718d0c907b62c6e9141ba5f584af3f6830d0872c521357e512381f24f7c44acae583ad517d73 + languageName: node + linkType: hard + +"type-fest@npm:^0.21.3": + version: 0.21.3 + resolution: "type-fest@npm:0.21.3" + checksum: e6b32a3b3877f04339bae01c193b273c62ba7bfc9e325b8703c4ee1b32dc8fe4ef5dfa54bf78265e069f7667d058e360ae0f37be5af9f153b22382cd55a9afe0 + languageName: node + linkType: hard + +"typedoc@npm:^0.23.26": + version: 0.23.28 + resolution: "typedoc@npm:0.23.28" + dependencies: + lunr: ^2.3.9 + marked: ^4.2.12 + minimatch: ^7.1.3 + shiki: ^0.14.1 + peerDependencies: + typescript: 4.6.x || 4.7.x || 4.8.x || 4.9.x || 5.0.x + bin: + typedoc: bin/typedoc + checksum: 40eb4e207aac1b734e09400cf03f543642cc7b11000895198dd5a0d3166315759ccf4ac30a2915153597c5c186101c72bac2f1fc12b428184a9274d3a0e44c5e + languageName: node + linkType: hard + +"typescript@npm:^4.9.5": + version: 4.9.5 + resolution: "typescript@npm:4.9.5" + bin: + tsc: bin/tsc + tsserver: bin/tsserver + checksum: ee000bc26848147ad423b581bd250075662a354d84f0e06eb76d3b892328d8d4440b7487b5a83e851b12b255f55d71835b008a66cbf8f255a11e4400159237db + languageName: node + linkType: hard + +"typescript@patch:typescript@^4.9.5#~builtin": + version: 4.9.5 + resolution: "typescript@patch:typescript@npm%3A4.9.5#~builtin::version=4.9.5&hash=23ec76" + bin: + tsc: bin/tsc + tsserver: bin/tsserver + checksum: ab417a2f398380c90a6cf5a5f74badd17866adf57f1165617d6a551f059c3ba0a3e4da0d147b3ac5681db9ac76a303c5876394b13b3de75fdd5b1eaa06181c9d + languageName: node + linkType: hard + +"unique-filename@npm:^2.0.0": + version: 2.0.1 + resolution: "unique-filename@npm:2.0.1" + dependencies: + unique-slug: ^3.0.0 + checksum: 807acf3381aff319086b64dc7125a9a37c09c44af7620bd4f7f3247fcd5565660ac12d8b80534dcbfd067e6fe88a67e621386dd796a8af828d1337a8420a255f + languageName: node + linkType: hard + +"unique-slug@npm:^3.0.0": + version: 3.0.0 + resolution: "unique-slug@npm:3.0.0" + dependencies: + imurmurhash: ^0.1.4 + checksum: 49f8d915ba7f0101801b922062ee46b7953256c93ceca74303bd8e6413ae10aa7e8216556b54dc5382895e8221d04f1efaf75f945c2e4a515b4139f77aa6640c + languageName: node + linkType: hard + +"update-browserslist-db@npm:^1.0.10": + version: 1.0.10 + resolution: "update-browserslist-db@npm:1.0.10" + dependencies: + escalade: ^3.1.1 + picocolors: ^1.0.0 + peerDependencies: + browserslist: ">= 4.21.0" + bin: + browserslist-lint: cli.js + checksum: 12db73b4f63029ac407b153732e7cd69a1ea8206c9100b482b7d12859cd3cd0bc59c602d7ae31e652706189f1acb90d42c53ab24a5ba563ed13aebdddc5561a0 + languageName: node + linkType: hard + +"uri-js@npm:^4.2.2": + version: 4.4.1 + resolution: "uri-js@npm:4.4.1" + dependencies: + punycode: ^2.1.0 + checksum: 7167432de6817fe8e9e0c9684f1d2de2bb688c94388f7569f7dbdb1587c9f4ca2a77962f134ec90be0cc4d004c939ff0d05acc9f34a0db39a3c797dada262633 + languageName: node + linkType: hard + +"util-deprecate@npm:^1.0.1": + version: 1.0.2 + resolution: "util-deprecate@npm:1.0.2" + checksum: 474acf1146cb2701fe3b074892217553dfcf9a031280919ba1b8d651a068c9b15d863b7303cb15bd00a862b498e6cf4ad7b4a08fb134edd5a6f7641681cb54a2 + languageName: node + linkType: hard + +"uuid@npm:^9.0.0": + version: 9.0.0 + resolution: "uuid@npm:9.0.0" + bin: + uuid: dist/bin/uuid + checksum: 8dd2c83c43ddc7e1c71e36b60aea40030a6505139af6bee0f382ebcd1a56f6cd3028f7f06ffb07f8cf6ced320b76aea275284b224b002b289f89fe89c389b028 + languageName: node + linkType: hard + +"v8-compile-cache-lib@npm:^3.0.1": + version: 3.0.1 + resolution: "v8-compile-cache-lib@npm:3.0.1" + checksum: 78089ad549e21bcdbfca10c08850022b22024cdcc2da9b168bcf5a73a6ed7bf01a9cebb9eac28e03cd23a684d81e0502797e88f3ccd27a32aeab1cfc44c39da0 + languageName: node + linkType: hard + +"v8-to-istanbul@npm:^9.0.1": + version: 9.1.0 + resolution: "v8-to-istanbul@npm:9.1.0" + dependencies: + "@jridgewell/trace-mapping": ^0.3.12 + "@types/istanbul-lib-coverage": ^2.0.1 + convert-source-map: ^1.6.0 + checksum: 2069d59ee46cf8d83b4adfd8a5c1a90834caffa9f675e4360f1157ffc8578ef0f763c8f32d128334424159bb6b01f3876acd39cd13297b2769405a9da241f8d1 + languageName: node + linkType: hard + +"viem@npm:^0.1.15": + version: 0.1.21 + resolution: "viem@npm:0.1.21" + dependencies: + "@noble/hashes": ^1.1.2 + "@noble/secp256k1": ^1.7.1 + "@wagmi/chains": ~0.2.11 + abitype: ~0.7.1 + idna-uts46-hx: ^4.1.2 + isomorphic-ws: ^5.0.0 + ws: ^8.12.0 + checksum: ae7575d40db8e1f128c8f979ea550ece86444a0a198e7301a2b018b95d67942674a87752092982c1f036aae4355eb23682baf05dfb9464d7fa5c68c59db41a17 + languageName: node + linkType: hard + +"vite@npm:^4.1.4": + version: 4.2.1 + resolution: "vite@npm:4.2.1" + dependencies: + esbuild: ^0.17.5 + fsevents: ~2.3.2 + postcss: ^8.4.21 + resolve: ^1.22.1 + rollup: ^3.18.0 + peerDependencies: + "@types/node": ">= 14" + less: "*" + sass: "*" + stylus: "*" + sugarss: "*" + terser: ^5.4.0 + dependenciesMeta: + fsevents: + optional: true + peerDependenciesMeta: + "@types/node": + optional: true + less: + optional: true + sass: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + bin: + vite: bin/vite.js + checksum: 70eb162ffc299017a3c310e3adc95e9661def6b17aafd1f8e5e02e516766060435590dbe3df1e4e95acc3583c728a76e91f07c546221d1e701f1b2b021293f45 + languageName: node + linkType: hard + +"vscode-oniguruma@npm:^1.7.0": + version: 1.7.0 + resolution: "vscode-oniguruma@npm:1.7.0" + checksum: 53519d91d90593e6fb080260892e87d447e9b200c4964d766772b5053f5699066539d92100f77f1302c91e8fc5d9c772fbe40fe4c90f3d411a96d5a9b1e63f42 + languageName: node + linkType: hard + +"vscode-textmate@npm:^8.0.0": + version: 8.0.0 + resolution: "vscode-textmate@npm:8.0.0" + checksum: 127780dfea89559d70b8326df6ec344cfd701312dd7f3f591a718693812b7852c30b6715e3cfc8b3200a4e2515b4c96f0843c0eacc0a3020969b5de262c2a4bb + languageName: node + linkType: hard + +"walker@npm:^1.0.8": + version: 1.0.8 + resolution: "walker@npm:1.0.8" + dependencies: + makeerror: 1.0.12 + checksum: ad7a257ea1e662e57ef2e018f97b3c02a7240ad5093c392186ce0bcf1f1a60bbadd520d073b9beb921ed99f64f065efb63dfc8eec689a80e569f93c1c5d5e16c + languageName: node + linkType: hard + +"webidl-conversions@npm:^3.0.0": + version: 3.0.1 + resolution: "webidl-conversions@npm:3.0.1" + checksum: c92a0a6ab95314bde9c32e1d0a6dfac83b578f8fa5f21e675bc2706ed6981bc26b7eb7e6a1fab158e5ce4adf9caa4a0aee49a52505d4d13c7be545f15021b17c + languageName: node + linkType: hard + +"whatwg-url@npm:^5.0.0": + version: 5.0.0 + resolution: "whatwg-url@npm:5.0.0" + dependencies: + tr46: ~0.0.3 + webidl-conversions: ^3.0.0 + checksum: b8daed4ad3356cc4899048a15b2c143a9aed0dfae1f611ebd55073310c7b910f522ad75d727346ad64203d7e6c79ef25eafd465f4d12775ca44b90fa82ed9e2c + languageName: node + linkType: hard + +"which@npm:^2.0.1, which@npm:^2.0.2": + version: 2.0.2 + resolution: "which@npm:2.0.2" + dependencies: + isexe: ^2.0.0 + bin: + node-which: ./bin/node-which + checksum: 1a5c563d3c1b52d5f893c8b61afe11abc3bab4afac492e8da5bde69d550de701cf9806235f20a47b5c8fa8a1d6a9135841de2596535e998027a54589000e66d1 + languageName: node + linkType: hard + +"wide-align@npm:^1.1.5": + version: 1.1.5 + resolution: "wide-align@npm:1.1.5" + dependencies: + string-width: ^1.0.2 || 2 || 3 || 4 + checksum: d5fc37cd561f9daee3c80e03b92ed3e84d80dde3365a8767263d03dacfc8fa06b065ffe1df00d8c2a09f731482fcacae745abfbb478d4af36d0a891fad4834d3 + languageName: node + linkType: hard + +"word-wrap@npm:^1.2.3": + version: 1.2.3 + resolution: "word-wrap@npm:1.2.3" + checksum: 30b48f91fcf12106ed3186ae4fa86a6a1842416df425be7b60485de14bec665a54a68e4b5156647dec3a70f25e84d270ca8bc8cd23182ed095f5c7206a938c1f + languageName: node + linkType: hard + +"wrap-ansi@npm:^7.0.0": + version: 7.0.0 + resolution: "wrap-ansi@npm:7.0.0" + dependencies: + ansi-styles: ^4.0.0 + string-width: ^4.1.0 + strip-ansi: ^6.0.0 + checksum: a790b846fd4505de962ba728a21aaeda189b8ee1c7568ca5e817d85930e06ef8d1689d49dbf0e881e8ef84436af3a88bc49115c2e2788d841ff1b8b5b51a608b + languageName: node + linkType: hard + +"wrappy@npm:1": + version: 1.0.2 + resolution: "wrappy@npm:1.0.2" + checksum: 159da4805f7e84a3d003d8841557196034155008f817172d4e986bd591f74aa82aa7db55929a54222309e01079a65a92a9e6414da5a6aa4b01ee44a511ac3ee5 + languageName: node + linkType: hard + +"write-file-atomic@npm:^4.0.1, write-file-atomic@npm:^4.0.2": + version: 4.0.2 + resolution: "write-file-atomic@npm:4.0.2" + dependencies: + imurmurhash: ^0.1.4 + signal-exit: ^3.0.7 + checksum: 5da60bd4eeeb935eec97ead3df6e28e5917a6bd317478e4a85a5285e8480b8ed96032bbcc6ecd07b236142a24f3ca871c924ec4a6575e623ec1b11bf8c1c253c + languageName: node + linkType: hard + +"ws@npm:^8.12.0, ws@npm:^8.13.0": + version: 8.13.0 + resolution: "ws@npm:8.13.0" + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: ">=5.0.2" + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + checksum: 53e991bbf928faf5dc6efac9b8eb9ab6497c69feeb94f963d648b7a3530a720b19ec2e0ec037344257e05a4f35bd9ad04d9de6f289615ffb133282031b18c61c + languageName: node + linkType: hard + +"y18n@npm:^5.0.5": + version: 5.0.8 + resolution: "y18n@npm:5.0.8" + checksum: 54f0fb95621ee60898a38c572c515659e51cc9d9f787fb109cef6fde4befbe1c4602dc999d30110feee37456ad0f1660fa2edcfde6a9a740f86a290999550d30 + languageName: node + linkType: hard + +"yallist@npm:^3.0.2": + version: 3.1.1 + resolution: "yallist@npm:3.1.1" + checksum: 48f7bb00dc19fc635a13a39fe547f527b10c9290e7b3e836b9a8f1ca04d4d342e85714416b3c2ab74949c9c66f9cebb0473e6bc353b79035356103b47641285d + languageName: node + linkType: hard + +"yallist@npm:^4.0.0": + version: 4.0.0 + resolution: "yallist@npm:4.0.0" + checksum: 343617202af32df2a15a3be36a5a8c0c8545208f3d3dfbc6bb7c3e3b7e8c6f8e7485432e4f3b88da3031a6e20afa7c711eded32ddfb122896ac5d914e75848d5 + languageName: node + linkType: hard + +"yargs-parser@npm:^21.0.1, yargs-parser@npm:^21.1.1": + version: 21.1.1 + resolution: "yargs-parser@npm:21.1.1" + checksum: ed2d96a616a9e3e1cc7d204c62ecc61f7aaab633dcbfab2c6df50f7f87b393993fe6640d017759fe112d0cb1e0119f2b4150a87305cc873fd90831c6a58ccf1c + languageName: node + linkType: hard + +"yargs@npm:^17.3.1": + version: 17.7.1 + resolution: "yargs@npm:17.7.1" + 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.5 + yargs-parser: ^21.1.1 + checksum: 3d8a43c336a4942bc68080768664aca85c7bd406f018bad362fd255c41c8f4e650277f42fd65d543fce99e084124ddafee7bbfc1a5c6a8fda4cec78609dcf8d4 + languageName: node + linkType: hard + +"yn@npm:3.1.1": + version: 3.1.1 + resolution: "yn@npm:3.1.1" + checksum: 2c487b0e149e746ef48cda9f8bad10fc83693cd69d7f9dcd8be4214e985de33a29c9e24f3c0d6bcf2288427040a8947406ab27f7af67ee9456e6b84854f02dd6 + languageName: node + linkType: hard + +"yocto-queue@npm:^0.1.0": + version: 0.1.0 + resolution: "yocto-queue@npm:0.1.0" + checksum: f77b3d8d00310def622123df93d4ee654fc6a0096182af8bd60679ddcdfb3474c56c6c7190817c84a2785648cdee9d721c0154eb45698c62176c322fb46fc700 + languageName: node + linkType: hard From 0b4e0389a88dc87531f9b3390b5f04dfa0f8fa24 Mon Sep 17 00:00:00 2001 From: PhilWindle Date: Tue, 21 Mar 2023 16:28:59 +0000 Subject: [PATCH 26/36] WIP --- .../archiver/src/archiver/archiver.ts | 4 +- yarn-project/archiver/src/index.ts | 74 +++++++++--------- yarn-project/archiver/src/l2_block/index.ts | 1 + .../archiver/src/l2_block/l2_block_source.ts | 4 +- .../merkle-tree/src/test/test_suite.ts | 4 +- yarn-project/p2p/src/client/index.ts | 4 + .../p2p/src/{ => client}/memory_p2p_client.ts | 19 ++--- yarn-project/p2p/src/client/mocks.ts | 77 +++++++++++++++++++ .../p2p/src/{ => client}/p2p_client.test.ts | 12 +-- .../p2p/src/{ => client}/p2p_client.ts | 4 +- yarn-project/p2p/src/client/temp_types.ts | 4 + yarn-project/p2p/src/{ => client}/tx.ts | 0 yarn-project/p2p/src/index.ts | 32 ++++---- yarn-project/p2p/src/mocks.ts | 44 ----------- yarn-project/p2p/src/temp_types.ts | 43 ----------- .../p2p/src/tx_pool/memory_tx_pool.ts | 2 +- yarn-project/p2p/src/tx_pool/tx_pool.ts | 2 +- .../server_world_state_synchroniser.test.ts | 4 +- 18 files changed, 169 insertions(+), 165 deletions(-) create mode 100644 yarn-project/p2p/src/client/index.ts rename yarn-project/p2p/src/{ => client}/memory_p2p_client.ts (92%) create mode 100644 yarn-project/p2p/src/client/mocks.ts rename yarn-project/p2p/src/{ => client}/p2p_client.test.ts (90%) rename yarn-project/p2p/src/{ => client}/p2p_client.ts (83%) create mode 100644 yarn-project/p2p/src/client/temp_types.ts rename yarn-project/p2p/src/{ => client}/tx.ts (100%) delete mode 100644 yarn-project/p2p/src/mocks.ts delete mode 100644 yarn-project/p2p/src/temp_types.ts diff --git a/yarn-project/archiver/src/archiver/archiver.ts b/yarn-project/archiver/src/archiver/archiver.ts index 01660a721aa..cf7c04ee545 100644 --- a/yarn-project/archiver/src/archiver/archiver.ts +++ b/yarn-project/archiver/src/archiver/archiver.ts @@ -3,7 +3,7 @@ import { rollupAbi } from '../abis/rollup.js'; import { yeeterAbi } from '../abis/yeeter.js'; import { ContractData, L2Block } from '../l2_block/l2_block.js'; import { randomAppendOnlyTreeSnapshot, randomBytes, randomContractData } from '../l2_block/mocks.js'; -import { L2BlockSource, SyncStatus } from '../l2_block/l2_block_source.js'; +import { L2BlockSource, L2BlockSourceSyncStatus } from '../l2_block/l2_block_source.js'; import { createLogger } from '@aztec/foundation'; /** @@ -42,7 +42,7 @@ export class Archiver implements L2BlockSource { * Gets the sync status of the L2 block source. * @returns The sync status of the L2 block source. */ - public async getSyncStatus(): Promise { + public async getSyncStatus(): Promise { const nextBlockNum = await this.publicClient.readContract({ address: this.rollupAddress, abi: rollupAbi, diff --git a/yarn-project/archiver/src/index.ts b/yarn-project/archiver/src/index.ts index 0bafa05fc41..31ccc57c092 100644 --- a/yarn-project/archiver/src/index.ts +++ b/yarn-project/archiver/src/index.ts @@ -1,43 +1,43 @@ -import { createPublicClient, getAddress, http } from 'viem'; -import { localhost } from 'viem/chains'; -import { Archiver } from './archiver/archiver.js'; +// import { createPublicClient, getAddress, http } from 'viem'; +// import { localhost } from 'viem/chains'; +// import { Archiver } from './archiver/archiver.js'; export * from './l2_block/l2_block_source.js'; export * from './archiver/archiver.js'; export * from './block_downloader/index.js'; export * from './l2_block/index.js'; -const { - ETHEREUM_HOST = 'http://localhost:8545/', - ROLLUP_ADDRESS = '0x5FbDB2315678afecb367f032d93F642f64180aa3', - YEETER_ADDRESS = '0xe7f1725E7734CE288F8367e1Bb143E90bb3F0512', -} = process.env; - -/** - * A function which instantiates and starts Archiver. - */ -async function main() { - const rollupAddress = getAddress(ROLLUP_ADDRESS); - const yeeterAddress = getAddress(YEETER_ADDRESS); - - const publicClient = createPublicClient({ - chain: localhost, - transport: http(ETHEREUM_HOST), - }); - - const archiver = new Archiver(publicClient, rollupAddress, yeeterAddress); - - const shutdown = () => { - archiver.stop(); - process.exit(0); - }; - process.once('SIGINT', shutdown); - process.once('SIGTERM', shutdown); - - await archiver.start(); -} - -main().catch(err => { - console.log(err); - process.exit(1); -}); +// const { +// ETHEREUM_HOST = 'http://localhost:8545/', +// ROLLUP_ADDRESS = '0x5FbDB2315678afecb367f032d93F642f64180aa3', +// YEETER_ADDRESS = '0xe7f1725E7734CE288F8367e1Bb143E90bb3F0512', +// } = process.env; + +// /** +// * A function which instantiates and starts Archiver. +// */ +// async function main() { +// const rollupAddress = getAddress(ROLLUP_ADDRESS); +// const yeeterAddress = getAddress(YEETER_ADDRESS); + +// const publicClient = createPublicClient({ +// chain: localhost, +// transport: http(ETHEREUM_HOST), +// }); + +// const archiver = new Archiver(publicClient, rollupAddress, yeeterAddress); + +// const shutdown = () => { +// archiver.stop(); +// process.exit(0); +// }; +// process.once('SIGINT', shutdown); +// process.once('SIGTERM', shutdown); + +// await archiver.start(); +// } + +// main().catch(err => { +// console.log(err); +// process.exit(1); +// }); diff --git a/yarn-project/archiver/src/l2_block/index.ts b/yarn-project/archiver/src/l2_block/index.ts index 2cc58517e00..e8e9e0a8a41 100644 --- a/yarn-project/archiver/src/l2_block/index.ts +++ b/yarn-project/archiver/src/l2_block/index.ts @@ -1,2 +1,3 @@ export * from './l2_block.js'; export * from './l2_block_source.js'; +export * from './mocks.js'; diff --git a/yarn-project/archiver/src/l2_block/l2_block_source.ts b/yarn-project/archiver/src/l2_block/l2_block_source.ts index cb9f6aebf4e..bc40a1b3c23 100644 --- a/yarn-project/archiver/src/l2_block/l2_block_source.ts +++ b/yarn-project/archiver/src/l2_block/l2_block_source.ts @@ -3,7 +3,7 @@ import { L2Block } from './index.js'; /** * Describes sync status of the archiver. */ -export interface SyncStatus { +export interface L2BlockSourceSyncStatus { /** * The height of the L2 block that the archiver is synced to. */ @@ -22,7 +22,7 @@ export interface L2BlockSource { * Gets the sync status of the L2 block source. * @returns The sync status of the L2 block source. */ - getSyncStatus(): Promise; + getSyncStatus(): Promise; /** * Gets the number of the latest L2 block processed by the block source implementation. diff --git a/yarn-project/merkle-tree/src/test/test_suite.ts b/yarn-project/merkle-tree/src/test/test_suite.ts index 34948a7f87d..d846d75ff10 100644 --- a/yarn-project/merkle-tree/src/test/test_suite.ts +++ b/yarn-project/merkle-tree/src/test/test_suite.ts @@ -3,7 +3,9 @@ import { default as levelup } from 'levelup'; import { default as memdown } from 'memdown'; import { Hasher, MerkleTree, Pedersen, SiblingPath } from '../index.js'; -const createMemDown = () => memdown.MemDown(); +/* eslint-disable @typescript-eslint/ban-ts-comment */ +// @ts-ignore +const createMemDown = () => memdown(); const expectSameTrees = async (tree1: MerkleTree, tree2: MerkleTree) => { const size = tree1.getNumLeaves(); diff --git a/yarn-project/p2p/src/client/index.ts b/yarn-project/p2p/src/client/index.ts new file mode 100644 index 00000000000..704fdc740bf --- /dev/null +++ b/yarn-project/p2p/src/client/index.ts @@ -0,0 +1,4 @@ +export * from './p2p_client.js'; +export * from './memory_p2p_client.js'; +export * from './tx.js'; +export * from './temp_types.js'; diff --git a/yarn-project/p2p/src/memory_p2p_client.ts b/yarn-project/p2p/src/client/memory_p2p_client.ts similarity index 92% rename from yarn-project/p2p/src/memory_p2p_client.ts rename to yarn-project/p2p/src/client/memory_p2p_client.ts index 943816c9f1d..abe2de276c5 100644 --- a/yarn-project/p2p/src/memory_p2p_client.ts +++ b/yarn-project/p2p/src/client/memory_p2p_client.ts @@ -1,9 +1,9 @@ import { InterruptableSleep } from '@aztec/foundation'; import { L2Block, L2BlockSource, L2BlockDownloader } from '@aztec/archiver'; -import { InMemoryTxPool } from './tx_pool/memory_tx_pool.js'; +import { InMemoryTxPool } from '../tx_pool/memory_tx_pool.js'; import { P2P } from './p2p_client.js'; -import { TxPool } from './tx_pool/index.js'; +import { TxPool } from '../tx_pool/index.js'; import { Tx } from './temp_types.js'; import { AccumulatedTxData } from './tx.js'; @@ -117,7 +117,7 @@ export class InMemoryP2PCLient implements P2P { public async stop() { this.running = false; this.ready = false; - this.blockDownloader.stop(); + await this.blockDownloader.stop(); this.interruptableSleep.interrupt(); await this.runningSyncPromise; } @@ -126,19 +126,20 @@ export class InMemoryP2PCLient implements P2P { * Returns all transactions in the transaction pool. * @returns An array of Txs. */ - public getTxs(): Tx[] { - return this.txPool.getAllTxs(); + public getTxs(): Promise { + return Promise.resolve(this.txPool.getAllTxs()); } /** * Verifies the 'tx' and, if valid, adds it to local tx pool and forwards it to other peers. * @param tx - The tx to verify. + * @returns Empty promise. **/ - public sendTx(tx: Tx): void { - if (!this.ready || !this.running) { - return; + public sendTx(tx: Tx): Promise { + if (this.ready && this.running) { + this.txPool.addTxs([tx]); } - this.txPool.addTxs([tx]); + return Promise.resolve(); } /** diff --git a/yarn-project/p2p/src/client/mocks.ts b/yarn-project/p2p/src/client/mocks.ts new file mode 100644 index 00000000000..400b1d9b50d --- /dev/null +++ b/yarn-project/p2p/src/client/mocks.ts @@ -0,0 +1,77 @@ +/* eslint-disable jsdoc/require-jsdoc */ +import { randomBytes } from 'crypto'; +import { + L2BlockSource, + L2Block, + ContractData, + randomContractData, + randomAppendOnlyTreeSnapshot, + L2BlockSourceSyncStatus, +} from '@aztec/archiver'; + +import { Tx } from './temp_types.js'; + +export class MockTx implements Tx { + constructor(private _txId: Buffer = randomBytes(32)) {} + + get txId() { + return this._txId; + } +} + +export class MockBlockSource implements L2BlockSource { + private l2Blocks: L2Block[]; + + constructor(private numBlocks = 100) { + this.l2Blocks = []; + for (let i = 0; i < this.numBlocks; i++) { + this.l2Blocks.push(new MockBlock(i)); + } + } + + public getLatestBlockNum() { + return Promise.resolve(this.l2Blocks.length); + } + + public getL2Blocks(from: number, take: number) { + return Promise.resolve(this.l2Blocks.slice(from, from + take)); + } + + public getSyncStatus(): Promise { + return Promise.resolve({ + syncedToBlock: this.numBlocks, + latestBlock: this.numBlocks, + } as L2BlockSourceSyncStatus); + } +} + +export class MockBlock extends L2Block { + constructor(private _id: number) { + const newNullifiers = [randomBytes(32), randomBytes(32), randomBytes(32), randomBytes(32)]; + const newCommitments = [randomBytes(32), randomBytes(32), randomBytes(32), randomBytes(32)]; + const newContracts: Buffer[] = [randomBytes(32)]; + const newContractsData: ContractData[] = [randomContractData()]; + + super( + 0, + randomAppendOnlyTreeSnapshot(0), + randomAppendOnlyTreeSnapshot(0), + randomAppendOnlyTreeSnapshot(0), + randomAppendOnlyTreeSnapshot(0), + randomAppendOnlyTreeSnapshot(0), + randomAppendOnlyTreeSnapshot(newCommitments.length), + randomAppendOnlyTreeSnapshot(newNullifiers.length), + randomAppendOnlyTreeSnapshot(newContracts.length), + randomAppendOnlyTreeSnapshot(1), + randomAppendOnlyTreeSnapshot(1), + newCommitments, + newNullifiers, + newContracts, + newContractsData, + ); + } + + get settlementTimestamp() { + return Date.now(); + } +} diff --git a/yarn-project/p2p/src/p2p_client.test.ts b/yarn-project/p2p/src/client/p2p_client.test.ts similarity index 90% rename from yarn-project/p2p/src/p2p_client.test.ts rename to yarn-project/p2p/src/client/p2p_client.test.ts index f1fae6b4a50..43ed804ebd6 100644 --- a/yarn-project/p2p/src/p2p_client.test.ts +++ b/yarn-project/p2p/src/client/p2p_client.test.ts @@ -2,7 +2,7 @@ import { expect, jest } from '@jest/globals'; import { L2BlockSource } from '@aztec/archiver'; import { InMemoryP2PCLient } from './memory_p2p_client.js'; -import { TxPool } from './tx_pool/index.js'; +import { TxPool } from '../tx_pool/index.js'; import { MockBlockSource } from './mocks.js'; import { MockTx } from './mocks.js'; @@ -47,8 +47,8 @@ describe('In-Memory P2P Client', () => { await client.start(); const tx1 = new MockTx(); const tx2 = new MockTx(); - client.sendTx(tx1); - client.sendTx(tx2); + await client.sendTx(tx1); + await client.sendTx(tx2); expect(txPool.addTxs).toHaveBeenCalledTimes(2); }); @@ -58,13 +58,13 @@ describe('In-Memory P2P Client', () => { await client.start(); const tx1 = new MockTx(); const tx2 = new MockTx(); - client.sendTx(tx1); - client.sendTx(tx2); + await client.sendTx(tx1); + await client.sendTx(tx2); expect(txPool.addTxs).toHaveBeenCalledTimes(2); await client.stop(); const tx3 = new MockTx(); - client.sendTx(tx3); + await client.sendTx(tx3); expect(txPool.addTxs).toHaveBeenCalledTimes(2); }); }); diff --git a/yarn-project/p2p/src/p2p_client.ts b/yarn-project/p2p/src/client/p2p_client.ts similarity index 83% rename from yarn-project/p2p/src/p2p_client.ts rename to yarn-project/p2p/src/client/p2p_client.ts index a04e5fb0245..33d1319120c 100644 --- a/yarn-project/p2p/src/p2p_client.ts +++ b/yarn-project/p2p/src/client/p2p_client.ts @@ -7,11 +7,11 @@ export interface P2P { /** * Verifies the 'tx' and, if valid, adds it to local tx pool and forwards it to other peers. **/ - sendTx(tx: Tx): void; + sendTx(tx: Tx): Promise; /** * Returns all transactions in the transaction pool. * @returns An array of Txs. */ - getTxs(): Tx[]; + getTxs(): Promise; } diff --git a/yarn-project/p2p/src/client/temp_types.ts b/yarn-project/p2p/src/client/temp_types.ts new file mode 100644 index 00000000000..bee75315f81 --- /dev/null +++ b/yarn-project/p2p/src/client/temp_types.ts @@ -0,0 +1,4 @@ +/* eslint-disable jsdoc/require-jsdoc */ +export interface Tx { + txId: Buffer; +} diff --git a/yarn-project/p2p/src/tx.ts b/yarn-project/p2p/src/client/tx.ts similarity index 100% rename from yarn-project/p2p/src/tx.ts rename to yarn-project/p2p/src/client/tx.ts diff --git a/yarn-project/p2p/src/index.ts b/yarn-project/p2p/src/index.ts index 1311428c25a..e6a85a1efa9 100644 --- a/yarn-project/p2p/src/index.ts +++ b/yarn-project/p2p/src/index.ts @@ -1,22 +1,24 @@ -import { InMemoryP2PCLient } from './memory_p2p_client.js'; -import { MockBlockSource } from './mocks.js'; +// import { InMemoryP2PCLient } from './memory_p2p_client.js'; +// import { MockBlockSource } from './mocks.js'; + +export * from './client/index.js'; /** * Main function of P2P in-memory client that runs at init. */ -async function main() { - // TODO: replace with actual rollup source that gets instantiated with env variables - const rollupSource = new MockBlockSource(); - const p2pClient = new InMemoryP2PCLient(rollupSource); - await p2pClient.start(); +// async function main() { +// // TODO: replace with actual rollup source that gets instantiated with env variables +// const rollupSource = new MockBlockSource(); +// const p2pClient = new InMemoryP2PCLient(rollupSource); +// await p2pClient.start(); - const shutdown = async () => { - await p2pClient.stop(); - process.exit(0); - }; +// const shutdown = async () => { +// await p2pClient.stop(); +// process.exit(0); +// }; - process.once('SIGINT', shutdown); - process.once('SIGTERM', shutdown); -} +// process.once('SIGINT', shutdown); +// process.once('SIGTERM', shutdown); +// } -main().catch(err => console.log('ERROR in main p2p function: ', err)); +// main().catch(err => console.log('ERROR in main p2p function: ', err)); diff --git a/yarn-project/p2p/src/mocks.ts b/yarn-project/p2p/src/mocks.ts deleted file mode 100644 index c46fae1c036..00000000000 --- a/yarn-project/p2p/src/mocks.ts +++ /dev/null @@ -1,44 +0,0 @@ -/* eslint-disable jsdoc/require-jsdoc */ -import { randomBytes } from 'crypto'; -import { L2BlockSource, L2Block } from '@aztec/archiver'; - -import { Tx } from './temp_types.js'; - -export class MockTx implements Tx { - constructor(private _txId: Buffer = randomBytes(32)) {} - - get txId() { - return this._txId; - } -} - -export class MockBlockSource implements L2BlockSource { - private l2Blocks: L2Block[]; - - constructor() { - this.l2Blocks = []; - for (let i = 0; i++; i < 99) { - this.l2Blocks.push(new MockBlock(i)); - } - } - - public getLatestBlockNum() { - return this.l2Blocks.length; - } - - public getL2Blocks(from: number, take: number) { - return this.l2Blocks.slice(from, from + take); - } -} - -export class MockBlock implements L2Block { - constructor(private _id: number) {} - - get number() { - return this._id; - } - - get settlementTimestamp() { - return Date.now(); - } -} diff --git a/yarn-project/p2p/src/temp_types.ts b/yarn-project/p2p/src/temp_types.ts deleted file mode 100644 index f3d42eba7dd..00000000000 --- a/yarn-project/p2p/src/temp_types.ts +++ /dev/null @@ -1,43 +0,0 @@ -/* eslint-disable jsdoc/require-jsdoc */ -export interface Tx { - txId: Buffer; -} - -/** - * Interface defining data contained in a rollup object. - */ -export interface Rollup { - /** - * The ID of the rollup (block height in L1 terminology). - */ - rollupId: number; - - /** - * Timestamp of an L1 block in which the settlement tx containing this rollup was included. - */ - settlementTimestamp?: number; - - /** - * List of rollup transactions. - */ - txs?: Tx[]; -} - -/** - * Interface of classes allowing for the retrieval of all the relevant rollup information. - */ -export interface RollupSource { - /** - * Gets the ID of the last rollup. - * @returns The ID of the last rollup. - **/ - getLastRollupId(): number; - - /** - * Gets the `take` rollups starting from ID `from`. - * @param from - If of the first rollup to return (inclusive). - * @param take - The number of rollups to return. - * @returns The requested rollups. - */ - getRollups(from: number, take: number): Rollup[]; -} diff --git a/yarn-project/p2p/src/tx_pool/memory_tx_pool.ts b/yarn-project/p2p/src/tx_pool/memory_tx_pool.ts index c43d733f34a..a05c0871568 100644 --- a/yarn-project/p2p/src/tx_pool/memory_tx_pool.ts +++ b/yarn-project/p2p/src/tx_pool/memory_tx_pool.ts @@ -1,4 +1,4 @@ -import { Tx } from '../temp_types.js'; +import { Tx } from '../client/temp_types.js'; import { TxPool } from './index.js'; /** diff --git a/yarn-project/p2p/src/tx_pool/tx_pool.ts b/yarn-project/p2p/src/tx_pool/tx_pool.ts index 9ebb05ae15d..4960177279d 100644 --- a/yarn-project/p2p/src/tx_pool/tx_pool.ts +++ b/yarn-project/p2p/src/tx_pool/tx_pool.ts @@ -1,4 +1,4 @@ -import { Tx } from '../temp_types.js'; +import { Tx } from '../client/temp_types.js'; /** * Interface of a transaction pool. The pool includes tx requests and is kept up-to-date by a P2P client. diff --git a/yarn-project/world-state/src/synchroniser/server_world_state_synchroniser.test.ts b/yarn-project/world-state/src/synchroniser/server_world_state_synchroniser.test.ts index abb28ad7337..07bfbba9629 100644 --- a/yarn-project/world-state/src/synchroniser/server_world_state_synchroniser.test.ts +++ b/yarn-project/world-state/src/synchroniser/server_world_state_synchroniser.test.ts @@ -1,6 +1,6 @@ /* eslint-disable jsdoc/require-jsdoc */ import { ServerWorldStateSynchroniser } from './server_world_state_synchroniser.js'; -import { L2BlockSource, SyncStatus, L2Block } from '@aztec/archiver'; +import { L2BlockSource, L2BlockSourceSyncStatus, L2Block } from '@aztec/archiver'; import { WorldStateRunningState } from './world_state_synchroniser.js'; import { Pedersen, MerkleTreeDb, MerkleTreeId, SiblingPath, StandardMerkleTree } from '@aztec/merkle-tree'; import { sleep } from '@aztec/foundation'; @@ -13,7 +13,7 @@ type Mockify = { const syncStatus = { syncedToBlock: 0, latestBlock: 0, -} as SyncStatus; +} as L2BlockSourceSyncStatus; const LATEST_BLOCK_NUMBER = 5; const getLatestBlockNumber = () => LATEST_BLOCK_NUMBER; From 3866df11b6aeb32f0ebda9063bfa366027240a28 Mon Sep 17 00:00:00 2001 From: PhilWindle Date: Wed, 22 Mar 2023 15:58:10 +0000 Subject: [PATCH 27/36] WIP --- bootstrap.sh | 4 +- build_manifest.json | 6 +- yarn-project/archiver/package.json | 1 + .../archiver/src/archiver/archiver.test.ts | 2 +- .../archiver/src/archiver/archiver.ts | 39 +++- yarn-project/archiver/src/index.ts | 3 +- .../archiver/src/l2_block/l2_block.ts | 5 + .../archiver/src/l2_block/l2_block_source.ts | 12 ++ yarn-project/archiver/tsconfig.dest.json | 10 +- .../src/sibling_path/sibling_path.ts | 11 +- .../src/standard_tree/standard_tree.ts | 3 + yarn-project/p2p/src/client/index.ts | 2 - .../p2p/src/client/memory_p2p_client.ts | 197 ------------------ yarn-project/p2p/src/client/mocks.ts | 15 +- .../p2p/src/client/p2p_client.test.ts | 11 +- yarn-project/p2p/src/client/p2p_client.ts | 197 +++++++++++++++++- yarn-project/p2p/src/client/temp_types.ts | 4 - yarn-project/p2p/src/client/tx.ts | 12 +- .../p2p/src/tx_pool/memory_tx_pool.ts | 2 +- yarn-project/p2p/src/tx_pool/tx_pool.test.ts | 2 +- yarn-project/p2p/src/tx_pool/tx_pool.ts | 2 +- yarn-project/p2p/tsconfig.dest.json | 3 + yarn-project/public-client/package.json | 4 + yarn-project/public-client/src/index.ts | 45 +++- yarn-project/public-client/tsconfig.dest.json | 14 ++ .../server_world_state_synchroniser.ts | 9 +- .../world-state/src/world-state-db/index.ts | 1 + yarn-project/world-state/tsconfig.dest.json | 3 + yarn-project/yarn-project-base/Dockerfile | 1 + yarn-project/yarn.lock | 9 +- 30 files changed, 378 insertions(+), 251 deletions(-) delete mode 100644 yarn-project/p2p/src/client/memory_p2p_client.ts delete mode 100644 yarn-project/p2p/src/client/temp_types.ts diff --git a/bootstrap.sh b/bootstrap.sh index b27766177fc..a3202868c7e 100755 --- a/bootstrap.sh +++ b/bootstrap.sh @@ -47,14 +47,14 @@ PROJECTS=( # "yarn-project/aztec-cli:yarn build" "yarn-project/aztec.js:yarn build" "yarn-project/archiver:yarn build" - # "yarn-project/ethereum.js:yarn build" + "yarn-project/ethereum.js:yarn build" "yarn-project/foundation:yarn build" # "yarn-project/kernel-simulator:yarn build" "yarn-project/key-store:yarn build" "yarn-project/merkle-tree:yarn build" "yarn-project/p2p:yarn build" # "yarn-project/prover-client:yarn build" - # "yarn-project/public-client:yarn build" + "yarn-project/public-client:yarn build" # "yarn-project/sequencer-client:yarn build" # "yarn-project/wallet:yarn build" "yarn-project/world-state:yarn build" diff --git a/build_manifest.json b/build_manifest.json index f2b0f4c6cbb..676f7aa798f 100644 --- a/build_manifest.json +++ b/build_manifest.json @@ -50,7 +50,7 @@ "projectDir": "yarn-project/archiver", "dockerfile": "archiver/Dockerfile", "rebuildPatterns": ["^yarn-project/archiver/"], - "dependencies": ["yarn-project-base"] + "dependencies": ["yarn-project-base", "ethereum.js"] }, "aztec-cli": { "buildDir": "yarn-project", @@ -106,7 +106,7 @@ "projectDir": "yarn-project/p2p", "dockerfile": "p2p/Dockerfile", "rebuildPatterns": ["^yarn-project/p2p/"], - "dependencies": ["yarn-project-base"] + "dependencies": ["yarn-project-base", "archiver"] }, "prover-client": { "buildDir": "yarn-project", @@ -141,6 +141,6 @@ "projectDir": "yarn-project/world-state", "dockerfile": "world-state/Dockerfile", "rebuildPatterns": ["^yarn-project/world-state/"], - "dependencies": ["yarn-project-base"] + "dependencies": ["yarn-project-base", "merkle-tree"] } } diff --git a/yarn-project/archiver/package.json b/yarn-project/archiver/package.json index 3365eb23bc9..e50ef55dc6f 100644 --- a/yarn-project/archiver/package.json +++ b/yarn-project/archiver/package.json @@ -26,6 +26,7 @@ "rootDir": "./src" }, "dependencies": { + "@aztec/ethereum.js": "workspace:^", "@aztec/foundation": "workspace:^", "debug": "^4.3.4", "tsc-watch": "^6.0.0", diff --git a/yarn-project/archiver/src/archiver/archiver.test.ts b/yarn-project/archiver/src/archiver/archiver.test.ts index 8fb2297198f..69778b7c4b9 100644 --- a/yarn-project/archiver/src/archiver/archiver.test.ts +++ b/yarn-project/archiver/src/archiver/archiver.test.ts @@ -54,6 +54,6 @@ describe('Archiver', () => { }); expect(latestBlockNum).toBe(syncStatus.syncedToBlock); - archiver.stop(); + await archiver.stop(); }); }); diff --git a/yarn-project/archiver/src/archiver/archiver.ts b/yarn-project/archiver/src/archiver/archiver.ts index cf7c04ee545..a234217bc75 100644 --- a/yarn-project/archiver/src/archiver/archiver.ts +++ b/yarn-project/archiver/src/archiver/archiver.ts @@ -1,10 +1,12 @@ -import { Address, PublicClient } from 'viem'; +import { PublicClient, getAddress, http, createPublicClient } from 'viem'; import { rollupAbi } from '../abis/rollup.js'; import { yeeterAbi } from '../abis/yeeter.js'; import { ContractData, L2Block } from '../l2_block/l2_block.js'; import { randomAppendOnlyTreeSnapshot, randomBytes, randomContractData } from '../l2_block/mocks.js'; import { L2BlockSource, L2BlockSourceSyncStatus } from '../l2_block/l2_block_source.js'; import { createLogger } from '@aztec/foundation'; +import { EthAddress } from '@aztec/ethereum.js/eth_address'; +import { localhost } from 'viem/chains'; /** * Pulls L2 blocks in a non-blocking manner and provides interface for their retrieval. @@ -33,18 +35,33 @@ export class Archiver implements L2BlockSource { */ constructor( private readonly publicClient: PublicClient, - private readonly rollupAddress: Address, - private readonly yeeterAddress: Address, + private readonly rollupAddress: EthAddress, + private readonly yeeterAddress: EthAddress, private readonly log = createLogger('Archiver'), ) {} + /** + * Creates a new instance of the Archiver. + * @param rpcUrl - The RPC url for connecting to an eth node. + * @param rollupAddress - Ethereum address of the rollup contract. + * @param yeeterAddress - Ethereum address of the yeeter contract. + * @returns - An instance of the archiver. + */ + public static new(rpcUrl: string, rollupAddress: EthAddress, yeeterAddress: EthAddress) { + const publicClient = createPublicClient({ + chain: localhost, + transport: http(rpcUrl), + }); + return new Archiver(publicClient, rollupAddress, yeeterAddress); + } + /** * Gets the sync status of the L2 block source. * @returns The sync status of the L2 block source. */ public async getSyncStatus(): Promise { const nextBlockNum = await this.publicClient.readContract({ - address: this.rollupAddress, + address: getAddress(this.rollupAddress.toString()), abi: rollupAbi, functionName: 'nextBlockNum', }); @@ -71,13 +88,13 @@ export class Archiver implements L2BlockSource { */ private async runInitialSync() { const blockFilter = await this.publicClient.createEventFilter({ - address: this.rollupAddress, + address: getAddress(this.rollupAddress.toString()), fromBlock: 0n, event: rollupAbi[0], }); const yeetFilter = await this.publicClient.createEventFilter({ - address: this.yeeterAddress, + address: getAddress(this.yeeterAddress.toString()), event: yeeterAbi[0], fromBlock: 0n, }); @@ -94,13 +111,13 @@ export class Archiver implements L2BlockSource { */ private startWatchingEvents() { this.unwatchBlocks = this.publicClient.watchEvent({ - address: this.rollupAddress, + address: getAddress(this.rollupAddress.toString()), event: rollupAbi[0], onLogs: logs => this.processBlockLogs(logs), }); this.unwatchYeets = this.publicClient.watchEvent({ - address: this.yeeterAddress, + address: getAddress(this.yeeterAddress.toString()), event: yeeterAbi[0], onLogs: logs => this.processYeetLogs(logs), }); @@ -148,9 +165,10 @@ export class Archiver implements L2BlockSource { } /** - * Stops the event polling loop. + * Stops the archiver. + * @returns A promise signalling completion of the stop process. */ - public stop() { + public stop(): Promise { this.log('Stopping...'); if (this.unwatchBlocks === undefined || this.unwatchYeets === undefined) { throw new Error('Archiver is not running.'); @@ -160,6 +178,7 @@ export class Archiver implements L2BlockSource { this.unwatchYeets(); this.log('Stopped.'); + return Promise.resolve(); } /** diff --git a/yarn-project/archiver/src/index.ts b/yarn-project/archiver/src/index.ts index 31ccc57c092..944dc8cb170 100644 --- a/yarn-project/archiver/src/index.ts +++ b/yarn-project/archiver/src/index.ts @@ -2,8 +2,7 @@ // import { localhost } from 'viem/chains'; // import { Archiver } from './archiver/archiver.js'; -export * from './l2_block/l2_block_source.js'; -export * from './archiver/archiver.js'; +export * from './archiver/index.js'; export * from './block_downloader/index.js'; export * from './l2_block/index.js'; diff --git a/yarn-project/archiver/src/l2_block/l2_block.ts b/yarn-project/archiver/src/l2_block/l2_block.ts index 8c2264a82b7..454df989eaf 100644 --- a/yarn-project/archiver/src/l2_block/l2_block.ts +++ b/yarn-project/archiver/src/l2_block/l2_block.ts @@ -26,10 +26,15 @@ export type ContractData = { ethAddress: Buffer; }; +/* eslint-disable jsdoc/require-jsdoc */ + /** * The data that makes up the rollup proof, with encoder decoder functions. */ export class L2Block { + /** + * A yeet to go with the block. + */ public yeet?: Buffer; /** diff --git a/yarn-project/archiver/src/l2_block/l2_block_source.ts b/yarn-project/archiver/src/l2_block/l2_block_source.ts index bc40a1b3c23..bb4d6e77695 100644 --- a/yarn-project/archiver/src/l2_block/l2_block_source.ts +++ b/yarn-project/archiver/src/l2_block/l2_block_source.ts @@ -37,4 +37,16 @@ export interface L2BlockSource { * @returns The requested L2 blocks. */ getL2Blocks(from: number, take: number): Promise; + + /** + * Starts the L2 block source. + * @returns A promise signalling completion of the start process. + */ + start(): Promise; + + /** + * Stops the L2 block source. + * @returns A promise signalling completion of the stop process. + */ + stop(): Promise; } diff --git a/yarn-project/archiver/tsconfig.dest.json b/yarn-project/archiver/tsconfig.dest.json index 74be6e829f1..424bb413ffb 100644 --- a/yarn-project/archiver/tsconfig.dest.json +++ b/yarn-project/archiver/tsconfig.dest.json @@ -1,4 +1,12 @@ { "extends": ".", - "exclude": ["**/*.test.*", "**/fixtures/*"], + "references": [ + { + "path": "../ethereum.js/tsconfig.dest.json" + }, + { + "path": "../foundation/tsconfig.dest.json" + } + ], + "exclude": ["**/*.test.*", "**/fixtures/*"] } diff --git a/yarn-project/merkle-tree/src/sibling_path/sibling_path.ts b/yarn-project/merkle-tree/src/sibling_path/sibling_path.ts index 6b12590eee2..56179d0eb6b 100644 --- a/yarn-project/merkle-tree/src/sibling_path/sibling_path.ts +++ b/yarn-project/merkle-tree/src/sibling_path/sibling_path.ts @@ -22,7 +22,16 @@ export class SiblingPath { return new SiblingPath(bufs); } - constructor(public data: Buffer[] = []) {} + /** + * Constructor. + * @param data - The sibling path data. + */ + constructor( + /** + * The sibling path data. + */ + public data: Buffer[] = [], + ) {} /** * Serializes this SiblingPath object to a buffer. diff --git a/yarn-project/merkle-tree/src/standard_tree/standard_tree.ts b/yarn-project/merkle-tree/src/standard_tree/standard_tree.ts index 700dc3e0330..a81fd8a9642 100644 --- a/yarn-project/merkle-tree/src/standard_tree/standard_tree.ts +++ b/yarn-project/merkle-tree/src/standard_tree/standard_tree.ts @@ -28,6 +28,9 @@ const decodeMeta = (meta: Buffer) => { * A Merkle tree implementation that uses a LevelDB database to store the tree. */ export class StandardMerkleTree implements MerkleTree { + /** + * The value of an 'empty' leaf. + */ public static ZERO_ELEMENT = Buffer.from('0000000000000000000000000000000000000000000000000000000000000000', 'hex'); private root!: Buffer; private zeroHashes: Buffer[] = []; diff --git a/yarn-project/p2p/src/client/index.ts b/yarn-project/p2p/src/client/index.ts index 704fdc740bf..a51149dae99 100644 --- a/yarn-project/p2p/src/client/index.ts +++ b/yarn-project/p2p/src/client/index.ts @@ -1,4 +1,2 @@ export * from './p2p_client.js'; -export * from './memory_p2p_client.js'; export * from './tx.js'; -export * from './temp_types.js'; diff --git a/yarn-project/p2p/src/client/memory_p2p_client.ts b/yarn-project/p2p/src/client/memory_p2p_client.ts deleted file mode 100644 index abe2de276c5..00000000000 --- a/yarn-project/p2p/src/client/memory_p2p_client.ts +++ /dev/null @@ -1,197 +0,0 @@ -import { InterruptableSleep } from '@aztec/foundation'; -import { L2Block, L2BlockSource, L2BlockDownloader } from '@aztec/archiver'; - -import { InMemoryTxPool } from '../tx_pool/memory_tx_pool.js'; -import { P2P } from './p2p_client.js'; -import { TxPool } from '../tx_pool/index.js'; -import { Tx } from './temp_types.js'; -import { AccumulatedTxData } from './tx.js'; - -const TAKE_NUM = 10; - -/** - * Enum defining the possible states of the p2p client. - */ -enum P2PClientState { - IDLE, - SYNCING, - RUNNING, - STOPPED, -} - -/** - * An in-memory implementation of the P2P client. - */ -export class InMemoryP2PCLient implements P2P { - /** - * L2 Block download that p2p client uses to stay in sync with latest blocks. - */ - private blockDownloader: L2BlockDownloader; - - /** - * Property that indicates whether the client is running. - */ - private running = false; - - /** - * Property that indicates whether the client is ready to receive new txs. - */ - private ready = false; - - /** - * The JS promise that will be running to keep the client's data in sync. Can be interrupted if the client is stopped. - */ - private runningSyncPromise!: Promise; - - /** - * A function that waits for a specified time or until it's interrupted. - */ - private interruptableSleep = new InterruptableSleep(); - - /** - * Store the ID of the latest block the client has synced to. - */ - private syncedBlockNum = 0; - - /** - * In-memory P2P client constructor. - * @param l2BlockSource - P2P client's source for fetching existing block data. - * @param txPool - The client's instance of a transaction pool. Defaults to in-memory implementation. - */ - constructor(private l2BlockSource: L2BlockSource, private txPool: TxPool = new InMemoryTxPool()) { - this.blockDownloader = new L2BlockDownloader(l2BlockSource, TAKE_NUM); - } - - /** - * Starts the P2P client. - */ - public async start() { - this.running = true; - - let synced = false; - - const latestBlockNum = await this.l2BlockSource.getLatestBlockNum(); - - const txPoolSize = this.txPool.getAllTxs().keys.length; - if (!txPoolSize) { - // No initial reconciliation needed, proceed; - synced = true; - this.syncedBlockNum = latestBlockNum; - // start block downloader from latest L2 Block ID - this.blockDownloader.start(latestBlockNum); - } - - while (!synced) { - // start block downloader from the beginning - this.blockDownloader.start(); - const blocks = await this.blockDownloader.getL2Blocks(); - this.reconcileTxPool(blocks); - - if (blocks.length) { - this.syncedBlockNum = blocks[blocks.length - 1].number; - } else { - synced = true; - this.syncedBlockNum = latestBlockNum; - } - } - this.ready = true; - - const runningSyncPromise = async () => { - while (this.running) { - const newBlocks = await this.blockDownloader.getL2Blocks(); - if (newBlocks.length) { - this.reconcileTxPool(newBlocks); - } else { - await this.interruptableSleep.sleep(10000); - } - } - }; - - this.runningSyncPromise = runningSyncPromise(); - } - - /** - * Allows consumers to stop the instance of the P2P client. - * 'running' & 'ready' will now return 'false' and the running promise that keeps the client synced is interrupted. - */ - public async stop() { - this.running = false; - this.ready = false; - await this.blockDownloader.stop(); - this.interruptableSleep.interrupt(); - await this.runningSyncPromise; - } - - /** - * Returns all transactions in the transaction pool. - * @returns An array of Txs. - */ - public getTxs(): Promise { - return Promise.resolve(this.txPool.getAllTxs()); - } - - /** - * Verifies the 'tx' and, if valid, adds it to local tx pool and forwards it to other peers. - * @param tx - The tx to verify. - * @returns Empty promise. - **/ - public sendTx(tx: Tx): Promise { - if (this.ready && this.running) { - this.txPool.addTxs([tx]); - } - return Promise.resolve(); - } - - /** - * Public function to check if P2P client is currently running. - * @returns True if the P2P client is running. - */ - public isRunning() { - return this.running; - } - - /** - * Public function to check if the p2p client is fully synced and ready to receive txs. - * @returns True if the P2P client is ready to receive txs. - */ - public isReady() { - return this.ready; - } - - /** - * Public function to check the latest block number that the P2P client is synced to. - * @returns Block number of latest L2 Block we've synced with. - */ - public getSyncedBlockNum() { - return this.syncedBlockNum; - } - - /** - * Method to check the status the p2p client. - * @returns Information about p2p client status: state & syncedToBlockNum. - */ - public getStatus() { - let clientState = P2PClientState.IDLE; - if (this.ready) { - clientState = P2PClientState.RUNNING; - } else if (this.running) { - clientState = P2PClientState.SYNCING; - } - - return { - state: clientState, - syncedToBlockNum: this.syncedBlockNum, - }; - } - - /** - * Internal method that uses the provided blocks to check against the client's tx pool. - * @param blocks - A list of existing blocks with txs that the P2P client needs to ensure the tx pool is reconciled with. - */ - private reconcileTxPool(blocks: L2Block[]) { - for (let i = 0; i < blocks.length; i++) { - const { newContracts } = blocks[i]; - this.txPool.deleteTxs(newContracts?.map((data: Buffer) => AccumulatedTxData.createTxId(data)) || []); - } - } -} diff --git a/yarn-project/p2p/src/client/mocks.ts b/yarn-project/p2p/src/client/mocks.ts index 400b1d9b50d..72a09ab1589 100644 --- a/yarn-project/p2p/src/client/mocks.ts +++ b/yarn-project/p2p/src/client/mocks.ts @@ -8,8 +8,7 @@ import { randomAppendOnlyTreeSnapshot, L2BlockSourceSyncStatus, } from '@aztec/archiver'; - -import { Tx } from './temp_types.js'; +import { Tx } from './tx.js'; export class MockTx implements Tx { constructor(private _txId: Buffer = randomBytes(32)) {} @@ -30,7 +29,7 @@ export class MockBlockSource implements L2BlockSource { } public getLatestBlockNum() { - return Promise.resolve(this.l2Blocks.length); + return Promise.resolve(this.l2Blocks.length - 1); } public getL2Blocks(from: number, take: number) { @@ -43,6 +42,14 @@ export class MockBlockSource implements L2BlockSource { latestBlock: this.numBlocks, } as L2BlockSourceSyncStatus); } + + public start(): Promise { + return Promise.resolve(); + } + + public stop(): Promise { + return Promise.resolve(); + } } export class MockBlock extends L2Block { @@ -53,7 +60,7 @@ export class MockBlock extends L2Block { const newContractsData: ContractData[] = [randomContractData()]; super( - 0, + _id, randomAppendOnlyTreeSnapshot(0), randomAppendOnlyTreeSnapshot(0), randomAppendOnlyTreeSnapshot(0), diff --git a/yarn-project/p2p/src/client/p2p_client.test.ts b/yarn-project/p2p/src/client/p2p_client.test.ts index 43ed804ebd6..66afd9f0e0d 100644 --- a/yarn-project/p2p/src/client/p2p_client.test.ts +++ b/yarn-project/p2p/src/client/p2p_client.test.ts @@ -1,7 +1,7 @@ import { expect, jest } from '@jest/globals'; import { L2BlockSource } from '@aztec/archiver'; -import { InMemoryP2PCLient } from './memory_p2p_client.js'; +import { P2PCLient } from './p2p_client.js'; import { TxPool } from '../tx_pool/index.js'; import { MockBlockSource } from './mocks.js'; import { MockTx } from './mocks.js'; @@ -29,21 +29,18 @@ describe('In-Memory P2P Client', () => { }); it('can start & stop', async () => { - const client = new InMemoryP2PCLient(blockSource, txPool); + const client = new P2PCLient(blockSource, txPool); expect(client.isReady()).toEqual(false); - expect(client.isRunning()).toEqual(false); await client.start(); expect(client.isReady()).toEqual(true); - expect(client.isRunning()).toEqual(true); await client.stop(); expect(client.isReady()).toEqual(false); - expect(client.isRunning()).toEqual(false); }); it('adds txs to pool', async () => { - const client = new InMemoryP2PCLient(blockSource, txPool); + const client = new P2PCLient(blockSource, txPool); await client.start(); const tx1 = new MockTx(); const tx2 = new MockTx(); @@ -54,7 +51,7 @@ describe('In-Memory P2P Client', () => { }); it('rejects txs after being stopped', async () => { - const client = new InMemoryP2PCLient(blockSource, txPool); + const client = new P2PCLient(blockSource, txPool); await client.start(); const tx1 = new MockTx(); const tx2 = new MockTx(); diff --git a/yarn-project/p2p/src/client/p2p_client.ts b/yarn-project/p2p/src/client/p2p_client.ts index 33d1319120c..79479ac771e 100644 --- a/yarn-project/p2p/src/client/p2p_client.ts +++ b/yarn-project/p2p/src/client/p2p_client.ts @@ -1,4 +1,20 @@ -import { Tx } from './temp_types.js'; +import { L2Block, L2BlockSource, L2BlockDownloader } from '@aztec/archiver'; + +import { InMemoryTxPool } from '../tx_pool/memory_tx_pool.js'; +import { TxPool } from '../tx_pool/index.js'; +import { AccumulatedTxData, Tx } from './tx.js'; + +const TAKE_NUM = 10; + +/** + * Enum defining the possible states of the p2p client. + */ +enum P2PClientState { + IDLE, + SYNCHING, + RUNNING, + STOPPED, +} /** * Interface of a P2P client. @@ -14,4 +30,183 @@ export interface P2P { * @returns An array of Txs. */ getTxs(): Promise; + + /** + * Starts the p2p client. + * @returns A promise signalling the completion of the block sync. + */ + start(): Promise; + + /** + * Stops the p2p client. + * @returns A promise signalling the completion of the stop process. + */ + stop(): Promise; +} + +/** + * The P2P client implementation. + */ +export class P2PCLient implements P2P { + /** + * L2 Block download that p2p client uses to stay in sync with latest blocks. + */ + private blockDownloader: L2BlockDownloader; + + /** + * Property that indicates whether the client is running. + */ + private stopping = false; + + /** + * The JS promise that will be running to keep the client's data in sync. Can be interrupted if the client is stopped. + */ + private runningSyncPromise!: Promise; + + /** + * Store the ID of the latest block the client has synced to. + */ + private syncedBlockNum = -1; + + private currentState = P2PClientState.IDLE; + private syncPromise = Promise.resolve(); + private latestBlockNumberAtStart = -1; + private syncResolve?: () => void = undefined; + + /** + * In-memory P2P client constructor. + * @param l2BlockSource - P2P client's source for fetching existing block data. + * @param txPool - The client's instance of a transaction pool. Defaults to in-memory implementation. + */ + constructor(private l2BlockSource: L2BlockSource, private txPool: TxPool = new InMemoryTxPool()) { + this.blockDownloader = new L2BlockDownloader(l2BlockSource, TAKE_NUM); + } + + /** + * Starts the P2P client. + * @returns An empty promise signalling the synching process. + */ + public async start() { + if (this.currentState === P2PClientState.STOPPED) { + throw new Error('P2P client already stopped'); + } + if (this.currentState !== P2PClientState.IDLE) { + return this.syncPromise; + } + + // get the current latest block number + this.latestBlockNumberAtStart = await this.l2BlockSource.getLatestBlockNum(); + + if (this.syncedBlockNum >= this.latestBlockNumberAtStart) { + // if no blocks to be retrieved, go straight to running + this.currentState = P2PClientState.RUNNING; + this.syncPromise = Promise.resolve(); + } else { + this.currentState = P2PClientState.SYNCHING; + this.syncPromise = new Promise(resolve => { + this.syncResolve = resolve; + }); + } + + // start looking for further blocks + const blockProcess = async () => { + while (!this.stopping) { + const blocks = await this.blockDownloader.getL2Blocks(); + await this.processBlocks(blocks); + } + }; + this.runningSyncPromise = blockProcess(); + this.blockDownloader.start(this.syncedBlockNum + 1); + return this.syncPromise; + } + + /** + * Allows consumers to stop the instance of the P2P client. + * 'ready' will now return 'false' and the running promise that keeps the client synced is interrupted. + */ + public async stop() { + this.stopping = true; + await this.blockDownloader.stop(); + await this.runningSyncPromise; + this.currentState = P2PClientState.STOPPED; + } + + /** + * Returns all transactions in the transaction pool. + * @returns An array of Txs. + */ + public getTxs(): Promise { + return Promise.resolve(this.txPool.getAllTxs()); + } + + /** + * Verifies the 'tx' and, if valid, adds it to local tx pool and forwards it to other peers. + * @param tx - The tx to verify. + * @returns Empty promise. + **/ + public sendTx(tx: Tx): Promise { + if (this.isReady()) { + this.txPool.addTxs([tx]); + } + return Promise.resolve(); + } + + /** + * Public function to check if the p2p client is fully synced and ready to receive txs. + * @returns True if the P2P client is ready to receive txs. + */ + public isReady() { + return this.currentState === P2PClientState.RUNNING; + } + + /** + * Public function to check the latest block number that the P2P client is synced to. + * @returns Block number of latest L2 Block we've synced with. + */ + public getSyncedBlockNum() { + return this.syncedBlockNum; + } + + /** + * Method to check the status the p2p client. + * @returns Information about p2p client status: state & syncedToBlockNum. + */ + public getStatus() { + return { + state: this.currentState, + syncedToBlockNum: this.syncedBlockNum, + }; + } + + /** + * Internal method that uses the provided blocks to check against the client's tx pool. + * @param blocks - A list of existing blocks with txs that the P2P client needs to ensure the tx pool is reconciled with. + * @returns Empty promise. + */ + private reconcileTxPool(blocks: L2Block[]): Promise { + for (let i = 0; i < blocks.length; i++) { + const { newContracts } = blocks[i]; + this.txPool.deleteTxs(newContracts?.map((data: Buffer) => AccumulatedTxData.createTxId(data)) || []); + } + return Promise.resolve(); + } + + /** + * Method for processing new blocks. + * @param blocks - A list of existing blocks with txs that the P2P client needs to ensure the tx pool is reconciled with. + * @returns Empty promise. + */ + private async processBlocks(blocks: L2Block[]): Promise { + if (!blocks.length) { + return Promise.resolve(); + } + await this.reconcileTxPool(blocks); + this.syncedBlockNum = blocks[blocks.length - 1].number; + if (this.currentState === P2PClientState.SYNCHING && this.syncedBlockNum >= this.latestBlockNumberAtStart) { + this.currentState = P2PClientState.RUNNING; + if (this.syncResolve !== undefined) { + this.syncResolve(); + } + } + } } diff --git a/yarn-project/p2p/src/client/temp_types.ts b/yarn-project/p2p/src/client/temp_types.ts deleted file mode 100644 index bee75315f81..00000000000 --- a/yarn-project/p2p/src/client/temp_types.ts +++ /dev/null @@ -1,4 +0,0 @@ -/* eslint-disable jsdoc/require-jsdoc */ -export interface Tx { - txId: Buffer; -} diff --git a/yarn-project/p2p/src/client/tx.ts b/yarn-project/p2p/src/client/tx.ts index 90742e8a74b..190124c0873 100644 --- a/yarn-project/p2p/src/client/tx.ts +++ b/yarn-project/p2p/src/client/tx.ts @@ -1,10 +1,18 @@ import { randomBytes } from 'crypto'; import { Keccak } from 'sha3'; -import { Tx } from './temp_types.js'; - const hash = new Keccak(256); +/** + * The interface of an L2 transaction. + */ +export interface Tx { + /** + * The id of the transaction. + */ + txId: Buffer; +} + /** * Accumulated data of an A3 transaction. */ diff --git a/yarn-project/p2p/src/tx_pool/memory_tx_pool.ts b/yarn-project/p2p/src/tx_pool/memory_tx_pool.ts index a05c0871568..eddb4e7e911 100644 --- a/yarn-project/p2p/src/tx_pool/memory_tx_pool.ts +++ b/yarn-project/p2p/src/tx_pool/memory_tx_pool.ts @@ -1,4 +1,4 @@ -import { Tx } from '../client/temp_types.js'; +import { Tx } from '../index.js'; import { TxPool } from './index.js'; /** diff --git a/yarn-project/p2p/src/tx_pool/tx_pool.test.ts b/yarn-project/p2p/src/tx_pool/tx_pool.test.ts index d4e5a586de9..974320f8190 100644 --- a/yarn-project/p2p/src/tx_pool/tx_pool.test.ts +++ b/yarn-project/p2p/src/tx_pool/tx_pool.test.ts @@ -1,4 +1,4 @@ -import { MockTx } from '../mocks.js'; +import { MockTx } from '../client/mocks.js'; import { InMemoryTxPool } from './index.js'; describe('In-Memory TX pool', () => { diff --git a/yarn-project/p2p/src/tx_pool/tx_pool.ts b/yarn-project/p2p/src/tx_pool/tx_pool.ts index 4960177279d..c3134d45418 100644 --- a/yarn-project/p2p/src/tx_pool/tx_pool.ts +++ b/yarn-project/p2p/src/tx_pool/tx_pool.ts @@ -1,4 +1,4 @@ -import { Tx } from '../client/temp_types.js'; +import { Tx } from '../index.js'; /** * Interface of a transaction pool. The pool includes tx requests and is kept up-to-date by a P2P client. diff --git a/yarn-project/p2p/tsconfig.dest.json b/yarn-project/p2p/tsconfig.dest.json index 895baf0f085..f454c8daf89 100644 --- a/yarn-project/p2p/tsconfig.dest.json +++ b/yarn-project/p2p/tsconfig.dest.json @@ -3,6 +3,9 @@ "references": [ { "path": "../archiver/tsconfig.dest.json" + }, + { + "path": "../foundation/tsconfig.dest.json" } ], "exclude": ["**/*.test.*", "**/fixtures/*"] diff --git a/yarn-project/public-client/package.json b/yarn-project/public-client/package.json index 76039a8f412..bc068d4fe75 100644 --- a/yarn-project/public-client/package.json +++ b/yarn-project/public-client/package.json @@ -30,6 +30,10 @@ "rootDir": "./src" }, "dependencies": { + "@aztec/archiver": "workspace:^", + "@aztec/ethereum.js": "workspace:^", + "@aztec/p2p": "workspace:^", + "@aztec/world-state": "workspace:^", "tslib": "^2.4.0" }, "devDependencies": { diff --git a/yarn-project/public-client/src/index.ts b/yarn-project/public-client/src/index.ts index d91578d2c5f..69abb05510c 100644 --- a/yarn-project/public-client/src/index.ts +++ b/yarn-project/public-client/src/index.ts @@ -1,4 +1,45 @@ +import { default as levelup } from 'levelup'; +import { default as memdown } from 'memdown'; +import { L2BlockSource, Archiver } from '@aztec/archiver'; +import { P2P, P2PCLient } from '@aztec/p2p'; +import { MerkleTrees, WorldStateSynchroniser, ServerWorldStateSynchroniser } from '@aztec/world-state'; +import { EthAddress } from '@aztec/ethereum.js/eth_address'; + /** - * A placeholder for the Public Client. + * The public client. */ -export class PublicClient {} +export class AztecNode { + private p2pClient?: P2P; + private blockSource?: L2BlockSource; + private merkleTreeDB?: MerkleTrees; + private worldStateSynchroniser?: WorldStateSynchroniser; + + constructor() {} + + /** + * Initialises the Aztec Node, wait for component to sync. + * @param rpcUrl - The URL of an Ethereum RPC node. + * @param rollupAddress - The rollup contract address. + * @param yeeterAddress - The yeeter contract address. + */ + public async init(rpcUrl: string, rollupAddress: EthAddress, yeeterAddress: EthAddress) { + // first configure the block source + this.blockSource = Archiver.new(rpcUrl, rollupAddress, yeeterAddress); + + await this.blockSource.start(); + + // give the block source to the P2P network and the world state synchroniser + this.p2pClient = new P2PCLient(this.blockSource); + const db = levelup(memdown.MemDown()); + this.merkleTreeDB = new MerkleTrees(db); + this.worldStateSynchroniser = new ServerWorldStateSynchroniser(this.merkleTreeDB, this.blockSource); + + // start both and wait for them to sync from the block source + const p2pSyncPromise = this.p2pClient.start(); + const worldStateSyncPromise = this.worldStateSynchroniser.start(); + await Promise.all([p2pSyncPromise, worldStateSyncPromise]); + + // create and start the sequencer + // new Sequencer(this.blockSource, this.p2pClient, this.merkleTreeDB, this.publisher); + } +} diff --git a/yarn-project/public-client/tsconfig.dest.json b/yarn-project/public-client/tsconfig.dest.json index 965aaa1c433..1c9a9e1edac 100644 --- a/yarn-project/public-client/tsconfig.dest.json +++ b/yarn-project/public-client/tsconfig.dest.json @@ -1,4 +1,18 @@ { "extends": ".", + "references": [ + { + "path": "../archiver/tsconfig.dest.json" + }, + { + "path": "../foundation/tsconfig.dest.json" + }, + { + "path": "../p2p/tsconfig.dest.json" + }, + { + "path": "../world-state/tsconfig.dest.json" + } + ], "exclude": ["**/*.test.*", "**/fixtures/*"] } diff --git a/yarn-project/world-state/src/synchroniser/server_world_state_synchroniser.ts b/yarn-project/world-state/src/synchroniser/server_world_state_synchroniser.ts index 82ca09fddbd..148ad2c8e05 100644 --- a/yarn-project/world-state/src/synchroniser/server_world_state_synchroniser.ts +++ b/yarn-project/world-state/src/synchroniser/server_world_state_synchroniser.ts @@ -13,7 +13,6 @@ export class ServerWorldStateSynchroniser implements WorldStateSynchroniser { private l2BlockDownloader: L2BlockDownloader; private syncPromise: Promise = Promise.resolve(); private syncResolve?: () => void = undefined; - private syncReject?: () => void = undefined; private stopping = false; private runningPromise: Promise = Promise.resolve(); private currentState: WorldStateRunningState = WorldStateRunningState.IDLE; @@ -46,9 +45,8 @@ export class ServerWorldStateSynchroniser implements WorldStateSynchroniser { // if there are blocks to be retrieved, go to a synching state if (from < this.latestBlockNumberAtStart) { this.currentState = WorldStateRunningState.SYNCHING; - this.syncPromise = new Promise((resolve, reject) => { + this.syncPromise = new Promise(resolve => { this.syncResolve = resolve; - this.syncReject = reject; }); } else { // if no blocks to be retrieved, go straight to running @@ -73,12 +71,9 @@ export class ServerWorldStateSynchroniser implements WorldStateSynchroniser { * Stops the synchroniser. */ public async stop() { - await this.l2BlockDownloader.stop(); this.stopping = true; + await this.l2BlockDownloader.stop(); await this.runningPromise; - if (this.currentState === WorldStateRunningState.SYNCHING && this.syncReject !== undefined) { - this.syncReject(); - } this.currentState = WorldStateRunningState.STOPPED; } diff --git a/yarn-project/world-state/src/world-state-db/index.ts b/yarn-project/world-state/src/world-state-db/index.ts index fe55dababd4..bf39aac9edd 100644 --- a/yarn-project/world-state/src/world-state-db/index.ts +++ b/yarn-project/world-state/src/world-state-db/index.ts @@ -1,3 +1,4 @@ +export * from './memory_world_state_db.js'; /** * Defines the possible tree IDs. */ diff --git a/yarn-project/world-state/tsconfig.dest.json b/yarn-project/world-state/tsconfig.dest.json index ae55efe5e81..93f9b9ecffc 100644 --- a/yarn-project/world-state/tsconfig.dest.json +++ b/yarn-project/world-state/tsconfig.dest.json @@ -6,6 +6,9 @@ }, { "path": "../merkle-tree/tsconfig.dest.json" + }, + { + "path": "../foundation/tsconfig.dest.json" } ], "exclude": ["**/*.test.*", "**/fixtures/*"] diff --git a/yarn-project/yarn-project-base/Dockerfile b/yarn-project/yarn-project-base/Dockerfile index c8078b2dec9..8e3d7d1a382 100644 --- a/yarn-project/yarn-project-base/Dockerfile +++ b/yarn-project/yarn-project-base/Dockerfile @@ -19,6 +19,7 @@ COPY docs/package.json docs/package.json COPY end-to-end/package.json end-to-end/package.json COPY ethereum.js/example/package.json ethereum.js/example/package.json COPY ethereum.js/package.json ethereum.js/package.json +COPY foundation/package.json foundation/package.json COPY kernel-simulator/package.json kernel-simulator/package.json COPY key-store/package.json key-store/package.json COPY merkle-tree/package.json merkle-tree/package.json diff --git a/yarn-project/yarn.lock b/yarn-project/yarn.lock index 3ee91695559..62b78b72e41 100644 --- a/yarn-project/yarn.lock +++ b/yarn-project/yarn.lock @@ -37,6 +37,7 @@ __metadata: resolution: "@aztec/archiver@workspace:archiver" dependencies: "@aztec/eslint-config": "workspace:^" + "@aztec/ethereum.js": "workspace:^" "@aztec/foundation": "workspace:^" "@jest/globals": ^29.5.0 "@rushstack/eslint-patch": ^1.2.0 @@ -270,7 +271,7 @@ __metadata: languageName: unknown linkType: soft -"@aztec/p2p@workspace:p2p": +"@aztec/p2p@workspace:^, @aztec/p2p@workspace:p2p": version: 0.0.0-use.local resolution: "@aztec/p2p@workspace:p2p" dependencies: @@ -319,7 +320,11 @@ __metadata: version: 0.0.0-use.local resolution: "@aztec/public-client@workspace:public-client" dependencies: + "@aztec/archiver": "workspace:^" "@aztec/eslint-config": "workspace:^" + "@aztec/ethereum.js": "workspace:^" + "@aztec/p2p": "workspace:^" + "@aztec/world-state": "workspace:^" "@jest/globals": ^29.4.3 "@rushstack/eslint-patch": ^1.1.4 "@types/jest": ^29.4.0 @@ -366,7 +371,7 @@ __metadata: languageName: unknown linkType: soft -"@aztec/world-state@workspace:world-state": +"@aztec/world-state@workspace:^, @aztec/world-state@workspace:world-state": version: 0.0.0-use.local resolution: "@aztec/world-state@workspace:world-state" dependencies: From deaf130626231af09f1ca31a5ed1ee9028409224 Mon Sep 17 00:00:00 2001 From: PhilWindle Date: Wed, 22 Mar 2023 18:20:05 +0000 Subject: [PATCH 28/36] WIP --- .../archiver/src/archiver/archiver.ts | 4 +- yarn-project/p2p/src/client/mocks.ts | 12 ++-- yarn-project/p2p/src/client/p2p_client.ts | 56 ++++++++++++----- yarn-project/p2p/src/client/tx.ts | 52 ++++++++++------ .../p2p/src/tx_pool/memory_tx_pool.ts | 5 +- .../public-client/src/aztec_node.test.ts | 32 ++++++++++ yarn-project/public-client/src/index.ts | 62 ++++++++++++++++++- .../server_world_state_synchroniser.ts | 25 ++++++-- .../world-state-db/memory_world_state_db.ts | 11 ++++ 9 files changed, 208 insertions(+), 51 deletions(-) create mode 100644 yarn-project/public-client/src/aztec_node.test.ts diff --git a/yarn-project/archiver/src/archiver/archiver.ts b/yarn-project/archiver/src/archiver/archiver.ts index a234217bc75..dbf45e2aeba 100644 --- a/yarn-project/archiver/src/archiver/archiver.ts +++ b/yarn-project/archiver/src/archiver/archiver.ts @@ -4,9 +4,9 @@ import { yeeterAbi } from '../abis/yeeter.js'; import { ContractData, L2Block } from '../l2_block/l2_block.js'; import { randomAppendOnlyTreeSnapshot, randomBytes, randomContractData } from '../l2_block/mocks.js'; import { L2BlockSource, L2BlockSourceSyncStatus } from '../l2_block/l2_block_source.js'; -import { createLogger } from '@aztec/foundation'; import { EthAddress } from '@aztec/ethereum.js/eth_address'; import { localhost } from 'viem/chains'; +import { createDebugLogger } from '@aztec/foundation'; /** * Pulls L2 blocks in a non-blocking manner and provides interface for their retrieval. @@ -37,7 +37,7 @@ export class Archiver implements L2BlockSource { private readonly publicClient: PublicClient, private readonly rollupAddress: EthAddress, private readonly yeeterAddress: EthAddress, - private readonly log = createLogger('Archiver'), + private readonly log = createDebugLogger('aztec:archiver'), ) {} /** diff --git a/yarn-project/p2p/src/client/mocks.ts b/yarn-project/p2p/src/client/mocks.ts index 72a09ab1589..98bc7eda8db 100644 --- a/yarn-project/p2p/src/client/mocks.ts +++ b/yarn-project/p2p/src/client/mocks.ts @@ -8,15 +8,11 @@ import { randomAppendOnlyTreeSnapshot, L2BlockSourceSyncStatus, } from '@aztec/archiver'; -import { Tx } from './tx.js'; +import { AccumulatedTxData, Tx } from './tx.js'; -export class MockTx implements Tx { - constructor(private _txId: Buffer = randomBytes(32)) {} - - get txId() { - return this._txId; - } -} +export const MockTx = () => { + return new Tx(AccumulatedTxData.random()); +}; export class MockBlockSource implements L2BlockSource { private l2Blocks: L2Block[]; diff --git a/yarn-project/p2p/src/client/p2p_client.ts b/yarn-project/p2p/src/client/p2p_client.ts index 79479ac771e..c847979a83f 100644 --- a/yarn-project/p2p/src/client/p2p_client.ts +++ b/yarn-project/p2p/src/client/p2p_client.ts @@ -2,9 +2,10 @@ import { L2Block, L2BlockSource, L2BlockDownloader } from '@aztec/archiver'; import { InMemoryTxPool } from '../tx_pool/memory_tx_pool.js'; import { TxPool } from '../tx_pool/index.js'; -import { AccumulatedTxData, Tx } from './tx.js'; +import { Tx } from './tx.js'; +import { createDebugLogger } from '@aztec/foundation'; -const TAKE_NUM = 10; +const TAKE_NUM = 1; /** * Enum defining the possible states of the p2p client. @@ -42,6 +43,12 @@ export interface P2P { * @returns A promise signalling the completion of the stop process. */ stop(): Promise; + + /** + * Indicates if the p2p client is ready for transaction submission. + * @returns A boolean flag indicating readiness. + */ + isReady(): Promise; } /** @@ -77,8 +84,13 @@ export class P2PCLient implements P2P { * In-memory P2P client constructor. * @param l2BlockSource - P2P client's source for fetching existing block data. * @param txPool - The client's instance of a transaction pool. Defaults to in-memory implementation. + * @param log - A logger. */ - constructor(private l2BlockSource: L2BlockSource, private txPool: TxPool = new InMemoryTxPool()) { + constructor( + private l2BlockSource: L2BlockSource, + private txPool: TxPool = new InMemoryTxPool(), + private log = createDebugLogger('aztec:p2p'), + ) { this.blockDownloader = new L2BlockDownloader(l2BlockSource, TAKE_NUM); } @@ -99,13 +111,15 @@ export class P2PCLient implements P2P { if (this.syncedBlockNum >= this.latestBlockNumberAtStart) { // if no blocks to be retrieved, go straight to running - this.currentState = P2PClientState.RUNNING; + this.setCurrentState(P2PClientState.RUNNING); this.syncPromise = Promise.resolve(); + this.log(`already synched to latest block ${this.latestBlockNumberAtStart}`); } else { - this.currentState = P2PClientState.SYNCHING; + this.setCurrentState(P2PClientState.SYNCHING); this.syncPromise = new Promise(resolve => { this.syncResolve = resolve; }); + this.log(`starting sync from ${this.syncedBlockNum}, latest block ${this.latestBlockNumberAtStart}`); } // start looking for further blocks @@ -116,7 +130,9 @@ export class P2PCLient implements P2P { } }; this.runningSyncPromise = blockProcess(); - this.blockDownloader.start(this.syncedBlockNum + 1); + const blockToDownloadFrom = this.syncedBlockNum + 1; + this.blockDownloader.start(blockToDownloadFrom); + this.log(`started block downloader from block ${blockToDownloadFrom}`); return this.syncPromise; } @@ -125,10 +141,11 @@ export class P2PCLient implements P2P { * 'ready' will now return 'false' and the running promise that keeps the client synced is interrupted. */ public async stop() { + this.log('stopping p2p client...'); this.stopping = true; await this.blockDownloader.stop(); await this.runningSyncPromise; - this.currentState = P2PClientState.STOPPED; + this.setCurrentState(P2PClientState.STOPPED); } /** @@ -144,11 +161,12 @@ export class P2PCLient implements P2P { * @param tx - The tx to verify. * @returns Empty promise. **/ - public sendTx(tx: Tx): Promise { - if (this.isReady()) { - this.txPool.addTxs([tx]); + public async sendTx(tx: Tx): Promise { + const ready = await this.isReady(); + if (!ready) { + throw new Error('P2P client not ready'); } - return Promise.resolve(); + this.txPool.addTxs([tx]); } /** @@ -156,7 +174,7 @@ export class P2PCLient implements P2P { * @returns True if the P2P client is ready to receive txs. */ public isReady() { - return this.currentState === P2PClientState.RUNNING; + return Promise.resolve(this.currentState === P2PClientState.RUNNING); } /** @@ -186,7 +204,7 @@ export class P2PCLient implements P2P { private reconcileTxPool(blocks: L2Block[]): Promise { for (let i = 0; i < blocks.length; i++) { const { newContracts } = blocks[i]; - this.txPool.deleteTxs(newContracts?.map((data: Buffer) => AccumulatedTxData.createTxId(data)) || []); + this.txPool.deleteTxs(newContracts?.map((data: Buffer) => Tx.createTxId(data)) || []); } return Promise.resolve(); } @@ -202,11 +220,21 @@ export class P2PCLient implements P2P { } await this.reconcileTxPool(blocks); this.syncedBlockNum = blocks[blocks.length - 1].number; + this.log(`synched to block ${this.syncedBlockNum}`); if (this.currentState === P2PClientState.SYNCHING && this.syncedBlockNum >= this.latestBlockNumberAtStart) { - this.currentState = P2PClientState.RUNNING; + this.setCurrentState(P2PClientState.RUNNING); if (this.syncResolve !== undefined) { this.syncResolve(); } } } + + /** + * Method to set the value of the current state. + * @param newState - New state value. + */ + private setCurrentState(newState: P2PClientState) { + this.currentState = newState; + this.log(`moved to state ${P2PClientState[this.currentState]}`); + } } diff --git a/yarn-project/p2p/src/client/tx.ts b/yarn-project/p2p/src/client/tx.ts index 190124c0873..3bca9829be8 100644 --- a/yarn-project/p2p/src/client/tx.ts +++ b/yarn-project/p2p/src/client/tx.ts @@ -1,33 +1,45 @@ +/* eslint-disable jsdoc/require-jsdoc */ import { randomBytes } from 'crypto'; import { Keccak } from 'sha3'; const hash = new Keccak(256); /** - * The interface of an L2 transaction. + * Accumulated data of an A3 transaction. */ -export interface Tx { - /** - * The id of the transaction. - */ - txId: Buffer; +export class AccumulatedTxData { + constructor( + public newCommitments: Buffer[], + public newNullifiers: Buffer[], + public privateCallStack: Buffer[], + public publicCallStack: Buffer[], + public l1MsgStack: Buffer[], + public newContracts: Buffer[], + public optionallyRevealedData: Buffer[], + public aggregationObject?: object, + public callCount?: number, + ) {} + + public static random() { + return new AccumulatedTxData( + [randomBytes(32)], + [randomBytes(32)], + [randomBytes(32)], + [randomBytes(32)], + [randomBytes(32)], + [randomBytes(32)], + [randomBytes(32)], + undefined, + undefined, + ); + } } /** - * Accumulated data of an A3 transaction. + * The interface of an L2 transaction. */ -export class AccumulatedTxData implements Tx { - constructor( - private aggregationObject?: object, - private callCount?: number, - private newCommitments: Buffer[] = [randomBytes(32)], - private newNullifiers: Buffer[] = [randomBytes(32)], - private privateCallStack: Buffer[] = [randomBytes(32)], - private publicCallStack: Buffer[] = [randomBytes(32)], - private l1MsgStack: Buffer[] = [randomBytes(32)], - private newContracts: Buffer[] = [randomBytes(32)], - private optionallyRevealedData: Buffer[] = [randomBytes(32)], - ) {} +export class Tx { + constructor(private txData: AccumulatedTxData) {} /** * Construct & return transaction ID. @@ -35,7 +47,7 @@ export class AccumulatedTxData implements Tx { * @returns The transaction's id. */ get txId() { - const constractTxData = this.newContracts[0]; + const constractTxData = this.txData.newContracts[0]; hash.reset(); return hash.update(constractTxData).digest(); } diff --git a/yarn-project/p2p/src/tx_pool/memory_tx_pool.ts b/yarn-project/p2p/src/tx_pool/memory_tx_pool.ts index eddb4e7e911..4d6ed9bd978 100644 --- a/yarn-project/p2p/src/tx_pool/memory_tx_pool.ts +++ b/yarn-project/p2p/src/tx_pool/memory_tx_pool.ts @@ -1,3 +1,4 @@ +import { createDebugLogger } from '@aztec/foundation'; import { Tx } from '../index.js'; import { TxPool } from './index.js'; @@ -24,8 +25,9 @@ export class InMemoryTxPool implements TxPool { /** * Class constructor for in-memory TxPool. Initiates our transaction pool as a JS Map. + * @param log - A logger. */ - constructor() { + constructor(private log = createDebugLogger('aztec:tx_pool')) { this.txs = new Map(); } @@ -44,6 +46,7 @@ export class InMemoryTxPool implements TxPool { * @param txs - An array of txs to be added to the pool. */ public addTxs(txs: Tx[]): void { + this.log(`Adding tx with id ${txs[0].txId.toString('hex')}`); txs.forEach(tx => this.txs.set(toBigInt(tx.txId), tx)); } diff --git a/yarn-project/public-client/src/aztec_node.test.ts b/yarn-project/public-client/src/aztec_node.test.ts new file mode 100644 index 00000000000..350a11d1f88 --- /dev/null +++ b/yarn-project/public-client/src/aztec_node.test.ts @@ -0,0 +1,32 @@ +/* eslint-disable jsdoc/require-jsdoc */ +// import { default as levelup } from 'levelup'; +// import { default as memdown } from 'memdown'; +import { EthAddress } from '@aztec/ethereum.js/eth_address'; +import { AccumulatedTxData, Tx } from '@aztec/p2p'; +import { AztecNode } from './index.js'; + +const ETHEREUM_HOST = 'http://localhost:8545/'; +const ROLLUP_ADDRESS = '0x5FbDB2315678afecb367f032d93F642f64180aa3'; +const YEETER_ADDRESS = '0xe7f1725E7734CE288F8367e1Bb143E90bb3F0512'; + +describe('AztecNode', () => { + it('should start and stop all services', async () => { + const node = new AztecNode(); + await node.init(ETHEREUM_HOST, EthAddress.fromString(ROLLUP_ADDRESS), EthAddress.fromString(YEETER_ADDRESS)); + const isReady = await node.isReady(); + expect(isReady).toBeTruthy(); + await node.stop(); + }); + + it('should accept a transaction', async () => { + const node = new AztecNode(); + await node.init(ETHEREUM_HOST, EthAddress.fromString(ROLLUP_ADDRESS), EthAddress.fromString(YEETER_ADDRESS)); + const isReady = await node.isReady(); + expect(isReady).toBeTruthy(); + const tx: Tx = new Tx(AccumulatedTxData.random()); + await node.sendTx(tx); + const txs = await node.getTxs(); + expect(txs.length).toBe(1); + expect(txs[0].txId).toEqual(tx.txId); + }); +}); diff --git a/yarn-project/public-client/src/index.ts b/yarn-project/public-client/src/index.ts index 69abb05510c..4e29f935006 100644 --- a/yarn-project/public-client/src/index.ts +++ b/yarn-project/public-client/src/index.ts @@ -4,6 +4,7 @@ import { L2BlockSource, Archiver } from '@aztec/archiver'; import { P2P, P2PCLient } from '@aztec/p2p'; import { MerkleTrees, WorldStateSynchroniser, ServerWorldStateSynchroniser } from '@aztec/world-state'; import { EthAddress } from '@aztec/ethereum.js/eth_address'; +import { Tx } from '@aztec/p2p'; /** * The public client. @@ -30,8 +31,8 @@ export class AztecNode { // give the block source to the P2P network and the world state synchroniser this.p2pClient = new P2PCLient(this.blockSource); - const db = levelup(memdown.MemDown()); - this.merkleTreeDB = new MerkleTrees(db); + const db = levelup(memdown()); + this.merkleTreeDB = await MerkleTrees.new(db); this.worldStateSynchroniser = new ServerWorldStateSynchroniser(this.merkleTreeDB, this.blockSource); // start both and wait for them to sync from the block source @@ -42,4 +43,61 @@ export class AztecNode { // create and start the sequencer // new Sequencer(this.blockSource, this.p2pClient, this.merkleTreeDB, this.publisher); } + + /** + * Method to determine if the node is ready to accept transactions. + * @returns - Flag indicating the readiness for tx submission. + */ + public async isReady() { + return (await this.p2pClient?.isReady()) ?? false; + } + + /** + * Method to request blocks. Will attempt to return all requested blocks but will return only those available. + * @param from - The start of the range of blocks to return. + * @param take - The number of blocks desired. + * @returns The blocks requested. + */ + public async getBlocks(from: number, take: number) { + this.verifyInitialised(); + return (await this.blockSource?.getL2Blocks(from, take)) ?? []; + } + + /** + * Method to submit a transaction to the p2p pool. + * @param tx - The transaction to be submitted. + */ + public async sendTx(tx: Tx) { + this.verifyInitialised(); + await this.p2pClient!.sendTx(tx); + } + + /** + * Method to stop the aztec node. + */ + public async stop() { + this.verifyInitialised(); + await this.p2pClient!.stop(); + await this.worldStateSynchroniser!.stop(); + await this.merkleTreeDB!.stop(); + await this.blockSource!.stop(); + } + + /** + * Method to retrieve pending txs. + * @returns - The pending txs. + */ + public async getTxs() { + return await this.p2pClient!.getTxs(); + } + + /** + * Method to verify that we are initialised, throws if not. + */ + private verifyInitialised() { + const invalid = [this.blockSource, this.merkleTreeDB, this.p2pClient, this.worldStateSynchroniser].filter(x => !x); + if (invalid.length) { + throw new Error('Aztec Node not initialised'); + } + } } diff --git a/yarn-project/world-state/src/synchroniser/server_world_state_synchroniser.ts b/yarn-project/world-state/src/synchroniser/server_world_state_synchroniser.ts index 148ad2c8e05..5179d239f58 100644 --- a/yarn-project/world-state/src/synchroniser/server_world_state_synchroniser.ts +++ b/yarn-project/world-state/src/synchroniser/server_world_state_synchroniser.ts @@ -1,6 +1,7 @@ import { WorldStateRunningState, WorldStateStatus, WorldStateSynchroniser } from './world_state_synchroniser.js'; import { MerkleTreeDb, MerkleTreeId } from '@aztec/merkle-tree'; import { L2BlockSource, L2BlockDownloader, L2Block } from '@aztec/archiver'; +import { createDebugLogger } from '@aztec/foundation'; /** * Synchronises the world state with the L2 blocks from a L2BlockSource. @@ -22,6 +23,7 @@ export class ServerWorldStateSynchroniser implements WorldStateSynchroniser { private l2BlockSource: L2BlockSource, maxQueueSize = 1000, pollIntervalMS = 10000, + private log = createDebugLogger('aztec:world_state'), ) { this.l2BlockDownloader = new L2BlockDownloader(l2BlockSource, maxQueueSize, pollIntervalMS); } @@ -44,15 +46,17 @@ export class ServerWorldStateSynchroniser implements WorldStateSynchroniser { // if there are blocks to be retrieved, go to a synching state if (from < this.latestBlockNumberAtStart) { - this.currentState = WorldStateRunningState.SYNCHING; + this.setCurrentState(WorldStateRunningState.SYNCHING); this.syncPromise = new Promise(resolve => { this.syncResolve = resolve; }); + this.log(`starting sync from ${from}, latest block ${this.latestBlockNumberAtStart}`); } else { // if no blocks to be retrieved, go straight to running - this.currentState = WorldStateRunningState.RUNNING; + this.setCurrentState(WorldStateRunningState.RUNNING); this.currentL2BlockNum = this.latestBlockNumberAtStart; this.syncPromise = Promise.resolve(); + this.log(`already synched to latest block at ${this.latestBlockNumberAtStart}`); } // start looking for further blocks @@ -64,6 +68,7 @@ export class ServerWorldStateSynchroniser implements WorldStateSynchroniser { }; this.runningPromise = blockProcess(); this.l2BlockDownloader.start(from); + this.log(`started block downloader from block ${from}`); return this.syncPromise; } @@ -71,10 +76,11 @@ export class ServerWorldStateSynchroniser implements WorldStateSynchroniser { * Stops the synchroniser. */ public async stop() { + this.log('stopping world state...'); this.stopping = true; await this.l2BlockDownloader.stop(); await this.runningPromise; - this.currentState = WorldStateRunningState.STOPPED; + this.setCurrentState(WorldStateRunningState.STOPPED); } /** @@ -104,17 +110,28 @@ export class ServerWorldStateSynchroniser implements WorldStateSynchroniser { * @param l2block - The L2 block to handle. */ private async handleL2Block(l2block: L2Block) { + this.log(`committing block ${l2block.number}`); await this.merkleTreeDb.appendLeaves(MerkleTreeId.CONTRACT_TREE, l2block.newContracts); await this.merkleTreeDb.commit(); + this.log(`committed block ${l2block.number} to world state`); this.currentL2BlockNum = l2block.number; if ( this.currentState === WorldStateRunningState.SYNCHING && this.currentL2BlockNum >= this.latestBlockNumberAtStart ) { - this.currentState = WorldStateRunningState.RUNNING; + this.setCurrentState(WorldStateRunningState.RUNNING); if (this.syncResolve !== undefined) { this.syncResolve(); } } } + + /** + * Method to set the value of the current state. + * @param newState - New state value. + */ + private setCurrentState(newState: WorldStateRunningState) { + this.currentState = newState; + this.log(`moved to state ${WorldStateRunningState[this.currentState]}`); + } } diff --git a/yarn-project/world-state/src/world-state-db/memory_world_state_db.ts b/yarn-project/world-state/src/world-state-db/memory_world_state_db.ts index c31c43deef0..c2aa0fa6aea 100644 --- a/yarn-project/world-state/src/world-state-db/memory_world_state_db.ts +++ b/yarn-project/world-state/src/world-state-db/memory_world_state_db.ts @@ -48,6 +48,17 @@ export class MerkleTrees implements MerkleTreeDb { this.jobQueue.start(); } + /** + * Method to asynchronously create and initialise a MerkleTrees instance. + * @param db - The db instance to use for data persistance. + * @returns - A fully initialised MerkleTrees instance. + */ + public static async new(db: levelup.LevelUp) { + const merkleTrees = new MerkleTrees(db); + await merkleTrees.init(); + return merkleTrees; + } + /** * Stops the job queue (waits for all jobs to finish). */ From 32f8944cdae4444d2efec7b2799dca8de27169b9 Mon Sep 17 00:00:00 2001 From: PhilWindle Date: Thu, 23 Mar 2023 09:56:10 +0000 Subject: [PATCH 29/36] WIP --- yarn-project/yarn.lock | 57 ++++++++++++++++++++++++------------------ 1 file changed, 33 insertions(+), 24 deletions(-) diff --git a/yarn-project/yarn.lock b/yarn-project/yarn.lock index faf80d9b1f6..4aedbb88475 100644 --- a/yarn-project/yarn.lock +++ b/yarn-project/yarn.lock @@ -1,3 +1,6 @@ +# This file is generated by running "yarn install" inside your project. +# Manual changes might be lost - proceed with caution! + __metadata: version: 6 cacheKey: 8 @@ -264,6 +267,12 @@ __metadata: levelup: ^5.1.1 memdown: ^6.1.1 sha256: ^0.2.0 + ts-jest: ^28.0.7 + ts-node: ^10.9.1 + tslib: ^2.4.0 + typescript: ^4.9.5 + languageName: unknown + linkType: soft "@aztec/noir-contracts@workspace:noir-contracts": version: 0.0.0-use.local @@ -990,9 +999,9 @@ __metadata: linkType: hard "@eslint-community/regexpp@npm:^4.4.0": - version: 4.4.0 - resolution: "@eslint-community/regexpp@npm:4.4.0" - checksum: 2d127af0c752b80e8a782eacfe996a86925d21de92da3ffc6f9e615e701145e44a62e26bdd88bfac2cd76779c39ba8d9875a91046ec5e7e5f23cb647c247ea6a + version: 4.4.1 + resolution: "@eslint-community/regexpp@npm:4.4.1" + checksum: db97d8d08e784147b55ab0dda5892503c1a0eebad94d1c4646d89a94f02ca70b25f05d8e021fc05a075e7eb312e03e21f63d84f0b327719f8cf3bb64e66917cb languageName: node linkType: hard @@ -1656,9 +1665,9 @@ __metadata: linkType: hard "@noir-lang/noir-source-resolver@npm:^1.1.0": - version: 1.1.0 - resolution: "@noir-lang/noir-source-resolver@npm:1.1.0" - checksum: c3077f6740e613fd7866715ba01053f9711cff47c1196a780ff7b2683a5e500d08791ac304515ccbe906d32cdabf658df6fc825c775bb7d181abbf16e87cee92 + version: 1.1.1 + resolution: "@noir-lang/noir-source-resolver@npm:1.1.1" + checksum: 43acc4c1a720ad0837db68bfac59efe58fe2b7467a8508807857aa738e3095d088547692efba5655f3e89e6c4747307c769e582d6ef5b4d454c7787090601a82 languageName: node linkType: hard @@ -3069,9 +3078,9 @@ __metadata: linkType: hard "electron-to-chromium@npm:^1.4.284": - version: 1.4.334 - resolution: "electron-to-chromium@npm:1.4.334" - checksum: 8092fd18e30c68f68b197f7c151c149806fe307210d86a74c0544e05540c49b3de17e48def6c04af7886cefb927c45910cc18fddc475c0ed17ff0a1ddbc94268 + version: 1.4.337 + resolution: "electron-to-chromium@npm:1.4.337" + checksum: b7da59afa5e3239f222c3e146d27757cef10bdcb4180f3f77d7a7d339d1ee7c99d0e281807fe47a865426995a3d1c06809743ca71dddc0aaf65e749e66a8be40 languageName: node linkType: hard @@ -5057,9 +5066,9 @@ __metadata: linkType: hard "js-sdsl@npm:^4.1.4": - version: 4.3.0 - resolution: "js-sdsl@npm:4.3.0" - checksum: ce908257cf6909e213af580af3a691a736f5ee8b16315454768f917a682a4ea0c11bde1b241bbfaecedc0eb67b72101b2c2df2ffaed32aed5d539fca816f054e + version: 4.4.0 + resolution: "js-sdsl@npm:4.4.0" + checksum: 7bb08a2d746ab7ff742720339aa006c631afe05e77d11eda988c1c35fae8e03e492e4e347e883e786e3ce6170685d4780c125619111f0730c11fdb41b04059c7 languageName: node linkType: hard @@ -5352,11 +5361,11 @@ __metadata: linkType: hard "marked@npm:^4.2.12": - version: 4.2.12 - resolution: "marked@npm:4.2.12" + version: 4.3.0 + resolution: "marked@npm:4.3.0" bin: marked: bin/marked.js - checksum: bd551cd61028ee639d4ca2ccdfcc5a6ba4227c1b143c4538f3cde27f569dcb57df8e6313560394645b418b84a7336c07ab1e438b89b6324c29d7d8cdd3102d63 + checksum: 0db6817893952c3ec710eb9ceafb8468bf5ae38cb0f92b7b083baa13d70b19774674be04db5b817681fa7c5c6a088f61300815e4dd75a59696f4716ad69f6260 languageName: node linkType: hard @@ -5448,11 +5457,11 @@ __metadata: linkType: hard "minimatch@npm:^7.1.3": - version: 7.4.2 - resolution: "minimatch@npm:7.4.2" + version: 7.4.3 + resolution: "minimatch@npm:7.4.3" dependencies: brace-expansion: ^2.0.1 - checksum: 9e341b04e69d5ab03e4206dcb61c8a158e3b8709628bf5e1a4eaa9f3b72c0ba925e24ad959b1f6ce6835caa5a927131d5087fae6836b69e7d99d7d5e63ef0bd8 + checksum: daa954231b6859e3ba0e5fbd2486986d3cae283bb69acb7ed3833c84a293f8d7edb8514360ea62c01426ba791446b2a1e1cc0d718bed15c0212cef35c59a6b95 languageName: node linkType: hard @@ -6154,8 +6163,8 @@ __metadata: linkType: hard "rollup@npm:^3.18.0": - version: 3.20.0 - resolution: "rollup@npm:3.20.0" + version: 3.20.1 + resolution: "rollup@npm:3.20.1" dependencies: fsevents: ~2.3.2 dependenciesMeta: @@ -6163,7 +6172,7 @@ __metadata: optional: true bin: rollup: dist/bin/rollup - checksum: ebf75f48eb81234f8233b4ed145b00841cefba26802d4f069f161247ffba085ca5bb165cc3cd662d9c36cfc135a67660dfff9088d3da2d2c6a70addc15f3233a + checksum: dc88f337133228311c4d52f005310f2b23ad6d0765b8909698aede1eecde32057ef2ae84e244fd27a45ff944f66f3c120d0b5e163c4642356d2d501df531b798 languageName: node linkType: hard @@ -6964,8 +6973,8 @@ __metadata: linkType: hard "viem@npm:^0.1.15": - version: 0.1.21 - resolution: "viem@npm:0.1.21" + version: 0.1.22 + resolution: "viem@npm:0.1.22" dependencies: "@noble/hashes": ^1.1.2 "@noble/secp256k1": ^1.7.1 @@ -6974,7 +6983,7 @@ __metadata: idna-uts46-hx: ^4.1.2 isomorphic-ws: ^5.0.0 ws: ^8.12.0 - checksum: ae7575d40db8e1f128c8f979ea550ece86444a0a198e7301a2b018b95d67942674a87752092982c1f036aae4355eb23682baf05dfb9464d7fa5c68c59db41a17 + checksum: 55ca47241c3e7b6a5720909955cbf003c598e2564db0e25dce2f954a3a7894057e1c1bc0e9dda30b1e8007861bc850704b02eed244a3fde96b3dc6ecb7bd77b4 languageName: node linkType: hard From ca8d49aaf44e7a440d5b19064b1e306c4b258c64 Mon Sep 17 00:00:00 2001 From: PhilWindle Date: Thu, 23 Mar 2023 10:03:43 +0000 Subject: [PATCH 30/36] WIP --- .../merkle-tree/src/indexed_tree/indexed_tree.test.ts | 6 ++---- .../merkle-tree/src/standard_tree/standard_tree.test.ts | 6 ++---- yarn-project/merkle-tree/src/test/test_suite.ts | 3 +-- yarn-project/public-client/src/aztec_node.test.ts | 3 --- .../synchroniser/server_world_state_synchroniser.test.ts | 4 +++- 5 files changed, 8 insertions(+), 14 deletions(-) diff --git a/yarn-project/merkle-tree/src/indexed_tree/indexed_tree.test.ts b/yarn-project/merkle-tree/src/indexed_tree/indexed_tree.test.ts index a78921a0d26..518f19f5fe6 100644 --- a/yarn-project/merkle-tree/src/indexed_tree/indexed_tree.test.ts +++ b/yarn-project/merkle-tree/src/indexed_tree/indexed_tree.test.ts @@ -1,10 +1,8 @@ -/* eslint-disable jsdoc/require-jsdoc */ import { default as levelup } from 'levelup'; -import { default as memdown } from 'memdown'; import { toBufferBE } from '../bigint_buffer.js'; import { Hasher, Pedersen, SiblingPath } from '../index.js'; import { IndexedTree } from './indexed_tree.js'; -import { merkleTreeTestSuite } from '../test/test_suite.js'; +import { merkleTreeTestSuite, createMemDown } from '../test/test_suite.js'; const createDb = async (levelUp: levelup.LevelUp, hasher: Hasher, name: string, depth: number) => { return await IndexedTree.new(levelUp, hasher, name, depth); @@ -29,7 +27,7 @@ describe('IndexedMerkleTreeSpecific', () => { it('produces the correct roots and sibling paths', async () => { // Create a depth-3 indexed merkle tree - const db = levelup(memdown()); + const db = levelup(createMemDown()); const tree = await createDb(db, pedersen, 'test', 3); /** diff --git a/yarn-project/merkle-tree/src/standard_tree/standard_tree.test.ts b/yarn-project/merkle-tree/src/standard_tree/standard_tree.test.ts index a889cfc1158..d7119a60227 100644 --- a/yarn-project/merkle-tree/src/standard_tree/standard_tree.test.ts +++ b/yarn-project/merkle-tree/src/standard_tree/standard_tree.test.ts @@ -1,11 +1,9 @@ -/* eslint-disable jsdoc/require-jsdoc */ import { default as levelup } from 'levelup'; -import { default as memdown } from 'memdown'; import { Hasher } from '../hasher.js'; import { SiblingPath } from '../index.js'; import { Pedersen } from '../pedersen.js'; import { StandardMerkleTree } from './standard_tree.js'; -import { merkleTreeTestSuite } from '../test/test_suite.js'; +import { merkleTreeTestSuite, createMemDown } from '../test/test_suite.js'; const createDb = async (levelUp: levelup.LevelUp, hasher: Hasher, name: string, depth: number) => { return await StandardMerkleTree.new(levelUp, hasher, name, depth); @@ -29,7 +27,7 @@ describe('StandardMerkleTreeSpecific', () => { } }); it('should have correct root and sibling paths', async () => { - const db = levelup(memdown()); + const db = levelup(createMemDown()); const tree = await createDb(db, pedersen, 'test', 2); const zeroTreeLeafHash = StandardMerkleTree.ZERO_ELEMENT; diff --git a/yarn-project/merkle-tree/src/test/test_suite.ts b/yarn-project/merkle-tree/src/test/test_suite.ts index d846d75ff10..0fce9239ee1 100644 --- a/yarn-project/merkle-tree/src/test/test_suite.ts +++ b/yarn-project/merkle-tree/src/test/test_suite.ts @@ -1,11 +1,10 @@ -/* eslint-disable jsdoc/require-jsdoc */ import { default as levelup } from 'levelup'; import { default as memdown } from 'memdown'; import { Hasher, MerkleTree, Pedersen, SiblingPath } from '../index.js'; /* eslint-disable @typescript-eslint/ban-ts-comment */ // @ts-ignore -const createMemDown = () => memdown(); +export const createMemDown = () => memdown(); const expectSameTrees = async (tree1: MerkleTree, tree2: MerkleTree) => { const size = tree1.getNumLeaves(); diff --git a/yarn-project/public-client/src/aztec_node.test.ts b/yarn-project/public-client/src/aztec_node.test.ts index 350a11d1f88..ba2fc950e08 100644 --- a/yarn-project/public-client/src/aztec_node.test.ts +++ b/yarn-project/public-client/src/aztec_node.test.ts @@ -1,6 +1,3 @@ -/* eslint-disable jsdoc/require-jsdoc */ -// import { default as levelup } from 'levelup'; -// import { default as memdown } from 'memdown'; import { EthAddress } from '@aztec/ethereum.js/eth_address'; import { AccumulatedTxData, Tx } from '@aztec/p2p'; import { AztecNode } from './index.js'; diff --git a/yarn-project/world-state/src/synchroniser/server_world_state_synchroniser.test.ts b/yarn-project/world-state/src/synchroniser/server_world_state_synchroniser.test.ts index 07bfbba9629..f84409a894c 100644 --- a/yarn-project/world-state/src/synchroniser/server_world_state_synchroniser.test.ts +++ b/yarn-project/world-state/src/synchroniser/server_world_state_synchroniser.test.ts @@ -1,4 +1,3 @@ -/* eslint-disable jsdoc/require-jsdoc */ import { ServerWorldStateSynchroniser } from './server_world_state_synchroniser.js'; import { L2BlockSource, L2BlockSourceSyncStatus, L2Block } from '@aztec/archiver'; import { WorldStateRunningState } from './world_state_synchroniser.js'; @@ -6,6 +5,9 @@ import { Pedersen, MerkleTreeDb, MerkleTreeId, SiblingPath, StandardMerkleTree } import { sleep } from '@aztec/foundation'; import { jest } from '@jest/globals'; +/** + * Generic mock implementation. + */ type Mockify = { [P in keyof T]: jest.Mock; }; From 1cfe8014df71c6bcb4761d7b5eca7f00f35e1544 Mon Sep 17 00:00:00 2001 From: PhilWindle Date: Thu, 23 Mar 2023 10:09:42 +0000 Subject: [PATCH 31/36] WIP --- .../archiver/src/archiver/archiver.test.ts | 13 +++++++++---- .../p2p/src/client/p2p_client.test.ts | 19 ++++++++++--------- yarn-project/p2p/src/tx_pool/tx_pool.test.ts | 4 ++-- 3 files changed, 21 insertions(+), 15 deletions(-) diff --git a/yarn-project/archiver/src/archiver/archiver.test.ts b/yarn-project/archiver/src/archiver/archiver.test.ts index 69778b7c4b9..138e8575d47 100644 --- a/yarn-project/archiver/src/archiver/archiver.test.ts +++ b/yarn-project/archiver/src/archiver/archiver.test.ts @@ -1,12 +1,13 @@ +import { EthAddress } from '@aztec/ethereum.js/eth_address'; import { jest } from '@jest/globals'; -import { getAddress, PublicClient } from 'viem'; +import { PublicClient } from 'viem'; import { Archiver } from './archiver.js'; jest.mock('viem'); describe('Archiver', () => { - const rollupAddress = getAddress('0x0000000000000000000000000000000000000000'); - const yeeterAddress = getAddress('0x0000000000000000000000000000000000000000'); + const rollupAddress = '0x0000000000000000000000000000000000000000'; + const yeeterAddress = '0x0000000000000000000000000000000000000000'; let publicClient: PublicClient; beforeEach(() => { @@ -35,7 +36,11 @@ describe('Archiver', () => { }); it('can start, sync and stop', async () => { - const archiver = new Archiver(publicClient, rollupAddress, yeeterAddress); + const archiver = new Archiver( + publicClient, + EthAddress.fromString(rollupAddress), + EthAddress.fromString(yeeterAddress), + ); let syncStatus = await archiver.getSyncStatus(); let latestBlockNum = await archiver.getLatestBlockNum(); expect(syncStatus).toStrictEqual({ diff --git a/yarn-project/p2p/src/client/p2p_client.test.ts b/yarn-project/p2p/src/client/p2p_client.test.ts index 66afd9f0e0d..23831004bbc 100644 --- a/yarn-project/p2p/src/client/p2p_client.test.ts +++ b/yarn-project/p2p/src/client/p2p_client.test.ts @@ -30,38 +30,39 @@ describe('In-Memory P2P Client', () => { it('can start & stop', async () => { const client = new P2PCLient(blockSource, txPool); - expect(client.isReady()).toEqual(false); + expect(await client.isReady()).toEqual(false); await client.start(); - expect(client.isReady()).toEqual(true); + expect(await client.isReady()).toEqual(true); await client.stop(); - expect(client.isReady()).toEqual(false); + expect(await client.isReady()).toEqual(false); }); it('adds txs to pool', async () => { const client = new P2PCLient(blockSource, txPool); await client.start(); - const tx1 = new MockTx(); - const tx2 = new MockTx(); + const tx1 = MockTx(); + const tx2 = MockTx(); await client.sendTx(tx1); await client.sendTx(tx2); expect(txPool.addTxs).toHaveBeenCalledTimes(2); + await client.stop(); }); it('rejects txs after being stopped', async () => { const client = new P2PCLient(blockSource, txPool); await client.start(); - const tx1 = new MockTx(); - const tx2 = new MockTx(); + const tx1 = MockTx(); + const tx2 = MockTx(); await client.sendTx(tx1); await client.sendTx(tx2); expect(txPool.addTxs).toHaveBeenCalledTimes(2); await client.stop(); - const tx3 = new MockTx(); - await client.sendTx(tx3); + const tx3 = MockTx(); + await expect(client.sendTx(tx3)).rejects.toThrow(); expect(txPool.addTxs).toHaveBeenCalledTimes(2); }); }); diff --git a/yarn-project/p2p/src/tx_pool/tx_pool.test.ts b/yarn-project/p2p/src/tx_pool/tx_pool.test.ts index 974320f8190..1470b007fb2 100644 --- a/yarn-project/p2p/src/tx_pool/tx_pool.test.ts +++ b/yarn-project/p2p/src/tx_pool/tx_pool.test.ts @@ -4,7 +4,7 @@ import { InMemoryTxPool } from './index.js'; describe('In-Memory TX pool', () => { it('Adds txs to the pool', () => { const pool = new InMemoryTxPool(); - const tx1 = new MockTx(); + const tx1 = MockTx(); pool.addTxs([tx1]); const poolTx = pool.getTx(tx1.txId); @@ -13,7 +13,7 @@ describe('In-Memory TX pool', () => { it('Removes txs from the pool', () => { const pool = new InMemoryTxPool(); - const tx1 = new MockTx(); + const tx1 = MockTx(); pool.addTxs([tx1]); pool.deleteTxs([tx1.txId]); From f1cb1b08fbc9a6cef39af81912c0a3d19d45e663 Mon Sep 17 00:00:00 2001 From: PhilWindle Date: Thu, 23 Mar 2023 10:15:01 +0000 Subject: [PATCH 32/36] Renamed public client --- yarn-project/{public-client => aztec-node}/.dockerignore | 0 yarn-project/{public-client => aztec-node}/.eslintrc.cjs | 0 yarn-project/{public-client => aztec-node}/.gitignore | 0 yarn-project/{public-client => aztec-node}/Dockerfile | 8 ++++---- yarn-project/aztec-node/README.md | 1 + yarn-project/{public-client => aztec-node}/package.json | 4 ++-- .../{public-client => aztec-node}/src/aztec_node.test.ts | 0 yarn-project/{public-client => aztec-node}/src/index.ts | 6 +++++- .../{public-client => aztec-node}/tsconfig.dest.json | 0 yarn-project/{public-client => aztec-node}/tsconfig.json | 0 yarn-project/public-client/README.md | 1 - 11 files changed, 12 insertions(+), 8 deletions(-) rename yarn-project/{public-client => aztec-node}/.dockerignore (100%) rename yarn-project/{public-client => aztec-node}/.eslintrc.cjs (100%) rename yarn-project/{public-client => aztec-node}/.gitignore (100%) rename yarn-project/{public-client => aztec-node}/Dockerfile (57%) create mode 100644 yarn-project/aztec-node/README.md rename yarn-project/{public-client => aztec-node}/package.json (95%) rename yarn-project/{public-client => aztec-node}/src/aztec_node.test.ts (100%) rename yarn-project/{public-client => aztec-node}/src/index.ts (95%) rename yarn-project/{public-client => aztec-node}/tsconfig.dest.json (100%) rename yarn-project/{public-client => aztec-node}/tsconfig.json (100%) delete mode 100644 yarn-project/public-client/README.md diff --git a/yarn-project/public-client/.dockerignore b/yarn-project/aztec-node/.dockerignore similarity index 100% rename from yarn-project/public-client/.dockerignore rename to yarn-project/aztec-node/.dockerignore diff --git a/yarn-project/public-client/.eslintrc.cjs b/yarn-project/aztec-node/.eslintrc.cjs similarity index 100% rename from yarn-project/public-client/.eslintrc.cjs rename to yarn-project/aztec-node/.eslintrc.cjs diff --git a/yarn-project/public-client/.gitignore b/yarn-project/aztec-node/.gitignore similarity index 100% rename from yarn-project/public-client/.gitignore rename to yarn-project/aztec-node/.gitignore diff --git a/yarn-project/public-client/Dockerfile b/yarn-project/aztec-node/Dockerfile similarity index 57% rename from yarn-project/public-client/Dockerfile rename to yarn-project/aztec-node/Dockerfile index f376fd807bf..1cf44789767 100644 --- a/yarn-project/public-client/Dockerfile +++ b/yarn-project/aztec-node/Dockerfile @@ -1,7 +1,7 @@ FROM 278380418400.dkr.ecr.eu-west-2.amazonaws.com/yarn-project-base AS builder -COPY public-client public-client -WORKDIR /usr/src/yarn-project/public-client +COPY aztec-node aztec-node +WORKDIR /usr/src/yarn-project/aztec-node RUN yarn build && yarn formatting && yarn test # Prune dev dependencies. See comment in base image. @@ -9,6 +9,6 @@ RUN yarn cache clean RUN yarn workspaces focus --production > /dev/null FROM node:18-alpine -COPY --from=builder /usr/src/yarn-project/public-client /usr/src/yarn-project/public-client -WORKDIR /usr/src/yarn-project/public-client +COPY --from=builder /usr/src/yarn-project/aztec-node /usr/src/yarn-project/aztec-node +WORKDIR /usr/src/yarn-project/aztec-node ENTRYPOINT ["yarn"] \ No newline at end of file diff --git a/yarn-project/aztec-node/README.md b/yarn-project/aztec-node/README.md new file mode 100644 index 00000000000..089629c6ea7 --- /dev/null +++ b/yarn-project/aztec-node/README.md @@ -0,0 +1 @@ +# Aztec Node diff --git a/yarn-project/public-client/package.json b/yarn-project/aztec-node/package.json similarity index 95% rename from yarn-project/public-client/package.json rename to yarn-project/aztec-node/package.json index bc068d4fe75..03ef382ccdb 100644 --- a/yarn-project/public-client/package.json +++ b/yarn-project/aztec-node/package.json @@ -1,12 +1,12 @@ { - "name": "@aztec/public-client", + "name": "@aztec/aztec-node", "version": "0.0.0", "main": "dest/index.js", "type": "module", "exports": "./dest/index.js", "typedoc": { "entryPoint": "./src/index.ts", - "displayName": "Public Client", + "displayName": "Aztec Node", "tsconfig": "./tsconfig.dest.json" }, "scripts": { diff --git a/yarn-project/public-client/src/aztec_node.test.ts b/yarn-project/aztec-node/src/aztec_node.test.ts similarity index 100% rename from yarn-project/public-client/src/aztec_node.test.ts rename to yarn-project/aztec-node/src/aztec_node.test.ts diff --git a/yarn-project/public-client/src/index.ts b/yarn-project/aztec-node/src/index.ts similarity index 95% rename from yarn-project/public-client/src/index.ts rename to yarn-project/aztec-node/src/index.ts index 4e29f935006..34dbbc7899a 100644 --- a/yarn-project/public-client/src/index.ts +++ b/yarn-project/aztec-node/src/index.ts @@ -6,6 +6,10 @@ import { MerkleTrees, WorldStateSynchroniser, ServerWorldStateSynchroniser } fro import { EthAddress } from '@aztec/ethereum.js/eth_address'; import { Tx } from '@aztec/p2p'; +/* eslint-disable @typescript-eslint/ban-ts-comment */ +// @ts-ignore +export const createMemDown = () => memdown(); + /** * The public client. */ @@ -31,7 +35,7 @@ export class AztecNode { // give the block source to the P2P network and the world state synchroniser this.p2pClient = new P2PCLient(this.blockSource); - const db = levelup(memdown()); + const db = levelup(createMemDown()); this.merkleTreeDB = await MerkleTrees.new(db); this.worldStateSynchroniser = new ServerWorldStateSynchroniser(this.merkleTreeDB, this.blockSource); diff --git a/yarn-project/public-client/tsconfig.dest.json b/yarn-project/aztec-node/tsconfig.dest.json similarity index 100% rename from yarn-project/public-client/tsconfig.dest.json rename to yarn-project/aztec-node/tsconfig.dest.json diff --git a/yarn-project/public-client/tsconfig.json b/yarn-project/aztec-node/tsconfig.json similarity index 100% rename from yarn-project/public-client/tsconfig.json rename to yarn-project/aztec-node/tsconfig.json diff --git a/yarn-project/public-client/README.md b/yarn-project/public-client/README.md deleted file mode 100644 index 9ea41167a79..00000000000 --- a/yarn-project/public-client/README.md +++ /dev/null @@ -1 +0,0 @@ -# Public Client From a2823294193878e2148131f07458ab903edccaeb Mon Sep 17 00:00:00 2001 From: PhilWindle Date: Thu, 23 Mar 2023 10:19:39 +0000 Subject: [PATCH 33/36] Removed serialisation code from merkle tree project --- yarn-project/merkle-tree/package.json | 1 + yarn-project/merkle-tree/src/bigint_buffer.ts | 51 ---------------- .../src/indexed_tree/indexed_tree.test.ts | 2 +- .../src/indexed_tree/indexed_tree.ts | 2 +- yarn-project/merkle-tree/src/serialise.ts | 58 ------------------- .../src/sibling_path/sibling_path.ts | 2 +- .../src/standard_tree/standard_tree.ts | 2 +- yarn-project/merkle-tree/tsconfig.dest.json | 3 +- yarn-project/merkle-tree/tsconfig.json | 1 + yarn-project/yarn.lock | 26 +-------- 10 files changed, 11 insertions(+), 137 deletions(-) delete mode 100644 yarn-project/merkle-tree/src/bigint_buffer.ts delete mode 100644 yarn-project/merkle-tree/src/serialise.ts diff --git a/yarn-project/merkle-tree/package.json b/yarn-project/merkle-tree/package.json index 1fec0ddc593..7315b35f600 100644 --- a/yarn-project/merkle-tree/package.json +++ b/yarn-project/merkle-tree/package.json @@ -24,6 +24,7 @@ "rootDir": "./src" }, "dependencies": { + "@aztec/foundation": "workspace:^", "levelup": "^5.1.1", "memdown": "^6.1.1", "sha256": "^0.2.0", diff --git a/yarn-project/merkle-tree/src/bigint_buffer.ts b/yarn-project/merkle-tree/src/bigint_buffer.ts deleted file mode 100644 index 6347b952d64..00000000000 --- a/yarn-project/merkle-tree/src/bigint_buffer.ts +++ /dev/null @@ -1,51 +0,0 @@ -/** - * Convert a little-endian buffer into a BigInt. - * @param buf - The little-endian buffer to convert. - * @returns A BigInt with the little-endian representation of buf. - */ -export function toBigIntLE(buf: Buffer): bigint { - const reversed = Buffer.from(buf); - reversed.reverse(); - const hex = reversed.toString('hex'); - if (hex.length === 0) { - return BigInt(0); - } - return BigInt(`0x${hex}`); -} - -/** - * Convert a big-endian buffer into a BigInt. - * @param buf - The big-endian buffer to convert. - * @returns A BigInt with the big-endian representation of buf. - */ -export function toBigIntBE(buf: Buffer): bigint { - const hex = buf.toString('hex'); - if (hex.length === 0) { - return BigInt(0); - } - return BigInt(`0x${hex}`); -} - -/** - * Convert a BigInt to a little-endian buffer. - * @param num - The BigInt to convert. - * @param width - The number of bytes that the resulting buffer should be. - * @returns A little-endian buffer representation of num. - */ -export function toBufferLE(num: bigint, width: number): Buffer { - const hex = num.toString(16); - const buffer = Buffer.from(hex.padStart(width * 2, '0').slice(0, width * 2), 'hex'); - buffer.reverse(); - return buffer; -} - -/** - * Convert a BigInt to a big-endian buffer. - * @param num - The BigInt to convert. - * @param width - The number of bytes that the resulting buffer should be. - * @returns A big-endian buffer representation of num. - */ -export function toBufferBE(num: bigint, width: number): Buffer { - const hex = num.toString(16); - return Buffer.from(hex.padStart(width * 2, '0').slice(0, width * 2), 'hex'); -} diff --git a/yarn-project/merkle-tree/src/indexed_tree/indexed_tree.test.ts b/yarn-project/merkle-tree/src/indexed_tree/indexed_tree.test.ts index 518f19f5fe6..dc09089aece 100644 --- a/yarn-project/merkle-tree/src/indexed_tree/indexed_tree.test.ts +++ b/yarn-project/merkle-tree/src/indexed_tree/indexed_tree.test.ts @@ -1,8 +1,8 @@ import { default as levelup } from 'levelup'; -import { toBufferBE } from '../bigint_buffer.js'; import { Hasher, Pedersen, SiblingPath } from '../index.js'; import { IndexedTree } from './indexed_tree.js'; import { merkleTreeTestSuite, createMemDown } from '../test/test_suite.js'; +import { toBufferBE } from '@aztec/foundation'; const createDb = async (levelUp: levelup.LevelUp, hasher: Hasher, name: string, depth: number) => { return await IndexedTree.new(levelUp, hasher, name, depth); diff --git a/yarn-project/merkle-tree/src/indexed_tree/indexed_tree.ts b/yarn-project/merkle-tree/src/indexed_tree/indexed_tree.ts index d02a73a100b..07cd0350aab 100644 --- a/yarn-project/merkle-tree/src/indexed_tree/indexed_tree.ts +++ b/yarn-project/merkle-tree/src/indexed_tree/indexed_tree.ts @@ -1,5 +1,5 @@ import { LevelUp } from 'levelup'; -import { toBigIntBE, toBufferBE } from '../bigint_buffer.js'; +import { toBigIntBE, toBufferBE } from '@aztec/foundation'; import { MerkleTree } from '../merkle_tree.js'; import { SiblingPath } from '../sibling_path/sibling_path.js'; import { StandardMerkleTree } from '../standard_tree/standard_tree.js'; diff --git a/yarn-project/merkle-tree/src/serialise.ts b/yarn-project/merkle-tree/src/serialise.ts deleted file mode 100644 index a0a16c30eb8..00000000000 --- a/yarn-project/merkle-tree/src/serialise.ts +++ /dev/null @@ -1,58 +0,0 @@ -/** - * Concatenates buffers and prefixes them with the resulting length. - * @param arr - An array of buffers to serialize to a vector. - * @returns A vector containing the length of the array, followed by the concatenated buffers. - */ -export function serializeBufferArrayToVector(arr: Buffer[]): Buffer { - const lengthBuf = Buffer.alloc(4); - lengthBuf.writeUInt32BE(arr.length, 0); - return Buffer.concat([lengthBuf, ...arr]); -} - -/** - * Extracts a buffer from a vector and returns the buffer and the amount of bytes advanced. - * @param vector - A vector from which we extract the buffer. - * @param offset - An offset from which to start extracting the buffer. - * @returns Extracted buffer and the amount of bytes advanced. - */ -export function deserializeBufferFromVector(vector: Buffer, offset = 0) { - const length = vector.readUInt32BE(offset); - const adv = 4 + length; - return { elem: vector.slice(offset + 4, offset + adv), adv }; -} - -/** - * Deserializes elements from a vector using the provided deserialization function and returns the elements as array. - * @param deserialize - A function used to deserialize the elements of the array. - * @param vector - A vector from which to extract the elements. - * @param offset - An offset from which to start extracting the elements. - * @returns An array of elements and the amount of bytes advanced. - */ -export function deserializeArrayFromVector( - deserialize: ( - buf: Buffer, - offset: number, - ) => { - /** - * A deserialized element. - */ - elem: T; - /** - * An amount of bytes advanced. - */ - adv: number; - }, - vector: Buffer, - offset = 0, -) { - let pos = offset; - const size = vector.readUInt32BE(pos); - pos += 4; - const arr = new Array(size); - for (let i = 0; i < size; ++i) { - const { elem, adv } = deserialize(vector, pos); - pos += adv; - arr[i] = elem; - } - return { elem: arr, adv: pos - offset }; -} diff --git a/yarn-project/merkle-tree/src/sibling_path/sibling_path.ts b/yarn-project/merkle-tree/src/sibling_path/sibling_path.ts index 56179d0eb6b..6cb15f36523 100644 --- a/yarn-project/merkle-tree/src/sibling_path/sibling_path.ts +++ b/yarn-project/merkle-tree/src/sibling_path/sibling_path.ts @@ -1,5 +1,5 @@ import { Pedersen } from '../pedersen.js'; -import { deserializeArrayFromVector, serializeBufferArrayToVector } from '../serialise.js'; +import { deserializeArrayFromVector, serializeBufferArrayToVector } from '@aztec/foundation'; /** * Contains functionality to compute and serialize/deserialize a sibling path. diff --git a/yarn-project/merkle-tree/src/standard_tree/standard_tree.ts b/yarn-project/merkle-tree/src/standard_tree/standard_tree.ts index a81fd8a9642..7ac8418b857 100644 --- a/yarn-project/merkle-tree/src/standard_tree/standard_tree.ts +++ b/yarn-project/merkle-tree/src/standard_tree/standard_tree.ts @@ -2,7 +2,7 @@ import { LevelUp, LevelUpChain } from 'levelup'; import { SiblingPath } from '../sibling_path/sibling_path.js'; import { Hasher } from '../hasher.js'; import { MerkleTree } from '../merkle_tree.js'; -import { toBufferLE, toBigIntLE } from '../bigint_buffer.js'; +import { toBufferLE, toBigIntLE } from '@aztec/foundation'; const MAX_DEPTH = 32; diff --git a/yarn-project/merkle-tree/tsconfig.dest.json b/yarn-project/merkle-tree/tsconfig.dest.json index 965aaa1c433..270bf9b6ea3 100644 --- a/yarn-project/merkle-tree/tsconfig.dest.json +++ b/yarn-project/merkle-tree/tsconfig.dest.json @@ -1,4 +1,5 @@ { "extends": ".", - "exclude": ["**/*.test.*", "**/fixtures/*"] + "exclude": ["**/*.test.*", "**/fixtures/*"], + "references": [{ "path": "../foundation/tsconfig.dest.json" }] } diff --git a/yarn-project/merkle-tree/tsconfig.json b/yarn-project/merkle-tree/tsconfig.json index f67ddec9fd6..43f4a4dda44 100644 --- a/yarn-project/merkle-tree/tsconfig.json +++ b/yarn-project/merkle-tree/tsconfig.json @@ -5,5 +5,6 @@ "rootDir": "src", "tsBuildInfoFile": ".tsbuildinfo" }, + "references": [{ "path": "../foundation/tsconfig.dest.json" }], "include": ["src"] } diff --git a/yarn-project/yarn.lock b/yarn-project/yarn.lock index 4aedbb88475..6f27a8298f4 100644 --- a/yarn-project/yarn.lock +++ b/yarn-project/yarn.lock @@ -256,6 +256,7 @@ __metadata: resolution: "@aztec/merkle-tree@workspace:merkle-tree" dependencies: "@aztec/eslint-config": "workspace:^" + "@aztec/foundation": "workspace:^" "@jest/globals": ^29.4.3 "@rushstack/eslint-patch": ^1.1.4 "@types/jest": ^29.4.0 @@ -294,7 +295,7 @@ __metadata: languageName: unknown linkType: soft -"@aztec/p2p@workspace:^, @aztec/p2p@workspace:p2p": +"@aztec/p2p@workspace:p2p": version: 0.0.0-use.local resolution: "@aztec/p2p@workspace:p2p" dependencies: @@ -339,27 +340,6 @@ __metadata: languageName: unknown linkType: soft -"@aztec/public-client@workspace:public-client": - version: 0.0.0-use.local - resolution: "@aztec/public-client@workspace:public-client" - dependencies: - "@aztec/archiver": "workspace:^" - "@aztec/eslint-config": "workspace:^" - "@aztec/ethereum.js": "workspace:^" - "@aztec/p2p": "workspace:^" - "@aztec/world-state": "workspace:^" - "@jest/globals": ^29.4.3 - "@rushstack/eslint-patch": ^1.1.4 - "@types/jest": ^29.4.0 - "@types/node": ^18.7.23 - jest: ^28.1.3 - ts-jest: ^28.0.7 - ts-node: ^10.9.1 - tslib: ^2.4.0 - typescript: ^4.9.5 - languageName: unknown - linkType: soft - "@aztec/sequencer-client@workspace:sequencer-client": version: 0.0.0-use.local resolution: "@aztec/sequencer-client@workspace:sequencer-client" @@ -394,7 +374,7 @@ __metadata: languageName: unknown linkType: soft -"@aztec/world-state@workspace:^, @aztec/world-state@workspace:world-state": +"@aztec/world-state@workspace:world-state": version: 0.0.0-use.local resolution: "@aztec/world-state@workspace:world-state" dependencies: From 3b9fd04b643d75d12e11bd973990df6c21244157 Mon Sep 17 00:00:00 2001 From: PhilWindle Date: Thu, 23 Mar 2023 10:22:22 +0000 Subject: [PATCH 34/36] WIP --- README.md | 2 +- bootstrap.sh | 2 +- build_manifest.json | 8 ++++---- build_manifest.sh | 2 +- yarn-project/package.json | 2 +- yarn-project/typedoc.json | 2 +- yarn-project/yarn-project-base/Dockerfile | 2 +- 7 files changed, 10 insertions(+), 10 deletions(-) diff --git a/README.md b/README.md index 4b17b0aa598..69247931a83 100644 --- a/README.md +++ b/README.md @@ -11,6 +11,6 @@ The Aztec 3 system consists of the following sub projects. - `key-store` - `p2p` - `prover-client` -- `public-client` +- `aztec-node` - `sequencer-client` - `wallet` diff --git a/bootstrap.sh b/bootstrap.sh index a3202868c7e..1c3df7bbcd6 100755 --- a/bootstrap.sh +++ b/bootstrap.sh @@ -54,7 +54,7 @@ PROJECTS=( "yarn-project/merkle-tree:yarn build" "yarn-project/p2p:yarn build" # "yarn-project/prover-client:yarn build" - "yarn-project/public-client:yarn build" + "yarn-project/aztec-node:yarn build" # "yarn-project/sequencer-client:yarn build" # "yarn-project/wallet:yarn build" "yarn-project/world-state:yarn build" diff --git a/build_manifest.json b/build_manifest.json index 2671ec3b708..f28580e2a5d 100644 --- a/build_manifest.json +++ b/build_manifest.json @@ -122,11 +122,11 @@ "rebuildPatterns": ["^yarn-project/prover-client/"], "dependencies": ["yarn-project-base"] }, - "public-client": { + "aztec-node": { "buildDir": "yarn-project", - "projectDir": "yarn-project/public-client", - "dockerfile": "public-client/Dockerfile", - "rebuildPatterns": ["^yarn-project/public-client/"], + "projectDir": "yarn-project/aztec-node", + "dockerfile": "aztec-node/Dockerfile", + "rebuildPatterns": ["^yarn-project/aztec-node/"], "dependencies": ["yarn-project-base"] }, "sequencer-client": { diff --git a/build_manifest.sh b/build_manifest.sh index 820b6d9ba6e..ebe59c4e914 100755 --- a/build_manifest.sh +++ b/build_manifest.sh @@ -22,7 +22,7 @@ PROJECTS=( # merkle-tree:yarn-project # p2p:yarn-project # prover-client:yarn-project - # public-client:yarn-project + # aztec-node:yarn-project # sequencer-client:yarn-project # wallet:yarn-project # world-state:yarn-project diff --git a/yarn-project/package.json b/yarn-project/package.json index 4e8aec77eef..4afaad7811a 100644 --- a/yarn-project/package.json +++ b/yarn-project/package.json @@ -24,7 +24,7 @@ "p2p", "prettier-config", "prover-client", - "public-client", + "aztec-node", "sequencer-client", "wallet", "world-state" diff --git a/yarn-project/typedoc.json b/yarn-project/typedoc.json index caf8497b4a8..a15ecf7af3a 100644 --- a/yarn-project/typedoc.json +++ b/yarn-project/typedoc.json @@ -12,7 +12,7 @@ "noir-contracts", "p2p", "prover-client", - "public-client", + "aztec-node", "sequencer-client", "wallet" ] diff --git a/yarn-project/yarn-project-base/Dockerfile b/yarn-project/yarn-project-base/Dockerfile index 84b63247b03..b7ac586c186 100644 --- a/yarn-project/yarn-project-base/Dockerfile +++ b/yarn-project/yarn-project-base/Dockerfile @@ -26,7 +26,7 @@ COPY merkle-tree/package.json merkle-tree/package.json COPY noir-contracts/package.json noir-contracts/package.json COPY p2p/package.json p2p/package.json COPY prover-client/package.json prover-client/package.json -COPY public-client/package.json public-client/package.json +COPY aztec-node/package.json aztec-node/package.json COPY sequencer-client/package.json sequencer-client/package.json COPY wallet/package.json wallet/package.json COPY world-state/package.json world-state/package.json From 90fe84a2b3068a7b93c585f527083c1327d4df96 Mon Sep 17 00:00:00 2001 From: PhilWindle Date: Thu, 23 Mar 2023 10:24:02 +0000 Subject: [PATCH 35/36] WIP --- yarn-project/yarn.lock | 25 +++++++++++++++++++++++-- 1 file changed, 23 insertions(+), 2 deletions(-) diff --git a/yarn-project/yarn.lock b/yarn-project/yarn.lock index 6f27a8298f4..4a020a37f6c 100644 --- a/yarn-project/yarn.lock +++ b/yarn-project/yarn.lock @@ -80,6 +80,27 @@ __metadata: languageName: unknown linkType: soft +"@aztec/aztec-node@workspace:aztec-node": + version: 0.0.0-use.local + resolution: "@aztec/aztec-node@workspace:aztec-node" + dependencies: + "@aztec/archiver": "workspace:^" + "@aztec/eslint-config": "workspace:^" + "@aztec/ethereum.js": "workspace:^" + "@aztec/p2p": "workspace:^" + "@aztec/world-state": "workspace:^" + "@jest/globals": ^29.4.3 + "@rushstack/eslint-patch": ^1.1.4 + "@types/jest": ^29.4.0 + "@types/node": ^18.7.23 + jest: ^28.1.3 + ts-jest: ^28.0.7 + ts-node: ^10.9.1 + tslib: ^2.4.0 + typescript: ^4.9.5 + languageName: unknown + linkType: soft + "@aztec/aztec.js@workspace:^, @aztec/aztec.js@workspace:aztec.js": version: 0.0.0-use.local resolution: "@aztec/aztec.js@workspace:aztec.js" @@ -295,7 +316,7 @@ __metadata: languageName: unknown linkType: soft -"@aztec/p2p@workspace:p2p": +"@aztec/p2p@workspace:^, @aztec/p2p@workspace:p2p": version: 0.0.0-use.local resolution: "@aztec/p2p@workspace:p2p" dependencies: @@ -374,7 +395,7 @@ __metadata: languageName: unknown linkType: soft -"@aztec/world-state@workspace:world-state": +"@aztec/world-state@workspace:^, @aztec/world-state@workspace:world-state": version: 0.0.0-use.local resolution: "@aztec/world-state@workspace:world-state" dependencies: From 7e054c3cc137aa00ad31a22888f232b1a7ddfd94 Mon Sep 17 00:00:00 2001 From: PhilWindle Date: Thu, 23 Mar 2023 10:25:43 +0000 Subject: [PATCH 36/36] WIP --- yarn-project/typedoc.json | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/yarn-project/typedoc.json b/yarn-project/typedoc.json index a15ecf7af3a..e332f8cf72d 100644 --- a/yarn-project/typedoc.json +++ b/yarn-project/typedoc.json @@ -14,6 +14,8 @@ "prover-client", "aztec-node", "sequencer-client", - "wallet" + "wallet", + "world-state", + "merkle-tree" ] }