diff --git a/.changeset/pre.json b/.changeset/pre.json index b0dfdb6860..e55c0c40b8 100644 --- a/.changeset/pre.json +++ b/.changeset/pre.json @@ -23,6 +23,7 @@ "@ignored/hardhat-vnext": "2.0.0", "@ignored/hardhat-vnext-build-system": "2.0.0", "@ignored/hardhat-vnext-errors": "2.0.0", + "@ignored/hardhat-vnext-keystore": "2.0.0", "@ignored/hardhat-vnext-node-test-reporter": "2.0.0", "@ignored/hardhat-vnext-utils": "2.0.0", "@ignored/hardhat-vnext-zod-utils": "2.0.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 513b7e3b94..05096f7e78 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -62,7 +62,7 @@ importers: version: 3.4.0(eslint-config-prettier@8.3.0(eslint@8.57.0))(eslint@8.57.0)(prettier@2.4.1) mocha: specifier: ^10.0.0 - version: 10.7.0 + version: 10.7.3 prettier: specifier: 2.4.1 version: 2.4.1 @@ -71,7 +71,7 @@ importers: dependencies: eslint-module-utils: specifier: ^2.8.0 - version: 2.8.1(@typescript-eslint/parser@7.18.0(eslint@8.57.0)(typescript@5.5.4))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@7.18.0(eslint@8.57.0)(typescript@5.5.4))(eslint-plugin-import@2.29.1)(eslint@8.57.0))(eslint@8.57.0) + version: 2.8.2(@typescript-eslint/parser@7.18.0(eslint@8.57.0)(typescript@5.5.4))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@7.18.0(eslint@8.57.0)(typescript@5.5.4))(eslint-plugin-import@2.29.1)(eslint@8.57.0))(eslint@8.57.0) requireindex: specifier: ^1.2.0 version: 1.2.0 @@ -96,7 +96,7 @@ importers: version: 3.4.0(eslint-config-prettier@8.3.0(eslint@8.57.0))(eslint@8.57.0)(prettier@2.4.1) mocha: specifier: ^10.0.0 - version: 10.7.0 + version: 10.7.3 prettier: specifier: 2.4.1 version: 2.4.1 @@ -133,13 +133,13 @@ importers: version: 5.1.5 '@types/chai': specifier: ^4.2.0 - version: 4.3.17 + version: 4.3.18 '@types/mocha': specifier: '>=9.1.0' version: 10.0.7 '@types/node': specifier: ^18.0.0 - version: 18.19.43 + version: 18.19.46 '@typescript-eslint/eslint-plugin': specifier: 5.61.0 version: 5.61.0(@typescript-eslint/parser@5.61.0(eslint@8.57.0)(typescript@5.0.4))(eslint@8.57.0)(typescript@5.0.4) @@ -181,7 +181,7 @@ importers: version: link:../hardhat-core mocha: specifier: ^10.0.0 - version: 10.7.0 + version: 10.7.3 prettier: specifier: 2.4.1 version: 2.4.1 @@ -190,7 +190,7 @@ importers: version: 3.0.2 ts-node: specifier: ^10.8.0 - version: 10.9.2(@types/node@18.19.43)(typescript@5.0.4) + version: 10.9.2(@types/node@18.19.46)(typescript@5.0.4) typescript: specifier: ~5.0.0 version: 5.0.4 @@ -205,7 +205,7 @@ importers: version: 4.0.1 '@nomicfoundation/edr': specifier: ^0.5.0 - version: 0.5.0 + version: 0.5.2 '@nomicfoundation/ethereumjs-common': specifier: 4.0.4 version: 4.0.4 @@ -292,7 +292,7 @@ importers: version: 0.38.5 mocha: specifier: ^10.0.0 - version: 10.7.0 + version: 10.7.3 p-map: specifier: ^4.0.0 version: 4.0.0 @@ -341,7 +341,7 @@ importers: version: 0.2.4 '@types/chai': specifier: ^4.2.0 - version: 4.3.17 + version: 4.3.18 '@types/chai-as-promised': specifier: ^7.1.3 version: 7.1.8 @@ -371,7 +371,7 @@ importers: version: 10.0.7 '@types/node': specifier: ^18.0.0 - version: 18.19.43 + version: 18.19.46 '@types/resolve': specifier: ^1.17.1 version: 1.20.6 @@ -440,7 +440,7 @@ importers: version: 0.1.2 ts-node: specifier: ^10.8.0 - version: 10.9.2(@types/node@18.19.43)(typescript@5.0.4) + version: 10.9.2(@types/node@18.19.46)(typescript@5.0.4) typescript: specifier: ~5.0.0 version: 5.0.4 @@ -462,7 +462,7 @@ importers: version: link:../eslint-plugin-slow-imports '@types/chai': specifier: ^4.2.0 - version: 4.3.17 + version: 4.3.18 '@types/chai-as-promised': specifier: ^7.1.3 version: 7.1.8 @@ -477,7 +477,7 @@ importers: version: 10.0.7 '@types/node': specifier: ^18.0.0 - version: 18.19.43 + version: 18.19.46 '@types/sinon': specifier: ^9.0.8 version: 9.0.11 @@ -519,7 +519,7 @@ importers: version: link:../hardhat-core mocha: specifier: ^10.0.0 - version: 10.7.0 + version: 10.7.3 prettier: specifier: 2.4.1 version: 2.4.1 @@ -531,7 +531,7 @@ importers: version: 9.2.4 ts-node: specifier: ^10.8.0 - version: 10.9.2(@types/node@18.19.43)(typescript@5.0.4) + version: 10.9.2(@types/node@18.19.46)(typescript@5.0.4) typescript: specifier: ~5.0.0 version: 5.0.4 @@ -550,13 +550,13 @@ importers: version: link:../eslint-plugin-slow-imports '@types/chai': specifier: ^4.2.0 - version: 4.3.17 + version: 4.3.18 '@types/mocha': specifier: '>=9.1.0' version: 10.0.7 '@types/node': specifier: ^18.0.0 - version: 18.19.43 + version: 18.19.46 '@typescript-eslint/eslint-plugin': specifier: 5.61.0 version: 5.61.0(@typescript-eslint/parser@5.61.0(eslint@8.57.0)(typescript@5.0.4))(eslint@8.57.0)(typescript@5.0.4) @@ -586,7 +586,7 @@ importers: version: link:../hardhat-core mocha: specifier: ^10.0.0 - version: 10.7.0 + version: 10.7.3 prettier: specifier: 2.4.1 version: 2.4.1 @@ -595,7 +595,7 @@ importers: version: 3.0.2 ts-node: specifier: ^10.8.0 - version: 10.9.2(@types/node@18.19.43)(typescript@5.0.4) + version: 10.9.2(@types/node@18.19.46)(typescript@5.0.4) typescript: specifier: ~5.0.0 version: 5.0.4 @@ -647,7 +647,7 @@ importers: version: link:../eslint-plugin-slow-imports '@types/chai': specifier: ^4.2.0 - version: 4.3.17 + version: 4.3.18 '@types/fs-extra': specifier: ^5.1.0 version: 5.1.0 @@ -656,7 +656,7 @@ importers: version: 10.0.7 '@types/node': specifier: ^18.0.0 - version: 18.19.43 + version: 18.19.46 '@types/sinon': specifier: ^9.0.8 version: 9.0.11 @@ -689,7 +689,7 @@ importers: version: link:../hardhat-core mocha: specifier: ^10.0.0 - version: 10.7.0 + version: 10.7.3 nyc: specifier: ^15.1.0 version: 15.1.0 @@ -704,7 +704,7 @@ importers: version: 9.2.4 ts-node: specifier: ^10.8.0 - version: 10.9.2(@types/node@18.19.43)(typescript@5.0.4) + version: 10.9.2(@types/node@18.19.46)(typescript@5.0.4) typescript: specifier: ~5.0.0 version: 5.0.4 @@ -723,7 +723,7 @@ importers: version: link:../eslint-plugin-slow-imports '@types/chai': specifier: ^4.2.0 - version: 4.3.17 + version: 4.3.18 '@types/chai-as-promised': specifier: ^7.1.3 version: 7.1.8 @@ -732,7 +732,7 @@ importers: version: 10.0.7 '@types/node': specifier: ^18.0.0 - version: 18.19.43 + version: 18.19.46 '@typescript-eslint/eslint-plugin': specifier: 5.61.0 version: 5.61.0(@typescript-eslint/parser@5.61.0(eslint@8.57.0)(typescript@5.0.4))(eslint@8.57.0)(typescript@5.0.4) @@ -768,7 +768,7 @@ importers: version: link:../hardhat-core mocha: specifier: ^10.0.0 - version: 10.7.0 + version: 10.7.3 prettier: specifier: 2.4.1 version: 2.4.1 @@ -777,7 +777,7 @@ importers: version: 3.0.2 ts-node: specifier: ^10.8.0 - version: 10.9.2(@types/node@18.19.43)(typescript@5.0.4) + version: 10.9.2(@types/node@18.19.46)(typescript@5.0.4) typescript: specifier: ~5.0.0 version: 5.0.4 @@ -802,7 +802,7 @@ importers: version: link:../eslint-plugin-slow-imports '@types/chai': specifier: ^4.2.0 - version: 4.3.17 + version: 4.3.18 '@types/debug': specifier: ^4.1.4 version: 4.1.12 @@ -814,7 +814,7 @@ importers: version: 10.0.7 '@types/node': specifier: ^18.0.0 - version: 18.19.43 + version: 18.19.46 '@types/semver': specifier: ^6.0.2 version: 6.2.7 @@ -847,7 +847,7 @@ importers: version: link:../hardhat-core mocha: specifier: ^10.0.0 - version: 10.7.0 + version: 10.7.3 prettier: specifier: 2.4.1 version: 2.4.1 @@ -856,7 +856,7 @@ importers: version: 3.0.2 ts-node: specifier: ^10.8.0 - version: 10.9.2(@types/node@18.19.43)(typescript@5.0.4) + version: 10.9.2(@types/node@18.19.46)(typescript@5.0.4) typescript: specifier: ~5.0.0 version: 5.0.4 @@ -892,13 +892,13 @@ importers: version: 9.1.0(@typechain/ethers-v6@0.5.1(ethers@6.13.2)(typechain@8.3.2(typescript@5.0.4))(typescript@5.0.4))(ethers@6.13.2)(hardhat@packages+hardhat-core)(typechain@8.3.2(typescript@5.0.4)) '@types/chai': specifier: ^4.2.0 - version: 4.3.17 + version: 4.3.18 '@types/mocha': specifier: '>=9.1.0' version: 10.0.7 '@types/node': specifier: ^18.0.0 - version: 18.19.43 + version: 18.19.46 '@typescript-eslint/eslint-plugin': specifier: 5.61.0 version: 5.61.0(@typescript-eslint/parser@5.61.0(eslint@8.57.0)(typescript@5.0.4))(eslint@8.57.0)(typescript@5.0.4) @@ -934,7 +934,7 @@ importers: version: 1.0.10(hardhat@packages+hardhat-core) mocha: specifier: ^10.0.0 - version: 10.7.0 + version: 10.7.3 prettier: specifier: 2.4.1 version: 2.4.1 @@ -946,7 +946,7 @@ importers: version: 0.8.12(hardhat@packages+hardhat-core) ts-node: specifier: ^10.8.0 - version: 10.9.2(@types/node@18.19.43)(typescript@5.0.4) + version: 10.9.2(@types/node@18.19.46)(typescript@5.0.4) typechain: specifier: ^8.3.1 version: 8.3.2(typescript@5.0.4) @@ -968,7 +968,7 @@ importers: version: link:../eslint-plugin-slow-imports '@nomicfoundation/hardhat-ignition-viem': specifier: ^0.15.0 - version: 0.15.5(@nomicfoundation/hardhat-ignition@0.15.5(@nomicfoundation/hardhat-verify@packages+hardhat-verify)(hardhat@packages+hardhat-core))(@nomicfoundation/hardhat-viem@packages+hardhat-viem)(@nomicfoundation/ignition-core@0.15.5)(hardhat@packages+hardhat-core)(viem@2.18.8(typescript@5.0.4)(zod@3.23.8)) + version: 0.15.5(@nomicfoundation/hardhat-ignition@0.15.5(@nomicfoundation/hardhat-verify@packages+hardhat-verify)(hardhat@packages+hardhat-core))(@nomicfoundation/hardhat-viem@packages+hardhat-viem)(@nomicfoundation/ignition-core@0.15.5)(hardhat@packages+hardhat-core)(viem@2.20.0(typescript@5.0.4)(zod@3.23.8)) '@nomicfoundation/hardhat-network-helpers': specifier: workspace:^1.0.0 version: link:../hardhat-network-helpers @@ -980,7 +980,7 @@ importers: version: link:../hardhat-viem '@types/chai': specifier: ^4.2.0 - version: 4.3.17 + version: 4.3.18 '@types/chai-as-promised': specifier: ^7.1.6 version: 7.1.8 @@ -989,7 +989,7 @@ importers: version: 10.0.7 '@types/node': specifier: ^18.0.0 - version: 18.19.43 + version: 18.19.46 '@typescript-eslint/eslint-plugin': specifier: 5.61.0 version: 5.61.0(@typescript-eslint/parser@5.61.0(eslint@8.57.0)(typescript@5.0.4))(eslint@8.57.0)(typescript@5.0.4) @@ -1022,7 +1022,7 @@ importers: version: 1.0.10(hardhat@packages+hardhat-core) mocha: specifier: ^10.0.0 - version: 10.7.0 + version: 10.7.3 prettier: specifier: 2.4.1 version: 2.4.1 @@ -1034,13 +1034,13 @@ importers: version: 0.8.12(hardhat@packages+hardhat-core) ts-node: specifier: ^10.8.0 - version: 10.9.2(@types/node@18.19.43)(typescript@5.0.4) + version: 10.9.2(@types/node@18.19.46)(typescript@5.0.4) typescript: specifier: ~5.0.4 version: 5.0.4 viem: specifier: ^2.7.6 - version: 2.18.8(typescript@5.0.4)(zod@3.23.8) + version: 2.20.0(typescript@5.0.4)(zod@3.23.8) packages/hardhat-verify: dependencies: @@ -1083,7 +1083,7 @@ importers: version: link:../hardhat-ethers '@types/chai': specifier: ^4.2.0 - version: 4.3.17 + version: 4.3.18 '@types/chai-as-promised': specifier: ^7.1.3 version: 7.1.8 @@ -1098,7 +1098,7 @@ importers: version: 10.0.7 '@types/node': specifier: ^18.0.0 - version: 18.19.43 + version: 18.19.46 '@types/semver': specifier: ^6.0.2 version: 6.2.7 @@ -1143,7 +1143,7 @@ importers: version: link:../hardhat-core mocha: specifier: ^10.0.0 - version: 10.7.0 + version: 10.7.3 nyc: specifier: ^15.1.0 version: 15.1.0 @@ -1161,7 +1161,7 @@ importers: version: 3.7.0(chai@4.5.0)(sinon@9.2.4) ts-node: specifier: ^10.8.0 - version: 10.9.2(@types/node@18.19.43)(typescript@5.0.4) + version: 10.9.2(@types/node@18.19.46)(typescript@5.0.4) typescript: specifier: ~5.0.0 version: 5.0.4 @@ -1183,7 +1183,7 @@ importers: version: link:../eslint-plugin-slow-imports '@types/chai': specifier: ^4.2.0 - version: 4.3.17 + version: 4.3.18 '@types/chai-as-promised': specifier: ^7.1.3 version: 7.1.8 @@ -1198,7 +1198,7 @@ importers: version: 10.0.7 '@types/node': specifier: ^18.0.0 - version: 18.19.43 + version: 18.19.46 '@types/sinon': specifier: ^9.0.8 version: 9.0.11 @@ -1237,7 +1237,7 @@ importers: version: 29.7.0 mocha: specifier: ^10.0.0 - version: 10.7.0 + version: 10.7.3 nyc: specifier: ^15.1.0 version: 15.1.0 @@ -1252,13 +1252,13 @@ importers: version: 9.2.4 ts-node: specifier: ^10.8.0 - version: 10.9.2(@types/node@18.19.43)(typescript@5.0.4) + version: 10.9.2(@types/node@18.19.46)(typescript@5.0.4) typescript: specifier: ~5.0.0 version: 5.0.4 viem: specifier: ^2.7.6 - version: 2.18.8(typescript@5.0.4)(zod@3.23.8) + version: 2.20.0(typescript@5.0.4)(zod@3.23.8) packages/hardhat-vyper: dependencies: @@ -1286,7 +1286,7 @@ importers: version: link:../eslint-plugin-slow-imports '@types/chai': specifier: ^4.2.0 - version: 4.3.17 + version: 4.3.18 '@types/chai-as-promised': specifier: ^7.1.3 version: 7.1.8 @@ -1304,7 +1304,7 @@ importers: version: 10.0.7 '@types/node': specifier: ^18.0.0 - version: 18.19.43 + version: 18.19.46 '@types/semver': specifier: ^6.0.2 version: 6.2.7 @@ -1340,7 +1340,7 @@ importers: version: link:../hardhat-core mocha: specifier: ^10.0.0 - version: 10.7.0 + version: 10.7.3 prettier: specifier: 2.4.1 version: 2.4.1 @@ -1349,7 +1349,7 @@ importers: version: 3.0.2 ts-node: specifier: ^10.8.0 - version: 10.9.2(@types/node@18.19.43)(typescript@5.0.4) + version: 10.9.2(@types/node@18.19.46)(typescript@5.0.4) typescript: specifier: ~5.0.0 version: 5.0.4 @@ -1364,7 +1364,7 @@ importers: version: link:../eslint-plugin-slow-imports '@types/chai': specifier: ^4.2.0 - version: 4.3.17 + version: 4.3.18 '@types/chai-as-promised': specifier: ^7.1.3 version: 7.1.8 @@ -1373,7 +1373,7 @@ importers: version: 10.0.7 '@types/node': specifier: ^18.0.0 - version: 18.19.43 + version: 18.19.46 '@typescript-eslint/eslint-plugin': specifier: 5.61.0 version: 5.61.0(@typescript-eslint/parser@5.61.0(eslint@8.57.0)(typescript@5.0.4))(eslint@8.57.0)(typescript@5.0.4) @@ -1406,7 +1406,7 @@ importers: version: link:../hardhat-core mocha: specifier: ^10.0.0 - version: 10.7.0 + version: 10.7.3 prettier: specifier: 2.4.1 version: 2.4.1 @@ -1415,19 +1415,22 @@ importers: version: 3.0.2 ts-node: specifier: ^10.8.0 - version: 10.9.2(@types/node@18.19.43)(typescript@5.0.4) + version: 10.9.2(@types/node@18.19.46)(typescript@5.0.4) typescript: specifier: ~5.0.0 version: 5.0.4 web3: specifier: ^4.0.1 - version: 4.11.1(typescript@5.0.4)(zod@3.23.8) + version: 4.12.1(typescript@5.0.4)(zod@3.23.8) v-next/example-project: devDependencies: '@ignored/hardhat-vnext': specifier: workspace:^3.0.0-next.3 version: link:../hardhat + '@ignored/hardhat-vnext-keystore': + specifier: workspace:^3.0.0-next.2 + version: link:../hardhat-keystore '@ignored/hardhat-vnext-mocha-test-runner': specifier: workspace:^3.0.0-next.2 version: link:../hardhat-mocha-test-runner @@ -1439,10 +1442,10 @@ importers: version: 10.0.7 '@types/node': specifier: ^20.14.9 - version: 20.14.14 + version: 20.16.1 mocha: specifier: ^10.0.0 - version: 10.7.0 + version: 10.7.3 prettier: specifier: 3.2.5 version: 3.2.5 @@ -1484,14 +1487,14 @@ importers: version: 7.6.3 tsx: specifier: ^4.11.0 - version: 4.16.5 + version: 4.18.0 zod: specifier: ^3.23.8 version: 3.23.8 devDependencies: '@eslint-community/eslint-plugin-eslint-comments': specifier: ^4.3.0 - version: 4.3.0(eslint@8.57.0) + version: 4.4.0(eslint@8.57.0) '@ignored/hardhat-vnext-node-test-reporter': specifier: workspace:^3.0.0-next.2 version: link:../hardhat-node-test-reporter @@ -1503,7 +1506,7 @@ importers: version: 4.1.12 '@types/node': specifier: ^20.14.9 - version: 20.14.14 + version: 20.16.1 '@types/semver': specifier: ^7.5.8 version: 7.5.8 @@ -1521,10 +1524,10 @@ importers: version: 9.1.0(eslint@8.57.0) eslint-import-resolver-typescript: specifier: ^3.6.1 - version: 3.6.1(@typescript-eslint/parser@7.18.0(eslint@8.57.0)(typescript@5.5.4))(eslint-plugin-import@2.29.1)(eslint@8.57.0) + version: 3.6.3(@typescript-eslint/parser@7.18.0(eslint@8.57.0)(typescript@5.5.4))(eslint-plugin-import@2.29.1)(eslint@8.57.0) eslint-plugin-import: specifier: 2.29.1 - version: 2.29.1(@typescript-eslint/parser@7.18.0(eslint@8.57.0)(typescript@5.5.4))(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0) + version: 2.29.1(@typescript-eslint/parser@7.18.0(eslint@8.57.0)(typescript@5.5.4))(eslint-import-resolver-typescript@3.6.3)(eslint@8.57.0) eslint-plugin-no-only-tests: specifier: 3.1.0 version: 3.1.0 @@ -1602,11 +1605,11 @@ importers: version: 0.7.3(debug@4.3.6) undici: specifier: ^6.16.1 - version: 6.19.5 + version: 6.19.8 devDependencies: '@eslint-community/eslint-plugin-eslint-comments': specifier: ^4.3.0 - version: 4.3.0(eslint@8.57.0) + version: 4.4.0(eslint@8.57.0) '@ignored/hardhat-vnext-node-test-reporter': specifier: workspace:^3.0.0-next.0 version: link:../hardhat-node-test-reporter @@ -1630,7 +1633,7 @@ importers: version: 4.17.7 '@types/node': specifier: ^20.14.9 - version: 20.14.14 + version: 20.16.1 '@types/resolve': specifier: ^1.17.1 version: 1.20.6 @@ -1657,10 +1660,10 @@ importers: version: 9.1.0(eslint@8.57.0) eslint-import-resolver-typescript: specifier: ^3.6.1 - version: 3.6.1(@typescript-eslint/parser@7.18.0(eslint@8.57.0)(typescript@5.5.4))(eslint-plugin-import@2.29.1)(eslint@8.57.0) + version: 3.6.3(@typescript-eslint/parser@7.18.0(eslint@8.57.0)(typescript@5.5.4))(eslint-plugin-import@2.29.1)(eslint@8.57.0) eslint-plugin-import: specifier: 2.29.1 - version: 2.29.1(@typescript-eslint/parser@7.18.0(eslint@8.57.0)(typescript@5.5.4))(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0) + version: 2.29.1(@typescript-eslint/parser@7.18.0(eslint@8.57.0)(typescript@5.5.4))(eslint-import-resolver-typescript@3.6.3)(eslint@8.57.0) eslint-plugin-no-only-tests: specifier: 3.1.0 version: 3.1.0 @@ -1678,7 +1681,7 @@ importers: version: 9.2.4 tsx: specifier: ^4.11.0 - version: 4.16.5 + version: 4.18.0 typescript: specifier: ~5.5.0 version: 5.5.4 @@ -1694,19 +1697,101 @@ importers: devDependencies: '@eslint-community/eslint-plugin-eslint-comments': specifier: ^4.3.0 - version: 4.3.0(eslint@8.57.0) + version: 4.4.0(eslint@8.57.0) + '@ignored/hardhat-vnext-node-test-reporter': + specifier: workspace:^3.0.0-next.2 + version: link:../hardhat-node-test-reporter + '@types/node': + specifier: ^20.14.9 + version: 20.16.1 + '@typescript-eslint/eslint-plugin': + specifier: ^7.7.1 + version: 7.18.0(@typescript-eslint/parser@7.18.0(eslint@8.57.0)(typescript@5.5.4))(eslint@8.57.0)(typescript@5.5.4) + '@typescript-eslint/parser': + specifier: ^7.7.1 + version: 7.18.0(eslint@8.57.0)(typescript@5.5.4) + eslint: + specifier: 8.57.0 + version: 8.57.0 + eslint-config-prettier: + specifier: 9.1.0 + version: 9.1.0(eslint@8.57.0) + eslint-import-resolver-typescript: + specifier: ^3.6.1 + version: 3.6.3(@typescript-eslint/parser@7.18.0(eslint@8.57.0)(typescript@5.5.4))(eslint-plugin-import@2.29.1)(eslint@8.57.0) + eslint-plugin-import: + specifier: 2.29.1 + version: 2.29.1(@typescript-eslint/parser@7.18.0(eslint@8.57.0)(typescript@5.5.4))(eslint-import-resolver-typescript@3.6.3)(eslint@8.57.0) + eslint-plugin-no-only-tests: + specifier: 3.1.0 + version: 3.1.0 + expect-type: + specifier: ^0.19.0 + version: 0.19.0 + prettier: + specifier: 3.2.5 + version: 3.2.5 + rimraf: + specifier: ^5.0.5 + version: 5.0.10 + tsx: + specifier: ^4.11.0 + version: 4.18.0 + typescript: + specifier: ~5.5.0 + version: 5.5.4 + typescript-eslint: + specifier: 7.7.1 + version: 7.7.1(eslint@8.57.0)(typescript@5.5.4) + + v-next/hardhat-keystore: + dependencies: + '@ignored/hardhat-vnext': + specifier: workspace:^3.0.0-next.2 + version: link:../hardhat + '@ignored/hardhat-vnext-errors': + specifier: workspace:^3.0.0-next.2 + version: link:../hardhat-errors + '@ignored/hardhat-vnext-utils': + specifier: workspace:^3.0.0-next.2 + version: link:../hardhat-utils + '@ignored/hardhat-vnext-zod-utils': + specifier: workspace:^3.0.0-next.2 + version: link:../hardhat-zod-utils + chalk: + specifier: ^5.3.0 + version: 5.3.0 + debug: + specifier: ^4.1.1 + version: 4.3.6(supports-color@8.1.1) + zod: + specifier: ^3.23.8 + version: 3.23.8 + devDependencies: + '@eslint-community/eslint-plugin-eslint-comments': + specifier: ^4.3.0 + version: 4.4.0(eslint@8.57.0) '@ignored/hardhat-vnext-node-test-reporter': specifier: workspace:^3.0.0-next.2 version: link:../hardhat-node-test-reporter + '@nomicfoundation/hardhat-test-utils': + specifier: workspace:^ + version: link:../hardhat-test-utils + '@types/debug': + specifier: ^4.1.4 + version: 4.1.12 '@types/node': specifier: ^20.14.9 - version: 20.14.14 + version: 20.16.1 '@typescript-eslint/eslint-plugin': specifier: ^7.7.1 version: 7.18.0(@typescript-eslint/parser@7.18.0(eslint@8.57.0)(typescript@5.5.4))(eslint@8.57.0)(typescript@5.5.4) '@typescript-eslint/parser': specifier: ^7.7.1 version: 7.18.0(eslint@8.57.0)(typescript@5.5.4) + c8: + specifier: ^9.1.0 + version: 9.1.0 eslint: specifier: 8.57.0 version: 8.57.0 @@ -1715,10 +1800,10 @@ importers: version: 9.1.0(eslint@8.57.0) eslint-import-resolver-typescript: specifier: ^3.6.1 - version: 3.6.1(@typescript-eslint/parser@7.18.0(eslint@8.57.0)(typescript@5.5.4))(eslint-plugin-import@2.29.1)(eslint@8.57.0) + version: 3.6.3(@typescript-eslint/parser@7.18.0(eslint@8.57.0)(typescript@5.5.4))(eslint-plugin-import@2.29.1)(eslint@8.57.0) eslint-plugin-import: specifier: 2.29.1 - version: 2.29.1(@typescript-eslint/parser@7.18.0(eslint@8.57.0)(typescript@5.5.4))(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0) + version: 2.29.1(@typescript-eslint/parser@7.18.0(eslint@8.57.0)(typescript@5.5.4))(eslint-import-resolver-typescript@3.6.3)(eslint@8.57.0) eslint-plugin-no-only-tests: specifier: 3.1.0 version: 3.1.0 @@ -1733,7 +1818,7 @@ importers: version: 5.0.10 tsx: specifier: ^4.11.0 - version: 4.16.5 + version: 4.18.0 typescript: specifier: ~5.5.0 version: 5.5.4 @@ -1757,17 +1842,17 @@ importers: version: link:../hardhat-zod-utils mocha: specifier: ^10.0.0 - version: 10.7.0 + version: 10.7.3 tsx: specifier: ^4.11.0 - version: 4.16.5 + version: 4.18.0 zod: specifier: ^3.23.8 version: 3.23.8 devDependencies: '@eslint-community/eslint-plugin-eslint-comments': specifier: ^4.3.0 - version: 4.3.0(eslint@8.57.0) + version: 4.4.0(eslint@8.57.0) '@ignored/hardhat-vnext-node-test-reporter': specifier: workspace:^3.0.0-next.2 version: link:../hardhat-node-test-reporter @@ -1779,7 +1864,7 @@ importers: version: 10.0.7 '@types/node': specifier: ^20.14.9 - version: 20.14.14 + version: 20.16.1 '@typescript-eslint/eslint-plugin': specifier: ^7.7.1 version: 7.18.0(@typescript-eslint/parser@7.18.0(eslint@8.57.0)(typescript@5.5.4))(eslint@8.57.0)(typescript@5.5.4) @@ -1794,10 +1879,10 @@ importers: version: 9.1.0(eslint@8.57.0) eslint-import-resolver-typescript: specifier: ^3.6.1 - version: 3.6.1(@typescript-eslint/parser@7.18.0(eslint@8.57.0)(typescript@5.5.4))(eslint-plugin-import@2.29.1)(eslint@8.57.0) + version: 3.6.3(@typescript-eslint/parser@7.18.0(eslint@8.57.0)(typescript@5.5.4))(eslint-plugin-import@2.29.1)(eslint@8.57.0) eslint-plugin-import: specifier: 2.29.1 - version: 2.29.1(@typescript-eslint/parser@7.18.0(eslint@8.57.0)(typescript@5.5.4))(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0) + version: 2.29.1(@typescript-eslint/parser@7.18.0(eslint@8.57.0)(typescript@5.5.4))(eslint-import-resolver-typescript@3.6.3)(eslint@8.57.0) eslint-plugin-no-only-tests: specifier: 3.1.0 version: 3.1.0 @@ -1831,7 +1916,7 @@ importers: devDependencies: '@types/node': specifier: ^20.14.9 - version: 20.14.14 + version: 20.16.1 '@typescript-eslint/eslint-plugin': specifier: ^7.7.1 version: 7.18.0(@typescript-eslint/parser@7.18.0(eslint@8.57.0)(typescript@5.5.4))(eslint@8.57.0)(typescript@5.5.4) @@ -1846,10 +1931,10 @@ importers: version: 9.1.0(eslint@8.57.0) eslint-import-resolver-typescript: specifier: ^3.6.1 - version: 3.6.1(@typescript-eslint/parser@7.18.0(eslint@8.57.0)(typescript@5.5.4))(eslint-plugin-import@2.29.1)(eslint@8.57.0) + version: 3.6.3(@typescript-eslint/parser@7.18.0(eslint@8.57.0)(typescript@5.5.4))(eslint-plugin-import@2.29.1)(eslint@8.57.0) eslint-plugin-import: specifier: 2.29.1 - version: 2.29.1(@typescript-eslint/parser@7.18.0(eslint@8.57.0)(typescript@5.5.4))(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0) + version: 2.29.1(@typescript-eslint/parser@7.18.0(eslint@8.57.0)(typescript@5.5.4))(eslint-import-resolver-typescript@3.6.3)(eslint@8.57.0) eslint-plugin-no-only-tests: specifier: 3.1.0 version: 3.1.0 @@ -1864,7 +1949,7 @@ importers: version: 5.0.10 tsx: specifier: ^4.11.0 - version: 4.16.5 + version: 4.18.0 typescript: specifier: ~5.5.0 version: 5.5.4 @@ -1891,20 +1976,20 @@ importers: version: link:../hardhat-zod-utils tsx: specifier: ^4.11.0 - version: 4.16.5 + version: 4.18.0 zod: specifier: ^3.23.8 version: 3.23.8 devDependencies: '@eslint-community/eslint-plugin-eslint-comments': specifier: ^4.3.0 - version: 4.3.0(eslint@8.57.0) + version: 4.4.0(eslint@8.57.0) '@nomicfoundation/hardhat-test-utils': specifier: workspace:^ version: link:../hardhat-test-utils '@types/node': specifier: ^20.14.9 - version: 20.14.14 + version: 20.16.1 '@typescript-eslint/eslint-plugin': specifier: ^7.7.1 version: 7.18.0(@typescript-eslint/parser@7.18.0(eslint@8.57.0)(typescript@5.5.4))(eslint@8.57.0)(typescript@5.5.4) @@ -1919,10 +2004,10 @@ importers: version: 9.1.0(eslint@8.57.0) eslint-import-resolver-typescript: specifier: ^3.6.1 - version: 3.6.1(@typescript-eslint/parser@7.18.0(eslint@8.57.0)(typescript@5.5.4))(eslint-plugin-import@2.29.1)(eslint@8.57.0) + version: 3.6.3(@typescript-eslint/parser@7.18.0(eslint@8.57.0)(typescript@5.5.4))(eslint-plugin-import@2.29.1)(eslint@8.57.0) eslint-plugin-import: specifier: 2.29.1 - version: 2.29.1(@typescript-eslint/parser@7.18.0(eslint@8.57.0)(typescript@5.5.4))(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0) + version: 2.29.1(@typescript-eslint/parser@7.18.0(eslint@8.57.0)(typescript@5.5.4))(eslint-import-resolver-typescript@3.6.3)(eslint@8.57.0) eslint-plugin-no-only-tests: specifier: 3.1.0 version: 3.1.0 @@ -1953,13 +2038,13 @@ importers: devDependencies: '@eslint-community/eslint-plugin-eslint-comments': specifier: ^4.3.0 - version: 4.3.0(eslint@8.57.0) + version: 4.4.0(eslint@8.57.0) '@ignored/hardhat-vnext-node-test-reporter': specifier: workspace:^3.0.0-next.2 version: link:../hardhat-node-test-reporter '@types/node': specifier: ^20.14.9 - version: 20.14.14 + version: 20.16.1 '@typescript-eslint/eslint-plugin': specifier: ^7.7.1 version: 7.18.0(@typescript-eslint/parser@7.18.0(eslint@8.57.0)(typescript@5.5.4))(eslint@8.57.0)(typescript@5.5.4) @@ -1974,10 +2059,10 @@ importers: version: 9.1.0(eslint@8.57.0) eslint-import-resolver-typescript: specifier: ^3.6.1 - version: 3.6.1(@typescript-eslint/parser@7.18.0(eslint@8.57.0)(typescript@5.5.4))(eslint-plugin-import@2.29.1)(eslint@8.57.0) + version: 3.6.3(@typescript-eslint/parser@7.18.0(eslint@8.57.0)(typescript@5.5.4))(eslint-plugin-import@2.29.1)(eslint@8.57.0) eslint-plugin-import: specifier: 2.29.1 - version: 2.29.1(@typescript-eslint/parser@7.18.0(eslint@8.57.0)(typescript@5.5.4))(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0) + version: 2.29.1(@typescript-eslint/parser@7.18.0(eslint@8.57.0)(typescript@5.5.4))(eslint-import-resolver-typescript@3.6.3)(eslint@8.57.0) eslint-plugin-no-only-tests: specifier: 3.1.0 version: 3.1.0 @@ -1992,7 +2077,7 @@ importers: version: 5.0.10 tsx: specifier: ^4.11.0 - version: 4.16.5 + version: 4.18.0 typescript: specifier: ~5.5.0 version: 5.5.4 @@ -2019,11 +2104,11 @@ importers: version: 1.4.1 undici: specifier: ^6.16.1 - version: 6.19.5 + version: 6.19.8 devDependencies: '@eslint-community/eslint-plugin-eslint-comments': specifier: ^4.3.0 - version: 4.3.0(eslint@8.57.0) + version: 4.4.0(eslint@8.57.0) '@ignored/hardhat-vnext-node-test-reporter': specifier: workspace:^3.0.0-next.2 version: link:../hardhat-node-test-reporter @@ -2035,7 +2120,7 @@ importers: version: 4.1.12 '@types/node': specifier: ^20.14.9 - version: 20.14.14 + version: 20.16.1 '@typescript-eslint/eslint-plugin': specifier: ^7.7.1 version: 7.18.0(@typescript-eslint/parser@7.18.0(eslint@8.57.0)(typescript@5.5.4))(eslint@8.57.0)(typescript@5.5.4) @@ -2050,10 +2135,10 @@ importers: version: 9.1.0(eslint@8.57.0) eslint-import-resolver-typescript: specifier: ^3.6.1 - version: 3.6.1(@typescript-eslint/parser@7.18.0(eslint@8.57.0)(typescript@5.5.4))(eslint-plugin-import@2.29.1)(eslint@8.57.0) + version: 3.6.3(@typescript-eslint/parser@7.18.0(eslint@8.57.0)(typescript@5.5.4))(eslint-plugin-import@2.29.1)(eslint@8.57.0) eslint-plugin-import: specifier: 2.29.1 - version: 2.29.1(@typescript-eslint/parser@7.18.0(eslint@8.57.0)(typescript@5.5.4))(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0) + version: 2.29.1(@typescript-eslint/parser@7.18.0(eslint@8.57.0)(typescript@5.5.4))(eslint-import-resolver-typescript@3.6.3)(eslint@8.57.0) eslint-plugin-no-only-tests: specifier: 3.1.0 version: 3.1.0 @@ -2068,7 +2153,7 @@ importers: version: 5.0.10 tsx: specifier: ^4.11.0 - version: 4.16.5 + version: 4.18.0 typescript: specifier: ~5.5.0 version: 5.5.4 @@ -2080,7 +2165,7 @@ importers: devDependencies: '@eslint-community/eslint-plugin-eslint-comments': specifier: ^4.3.0 - version: 4.3.0(eslint@8.57.0) + version: 4.4.0(eslint@8.57.0) '@ignored/hardhat-vnext-node-test-reporter': specifier: workspace:^3.0.0-next.2 version: link:../hardhat-node-test-reporter @@ -2089,7 +2174,7 @@ importers: version: link:../hardhat-test-utils '@types/node': specifier: ^20.14.9 - version: 20.14.14 + version: 20.16.1 '@typescript-eslint/eslint-plugin': specifier: ^7.7.1 version: 7.18.0(@typescript-eslint/parser@7.18.0(eslint@8.57.0)(typescript@5.5.4))(eslint@8.57.0)(typescript@5.5.4) @@ -2104,10 +2189,10 @@ importers: version: 9.1.0(eslint@8.57.0) eslint-import-resolver-typescript: specifier: ^3.6.1 - version: 3.6.1(@typescript-eslint/parser@7.18.0(eslint@8.57.0)(typescript@5.5.4))(eslint-plugin-import@2.29.1)(eslint@8.57.0) + version: 3.6.3(@typescript-eslint/parser@7.18.0(eslint@8.57.0)(typescript@5.5.4))(eslint-plugin-import@2.29.1)(eslint@8.57.0) eslint-plugin-import: specifier: 2.29.1 - version: 2.29.1(@typescript-eslint/parser@7.18.0(eslint@8.57.0)(typescript@5.5.4))(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0) + version: 2.29.1(@typescript-eslint/parser@7.18.0(eslint@8.57.0)(typescript@5.5.4))(eslint-import-resolver-typescript@3.6.3)(eslint@8.57.0) eslint-plugin-no-only-tests: specifier: 3.1.0 version: 3.1.0 @@ -2122,7 +2207,7 @@ importers: version: 5.0.10 tsx: specifier: ^4.11.0 - version: 4.16.5 + version: 4.18.0 typescript: specifier: ~5.5.0 version: 5.5.4 @@ -2137,7 +2222,7 @@ importers: devDependencies: '@eslint-community/eslint-plugin-eslint-comments': specifier: ^4.3.0 - version: 4.3.0(eslint@8.57.0) + version: 4.4.0(eslint@8.57.0) '@ignored/hardhat-vnext-node-test-reporter': specifier: workspace:^3.0.0-next.2 version: link:../hardhat-node-test-reporter @@ -2146,7 +2231,7 @@ importers: version: link:../hardhat-test-utils '@types/node': specifier: ^20.14.9 - version: 20.14.14 + version: 20.16.1 '@typescript-eslint/eslint-plugin': specifier: ^7.7.1 version: 7.18.0(@typescript-eslint/parser@7.18.0(eslint@8.57.0)(typescript@5.5.4))(eslint@8.57.0)(typescript@5.5.4) @@ -2161,10 +2246,10 @@ importers: version: 9.1.0(eslint@8.57.0) eslint-import-resolver-typescript: specifier: ^3.6.1 - version: 3.6.1(@typescript-eslint/parser@7.18.0(eslint@8.57.0)(typescript@5.5.4))(eslint-plugin-import@2.29.1)(eslint@8.57.0) + version: 3.6.3(@typescript-eslint/parser@7.18.0(eslint@8.57.0)(typescript@5.5.4))(eslint-plugin-import@2.29.1)(eslint@8.57.0) eslint-plugin-import: specifier: 2.29.1 - version: 2.29.1(@typescript-eslint/parser@7.18.0(eslint@8.57.0)(typescript@5.5.4))(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0) + version: 2.29.1(@typescript-eslint/parser@7.18.0(eslint@8.57.0)(typescript@5.5.4))(eslint-import-resolver-typescript@3.6.3)(eslint@8.57.0) eslint-plugin-no-only-tests: specifier: 3.1.0 version: 3.1.0 @@ -2179,7 +2264,7 @@ importers: version: 5.0.10 tsx: specifier: ^4.11.0 - version: 4.16.5 + version: 4.18.0 typescript: specifier: ~5.5.0 version: 5.5.4 @@ -2192,8 +2277,8 @@ packages: '@actions/core@1.10.1': resolution: {integrity: sha512-3lBR9EDAY+iYIpTnTIXmWcNbX3T2kCkAEQGIQx4NVQ0575nk2k3GRZDTPQG+vVtS2izSLmINlxXf0uLtnrTP+g==} - '@actions/http-client@2.2.1': - resolution: {integrity: sha512-KhC/cZsq7f8I4LfZSJKgCvEwfkE8o1538VoBeoGzokVLLnbFDEAdFD3UhoMklxo2un9NJVBdANOresx7vTHlHw==} + '@actions/http-client@2.2.3': + resolution: {integrity: sha512-mx8hyJi/hjFvbPokCg4uRd4ZX78t+YyRPtnKWwIl+RzNaVuFpQHfmlGVfsKEJN8LwTCvL+DfVgAM04XaHkm6bA==} '@adraffy/ens-normalize@1.10.0': resolution: {integrity: sha512-nA9XHtlAkYfJxY7bce8DcN7eKxWWCWkU+1GR9d+U6MbNpfwQp8TI7vqOsBsMcHoT4mBu2kypKoSKnghEzOOq5Q==} @@ -2209,16 +2294,16 @@ packages: resolution: {integrity: sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA==} engines: {node: '>=6.9.0'} - '@babel/compat-data@7.25.2': - resolution: {integrity: sha512-bYcppcpKBvX4znYaPEeFau03bp89ShqNMLs+rmdptMw+heSZh9+z84d2YG+K7cYLbWwzdjtDoW/uqZmPjulClQ==} + '@babel/compat-data@7.25.4': + resolution: {integrity: sha512-+LGRog6RAsCJrrrg/IO6LGmpphNe5DiK30dGjCoxxeGv49B10/3XYGxPsAwrDlMFcFEvdAUavDT8r9k/hSyQqQ==} engines: {node: '>=6.9.0'} '@babel/core@7.25.2': resolution: {integrity: sha512-BBt3opiCOxUr9euZ5/ro/Xv8/V7yJ5bjYMqG/C1YAo8MIKAnumZalCN+msbci3Pigy4lIQfPUpfMM27HMGaYEA==} engines: {node: '>=6.9.0'} - '@babel/generator@7.25.0': - resolution: {integrity: sha512-3LEEcj3PVW8pW2R1SR1M89g/qrYk/m/mB/tLqn7dn4sbBUQyTqnlod+II2U4dqiGtUmkcnAmkMDralTFZttRiw==} + '@babel/generator@7.25.5': + resolution: {integrity: sha512-abd43wyLfbWoxC6ahM8xTkqLpGB2iWBVyuKC9/srhFunCd1SDNrV1s72bBpK4hLj8KLzHBBcOblvLQZBNw9r3w==} engines: {node: '>=6.9.0'} '@babel/helper-compilation-targets@7.25.2': @@ -2259,27 +2344,30 @@ packages: resolution: {integrity: sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==} engines: {node: '>=6.9.0'} - '@babel/parser@7.25.3': - resolution: {integrity: sha512-iLTJKDbJ4hMvFPgQwwsVoxtHyWpKKPBrxkANrSYewDPaPpT5py5yeVkgPIJ7XYXhndxJpaA3PyALSXQ7u8e/Dw==} + '@babel/parser@7.25.4': + resolution: {integrity: sha512-nq+eWrOgdtu3jG5Os4TQP3x3cLA8hR8TvJNjD8vnPa20WGycimcparWnLK4jJhElTK6SDyuJo1weMKO/5LpmLA==} engines: {node: '>=6.0.0'} hasBin: true - '@babel/runtime@7.25.0': - resolution: {integrity: sha512-7dRy4DwXwtzBrPbZflqxnvfxLF8kdZXPkhymtDeFoFqE6ldzjQFgYTtYIFARcLEYDrqfBfYcZt1WqFxRoyC9Rw==} + '@babel/runtime@7.25.4': + resolution: {integrity: sha512-DSgLeL/FNcpXuzav5wfYvHCGvynXkJbn3Zvc3823AEe9nPwW9IK4UoCSS5yGymmQzN0pCPvivtgS6/8U2kkm1w==} engines: {node: '>=6.9.0'} '@babel/template@7.25.0': resolution: {integrity: sha512-aOOgh1/5XzKvg1jvVz7AVrx2piJ2XBi227DHmbY6y+bM9H2FlN+IfecYu4Xl0cNiiVejlsCri89LUsbj8vJD9Q==} engines: {node: '>=6.9.0'} - '@babel/traverse@7.25.3': - resolution: {integrity: sha512-HefgyP1x754oGCsKmV5reSmtV7IXj/kpaE1XYY+D9G5PvKKoFfSbiS4M77MdjuwlZKDIKFCffq9rPU+H/s3ZdQ==} + '@babel/traverse@7.25.4': + resolution: {integrity: sha512-VJ4XsrD+nOvlXyLzmLzUs/0qjFS4sK30te5yEFlvbbUNEgKaVb2BHZUpAL+ttLPQAHNrsI3zZisbfha5Cvr8vg==} engines: {node: '>=6.9.0'} - '@babel/types@7.25.2': - resolution: {integrity: sha512-YTnYtra7W9e6/oAZEHj0bJehPRUlLH9/fbpT5LfB0NhQXyALCRkRs3zH9v07IYhkgpqX6Z78FnuccZr/l4Fs4Q==} + '@babel/types@7.25.4': + resolution: {integrity: sha512-zQ1ijeeCXVEh+aNL0RlmkPkG8HUiDcU2pzQQFjtbntgAczRASFzj4H+6+bV+dy1ntKR14I/DypeuRG1uma98iQ==} engines: {node: '>=6.9.0'} + '@bcoe/v8-coverage@0.2.3': + resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} + '@changesets/apply-release-plan@7.0.4': resolution: {integrity: sha512-HLFwhKWayKinWAul0Vj+76jVx1Pc2v55MGPVjZ924Y/ROeSsBMFutv9heHmCUj48lJyRfOTJG5+ar+29FUky/A==} @@ -2339,146 +2427,152 @@ packages: resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} engines: {node: '>=12'} - '@esbuild/aix-ppc64@0.21.5': - resolution: {integrity: sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==} - engines: {node: '>=12'} + '@esbuild/aix-ppc64@0.23.1': + resolution: {integrity: sha512-6VhYk1diRqrhBAqpJEdjASR/+WVRtfjpqKuNw11cLiaWpAT/Uu+nokB+UJnevzy/P9C/ty6AOe0dwueMrGh/iQ==} + engines: {node: '>=18'} cpu: [ppc64] os: [aix] - '@esbuild/android-arm64@0.21.5': - resolution: {integrity: sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==} - engines: {node: '>=12'} + '@esbuild/android-arm64@0.23.1': + resolution: {integrity: sha512-xw50ipykXcLstLeWH7WRdQuysJqejuAGPd30vd1i5zSyKK3WE+ijzHmLKxdiCMtH1pHz78rOg0BKSYOSB/2Khw==} + engines: {node: '>=18'} cpu: [arm64] os: [android] - '@esbuild/android-arm@0.21.5': - resolution: {integrity: sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==} - engines: {node: '>=12'} + '@esbuild/android-arm@0.23.1': + resolution: {integrity: sha512-uz6/tEy2IFm9RYOyvKl88zdzZfwEfKZmnX9Cj1BHjeSGNuGLuMD1kR8y5bteYmwqKm1tj8m4cb/aKEorr6fHWQ==} + engines: {node: '>=18'} cpu: [arm] os: [android] - '@esbuild/android-x64@0.21.5': - resolution: {integrity: sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==} - engines: {node: '>=12'} + '@esbuild/android-x64@0.23.1': + resolution: {integrity: sha512-nlN9B69St9BwUoB+jkyU090bru8L0NA3yFvAd7k8dNsVH8bi9a8cUAUSEcEEgTp2z3dbEDGJGfP6VUnkQnlReg==} + engines: {node: '>=18'} cpu: [x64] os: [android] - '@esbuild/darwin-arm64@0.21.5': - resolution: {integrity: sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==} - engines: {node: '>=12'} + '@esbuild/darwin-arm64@0.23.1': + resolution: {integrity: sha512-YsS2e3Wtgnw7Wq53XXBLcV6JhRsEq8hkfg91ESVadIrzr9wO6jJDMZnCQbHm1Guc5t/CdDiFSSfWP58FNuvT3Q==} + engines: {node: '>=18'} cpu: [arm64] os: [darwin] - '@esbuild/darwin-x64@0.21.5': - resolution: {integrity: sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==} - engines: {node: '>=12'} + '@esbuild/darwin-x64@0.23.1': + resolution: {integrity: sha512-aClqdgTDVPSEGgoCS8QDG37Gu8yc9lTHNAQlsztQ6ENetKEO//b8y31MMu2ZaPbn4kVsIABzVLXYLhCGekGDqw==} + engines: {node: '>=18'} cpu: [x64] os: [darwin] - '@esbuild/freebsd-arm64@0.21.5': - resolution: {integrity: sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==} - engines: {node: '>=12'} + '@esbuild/freebsd-arm64@0.23.1': + resolution: {integrity: sha512-h1k6yS8/pN/NHlMl5+v4XPfikhJulk4G+tKGFIOwURBSFzE8bixw1ebjluLOjfwtLqY0kewfjLSrO6tN2MgIhA==} + engines: {node: '>=18'} cpu: [arm64] os: [freebsd] - '@esbuild/freebsd-x64@0.21.5': - resolution: {integrity: sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==} - engines: {node: '>=12'} + '@esbuild/freebsd-x64@0.23.1': + resolution: {integrity: sha512-lK1eJeyk1ZX8UklqFd/3A60UuZ/6UVfGT2LuGo3Wp4/z7eRTRYY+0xOu2kpClP+vMTi9wKOfXi2vjUpO1Ro76g==} + engines: {node: '>=18'} cpu: [x64] os: [freebsd] - '@esbuild/linux-arm64@0.21.5': - resolution: {integrity: sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==} - engines: {node: '>=12'} + '@esbuild/linux-arm64@0.23.1': + resolution: {integrity: sha512-/93bf2yxencYDnItMYV/v116zff6UyTjo4EtEQjUBeGiVpMmffDNUyD9UN2zV+V3LRV3/on4xdZ26NKzn6754g==} + engines: {node: '>=18'} cpu: [arm64] os: [linux] - '@esbuild/linux-arm@0.21.5': - resolution: {integrity: sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==} - engines: {node: '>=12'} + '@esbuild/linux-arm@0.23.1': + resolution: {integrity: sha512-CXXkzgn+dXAPs3WBwE+Kvnrf4WECwBdfjfeYHpMeVxWE0EceB6vhWGShs6wi0IYEqMSIzdOF1XjQ/Mkm5d7ZdQ==} + engines: {node: '>=18'} cpu: [arm] os: [linux] - '@esbuild/linux-ia32@0.21.5': - resolution: {integrity: sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==} - engines: {node: '>=12'} + '@esbuild/linux-ia32@0.23.1': + resolution: {integrity: sha512-VTN4EuOHwXEkXzX5nTvVY4s7E/Krz7COC8xkftbbKRYAl96vPiUssGkeMELQMOnLOJ8k3BY1+ZY52tttZnHcXQ==} + engines: {node: '>=18'} cpu: [ia32] os: [linux] - '@esbuild/linux-loong64@0.21.5': - resolution: {integrity: sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==} - engines: {node: '>=12'} + '@esbuild/linux-loong64@0.23.1': + resolution: {integrity: sha512-Vx09LzEoBa5zDnieH8LSMRToj7ir/Jeq0Gu6qJ/1GcBq9GkfoEAoXvLiW1U9J1qE/Y/Oyaq33w5p2ZWrNNHNEw==} + engines: {node: '>=18'} cpu: [loong64] os: [linux] - '@esbuild/linux-mips64el@0.21.5': - resolution: {integrity: sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==} - engines: {node: '>=12'} + '@esbuild/linux-mips64el@0.23.1': + resolution: {integrity: sha512-nrFzzMQ7W4WRLNUOU5dlWAqa6yVeI0P78WKGUo7lg2HShq/yx+UYkeNSE0SSfSure0SqgnsxPvmAUu/vu0E+3Q==} + engines: {node: '>=18'} cpu: [mips64el] os: [linux] - '@esbuild/linux-ppc64@0.21.5': - resolution: {integrity: sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==} - engines: {node: '>=12'} + '@esbuild/linux-ppc64@0.23.1': + resolution: {integrity: sha512-dKN8fgVqd0vUIjxuJI6P/9SSSe/mB9rvA98CSH2sJnlZ/OCZWO1DJvxj8jvKTfYUdGfcq2dDxoKaC6bHuTlgcw==} + engines: {node: '>=18'} cpu: [ppc64] os: [linux] - '@esbuild/linux-riscv64@0.21.5': - resolution: {integrity: sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==} - engines: {node: '>=12'} + '@esbuild/linux-riscv64@0.23.1': + resolution: {integrity: sha512-5AV4Pzp80fhHL83JM6LoA6pTQVWgB1HovMBsLQ9OZWLDqVY8MVobBXNSmAJi//Csh6tcY7e7Lny2Hg1tElMjIA==} + engines: {node: '>=18'} cpu: [riscv64] os: [linux] - '@esbuild/linux-s390x@0.21.5': - resolution: {integrity: sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==} - engines: {node: '>=12'} + '@esbuild/linux-s390x@0.23.1': + resolution: {integrity: sha512-9ygs73tuFCe6f6m/Tb+9LtYxWR4c9yg7zjt2cYkjDbDpV/xVn+68cQxMXCjUpYwEkze2RcU/rMnfIXNRFmSoDw==} + engines: {node: '>=18'} cpu: [s390x] os: [linux] - '@esbuild/linux-x64@0.21.5': - resolution: {integrity: sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==} - engines: {node: '>=12'} + '@esbuild/linux-x64@0.23.1': + resolution: {integrity: sha512-EV6+ovTsEXCPAp58g2dD68LxoP/wK5pRvgy0J/HxPGB009omFPv3Yet0HiaqvrIrgPTBuC6wCH1LTOY91EO5hQ==} + engines: {node: '>=18'} cpu: [x64] os: [linux] - '@esbuild/netbsd-x64@0.21.5': - resolution: {integrity: sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==} - engines: {node: '>=12'} + '@esbuild/netbsd-x64@0.23.1': + resolution: {integrity: sha512-aevEkCNu7KlPRpYLjwmdcuNz6bDFiE7Z8XC4CPqExjTvrHugh28QzUXVOZtiYghciKUacNktqxdpymplil1beA==} + engines: {node: '>=18'} cpu: [x64] os: [netbsd] - '@esbuild/openbsd-x64@0.21.5': - resolution: {integrity: sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==} - engines: {node: '>=12'} + '@esbuild/openbsd-arm64@0.23.1': + resolution: {integrity: sha512-3x37szhLexNA4bXhLrCC/LImN/YtWis6WXr1VESlfVtVeoFJBRINPJ3f0a/6LV8zpikqoUg4hyXw0sFBt5Cr+Q==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openbsd] + + '@esbuild/openbsd-x64@0.23.1': + resolution: {integrity: sha512-aY2gMmKmPhxfU+0EdnN+XNtGbjfQgwZj43k8G3fyrDM/UdZww6xrWxmDkuz2eCZchqVeABjV5BpildOrUbBTqA==} + engines: {node: '>=18'} cpu: [x64] os: [openbsd] - '@esbuild/sunos-x64@0.21.5': - resolution: {integrity: sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==} - engines: {node: '>=12'} + '@esbuild/sunos-x64@0.23.1': + resolution: {integrity: sha512-RBRT2gqEl0IKQABT4XTj78tpk9v7ehp+mazn2HbUeZl1YMdaGAQqhapjGTCe7uw7y0frDi4gS0uHzhvpFuI1sA==} + engines: {node: '>=18'} cpu: [x64] os: [sunos] - '@esbuild/win32-arm64@0.21.5': - resolution: {integrity: sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==} - engines: {node: '>=12'} + '@esbuild/win32-arm64@0.23.1': + resolution: {integrity: sha512-4O+gPR5rEBe2FpKOVyiJ7wNDPA8nGzDuJ6gN4okSA1gEOYZ67N8JPk58tkWtdtPeLz7lBnY6I5L3jdsr3S+A6A==} + engines: {node: '>=18'} cpu: [arm64] os: [win32] - '@esbuild/win32-ia32@0.21.5': - resolution: {integrity: sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==} - engines: {node: '>=12'} + '@esbuild/win32-ia32@0.23.1': + resolution: {integrity: sha512-BcaL0Vn6QwCwre3Y717nVHZbAa4UBEigzFm6VdsVdT/MbZ38xoj1X9HPkZhbmaBGUD1W8vxAfffbDe8bA6AKnQ==} + engines: {node: '>=18'} cpu: [ia32] os: [win32] - '@esbuild/win32-x64@0.21.5': - resolution: {integrity: sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==} - engines: {node: '>=12'} + '@esbuild/win32-x64@0.23.1': + resolution: {integrity: sha512-BHpFFeslkWrXWyUPnbKm+xYYVYruCinGcftSBaa8zoF9hZO4BcSCFUvHVTtzpIY6YzUnYtuEhZ+C9iEXjxnasg==} + engines: {node: '>=18'} cpu: [x64] os: [win32] - '@eslint-community/eslint-plugin-eslint-comments@4.3.0': - resolution: {integrity: sha512-6e93KtgsndNkvwCCa07LOQJSwzzLLxwrFll3+huyFoiiQXWG0KBcmo0Q1bVgYQQDLfWOOZl2VPBsXqZL6vHIBQ==} + '@eslint-community/eslint-plugin-eslint-comments@4.4.0': + resolution: {integrity: sha512-yljsWl5Qv3IkIRmJ38h3NrHXFCm4EUl55M8doGTF6hvzvFF8kRpextgSrg2dwHev9lzBZyafCr9RelGIyQm6fw==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 || ^9.0.0 @@ -2672,8 +2766,8 @@ packages: '@ledgerhq/devices@8.4.2': resolution: {integrity: sha512-oWNTp3jCMaEvRHsXNYE/yo+PFMgXAJGFHLOU1UdE4/fYkniHbD9wdxwyZrZvrxr9hNw4/9wHiThyITwPtMzG7g==} - '@ledgerhq/domain-service@1.2.2': - resolution: {integrity: sha512-t5Nzi9ZKPAhGHdYwRJ/4ugKO9QCTDFgrx66evQ3sI+yDQyrP09e0Yxxr68JDlMp5IdhSObQrxaMIr4mBn4gr8w==} + '@ledgerhq/domain-service@1.2.3': + resolution: {integrity: sha512-q46q4fxnZgS7Fn+4P+UKJD4ccSZftljq4Jj36J8dNhuj+fdi0JG1B2B1pk4HbfkaWPMcpbNLXx4NyriN7+ncEQ==} '@ledgerhq/errors@6.18.0': resolution: {integrity: sha512-L3jQWAGyooxRDk/MRlW2v4Ji9+kloBtdmz9wBkHaj2j0n+05rweJSV3GHw9oye1BYMbVFqFffmT4H3hlXlCasw==} @@ -2696,8 +2790,8 @@ packages: '@ledgerhq/logs@6.12.0': resolution: {integrity: sha512-ExDoj1QV5eC6TEbMdLUMMk9cfvNKhhv5gXol4SmULRVCx/3iyCPhJ74nsb3S0Vb+/f+XujBEj3vQn5+cwS0fNA==} - '@ledgerhq/types-live@6.49.0': - resolution: {integrity: sha512-n4Qa1n1fbYO51nRfbZC14CkHyFFbdHbg4JiJVEWB2TbmU1a9BP49S4mSCcWiJcgwZTVfcI0GP2hNFBqU24GBbw==} + '@ledgerhq/types-live@6.50.0': + resolution: {integrity: sha512-6+PQ8/vG1inO0z1wauYdtyWZYKClm+rTigdFBrAuUBYkdkvf9j4TRR0Ekn98qXuWYwjq38rTY9M5C/q2L64oZw==} '@manypkg/find-root@1.1.0': resolution: {integrity: sha512-mki5uBvhHzO8kYYix/WRy2WX8S3B5wdVSc9D6KcU5lQNglP2yt58/VfLuAK49glRXChosY8ap2oJ1qgma3GUVA==} @@ -2744,36 +2838,40 @@ packages: resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} engines: {node: '>= 8'} - '@nomicfoundation/edr-darwin-arm64@0.5.0': - resolution: {integrity: sha512-G6OX/PESdfU4ZOyJ4MDh4eevW0wt2mduuxA+thXtTcStOiQTtPuV205h4kLOR5wRB1Zz6Zy0LedTMax7TzOtGw==} + '@nolyfill/is-core-module@1.0.39': + resolution: {integrity: sha512-nn5ozdjYQpUCZlWGuxcJY/KpxkWQs4DcbMCmKojjyrYDEAGy4Ce19NN4v5MduafTwJlbKc99UA8YhSVqq9yPZA==} + engines: {node: '>=12.4.0'} + + '@nomicfoundation/edr-darwin-arm64@0.5.2': + resolution: {integrity: sha512-Gm4wOPKhbDjGTIRyFA2QUAPfCXA1AHxYOKt3yLSGJkQkdy9a5WW+qtqKeEKHc/+4wpJSLtsGQfpzyIzggFfo/A==} engines: {node: '>= 18'} - '@nomicfoundation/edr-darwin-x64@0.5.0': - resolution: {integrity: sha512-fI7uHfHqPtdPZjkFUTpotc/F5gGv41ws+jSZy9+2AR9RDMOAIXMEArOx9rGLBcevWu8SFnyH/l/77kG/5FXbDw==} + '@nomicfoundation/edr-darwin-x64@0.5.2': + resolution: {integrity: sha512-ClyABq2dFCsrYEED3/UIO0c7p4H1/4vvlswFlqUyBpOkJccr75qIYvahOSJRM62WgUFRhbSS0OJXFRwc/PwmVg==} engines: {node: '>= 18'} - '@nomicfoundation/edr-linux-arm64-gnu@0.5.0': - resolution: {integrity: sha512-eMC3sWPkBZILg2/YB4Xv6IR0nggCLt5hS8K8jjHeGEeUs9pf8poBF2Oy+G4lSu0YLLjexGzHypz9/P+pIuxZHw==} + '@nomicfoundation/edr-linux-arm64-gnu@0.5.2': + resolution: {integrity: sha512-HWMTVk1iOabfvU2RvrKLDgtFjJZTC42CpHiw2h6rfpsgRqMahvIlx2jdjWYzFNy1jZKPTN1AStQ/91MRrg5KnA==} engines: {node: '>= 18'} - '@nomicfoundation/edr-linux-arm64-musl@0.5.0': - resolution: {integrity: sha512-yPK0tKjYRxe5ktggFr8aBHH0DCI9uafuaD8QuzyrQAfSf/m/ebTdgthROdbYp6eRk5mJyfAQT/45fM3tnlYsWw==} + '@nomicfoundation/edr-linux-arm64-musl@0.5.2': + resolution: {integrity: sha512-CwsQ10xFx/QAD5y3/g5alm9+jFVuhc7uYMhrZAu9UVF+KtVjeCvafj0PaVsZ8qyijjqVuVsJ8hD1x5ob7SMcGg==} engines: {node: '>= 18'} - '@nomicfoundation/edr-linux-x64-gnu@0.5.0': - resolution: {integrity: sha512-Hds8CRYi4DEyuErjcwUNSvNpMzmOYUihW4qYCoKgSBUVS5saX1PyPYvFYuYpeU5J8/T2iMk6yAPVLCxtKbgnKg==} + '@nomicfoundation/edr-linux-x64-gnu@0.5.2': + resolution: {integrity: sha512-CWVCEdhWJ3fmUpzWHCRnC0/VLBDbqtqTGTR6yyY1Ep3S3BOrHEAvt7h5gx85r2vLcztisu2vlDq51auie4IU1A==} engines: {node: '>= 18'} - '@nomicfoundation/edr-linux-x64-musl@0.5.0': - resolution: {integrity: sha512-1hXMDSzdyh5ojwO3ZSRbt7t5KKYycGUlFdC3lgJRZ7gStB8xjb7RA3hZn2csn9OydS950Ne4nh+puNq91iXApw==} + '@nomicfoundation/edr-linux-x64-musl@0.5.2': + resolution: {integrity: sha512-+aJDfwhkddy2pP5u1ISg3IZVAm0dO836tRlDTFWtvvSMQ5hRGqPcWwlsbobhDQsIxhPJyT7phL0orCg5W3WMeA==} engines: {node: '>= 18'} - '@nomicfoundation/edr-win32-x64-msvc@0.5.0': - resolution: {integrity: sha512-CFagD423400xXkRmACIR13FoocN48qi4ogRnuFQIvBDtEE3aMEajfFj4bycmQQDqnqChsZy/jwD4OxbX6oaNJw==} + '@nomicfoundation/edr-win32-x64-msvc@0.5.2': + resolution: {integrity: sha512-CcvvuA3sAv7liFNPsIR/68YlH6rrybKzYttLlMr80d4GKJjwJ5OKb3YgE6FdZZnOfP19HEHhsLcE0DPLtY3r0w==} engines: {node: '>= 18'} - '@nomicfoundation/edr@0.5.0': - resolution: {integrity: sha512-nAUyjGhxntXje/1AkDX9POfH+pqUxdi4XHzIhaf/dJYs7fgAFxL3STBK1OYcA3LR7vtiylLHMz7wxjqLzlLGKg==} + '@nomicfoundation/edr@0.5.2': + resolution: {integrity: sha512-hW/iLvUQZNTVjFyX/I40rtKvvDOqUEyIi96T28YaLfmPL+3LW2lxmYLUXEJ6MI14HzqxDqrLyhf6IbjAa2r3Dw==} engines: {node: '>= 18'} '@nomicfoundation/ethereumjs-block@5.0.4': @@ -2931,8 +3029,8 @@ packages: '@sinonjs/samsam@5.3.1': resolution: {integrity: sha512-1Hc0b1TtyfBu8ixF/tpfSHTVWKwCBLY4QJbkgnE7HcwyvT2xArDxb4K7dMgqRm3szI+LJbzmW/s4xxEhv6hwDg==} - '@sinonjs/text-encoding@0.7.2': - resolution: {integrity: sha512-sXXKG+uL9IrKqViTtao2Ws6dy0znu9sOaP1di/jKGW1M6VssO8vlpXCQcpZ+jisQ1tTFAC5Jo/EOzFbggBagFQ==} + '@sinonjs/text-encoding@0.7.3': + resolution: {integrity: sha512-DE427ROAphMQzU4ENbliGYrBSYPXF+TtLg9S8vzeA+OF4ZKzoDdzfL8sxuMUGS/lgRhM6j1URSk9ghf7Xo1tyA==} '@solidity-parser/parser@0.14.5': resolution: {integrity: sha512-6dKnHZn7fg/iQATVEzqyUOyEidbn05q7YA2mQ9hC0MMXhhV3/JrsxmFSYZAcr7j1yUP700LLhTruvJ3MiQmjJg==} @@ -2979,8 +3077,8 @@ packages: '@types/chai-as-promised@7.1.8': resolution: {integrity: sha512-ThlRVIJhr69FLlh6IctTXFkmhtP3NpMZ2QGq69StYLyKZFp/HOp1VdKZj7RvfNWYYcJ1xlbLGLLWj1UvP5u/Gw==} - '@types/chai@4.3.17': - resolution: {integrity: sha512-zmZ21EWzR71B4Sscphjief5djsLre50M6lI622OSySTmn9DB3j+C3kWroHfBQWXbOBwbgg/M8CG/hUxDLIloow==} + '@types/chai@4.3.18': + resolution: {integrity: sha512-2UfJzigyNa8kYTKn7o4hNMPphkxtu4WTJyobK3m4FBpyj7EK5xgtPcOtxLm7Dznk/Qxr0QXn+gQbkg7mCZKdfg==} '@types/ci-info@2.0.0': resolution: {integrity: sha512-5R2/MHILQLDCzTuhs1j4Qqq8AaKUf7Ma4KSSkCtc12+fMs47zfa34qhto9goxpyX00tQK1zxB885VCiawZ5Qhg==} @@ -3006,6 +3104,9 @@ packages: '@types/glob@7.2.0': resolution: {integrity: sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==} + '@types/istanbul-lib-coverage@2.0.6': + resolution: {integrity: sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==} + '@types/json-schema@7.0.15': resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} @@ -3048,11 +3149,11 @@ packages: '@types/node@18.15.13': resolution: {integrity: sha512-N+0kuo9KgrUQ1Sn/ifDXsvg0TTleP7rIy4zOBGECxAljqvqfqpTfzx0Q1NUedOixRMBfe2Whhb056a42cWs26Q==} - '@types/node@18.19.43': - resolution: {integrity: sha512-Mw/YlgXnyJdEwLoFv2dpuJaDFriX+Pc+0qOBJ57jC1H6cDxIj2xc5yUrdtArDVG0m+KV6622a4p2tenEqB3C/g==} + '@types/node@18.19.46': + resolution: {integrity: sha512-vnRgMS7W6cKa1/0G3/DTtQYpVrZ8c0Xm6UkLaVFrb9jtcVC3okokW09Ki1Qdrj9ISokszD69nY4WDLRlvHlhAA==} - '@types/node@20.14.14': - resolution: {integrity: sha512-d64f00982fS9YoOgJkAMolK7MN8Iq3TDdVjchbYHdEmjth/DHowx82GnoA+tVUAN+7vxfYUgAzi+JXbKNd2SDQ==} + '@types/node@20.16.1': + resolution: {integrity: sha512-zJDo7wEadFtSyNz5QITDfRcrhqDvQI1xQNQ0VoizPjM/dVAODqqIUWbJPkvsxmTI0MYRGRikcdjMPhOssnPejQ==} '@types/node@8.10.66': resolution: {integrity: sha512-tktOkFUA4kXx2hhhrB8bIFb5TbwzS4uOhKEmwiD+NoiL0qtP2OQ9mFldbgD4dV1djrlBYP6eBuQZiWjuHUpqFw==} @@ -3516,8 +3617,8 @@ packages: resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} engines: {node: '>= 0.4'} - axios@1.7.3: - resolution: {integrity: sha512-Ar7ND9pU99eJ9GpoGQKhKf58GpUOgnzuaB7ueNQ5BMi0p+LZ5oaEnfF999fAArcTIBwXTCHAmGcHOZJaWPq9Nw==} + axios@1.7.5: + resolution: {integrity: sha512-fZu86yCo+svH3uqJ/yTdQ0QHpQu5oL+/QE+QPSv6BZSkDAoky9vytxp7u5qk83OJFS3kEBcesWni9WTZAv3tSw==} balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} @@ -3617,6 +3718,11 @@ packages: resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} engines: {node: '>= 0.8'} + c8@9.1.0: + resolution: {integrity: sha512-mBWcT5iqNir1zIkzSPyI3NCR9EZCVI3WUD+AVO17MVWTSFNyUueXE82qTeampNtTr+ilN/5Ua3j24LgbCKjDVg==} + engines: {node: '>=14.14.0'} + hasBin: true + caching-transform@4.0.0: resolution: {integrity: sha512-kpqOvwXnjjN44D89K5ccQC+RUrsy7jB/XLlRrx0D7/2HNcTPqzsb6XgYoErwko6QsV184CA2YgS1fxDiiDZMWA==} engines: {node: '>=8'} @@ -3637,8 +3743,8 @@ packages: resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} engines: {node: '>=10'} - caniuse-lite@1.0.30001649: - resolution: {integrity: sha512-fJegqZZ0ZX8HOWr6rcafGr72+xcgJKI9oWfDW5DrD7ExUtgZC7a7R7ZYmZqplh7XDocFdGeIFn7roAxhOeYrPQ==} + caniuse-lite@1.0.30001653: + resolution: {integrity: sha512-XGWQVB8wFQ2+9NZwZ10GxTYC5hk0Fa+q8cSkr0tgvMhYhMHP/QC+WTgrePMDBWiWc/pV+1ik82Al20XOK25Gcw==} caseless@0.12.0: resolution: {integrity: sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==} @@ -3728,6 +3834,10 @@ packages: cliui@7.0.4: resolution: {integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==} + cliui@8.0.1: + resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} + engines: {node: '>=12'} + clone@1.0.4: resolution: {integrity: sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==} engines: {node: '>=0.8'} @@ -3973,14 +4083,14 @@ packages: eip55@2.1.1: resolution: {integrity: sha512-WcagVAmNu2Ww2cDUfzuWVntYwFxbvZ5MvIyLZpMjTTkjD6sCvkGOiS86jTppzu9/gWsc8isLHAeMBWK02OnZmA==} - electron-to-chromium@1.5.4: - resolution: {integrity: sha512-orzA81VqLyIGUEA77YkVA1D+N+nNfl2isJVjjmOyrlxuooZ19ynb+dOlaDTqd/idKRS9lDCSBmtzM+kyCsMnkA==} + electron-to-chromium@1.5.13: + resolution: {integrity: sha512-lbBcvtIJ4J6sS4tb5TLp1b4LyfCdMkwStzXPyAgVgTRAsep4bvrAGaBOP7ZJtQMNJpSQ9SqG4brWOroNaQtm7Q==} elliptic@6.5.4: resolution: {integrity: sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==} - elliptic@6.5.6: - resolution: {integrity: sha512-mpzdtpeCLuS3BmE3pO3Cpp5bbjlOPY2Q0PgoF+Od1XZrHLYI28Xe3ossCmYCQt11FQKEYd9+PF8jymTvtWJSHQ==} + elliptic@6.5.7: + resolution: {integrity: sha512-ESVCtTwiA+XhY3wyh24QqRGBoP3rEdDUl3EDUUo9tft074fi19IrdpH7hLCMMP3CIj7jb3W96rn8lt/BqIlt5Q==} emoji-regex@8.0.0: resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} @@ -4036,9 +4146,9 @@ packages: es6-error@4.1.1: resolution: {integrity: sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==} - esbuild@0.21.5: - resolution: {integrity: sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==} - engines: {node: '>=12'} + esbuild@0.23.1: + resolution: {integrity: sha512-VVNz/9Sa0bs5SELtn3f7qhJCDPCF5oMEl5cO9/SSinpE9hbPVvxbd572HH5AKiP7WD8INO53GgfDDhRjkylHEg==} + engines: {node: '>=18'} hasBin: true escalade@3.1.2: @@ -4086,15 +4196,21 @@ packages: eslint-import-resolver-node@0.3.9: resolution: {integrity: sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==} - eslint-import-resolver-typescript@3.6.1: - resolution: {integrity: sha512-xgdptdoi5W3niYeuQxKmzVDTATvLYqhpwmykwsh7f6HIOStGWEIL9iqZgQDF9u9OEzrRwR8no5q2VT+bjAujTg==} + eslint-import-resolver-typescript@3.6.3: + resolution: {integrity: sha512-ud9aw4szY9cCT1EWWdGv1L1XR6hh2PaRWif0j2QjQ0pgTY/69iw+W0Z4qZv5wHahOl8isEr+k/JnyAqNQkLkIA==} engines: {node: ^14.18.0 || >=16.0.0} peerDependencies: eslint: '*' eslint-plugin-import: '*' + eslint-plugin-import-x: '*' + peerDependenciesMeta: + eslint-plugin-import: + optional: true + eslint-plugin-import-x: + optional: true - eslint-module-utils@2.8.1: - resolution: {integrity: sha512-rXDXR3h7cs7dy9RNpUlQf80nX31XWJEyGq1tRMo+6GsO5VmTe4UTwtmonAD4ZkAsrfMVDA2wlGJ3790Ys+D49Q==} + eslint-module-utils@2.8.2: + resolution: {integrity: sha512-3XnC5fDyc8M4J2E8pt8pmSVRX2M+5yWMCfI/kDZwauQeFgzQOuhcRBFKjTeJagqgk4sFKxe1mvNVnaWwImx/Tg==} engines: {node: '>=4'} peerDependencies: '@typescript-eslint/parser': '*' @@ -4395,8 +4511,8 @@ packages: resolution: {integrity: sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA==} engines: {node: '>=8.0.0'} - foreground-child@3.2.1: - resolution: {integrity: sha512-PXUUyLqrR2XCWICfv6ukppP96sdFwWbNEnfEMt7jNsISjMsvaLNinAHNDYyvkyU+SZG2BTSbT5NjG+vZslfGTA==} + foreground-child@3.3.0: + resolution: {integrity: sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==} engines: {node: '>=14'} form-data@2.5.1: @@ -4664,8 +4780,8 @@ packages: ieee754@1.2.1: resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} - ignore@5.3.1: - resolution: {integrity: sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==} + ignore@5.3.2: + resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} engines: {node: '>= 4'} immer@10.0.2: @@ -4736,12 +4852,15 @@ packages: resolution: {integrity: sha512-BSLE3HnV2syZ0FK0iMA/yUGplUeMmNz4AW5fnTunbCIqZi4vG3WjJT9FHMy5D69xmAYBHXQhJdALdpwVxV501A==} engines: {node: '>=6'} + is-bun-module@1.1.0: + resolution: {integrity: sha512-4mTAVPlrXpaN3jtF0lsnPCMGnq4+qZjVIKq0HCpfcqf8OC1SM5oATCIAPM5V5FN05qp2NNnFndphmdZS9CV3hA==} + is-callable@1.2.7: resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} engines: {node: '>= 0.4'} - is-core-module@2.15.0: - resolution: {integrity: sha512-Dd+Lb2/zvk9SKy1TGCt1wFJFo/MWBPMX5x7KcvLajWTGuomczdQX61PvY5yK6SVACwpoexWo81IfFyoKY2QnTA==} + is-core-module@2.15.1: + resolution: {integrity: sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ==} engines: {node: '>= 0.4'} is-data-view@1.0.1: @@ -5096,8 +5215,8 @@ packages: micro-ftch@0.3.1: resolution: {integrity: sha512-/0LLxhzP0tfiR5hcQebtudP56gUurs2CLkGarnCiB/OqEyUFQ6U3paQi/tgLv0hBJYt2rnr9MNpxz4fiiugstg==} - micromatch@4.0.7: - resolution: {integrity: sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q==} + micromatch@4.0.8: + resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} engines: {node: '>=8.6'} mime-db@1.52.0: @@ -5155,8 +5274,8 @@ packages: mnemonist@0.38.5: resolution: {integrity: sha512-bZTFT5rrPKtPJxj8KSV0WkPyNxl72vQepqqVUAW2ARUpUSF2qXMB6jZj7hW5/k7C1rtpzqbD/IIbJwLXUjCHeg==} - mocha@10.7.0: - resolution: {integrity: sha512-v8/rBWr2VO5YkspYINnvu81inSz2y3ODJrhO175/Exzor1RcEZZkizgE2A+w/CAXXoESS8Kys5E62dOHGHzULA==} + mocha@10.7.3: + resolution: {integrity: sha512-uQWxAu44wwiACGqjbPYmjo7Lg8sFrS3dQe7PP2FQI+woptP4vZXSMcfMyFL/e1yFEeEpV4RtyTpZROOKmxis+A==} engines: {node: '>= 14.0.0'} hasBin: true @@ -5193,8 +5312,8 @@ packages: no-case@3.0.4: resolution: {integrity: sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==} - node-abi@3.65.0: - resolution: {integrity: sha512-ThjYBfoDNr08AWx6hGaRbfPwxKV9kVzAzOzlLKbk2CuqXE2xnCh+cbAGnwM3t8Lq4v9rUB7VfondlkBckcJrVA==} + node-abi@3.67.0: + resolution: {integrity: sha512-bLn/fU/ALVBE9wj+p4Y21ZJWYFjUXLXPi/IewyLZkx3ApxKDNBWCKdReeKOtD8dWpOdDCeMyLh6ZewzcLsG2Nw==} engines: {node: '>=10'} node-addon-api@2.0.2: @@ -6042,8 +6161,8 @@ packages: tslib@2.4.0: resolution: {integrity: sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==} - tslib@2.6.3: - resolution: {integrity: sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==} + tslib@2.7.0: + resolution: {integrity: sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==} tsort@0.0.1: resolution: {integrity: sha512-Tyrf5mxF8Ofs1tNoxA13lFeZ2Zrbd6cKbuH3V+MQ5sb6DtBj5FjrXVsRWT8YvNAQTqNoz66dz1WsbigI22aEnw==} @@ -6054,8 +6173,8 @@ packages: 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' - tsx@4.16.5: - resolution: {integrity: sha512-ArsiAQHEW2iGaqZ8fTA1nX0a+lN5mNTyuGRRO6OW3H/Yno1y9/t1f9YOI1Cfoqz63VAthn++ZYcbDP7jPflc+A==} + tsx@4.18.0: + resolution: {integrity: sha512-a1jaKBSVQkd6yEc1/NI7G6yHFfefIcuf3QJST7ZEyn4oQnxLYrZR5uZAM8UrwUa3Ge8suiZHcNS1gNrEvmobqg==} engines: {node: '>=18.0.0'} hasBin: true @@ -6168,8 +6287,8 @@ packages: resolution: {integrity: sha512-dvdQgNDNJo+8B2uBQoqdb11eUCE1JQXhvjC/CZtgvZseVd5TYMXnq0+vuUemXbd/Se29cTaUuPX3YIc2xgbvIg==} engines: {node: '>=8'} - uglify-js@3.19.1: - resolution: {integrity: sha512-y/2wiW+ceTYR2TSSptAhfnEtpLaQ4Ups5zrjB2d3kuVxHj16j/QJwPl5PvuGy9uARb39J0+iKxcRPvtpsx4A4A==} + uglify-js@3.19.2: + resolution: {integrity: sha512-S8KA6DDI47nQXJSi2ctQ629YzwOVs+bQML6DAtvy0wgNdpi+0ySpQK0g2pxBq2xfF2z3YCscu7NNA8nXT9PlIQ==} engines: {node: '>=0.8.0'} hasBin: true @@ -6179,12 +6298,15 @@ packages: undici-types@5.26.5: resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} + undici-types@6.19.8: + resolution: {integrity: sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==} + undici@5.28.4: resolution: {integrity: sha512-72RFADWFqKmUb2hmmvNODKL3p9hcB6Gt2DOQMis1SEBaV6a4MH8soBvzg+95CYhCKPFedut2JY9bMfrDl9D23g==} engines: {node: '>=14.0'} - undici@6.19.5: - resolution: {integrity: sha512-LryC15SWzqQsREHIOUybavaIHF5IoL0dJ9aWWxL/PgT1KfqAW5225FZpDUFlt9xiDMS2/S7DOKhFWA7RLksWdg==} + undici@6.19.8: + resolution: {integrity: sha512-U8uCCl2x9TK3WANvmBavymRzxbfFYG+tAu+fgx3zxQy3qdagQqBLwJVrdyO1TBfUXvfKveMKJZhpvUYoOjM+4g==} engines: {node: '>=18.17'} universalify@0.1.2: @@ -6232,6 +6354,10 @@ packages: v8-compile-cache-lib@3.0.1: resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==} + v8-to-istanbul@9.3.0: + resolution: {integrity: sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA==} + engines: {node: '>=10.12.0'} + viem@2.18.8: resolution: {integrity: sha512-Fi5d9fd/LBiVtJ5eV2c99yrdt4dJH5Vbkf2JajwCqHYuV4ErSk/sm+L6Ru3rzT67rfRHSOQibTZxByEBua/WLw==} peerDependencies: @@ -6240,27 +6366,35 @@ packages: typescript: optional: true + viem@2.20.0: + resolution: {integrity: sha512-cM4vs81HnSNbfceI1MLkx4pCVzbVjl9xiNSv5SCutYjUyFFOVSPDlEyhpg2iHinxx1NM4Qne3END5eLT8rvUdg==} + peerDependencies: + typescript: '>=5.0.4' + peerDependenciesMeta: + typescript: + optional: true + wcwidth@1.0.1: resolution: {integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==} - web3-core@4.5.0: - resolution: {integrity: sha512-Q8LIAqmF7vkRydBPiU+OC7wI44nEU6JEExolFaOakqrjMtQ1CWFHRUQMNJRDsk5bRirjyShuAsuqLeYByvvXhg==} + web3-core@4.5.1: + resolution: {integrity: sha512-mFMOO/IWdKsLL1o2whh3oJ0LCG9P3l5c4lpiMoVsVln3QXh/B0Gf8gW3aY8S+Ixm0OHyzFDXJVc2CodxqmI4Gw==} engines: {node: '>=14', npm: '>=6.12.0'} - web3-errors@1.2.1: - resolution: {integrity: sha512-dIsi8SFC9TCAWpPmacXeVMk/F8tDNa1Bvg8/Cc2cvJo8LRSWd099szEyb+/SiMYcLlEbwftiT9Rpukz7ql4hBg==} + web3-errors@1.3.0: + resolution: {integrity: sha512-j5JkAKCtuVMbY3F5PYXBqg1vWrtF4jcyyMY1rlw8a4PV67AkqlepjGgpzWJZd56Mt+TvHy6DA1F/3Id8LatDSQ==} engines: {node: '>=14', npm: '>=6.12.0'} web3-eth-abi@4.2.3: resolution: {integrity: sha512-rPVwTn0O1CzbtfXwEfIjUP0W5Y7u1OFjugwKpSqJzPQE6+REBg6OELjomTGZBu+GThxHnv0rp15SOxvqp+tyXA==} engines: {node: '>=14', npm: '>=6.12.0'} - web3-eth-accounts@4.1.3: - resolution: {integrity: sha512-61Nb7xCXy6Vw/6xUZMM5ITtXetXmaP0F8oKRxika4GO4fRfKZLAwBZtshMyrdAORPZYq77ENiqXJVU+hTmtUaQ==} + web3-eth-accounts@4.2.1: + resolution: {integrity: sha512-aOlEZFzqAgKprKs7+DGArU4r9b+ILBjThpeq42aY7LAQcP+mSpsWcQgbIRK3r/n3OwTYZ3aLPk0Ih70O/LwnYA==} engines: {node: '>=14', npm: '>=6.12.0'} - web3-eth-contract@4.6.0: - resolution: {integrity: sha512-mgQ/WUUlgW9BVKKVGU/Q7KrQEbEGI98h8ppox7fT964wY9ITFMDuRCvYk50WTWnFMdjFtOBqt1xRJ0+B1ekCHg==} + web3-eth-contract@4.7.0: + resolution: {integrity: sha512-fdStoBOjFyMHwlyJmSUt/BTDL1ATwKGmG3zDXQ/zTKlkkW/F/074ut0Vry4GuwSBg9acMHc0ycOiZx9ZKjNHsw==} engines: {node: '>=14', npm: '>=6.12.0'} web3-eth-ens@4.4.0: @@ -6283,8 +6417,8 @@ packages: resolution: {integrity: sha512-WWmfvHVIXWEoBDWdgKNYKN8rAy6SgluZ0abyRyXOL3ESr7ym7pKWbfP4fjApIHlYTh8tNqkrdPfM4Dyi6CA0SA==} engines: {node: '>=14', npm: '>=6.12.0'} - web3-providers-http@4.1.0: - resolution: {integrity: sha512-6qRUGAhJfVQM41E5t+re5IHYmb5hSaLc02BE2MaRQsz2xKA6RjmHpOA5h/+ojJxEpI9NI2CrfDKOAgtJfoUJQg==} + web3-providers-http@4.2.0: + resolution: {integrity: sha512-IPMnDtHB7dVwaB7/mMxAZzyq7d5ezfO1+Vw0bNfAeIi7gaDlJiggp85SdyAfOgov8AMUA/dyiY72kQ0KmjXKvQ==} engines: {node: '>=14', npm: '>=6.12.0'} web3-providers-ipc@4.0.7: @@ -6299,8 +6433,8 @@ packages: resolution: {integrity: sha512-/CHmzGN+IYgdBOme7PdqzF+FNeMleefzqs0LVOduncSaqsppeOEoskLXb2anSpzmQAP3xZJPaTrkQPWSJMORig==} engines: {node: '>=14', npm: '>=6.12.0'} - web3-rpc-providers@1.0.0-rc.1: - resolution: {integrity: sha512-N7AgGB+ilKPFQohnlI1vNHWmQ5Wh5vlGdYKWCWJc9kisKxxGtOsqN3W8tOj6/898sHZIXU9i/IAOyreGDIybmw==} + web3-rpc-providers@1.0.0-rc.2: + resolution: {integrity: sha512-ocFIEXcBx/DYQ90HhVepTBUVnL9pGsZw8wyPb1ZINSenwYus9SvcFkjU1Hfvd/fXjuhAv2bUVch9vxvMx1mXAQ==} engines: {node: '>=14', npm: '>=6.12.0'} web3-types@1.7.0: @@ -6319,8 +6453,8 @@ packages: resolution: {integrity: sha512-qn9id0/l1bWmvH4XfnG/JtGKKwut2Vokl6YXP5Kfg424npysmtRLe9DgiNBM9Op7QL/aSiaA0TVXibuIuWcizg==} engines: {node: '>=14', npm: '>=6.12.0'} - web3@4.11.1: - resolution: {integrity: sha512-KUntBtnc+cj9ur/yNcdTok9MpCI9dHf8h1hRmLPVICF5wyKyHbR4t+51vqUnK5bI6UxVfRPT++qCcP7KhDACVA==} + web3@4.12.1: + resolution: {integrity: sha512-zIFUPdgo2uG5Vbl7C4KrTv8dmWKN3sGnY/GundbiJzcaJZDxaCyu3a5HXAcgUM1VvvsVb1zaUQAFPceq05/q/Q==} engines: {node: '>=14.0.0', npm: '>=6.12.0'} webauthn-p256@0.0.5: @@ -6460,6 +6594,10 @@ packages: resolution: {integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==} engines: {node: '>=10'} + yargs-parser@21.1.1: + resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} + engines: {node: '>=12'} + yargs-unparser@2.0.0: resolution: {integrity: sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==} engines: {node: '>=10'} @@ -6472,6 +6610,10 @@ packages: resolution: {integrity: sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==} engines: {node: '>=10'} + yargs@17.7.2: + resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} + engines: {node: '>=12'} + yn@3.1.1: resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==} engines: {node: '>=6'} @@ -6487,10 +6629,10 @@ snapshots: '@actions/core@1.10.1': dependencies: - '@actions/http-client': 2.2.1 + '@actions/http-client': 2.2.3 uuid: 8.3.2 - '@actions/http-client@2.2.1': + '@actions/http-client@2.2.3': dependencies: tunnel: 0.0.6 undici: 5.28.4 @@ -6509,20 +6651,20 @@ snapshots: '@babel/highlight': 7.24.7 picocolors: 1.0.1 - '@babel/compat-data@7.25.2': {} + '@babel/compat-data@7.25.4': {} '@babel/core@7.25.2': dependencies: '@ampproject/remapping': 2.3.0 '@babel/code-frame': 7.24.7 - '@babel/generator': 7.25.0 + '@babel/generator': 7.25.5 '@babel/helper-compilation-targets': 7.25.2 '@babel/helper-module-transforms': 7.25.2(@babel/core@7.25.2) '@babel/helpers': 7.25.0 - '@babel/parser': 7.25.3 + '@babel/parser': 7.25.4 '@babel/template': 7.25.0 - '@babel/traverse': 7.25.3 - '@babel/types': 7.25.2 + '@babel/traverse': 7.25.4 + '@babel/types': 7.25.4 convert-source-map: 2.0.0 debug: 4.3.6(supports-color@8.1.1) gensync: 1.0.0-beta.2 @@ -6531,16 +6673,16 @@ snapshots: transitivePeerDependencies: - supports-color - '@babel/generator@7.25.0': + '@babel/generator@7.25.5': dependencies: - '@babel/types': 7.25.2 + '@babel/types': 7.25.4 '@jridgewell/gen-mapping': 0.3.5 '@jridgewell/trace-mapping': 0.3.25 jsesc: 2.5.2 '@babel/helper-compilation-targets@7.25.2': dependencies: - '@babel/compat-data': 7.25.2 + '@babel/compat-data': 7.25.4 '@babel/helper-validator-option': 7.24.8 browserslist: 4.23.3 lru-cache: 5.1.1 @@ -6548,8 +6690,8 @@ snapshots: '@babel/helper-module-imports@7.24.7': dependencies: - '@babel/traverse': 7.25.3 - '@babel/types': 7.25.2 + '@babel/traverse': 7.25.4 + '@babel/types': 7.25.4 transitivePeerDependencies: - supports-color @@ -6559,14 +6701,14 @@ snapshots: '@babel/helper-module-imports': 7.24.7 '@babel/helper-simple-access': 7.24.7 '@babel/helper-validator-identifier': 7.24.7 - '@babel/traverse': 7.25.3 + '@babel/traverse': 7.25.4 transitivePeerDependencies: - supports-color '@babel/helper-simple-access@7.24.7': dependencies: - '@babel/traverse': 7.25.3 - '@babel/types': 7.25.2 + '@babel/traverse': 7.25.4 + '@babel/types': 7.25.4 transitivePeerDependencies: - supports-color @@ -6579,7 +6721,7 @@ snapshots: '@babel/helpers@7.25.0': dependencies: '@babel/template': 7.25.0 - '@babel/types': 7.25.2 + '@babel/types': 7.25.4 '@babel/highlight@7.24.7': dependencies: @@ -6588,41 +6730,43 @@ snapshots: js-tokens: 4.0.0 picocolors: 1.0.1 - '@babel/parser@7.25.3': + '@babel/parser@7.25.4': dependencies: - '@babel/types': 7.25.2 + '@babel/types': 7.25.4 - '@babel/runtime@7.25.0': + '@babel/runtime@7.25.4': dependencies: regenerator-runtime: 0.14.1 '@babel/template@7.25.0': dependencies: '@babel/code-frame': 7.24.7 - '@babel/parser': 7.25.3 - '@babel/types': 7.25.2 + '@babel/parser': 7.25.4 + '@babel/types': 7.25.4 - '@babel/traverse@7.25.3': + '@babel/traverse@7.25.4': dependencies: '@babel/code-frame': 7.24.7 - '@babel/generator': 7.25.0 - '@babel/parser': 7.25.3 + '@babel/generator': 7.25.5 + '@babel/parser': 7.25.4 '@babel/template': 7.25.0 - '@babel/types': 7.25.2 + '@babel/types': 7.25.4 debug: 4.3.6(supports-color@8.1.1) globals: 11.12.0 transitivePeerDependencies: - supports-color - '@babel/types@7.25.2': + '@babel/types@7.25.4': dependencies: '@babel/helper-string-parser': 7.24.8 '@babel/helper-validator-identifier': 7.24.7 to-fast-properties: 2.0.0 + '@bcoe/v8-coverage@0.2.3': {} + '@changesets/apply-release-plan@7.0.4': dependencies: - '@babel/runtime': 7.25.0 + '@babel/runtime': 7.25.4 '@changesets/config': 3.0.2 '@changesets/get-version-range-type': 0.4.0 '@changesets/git': 3.0.0 @@ -6639,7 +6783,7 @@ snapshots: '@changesets/assemble-release-plan@6.0.3': dependencies: - '@babel/runtime': 7.25.0 + '@babel/runtime': 7.25.4 '@changesets/errors': 0.2.0 '@changesets/get-dependents-graph': 2.1.1 '@changesets/should-skip-package': 0.1.0 @@ -6653,7 +6797,7 @@ snapshots: '@changesets/cli@2.27.7': dependencies: - '@babel/runtime': 7.25.0 + '@babel/runtime': 7.25.4 '@changesets/apply-release-plan': 7.0.4 '@changesets/assemble-release-plan': 6.0.3 '@changesets/changelog-git': 0.2.0 @@ -6694,7 +6838,7 @@ snapshots: '@changesets/types': 6.0.0 '@manypkg/get-packages': 1.1.3 fs-extra: 7.0.1 - micromatch: 4.0.7 + micromatch: 4.0.8 '@changesets/errors@0.2.0': dependencies: @@ -6710,7 +6854,7 @@ snapshots: '@changesets/get-release-plan@4.0.3': dependencies: - '@babel/runtime': 7.25.0 + '@babel/runtime': 7.25.4 '@changesets/assemble-release-plan': 6.0.3 '@changesets/config': 3.0.2 '@changesets/pre': 2.0.0 @@ -6722,12 +6866,12 @@ snapshots: '@changesets/git@3.0.0': dependencies: - '@babel/runtime': 7.25.0 + '@babel/runtime': 7.25.4 '@changesets/errors': 0.2.0 '@changesets/types': 6.0.0 '@manypkg/get-packages': 1.1.3 is-subdir: 1.2.0 - micromatch: 4.0.7 + micromatch: 4.0.8 spawndamnit: 2.0.0 '@changesets/logger@0.1.0': @@ -6741,7 +6885,7 @@ snapshots: '@changesets/pre@2.0.0': dependencies: - '@babel/runtime': 7.25.0 + '@babel/runtime': 7.25.4 '@changesets/errors': 0.2.0 '@changesets/types': 6.0.0 '@manypkg/get-packages': 1.1.3 @@ -6749,7 +6893,7 @@ snapshots: '@changesets/read@0.6.0': dependencies: - '@babel/runtime': 7.25.0 + '@babel/runtime': 7.25.4 '@changesets/git': 3.0.0 '@changesets/logger': 0.1.0 '@changesets/parse': 0.4.0 @@ -6760,7 +6904,7 @@ snapshots: '@changesets/should-skip-package@0.1.0': dependencies: - '@babel/runtime': 7.25.0 + '@babel/runtime': 7.25.4 '@changesets/types': 6.0.0 '@manypkg/get-packages': 1.1.3 @@ -6770,7 +6914,7 @@ snapshots: '@changesets/write@0.3.1': dependencies: - '@babel/runtime': 7.25.0 + '@babel/runtime': 7.25.4 '@changesets/types': 6.0.0 fs-extra: 7.0.1 human-id: 1.0.2 @@ -6780,80 +6924,83 @@ snapshots: dependencies: '@jridgewell/trace-mapping': 0.3.9 - '@esbuild/aix-ppc64@0.21.5': + '@esbuild/aix-ppc64@0.23.1': optional: true - '@esbuild/android-arm64@0.21.5': + '@esbuild/android-arm64@0.23.1': optional: true - '@esbuild/android-arm@0.21.5': + '@esbuild/android-arm@0.23.1': optional: true - '@esbuild/android-x64@0.21.5': + '@esbuild/android-x64@0.23.1': optional: true - '@esbuild/darwin-arm64@0.21.5': + '@esbuild/darwin-arm64@0.23.1': optional: true - '@esbuild/darwin-x64@0.21.5': + '@esbuild/darwin-x64@0.23.1': optional: true - '@esbuild/freebsd-arm64@0.21.5': + '@esbuild/freebsd-arm64@0.23.1': optional: true - '@esbuild/freebsd-x64@0.21.5': + '@esbuild/freebsd-x64@0.23.1': optional: true - '@esbuild/linux-arm64@0.21.5': + '@esbuild/linux-arm64@0.23.1': optional: true - '@esbuild/linux-arm@0.21.5': + '@esbuild/linux-arm@0.23.1': optional: true - '@esbuild/linux-ia32@0.21.5': + '@esbuild/linux-ia32@0.23.1': optional: true - '@esbuild/linux-loong64@0.21.5': + '@esbuild/linux-loong64@0.23.1': optional: true - '@esbuild/linux-mips64el@0.21.5': + '@esbuild/linux-mips64el@0.23.1': optional: true - '@esbuild/linux-ppc64@0.21.5': + '@esbuild/linux-ppc64@0.23.1': optional: true - '@esbuild/linux-riscv64@0.21.5': + '@esbuild/linux-riscv64@0.23.1': optional: true - '@esbuild/linux-s390x@0.21.5': + '@esbuild/linux-s390x@0.23.1': optional: true - '@esbuild/linux-x64@0.21.5': + '@esbuild/linux-x64@0.23.1': optional: true - '@esbuild/netbsd-x64@0.21.5': + '@esbuild/netbsd-x64@0.23.1': optional: true - '@esbuild/openbsd-x64@0.21.5': + '@esbuild/openbsd-arm64@0.23.1': optional: true - '@esbuild/sunos-x64@0.21.5': + '@esbuild/openbsd-x64@0.23.1': optional: true - '@esbuild/win32-arm64@0.21.5': + '@esbuild/sunos-x64@0.23.1': optional: true - '@esbuild/win32-ia32@0.21.5': + '@esbuild/win32-arm64@0.23.1': optional: true - '@esbuild/win32-x64@0.21.5': + '@esbuild/win32-ia32@0.23.1': optional: true - '@eslint-community/eslint-plugin-eslint-comments@4.3.0(eslint@8.57.0)': + '@esbuild/win32-x64@0.23.1': + optional: true + + '@eslint-community/eslint-plugin-eslint-comments@4.4.0(eslint@8.57.0)': dependencies: escape-string-regexp: 4.0.0 eslint: 8.57.0 - ignore: 5.3.1 + ignore: 5.3.2 '@eslint-community/eslint-utils@4.4.0(eslint@8.57.0)': dependencies: @@ -6868,7 +7015,7 @@ snapshots: debug: 4.3.6(supports-color@8.1.1) espree: 9.6.1 globals: 13.24.0 - ignore: 5.3.1 + ignore: 5.3.2 import-fresh: 3.3.0 js-yaml: 4.1.0 minimatch: 3.1.2 @@ -7231,12 +7378,12 @@ snapshots: rxjs: 7.8.1 semver: 7.6.3 - '@ledgerhq/domain-service@1.2.2(debug@4.3.6)': + '@ledgerhq/domain-service@1.2.3(debug@4.3.6)': dependencies: '@ledgerhq/errors': 6.18.0 '@ledgerhq/logs': 6.12.0 - '@ledgerhq/types-live': 6.49.0 - axios: 1.7.3(debug@4.3.6) + '@ledgerhq/types-live': 6.50.0 + axios: 1.7.5(debug@4.3.6) eip55: 2.1.1 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) @@ -7250,12 +7397,12 @@ snapshots: '@ethersproject/abi': 5.7.0 '@ethersproject/rlp': 5.7.0 '@ledgerhq/cryptoassets': 9.13.0 - '@ledgerhq/domain-service': 1.2.2(debug@4.3.6) + '@ledgerhq/domain-service': 1.2.3(debug@4.3.6) '@ledgerhq/errors': 6.18.0 '@ledgerhq/hw-transport': 6.31.2 '@ledgerhq/hw-transport-mocker': 6.29.2 '@ledgerhq/logs': 6.12.0 - axios: 1.7.3(debug@4.3.6) + axios: 1.7.5(debug@4.3.6) bignumber.js: 9.1.2 crypto-js: 4.2.0 transitivePeerDependencies: @@ -7295,21 +7442,21 @@ snapshots: '@ledgerhq/logs@6.12.0': {} - '@ledgerhq/types-live@6.49.0': + '@ledgerhq/types-live@6.50.0': dependencies: bignumber.js: 9.1.2 rxjs: 7.8.1 '@manypkg/find-root@1.1.0': dependencies: - '@babel/runtime': 7.25.0 + '@babel/runtime': 7.25.4 '@types/node': 12.20.55 find-up: 4.1.0 fs-extra: 8.1.0 '@manypkg/get-packages@1.1.3': dependencies: - '@babel/runtime': 7.25.0 + '@babel/runtime': 7.25.4 '@changesets/types': 4.1.0 '@manypkg/find-root': 1.1.0 fs-extra: 8.1.0 @@ -7356,29 +7503,31 @@ snapshots: '@nodelib/fs.scandir': 2.1.5 fastq: 1.17.1 - '@nomicfoundation/edr-darwin-arm64@0.5.0': {} + '@nolyfill/is-core-module@1.0.39': {} + + '@nomicfoundation/edr-darwin-arm64@0.5.2': {} - '@nomicfoundation/edr-darwin-x64@0.5.0': {} + '@nomicfoundation/edr-darwin-x64@0.5.2': {} - '@nomicfoundation/edr-linux-arm64-gnu@0.5.0': {} + '@nomicfoundation/edr-linux-arm64-gnu@0.5.2': {} - '@nomicfoundation/edr-linux-arm64-musl@0.5.0': {} + '@nomicfoundation/edr-linux-arm64-musl@0.5.2': {} - '@nomicfoundation/edr-linux-x64-gnu@0.5.0': {} + '@nomicfoundation/edr-linux-x64-gnu@0.5.2': {} - '@nomicfoundation/edr-linux-x64-musl@0.5.0': {} + '@nomicfoundation/edr-linux-x64-musl@0.5.2': {} - '@nomicfoundation/edr-win32-x64-msvc@0.5.0': {} + '@nomicfoundation/edr-win32-x64-msvc@0.5.2': {} - '@nomicfoundation/edr@0.5.0': + '@nomicfoundation/edr@0.5.2': dependencies: - '@nomicfoundation/edr-darwin-arm64': 0.5.0 - '@nomicfoundation/edr-darwin-x64': 0.5.0 - '@nomicfoundation/edr-linux-arm64-gnu': 0.5.0 - '@nomicfoundation/edr-linux-arm64-musl': 0.5.0 - '@nomicfoundation/edr-linux-x64-gnu': 0.5.0 - '@nomicfoundation/edr-linux-x64-musl': 0.5.0 - '@nomicfoundation/edr-win32-x64-msvc': 0.5.0 + '@nomicfoundation/edr-darwin-arm64': 0.5.2 + '@nomicfoundation/edr-darwin-x64': 0.5.2 + '@nomicfoundation/edr-linux-arm64-gnu': 0.5.2 + '@nomicfoundation/edr-linux-arm64-musl': 0.5.2 + '@nomicfoundation/edr-linux-x64-gnu': 0.5.2 + '@nomicfoundation/edr-linux-x64-musl': 0.5.2 + '@nomicfoundation/edr-win32-x64-msvc': 0.5.2 '@nomicfoundation/ethereumjs-block@5.0.4': dependencies: @@ -7430,13 +7579,13 @@ snapshots: ethers: 6.13.2 hardhat: link:packages/hardhat-core - '@nomicfoundation/hardhat-ignition-viem@0.15.5(@nomicfoundation/hardhat-ignition@0.15.5(@nomicfoundation/hardhat-verify@packages+hardhat-verify)(hardhat@packages+hardhat-core))(@nomicfoundation/hardhat-viem@packages+hardhat-viem)(@nomicfoundation/ignition-core@0.15.5)(hardhat@packages+hardhat-core)(viem@2.18.8(typescript@5.0.4)(zod@3.23.8))': + '@nomicfoundation/hardhat-ignition-viem@0.15.5(@nomicfoundation/hardhat-ignition@0.15.5(@nomicfoundation/hardhat-verify@packages+hardhat-verify)(hardhat@packages+hardhat-core))(@nomicfoundation/hardhat-viem@packages+hardhat-viem)(@nomicfoundation/ignition-core@0.15.5)(hardhat@packages+hardhat-core)(viem@2.20.0(typescript@5.0.4)(zod@3.23.8))': dependencies: '@nomicfoundation/hardhat-ignition': 0.15.5(@nomicfoundation/hardhat-verify@packages+hardhat-verify)(hardhat@packages+hardhat-core) '@nomicfoundation/hardhat-viem': link:packages/hardhat-viem '@nomicfoundation/ignition-core': 0.15.5 hardhat: link:packages/hardhat-core - viem: 2.18.8(typescript@5.0.4)(zod@3.23.8) + viem: 2.20.0(typescript@5.0.4)(zod@3.23.8) '@nomicfoundation/hardhat-ignition@0.15.5(@nomicfoundation/hardhat-verify@packages+hardhat-verify)(hardhat@packages+hardhat-core)': dependencies: @@ -7594,7 +7743,7 @@ snapshots: lodash.get: 4.4.2 type-detect: 4.1.0 - '@sinonjs/text-encoding@0.7.2': {} + '@sinonjs/text-encoding@0.7.3': {} '@solidity-parser/parser@0.14.5': dependencies: @@ -7632,23 +7781,23 @@ snapshots: '@types/bn.js@4.11.6': dependencies: - '@types/node': 20.14.14 + '@types/node': 20.16.1 '@types/bn.js@5.1.5': dependencies: - '@types/node': 18.19.43 + '@types/node': 18.19.46 '@types/chai-as-promised@7.1.8': dependencies: - '@types/chai': 4.3.17 + '@types/chai': 4.3.18 - '@types/chai@4.3.17': {} + '@types/chai@4.3.18': {} '@types/ci-info@2.0.0': {} '@types/concat-stream@1.6.1': dependencies: - '@types/node': 20.14.14 + '@types/node': 20.16.1 '@types/debug@4.1.12': dependencies: @@ -7660,16 +7809,18 @@ snapshots: '@types/form-data@0.0.33': dependencies: - '@types/node': 20.14.14 + '@types/node': 20.16.1 '@types/fs-extra@5.1.0': dependencies: - '@types/node': 18.19.43 + '@types/node': 18.19.46 '@types/glob@7.2.0': dependencies: '@types/minimatch': 5.1.2 - '@types/node': 18.19.43 + '@types/node': 18.19.46 + + '@types/istanbul-lib-coverage@2.0.6': {} '@types/json-schema@7.0.15': {} @@ -7677,7 +7828,7 @@ snapshots: '@types/keccak@3.0.4': dependencies: - '@types/node': 18.19.43 + '@types/node': 18.19.46 '@types/lodash.clonedeep@4.5.9': dependencies: @@ -7707,19 +7858,19 @@ snapshots: '@types/node@18.15.13': {} - '@types/node@18.19.43': + '@types/node@18.19.46': dependencies: undici-types: 5.26.5 - '@types/node@20.14.14': + '@types/node@20.16.1': dependencies: - undici-types: 5.26.5 + undici-types: 6.19.8 '@types/node@8.10.66': {} '@types/pbkdf2@3.1.2': dependencies: - '@types/node': 20.14.14 + '@types/node': 20.16.1 '@types/prettier@2.7.3': {} @@ -7727,14 +7878,14 @@ snapshots: '@types/readable-stream@2.3.15': dependencies: - '@types/node': 20.14.14 + '@types/node': 20.16.1 safe-buffer: 5.1.2 '@types/resolve@1.20.6': {} '@types/secp256k1@4.0.6': dependencies: - '@types/node': 20.14.14 + '@types/node': 20.16.1 '@types/semver@6.2.7': {} @@ -7742,7 +7893,7 @@ snapshots: '@types/sinon-chai@3.2.12': dependencies: - '@types/chai': 4.3.17 + '@types/chai': 4.3.18 '@types/sinon': 9.0.11 '@types/sinon@9.0.11': @@ -7757,11 +7908,11 @@ snapshots: '@types/ws@7.4.7': dependencies: - '@types/node': 18.19.43 + '@types/node': 18.19.46 '@types/ws@8.5.3': dependencies: - '@types/node': 20.14.14 + '@types/node': 20.16.1 '@typescript-eslint/eslint-plugin@5.61.0(@typescript-eslint/parser@5.61.0(eslint@8.57.0)(typescript@5.0.4))(eslint@8.57.0)(typescript@5.0.4)': dependencies: @@ -7773,7 +7924,7 @@ snapshots: debug: 4.3.6(supports-color@8.1.1) eslint: 8.57.0 graphemer: 1.4.0 - ignore: 5.3.1 + ignore: 5.3.2 natural-compare-lite: 1.4.0 semver: 7.6.3 tsutils: 3.21.0(typescript@5.0.4) @@ -7792,7 +7943,7 @@ snapshots: '@typescript-eslint/visitor-keys': 7.18.0 eslint: 8.57.0 graphemer: 1.4.0 - ignore: 5.3.1 + ignore: 5.3.2 natural-compare: 1.4.0 ts-api-utils: 1.3.0(typescript@5.5.4) optionalDependencies: @@ -7811,7 +7962,7 @@ snapshots: debug: 4.3.6(supports-color@8.1.1) eslint: 8.57.0 graphemer: 1.4.0 - ignore: 5.3.1 + ignore: 5.3.2 natural-compare: 1.4.0 semver: 7.6.3 ts-api-utils: 1.3.0(typescript@5.5.4) @@ -8249,7 +8400,7 @@ snapshots: dependencies: possible-typed-array-names: 1.0.0 - axios@1.7.3(debug@4.3.6): + axios@1.7.5(debug@4.3.6): dependencies: follow-redirects: 1.15.6(debug@4.3.6) form-data: 4.0.0 @@ -8334,8 +8485,8 @@ snapshots: browserslist@4.23.3: dependencies: - caniuse-lite: 1.0.30001649 - electron-to-chromium: 1.5.4 + caniuse-lite: 1.0.30001653 + electron-to-chromium: 1.5.13 node-releases: 2.0.18 update-browserslist-db: 1.1.0(browserslist@4.23.3) @@ -8366,6 +8517,20 @@ snapshots: bytes@3.1.2: {} + c8@9.1.0: + dependencies: + '@bcoe/v8-coverage': 0.2.3 + '@istanbuljs/schema': 0.1.3 + find-up: 5.0.0 + foreground-child: 3.3.0 + istanbul-lib-coverage: 3.2.2 + istanbul-lib-report: 3.0.1 + istanbul-reports: 3.1.7 + test-exclude: 6.0.0 + v8-to-istanbul: 9.3.0 + yargs: 17.7.2 + yargs-parser: 21.1.1 + caching-transform@4.0.0: dependencies: hasha: 5.2.2 @@ -8387,7 +8552,7 @@ snapshots: camelcase@6.3.0: {} - caniuse-lite@1.0.30001649: {} + caniuse-lite@1.0.30001653: {} caseless@0.12.0: {} @@ -8493,6 +8658,12 @@ snapshots: strip-ansi: 6.0.1 wrap-ansi: 7.0.0 + cliui@8.0.1: + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 7.0.0 + clone@1.0.4: {} color-convert@1.9.3: @@ -8723,7 +8894,7 @@ snapshots: dependencies: keccak: 3.0.4 - electron-to-chromium@1.5.4: {} + electron-to-chromium@1.5.13: {} elliptic@6.5.4: dependencies: @@ -8735,7 +8906,7 @@ snapshots: minimalistic-assert: 1.0.1 minimalistic-crypto-utils: 1.0.1 - elliptic@6.5.6: + elliptic@6.5.7: dependencies: bn.js: 4.12.0 brorand: 1.1.0 @@ -8846,31 +9017,32 @@ snapshots: es6-error@4.1.1: {} - esbuild@0.21.5: + esbuild@0.23.1: optionalDependencies: - '@esbuild/aix-ppc64': 0.21.5 - '@esbuild/android-arm': 0.21.5 - '@esbuild/android-arm64': 0.21.5 - '@esbuild/android-x64': 0.21.5 - '@esbuild/darwin-arm64': 0.21.5 - '@esbuild/darwin-x64': 0.21.5 - '@esbuild/freebsd-arm64': 0.21.5 - '@esbuild/freebsd-x64': 0.21.5 - '@esbuild/linux-arm': 0.21.5 - '@esbuild/linux-arm64': 0.21.5 - '@esbuild/linux-ia32': 0.21.5 - '@esbuild/linux-loong64': 0.21.5 - '@esbuild/linux-mips64el': 0.21.5 - '@esbuild/linux-ppc64': 0.21.5 - '@esbuild/linux-riscv64': 0.21.5 - '@esbuild/linux-s390x': 0.21.5 - '@esbuild/linux-x64': 0.21.5 - '@esbuild/netbsd-x64': 0.21.5 - '@esbuild/openbsd-x64': 0.21.5 - '@esbuild/sunos-x64': 0.21.5 - '@esbuild/win32-arm64': 0.21.5 - '@esbuild/win32-ia32': 0.21.5 - '@esbuild/win32-x64': 0.21.5 + '@esbuild/aix-ppc64': 0.23.1 + '@esbuild/android-arm': 0.23.1 + '@esbuild/android-arm64': 0.23.1 + '@esbuild/android-x64': 0.23.1 + '@esbuild/darwin-arm64': 0.23.1 + '@esbuild/darwin-x64': 0.23.1 + '@esbuild/freebsd-arm64': 0.23.1 + '@esbuild/freebsd-x64': 0.23.1 + '@esbuild/linux-arm': 0.23.1 + '@esbuild/linux-arm64': 0.23.1 + '@esbuild/linux-ia32': 0.23.1 + '@esbuild/linux-loong64': 0.23.1 + '@esbuild/linux-mips64el': 0.23.1 + '@esbuild/linux-ppc64': 0.23.1 + '@esbuild/linux-riscv64': 0.23.1 + '@esbuild/linux-s390x': 0.23.1 + '@esbuild/linux-x64': 0.23.1 + '@esbuild/netbsd-x64': 0.23.1 + '@esbuild/openbsd-arm64': 0.23.1 + '@esbuild/openbsd-x64': 0.23.1 + '@esbuild/sunos-x64': 0.23.1 + '@esbuild/win32-arm64': 0.23.1 + '@esbuild/win32-ia32': 0.23.1 + '@esbuild/win32-x64': 0.23.1 escalade@3.1.2: {} @@ -8922,29 +9094,31 @@ snapshots: eslint-import-resolver-node@0.3.9: dependencies: debug: 3.2.7 - is-core-module: 2.15.0 + is-core-module: 2.15.1 resolve: 1.22.8 transitivePeerDependencies: - supports-color - eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@7.18.0(eslint@8.57.0)(typescript@5.5.4))(eslint-plugin-import@2.29.1)(eslint@8.57.0): + eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@7.18.0(eslint@8.57.0)(typescript@5.5.4))(eslint-plugin-import@2.29.1)(eslint@8.57.0): dependencies: + '@nolyfill/is-core-module': 1.0.39 debug: 4.3.6(supports-color@8.1.1) enhanced-resolve: 5.17.1 eslint: 8.57.0 - eslint-module-utils: 2.8.1(@typescript-eslint/parser@7.18.0(eslint@8.57.0)(typescript@5.5.4))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@7.18.0(eslint@8.57.0)(typescript@5.5.4))(eslint-plugin-import@2.29.1)(eslint@8.57.0))(eslint@8.57.0) - eslint-plugin-import: 2.29.1(@typescript-eslint/parser@7.18.0(eslint@8.57.0)(typescript@5.5.4))(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0) + eslint-module-utils: 2.8.2(@typescript-eslint/parser@7.18.0(eslint@8.57.0)(typescript@5.5.4))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@7.18.0(eslint@8.57.0)(typescript@5.5.4))(eslint-plugin-import@2.29.1)(eslint@8.57.0))(eslint@8.57.0) fast-glob: 3.3.2 get-tsconfig: 4.7.6 - is-core-module: 2.15.0 + is-bun-module: 1.1.0 is-glob: 4.0.3 + optionalDependencies: + eslint-plugin-import: 2.29.1(@typescript-eslint/parser@7.18.0(eslint@8.57.0)(typescript@5.5.4))(eslint-import-resolver-typescript@3.6.3)(eslint@8.57.0) transitivePeerDependencies: - '@typescript-eslint/parser' - eslint-import-resolver-node - eslint-import-resolver-webpack - supports-color - eslint-module-utils@2.8.1(@typescript-eslint/parser@5.61.0(eslint@8.57.0)(typescript@5.0.4))(eslint-import-resolver-node@0.3.9)(eslint@8.57.0): + eslint-module-utils@2.8.2(@typescript-eslint/parser@5.61.0(eslint@8.57.0)(typescript@5.0.4))(eslint-import-resolver-node@0.3.9)(eslint@8.57.0): dependencies: debug: 3.2.7 optionalDependencies: @@ -8954,14 +9128,14 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-module-utils@2.8.1(@typescript-eslint/parser@7.18.0(eslint@8.57.0)(typescript@5.5.4))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@7.18.0(eslint@8.57.0)(typescript@5.5.4))(eslint-plugin-import@2.29.1)(eslint@8.57.0))(eslint@8.57.0): + eslint-module-utils@2.8.2(@typescript-eslint/parser@7.18.0(eslint@8.57.0)(typescript@5.5.4))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@7.18.0(eslint@8.57.0)(typescript@5.5.4))(eslint-plugin-import@2.29.1)(eslint@8.57.0))(eslint@8.57.0): dependencies: debug: 3.2.7 optionalDependencies: '@typescript-eslint/parser': 7.18.0(eslint@8.57.0)(typescript@5.5.4) eslint: 8.57.0 eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.6.1(@typescript-eslint/parser@7.18.0(eslint@8.57.0)(typescript@5.5.4))(eslint-plugin-import@2.29.1)(eslint@8.57.0) + eslint-import-resolver-typescript: 3.6.3(@typescript-eslint/parser@7.18.0(eslint@8.57.0)(typescript@5.5.4))(eslint-plugin-import@2.29.1)(eslint@8.57.0) transitivePeerDependencies: - supports-color @@ -8987,9 +9161,9 @@ snapshots: doctrine: 2.1.0 eslint: 8.57.0 eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.8.1(@typescript-eslint/parser@5.61.0(eslint@8.57.0)(typescript@5.0.4))(eslint-import-resolver-node@0.3.9)(eslint@8.57.0) + eslint-module-utils: 2.8.2(@typescript-eslint/parser@5.61.0(eslint@8.57.0)(typescript@5.0.4))(eslint-import-resolver-node@0.3.9)(eslint@8.57.0) has: 1.0.4 - is-core-module: 2.15.0 + is-core-module: 2.15.1 is-glob: 4.0.3 minimatch: 3.1.2 object.values: 1.2.0 @@ -9003,7 +9177,7 @@ snapshots: - eslint-import-resolver-webpack - supports-color - eslint-plugin-import@2.29.1(@typescript-eslint/parser@7.18.0(eslint@8.57.0)(typescript@5.5.4))(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0): + eslint-plugin-import@2.29.1(@typescript-eslint/parser@7.18.0(eslint@8.57.0)(typescript@5.5.4))(eslint-import-resolver-typescript@3.6.3)(eslint@8.57.0): dependencies: array-includes: 3.1.8 array.prototype.findlastindex: 1.2.5 @@ -9013,9 +9187,9 @@ snapshots: doctrine: 2.1.0 eslint: 8.57.0 eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.8.1(@typescript-eslint/parser@7.18.0(eslint@8.57.0)(typescript@5.5.4))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@7.18.0(eslint@8.57.0)(typescript@5.5.4))(eslint-plugin-import@2.29.1)(eslint@8.57.0))(eslint@8.57.0) + eslint-module-utils: 2.8.2(@typescript-eslint/parser@7.18.0(eslint@8.57.0)(typescript@5.5.4))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@7.18.0(eslint@8.57.0)(typescript@5.5.4))(eslint-plugin-import@2.29.1)(eslint@8.57.0))(eslint@8.57.0) hasown: 2.0.2 - is-core-module: 2.15.0 + is-core-module: 2.15.1 is-glob: 4.0.3 minimatch: 3.1.2 object.fromentries: 2.0.8 @@ -9045,9 +9219,9 @@ snapshots: eslint-plugin-es-x: 7.8.0(eslint@8.57.0) get-tsconfig: 4.7.6 globals: 13.24.0 - ignore: 5.3.1 + ignore: 5.3.2 is-builtin-module: 3.2.1 - is-core-module: 2.15.0 + is-core-module: 2.15.1 minimatch: 3.1.2 resolve: 1.22.8 semver: 7.6.3 @@ -9108,7 +9282,7 @@ snapshots: glob-parent: 6.0.2 globals: 13.24.0 graphemer: 1.4.0 - ignore: 5.3.1 + ignore: 5.3.2 imurmurhash: 0.1.4 is-glob: 4.0.3 is-path-inside: 3.0.3 @@ -9153,7 +9327,7 @@ snapshots: eth-gas-reporter@0.2.27: dependencies: '@solidity-parser/parser': 0.14.5 - axios: 1.7.3(debug@4.3.6) + axios: 1.7.5(debug@4.3.6) cli-table3: 0.5.1 colors: 1.4.0 ethereum-cryptography: 1.2.0 @@ -9161,7 +9335,7 @@ snapshots: fs-readdir-recursive: 1.1.0 lodash: 4.17.21 markdown-table: 1.1.3 - mocha: 10.7.0 + mocha: 10.7.3 req-cwd: 2.0.0 sha1: 1.1.1 sync-request: 6.1.0 @@ -9216,7 +9390,7 @@ snapshots: '@types/bn.js': 4.11.6 bn.js: 4.12.0 create-hash: 1.2.0 - elliptic: 6.5.6 + elliptic: 6.5.7 ethereum-cryptography: 0.1.3 ethjs-util: 0.1.6 rlp: 2.2.7 @@ -9321,7 +9495,7 @@ snapshots: '@nodelib/fs.walk': 1.2.8 glob-parent: 5.1.2 merge2: 1.4.1 - micromatch: 4.0.7 + micromatch: 4.0.8 fast-json-stable-stringify@2.1.0: {} @@ -9369,7 +9543,7 @@ snapshots: find-yarn-workspace-root2@1.2.16: dependencies: - micromatch: 4.0.7 + micromatch: 4.0.8 pkg-dir: 4.2.0 flat-cache@3.2.0: @@ -9395,7 +9569,7 @@ snapshots: cross-spawn: 7.0.3 signal-exit: 3.0.7 - foreground-child@3.2.1: + foreground-child@3.3.0: dependencies: cross-spawn: 7.0.3 signal-exit: 4.1.0 @@ -9516,7 +9690,7 @@ snapshots: glob@10.4.5: dependencies: - foreground-child: 3.2.1 + foreground-child: 3.3.0 jackspeak: 3.4.3 minimatch: 9.0.5 minipass: 7.1.2 @@ -9585,7 +9759,7 @@ snapshots: dir-glob: 3.0.1 fast-glob: 3.3.2 glob: 7.2.0 - ignore: 5.3.1 + ignore: 5.3.2 merge2: 1.4.1 slash: 3.0.0 @@ -9594,7 +9768,7 @@ snapshots: array-union: 2.1.0 dir-glob: 3.0.1 fast-glob: 3.3.2 - ignore: 5.3.1 + ignore: 5.3.2 merge2: 1.4.1 slash: 3.0.0 @@ -9613,7 +9787,7 @@ snapshots: source-map: 0.6.1 wordwrap: 1.0.0 optionalDependencies: - uglify-js: 3.19.1 + uglify-js: 3.19.2 hardhat-gas-reporter@1.0.10(hardhat@packages+hardhat-core): dependencies: @@ -9717,7 +9891,7 @@ snapshots: ieee754@1.2.1: {} - ignore@5.3.1: {} + ignore@5.3.2: {} immer@10.0.2: {} @@ -9786,9 +9960,13 @@ snapshots: dependencies: builtin-modules: 3.3.0 + is-bun-module@1.1.0: + dependencies: + semver: 7.6.3 + is-callable@1.2.7: {} - is-core-module@2.15.0: + is-core-module@2.15.1: dependencies: hasown: 2.0.2 @@ -10077,7 +10255,7 @@ snapshots: lower-case@2.0.2: dependencies: - tslib: 2.6.3 + tslib: 2.7.0 lru-cache@10.4.3: {} @@ -10118,7 +10296,7 @@ snapshots: micro-ftch@0.3.1: {} - micromatch@4.0.7: + micromatch@4.0.8: dependencies: braces: 3.0.3 picomatch: 2.3.1 @@ -10165,7 +10343,7 @@ snapshots: dependencies: obliterator: 2.0.4 - mocha@10.7.0: + mocha@10.7.3: dependencies: ansi-colors: 4.1.3 browser-stdout: 1.3.1 @@ -10214,16 +10392,16 @@ snapshots: dependencies: '@sinonjs/commons': 1.8.6 '@sinonjs/fake-timers': 6.0.1 - '@sinonjs/text-encoding': 0.7.2 + '@sinonjs/text-encoding': 0.7.3 just-extend: 4.2.1 path-to-regexp: 1.8.0 no-case@3.0.4: dependencies: lower-case: 2.0.2 - tslib: 2.6.3 + tslib: 2.7.0 - node-abi@3.65.0: + node-abi@3.67.0: dependencies: semver: 7.6.3 @@ -10495,7 +10673,7 @@ snapshots: minimist: 1.2.8 mkdirp-classic: 0.5.3 napi-build-utils: 1.0.2 - node-abi: 3.65.0 + node-abi: 3.67.0 pump: 3.0.0 rc: 1.2.8 simple-get: 4.0.1 @@ -10679,7 +10857,7 @@ snapshots: resolve@1.22.8: dependencies: - is-core-module: 2.15.0 + is-core-module: 2.15.1 path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 @@ -10719,7 +10897,7 @@ snapshots: rxjs@7.8.1: dependencies: - tslib: 2.6.3 + tslib: 2.7.0 safe-array-concat@1.1.2: dependencies: @@ -10765,7 +10943,7 @@ snapshots: secp256k1@4.0.3: dependencies: - elliptic: 6.5.6 + elliptic: 6.5.7 node-addon-api: 2.0.2 node-gyp-build: 4.8.1 @@ -10912,7 +11090,7 @@ snapshots: hardhat: link:packages/hardhat-core jsonschema: 1.4.1 lodash: 4.17.21 - mocha: 10.7.0 + mocha: 10.7.3 node-emoji: 1.11.0 pify: 4.0.1 recursive-readdir: 2.2.3 @@ -11155,14 +11333,14 @@ snapshots: dependencies: typescript: 5.0.4 - ts-node@10.9.2(@types/node@18.19.43)(typescript@5.0.4): + ts-node@10.9.2(@types/node@18.19.46)(typescript@5.0.4): dependencies: '@cspotcode/source-map-support': 0.8.1 '@tsconfig/node10': 1.0.11 '@tsconfig/node12': 1.0.11 '@tsconfig/node14': 1.0.3 '@tsconfig/node16': 1.0.4 - '@types/node': 18.19.43 + '@types/node': 18.19.46 acorn: 8.12.1 acorn-walk: 8.3.3 arg: 4.1.3 @@ -11184,7 +11362,7 @@ snapshots: tslib@2.4.0: {} - tslib@2.6.3: {} + tslib@2.7.0: {} tsort@0.0.1: {} @@ -11198,9 +11376,9 @@ snapshots: tslib: 1.14.1 typescript: 5.5.4 - tsx@4.16.5: + tsx@4.18.0: dependencies: - esbuild: 0.21.5 + esbuild: 0.23.1 get-tsconfig: 4.7.6 optionalDependencies: fsevents: 2.3.3 @@ -11312,7 +11490,7 @@ snapshots: typical@5.2.0: {} - uglify-js@3.19.1: + uglify-js@3.19.2: optional: true unbox-primitive@1.0.2: @@ -11324,11 +11502,13 @@ snapshots: undici-types@5.26.5: {} + undici-types@6.19.8: {} + undici@5.28.4: dependencies: '@fastify/busboy': 2.1.1 - undici@6.19.5: {} + undici@6.19.8: {} universalify@0.1.2: {} @@ -11370,37 +11550,43 @@ snapshots: v8-compile-cache-lib@3.0.1: {} - viem@2.18.8(typescript@5.0.4)(zod@3.23.8): + v8-to-istanbul@9.3.0: + dependencies: + '@jridgewell/trace-mapping': 0.3.25 + '@types/istanbul-lib-coverage': 2.0.6 + convert-source-map: 2.0.0 + + viem@2.18.8(typescript@5.5.4)(zod@3.23.8): dependencies: '@adraffy/ens-normalize': 1.10.0 '@noble/curves': 1.4.0 '@noble/hashes': 1.4.0 '@scure/bip32': 1.4.0 '@scure/bip39': 1.3.0 - abitype: 1.0.5(typescript@5.0.4)(zod@3.23.8) + abitype: 1.0.5(typescript@5.5.4)(zod@3.23.8) isows: 1.0.4(ws@8.17.1) webauthn-p256: 0.0.5 ws: 8.17.1 optionalDependencies: - typescript: 5.0.4 + typescript: 5.5.4 transitivePeerDependencies: - bufferutil - utf-8-validate - zod - viem@2.18.8(typescript@5.5.4)(zod@3.23.8): + viem@2.20.0(typescript@5.0.4)(zod@3.23.8): dependencies: '@adraffy/ens-normalize': 1.10.0 '@noble/curves': 1.4.0 '@noble/hashes': 1.4.0 '@scure/bip32': 1.4.0 '@scure/bip39': 1.3.0 - abitype: 1.0.5(typescript@5.5.4)(zod@3.23.8) + abitype: 1.0.5(typescript@5.0.4)(zod@3.23.8) isows: 1.0.4(ws@8.17.1) webauthn-p256: 0.0.5 ws: 8.17.1 optionalDependencies: - typescript: 5.5.4 + typescript: 5.0.4 transitivePeerDependencies: - bufferutil - utf-8-validate @@ -11410,12 +11596,12 @@ snapshots: dependencies: defaults: 1.0.4 - web3-core@4.5.0: + web3-core@4.5.1: dependencies: - web3-errors: 1.2.1 - web3-eth-accounts: 4.1.3 + web3-errors: 1.3.0 + web3-eth-accounts: 4.2.1 web3-eth-iban: 4.0.7 - web3-providers-http: 4.1.0 + web3-providers-http: 4.2.0 web3-providers-ws: 4.0.8 web3-types: 1.7.0 web3-utils: 4.3.1 @@ -11427,14 +11613,14 @@ snapshots: - encoding - utf-8-validate - web3-errors@1.2.1: + web3-errors@1.3.0: dependencies: web3-types: 1.7.0 web3-eth-abi@4.2.3(typescript@5.0.4)(zod@3.23.8): dependencies: abitype: 0.7.1(typescript@5.0.4)(zod@3.23.8) - web3-errors: 1.2.1 + web3-errors: 1.3.0 web3-types: 1.7.0 web3-utils: 4.3.1 web3-validator: 2.0.6 @@ -11442,21 +11628,21 @@ snapshots: - typescript - zod - web3-eth-accounts@4.1.3: + web3-eth-accounts@4.2.1: dependencies: '@ethereumjs/rlp': 4.0.1 crc-32: 1.2.2 ethereum-cryptography: 2.2.1 - web3-errors: 1.2.1 + web3-errors: 1.3.0 web3-types: 1.7.0 web3-utils: 4.3.1 web3-validator: 2.0.6 - web3-eth-contract@4.6.0(typescript@5.0.4)(zod@3.23.8): + web3-eth-contract@4.7.0(typescript@5.0.4)(zod@3.23.8): dependencies: '@ethereumjs/rlp': 5.0.2 - web3-core: 4.5.0 - web3-errors: 1.2.1 + web3-core: 4.5.1 + web3-errors: 1.3.0 web3-eth: 4.8.2(typescript@5.0.4)(zod@3.23.8) web3-eth-abi: 4.2.3(typescript@5.0.4)(zod@3.23.8) web3-types: 1.7.0 @@ -11472,10 +11658,10 @@ snapshots: web3-eth-ens@4.4.0(typescript@5.0.4)(zod@3.23.8): dependencies: '@adraffy/ens-normalize': 1.10.1 - web3-core: 4.5.0 - web3-errors: 1.2.1 + web3-core: 4.5.1 + web3-errors: 1.3.0 web3-eth: 4.8.2(typescript@5.0.4)(zod@3.23.8) - web3-eth-contract: 4.6.0(typescript@5.0.4)(zod@3.23.8) + web3-eth-contract: 4.7.0(typescript@5.0.4)(zod@3.23.8) web3-net: 4.1.0 web3-types: 1.7.0 web3-utils: 4.3.1 @@ -11489,14 +11675,14 @@ snapshots: web3-eth-iban@4.0.7: dependencies: - web3-errors: 1.2.1 + web3-errors: 1.3.0 web3-types: 1.7.0 web3-utils: 4.3.1 web3-validator: 2.0.6 web3-eth-personal@4.0.8(typescript@5.0.4)(zod@3.23.8): dependencies: - web3-core: 4.5.0 + web3-core: 4.5.1 web3-eth: 4.8.2(typescript@5.0.4)(zod@3.23.8) web3-rpc-methods: 1.3.0 web3-types: 1.7.0 @@ -11512,10 +11698,10 @@ snapshots: web3-eth@4.8.2(typescript@5.0.4)(zod@3.23.8): dependencies: setimmediate: 1.0.5 - web3-core: 4.5.0 - web3-errors: 1.2.1 + web3-core: 4.5.1 + web3-errors: 1.3.0 web3-eth-abi: 4.2.3(typescript@5.0.4)(zod@3.23.8) - web3-eth-accounts: 4.1.3 + web3-eth-accounts: 4.2.1 web3-net: 4.1.0 web3-providers-ws: 4.0.8 web3-rpc-methods: 1.3.0 @@ -11531,7 +11717,7 @@ snapshots: web3-net@4.1.0: dependencies: - web3-core: 4.5.0 + web3-core: 4.5.1 web3-rpc-methods: 1.3.0 web3-types: 1.7.0 web3-utils: 4.3.1 @@ -11540,10 +11726,10 @@ snapshots: - encoding - utf-8-validate - web3-providers-http@4.1.0: + web3-providers-http@4.2.0: dependencies: cross-fetch: 4.0.0 - web3-errors: 1.2.1 + web3-errors: 1.3.0 web3-types: 1.7.0 web3-utils: 4.3.1 transitivePeerDependencies: @@ -11551,7 +11737,7 @@ snapshots: web3-providers-ipc@4.0.7: dependencies: - web3-errors: 1.2.1 + web3-errors: 1.3.0 web3-types: 1.7.0 web3-utils: 4.3.1 optional: true @@ -11560,7 +11746,7 @@ snapshots: dependencies: '@types/ws': 8.5.3 isomorphic-ws: 5.0.0(ws@8.18.0) - web3-errors: 1.2.1 + web3-errors: 1.3.0 web3-types: 1.7.0 web3-utils: 4.3.1 ws: 8.18.0 @@ -11570,7 +11756,7 @@ snapshots: web3-rpc-methods@1.3.0: dependencies: - web3-core: 4.5.0 + web3-core: 4.5.1 web3-types: 1.7.0 web3-validator: 2.0.6 transitivePeerDependencies: @@ -11578,10 +11764,10 @@ snapshots: - encoding - utf-8-validate - web3-rpc-providers@1.0.0-rc.1: + web3-rpc-providers@1.0.0-rc.2: dependencies: - web3-errors: 1.2.1 - web3-providers-http: 4.1.0 + web3-errors: 1.3.0 + web3-providers-http: 4.2.0 web3-providers-ws: 4.0.8 web3-types: 1.7.0 web3-utils: 4.3.1 @@ -11608,7 +11794,7 @@ snapshots: dependencies: ethereum-cryptography: 2.2.1 eventemitter3: 5.0.1 - web3-errors: 1.2.1 + web3-errors: 1.3.0 web3-types: 1.7.0 web3-validator: 2.0.6 @@ -11616,26 +11802,26 @@ snapshots: dependencies: ethereum-cryptography: 2.2.1 util: 0.12.5 - web3-errors: 1.2.1 + web3-errors: 1.3.0 web3-types: 1.7.0 zod: 3.23.8 - web3@4.11.1(typescript@5.0.4)(zod@3.23.8): + web3@4.12.1(typescript@5.0.4)(zod@3.23.8): dependencies: - web3-core: 4.5.0 - web3-errors: 1.2.1 + web3-core: 4.5.1 + web3-errors: 1.3.0 web3-eth: 4.8.2(typescript@5.0.4)(zod@3.23.8) web3-eth-abi: 4.2.3(typescript@5.0.4)(zod@3.23.8) - web3-eth-accounts: 4.1.3 - web3-eth-contract: 4.6.0(typescript@5.0.4)(zod@3.23.8) + web3-eth-accounts: 4.2.1 + web3-eth-contract: 4.7.0(typescript@5.0.4)(zod@3.23.8) web3-eth-ens: 4.4.0(typescript@5.0.4)(zod@3.23.8) web3-eth-iban: 4.0.7 web3-eth-personal: 4.0.8(typescript@5.0.4)(zod@3.23.8) web3-net: 4.1.0 - web3-providers-http: 4.1.0 + web3-providers-http: 4.2.0 web3-providers-ws: 4.0.8 web3-rpc-methods: 1.3.0 - web3-rpc-providers: 1.0.0-rc.1 + web3-rpc-providers: 1.0.0-rc.2 web3-types: 1.7.0 web3-utils: 4.3.1 web3-validator: 2.0.6 @@ -11754,6 +11940,8 @@ snapshots: yargs-parser@20.2.9: {} + yargs-parser@21.1.1: {} + yargs-unparser@2.0.0: dependencies: camelcase: 6.3.0 @@ -11785,6 +11973,16 @@ snapshots: y18n: 5.0.8 yargs-parser: 20.2.9 + yargs@17.7.2: + dependencies: + cliui: 8.0.1 + escalade: 3.1.2 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + string-width: 4.2.3 + y18n: 5.0.8 + yargs-parser: 21.1.1 + yn@3.1.1: {} yocto-queue@0.1.0: {} diff --git a/v-next/example-project/README.md b/v-next/example-project/README.md index 2d8aafbcc3..7f68eac1e7 100644 --- a/v-next/example-project/README.md +++ b/v-next/example-project/README.md @@ -9,3 +9,13 @@ pnpm install pnpm build pnpm hardhat ``` + +You can set and read configuration variables in a local keystore with: + +```sh +# Set a value for reading in Hardhat.config.{js,ts} +pnpm hardhat keystore set mykey + +# Print a value from the keystore +pnpm hardhat keystore get mykey +``` diff --git a/v-next/example-project/hardhat.config.ts b/v-next/example-project/hardhat.config.ts index 5479769444..3d6ef51073 100644 --- a/v-next/example-project/hardhat.config.ts +++ b/v-next/example-project/hardhat.config.ts @@ -6,6 +6,7 @@ import util from "node:util"; import { task, emptyTask, globalOption } from "@ignored/hardhat-vnext/config"; import HardhatNodeTestRunner from "@ignored/hardhat-vnext-node-test-runner"; import HardhatMochaTestRunner from "@ignored/hardhat-vnext-mocha-test-runner"; +import HardhatKeystore from "@ignored/hardhat-vnext-keystore"; import { viemScketchPlugin } from "./viem-scketch-plugin.js"; const exampleEmptyTask = emptyTask("empty", "An example empty task").build(); @@ -118,6 +119,7 @@ const config: HardhatUserConfig = { ], plugins: [ pluginExample, + HardhatKeystore, // HardhatMochaTestRunner, // if testing node plugin, use the following line instead HardhatNodeTestRunner, diff --git a/v-next/example-project/package.json b/v-next/example-project/package.json index 735f8dedab..2399522712 100644 --- a/v-next/example-project/package.json +++ b/v-next/example-project/package.json @@ -21,6 +21,7 @@ }, "devDependencies": { "@ignored/hardhat-vnext": "workspace:^3.0.0-next.3", + "@ignored/hardhat-vnext-keystore": "workspace:^3.0.0-next.2", "@ignored/hardhat-vnext-mocha-test-runner": "workspace:^3.0.0-next.2", "@ignored/hardhat-vnext-node-test-runner": "workspace:^3.0.0-next.2", "@types/mocha": ">=9.1.0", diff --git a/v-next/example-project/test/mocha/other-mocha-test.ts b/v-next/example-project/test/mocha/other-mocha-test.ts index fe6bb98d3b..81865c1047 100644 --- a/v-next/example-project/test/mocha/other-mocha-test.ts +++ b/v-next/example-project/test/mocha/other-mocha-test.ts @@ -5,6 +5,6 @@ import hre from "@ignored/hardhat-vnext"; describe("Other mocha test", () => { it("should have the example task", () => { - assert.ok(hre.tasks.getTask("example")); + assert.ok(hre.tasks.getTask("empty")); }); }); diff --git a/v-next/example-project/test/node/other-example-test.js b/v-next/example-project/test/node/other-example-test.js index 38de25a8ae..2bae2bb99f 100644 --- a/v-next/example-project/test/node/other-example-test.js +++ b/v-next/example-project/test/node/other-example-test.js @@ -5,6 +5,6 @@ import hre from "@ignored/hardhat-vnext"; describe("Other example test", () => { it("should have the example task", () => { - assert.ok(hre.tasks.getTask("example")); + assert.ok(hre.tasks.getTask("empty")); }); }); diff --git a/v-next/example-project/tsconfig.json b/v-next/example-project/tsconfig.json index 62ca286dac..869989ab4c 100644 --- a/v-next/example-project/tsconfig.json +++ b/v-next/example-project/tsconfig.json @@ -9,6 +9,9 @@ }, { "path": "../hardhat-mocha-test-runner" + }, + { + "path": "../hardhat-keystore" } ] } diff --git a/v-next/hardhat-errors/src/descriptors.ts b/v-next/hardhat-errors/src/descriptors.ts index d5fe101c39..29f8f9eed1 100644 --- a/v-next/hardhat-errors/src/descriptors.ts +++ b/v-next/hardhat-errors/src/descriptors.ts @@ -67,6 +67,7 @@ export const ERROR_CATEGORIES: { ARGUMENTS: { min: 500, max: 599, websiteTitle: "Arguments related errors" }, BUILTIN_TASKS: { min: 600, max: 699, websiteTitle: "Built-in tasks errors" }, NETWORK: { min: 700, max: 799, websiteTitle: "Network errors" }, + KEYSTORE: { min: 800, max: 899, websiteTitle: "Keystore errors" }, }; export const ERRORS = { @@ -550,4 +551,25 @@ If you want to use a different chain type, please update your networks config.`, websiteDescription: `The configuration override you provided is invalid.`, }, }, + KEYSTORE: { + INVALID_KEYSTORE_FILE_FORMAT: { + number: 800, + messageTemplate: "Invalid keystore format", + websiteTitle: "Invalid keystore format", + websiteDescription: "The provided JSON is not a valid keystore file", + }, + INVALID_READLINE_OUTPUT: { + number: 801, + messageTemplate: "Expected readline output to be defined", + websiteTitle: "Expected readline output to be defined", + websiteDescription: "Expected readline output to be defined", + }, + USERINTERRUPTION_NOT_IMPLEMENTED: { + number: 802, + messageTemplate: "User interruption method not implemented", + websiteTitle: "User interruption method not implemented", + websiteDescription: + "Within the Keystore plugin, some direct user interruptions are not implemented. They are not expected to be invoked.", + }, + }, } as const; diff --git a/v-next/hardhat-keystore/.eslintrc.cjs b/v-next/hardhat-keystore/.eslintrc.cjs new file mode 100644 index 0000000000..939317ab1c --- /dev/null +++ b/v-next/hardhat-keystore/.eslintrc.cjs @@ -0,0 +1,3 @@ +const { createConfig } = require("../../config-v-next/eslint.cjs"); + +module.exports = createConfig(__filename); diff --git a/v-next/hardhat-keystore/.gitignore b/v-next/hardhat-keystore/.gitignore new file mode 100644 index 0000000000..6aa5402c62 --- /dev/null +++ b/v-next/hardhat-keystore/.gitignore @@ -0,0 +1,5 @@ +# Node modules +/node_modules + +# Compilation output +/dist diff --git a/v-next/hardhat-keystore/.prettierignore b/v-next/hardhat-keystore/.prettierignore new file mode 100644 index 0000000000..dafdfc3e02 --- /dev/null +++ b/v-next/hardhat-keystore/.prettierignore @@ -0,0 +1,4 @@ +/node_modules +/dist +/coverage +CHANGELOG.md diff --git a/v-next/hardhat-keystore/LICENSE b/v-next/hardhat-keystore/LICENSE new file mode 100644 index 0000000000..0781b4a819 --- /dev/null +++ b/v-next/hardhat-keystore/LICENSE @@ -0,0 +1,9 @@ +MIT License + +Copyright (c) 2024 Nomic Foundation + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/v-next/hardhat-keystore/README.md b/v-next/hardhat-keystore/README.md new file mode 100644 index 0000000000..4e0593b52f --- /dev/null +++ b/v-next/hardhat-keystore/README.md @@ -0,0 +1,3 @@ +# Hardhat Keystore + +This package includes a module for managing keystore files, which store a mapping of IDs to string values. diff --git a/v-next/hardhat-keystore/package.json b/v-next/hardhat-keystore/package.json new file mode 100644 index 0000000000..07898b3476 --- /dev/null +++ b/v-next/hardhat-keystore/package.json @@ -0,0 +1,75 @@ +{ + "name": "@ignored/hardhat-vnext-keystore", + "version": "3.0.0-next.2", + "description": "A module for managing keystore files that store a map from IDs to encrypted string values.", + "homepage": "https://github.com/nomicfoundation/hardhat/tree/v-next/v-next/hardhat-keystore", + "repository": { + "type": "git", + "url": "https://github.com/NomicFoundation/hardhat", + "directory": "v-next/hardhat-keystore" + }, + "author": "Nomic Foundation", + "license": "MIT", + "type": "module", + "exports": { + ".": "./dist/src/index.js" + }, + "keywords": [ + "keystore", + "storage", + "hardhat" + ], + "scripts": { + "lint": "pnpm prettier --check && pnpm eslint", + "lint:fix": "pnpm prettier --write && pnpm eslint --fix", + "eslint": "eslint \"src/**/*.ts\" \"test/**/*.ts\"", + "prettier": "prettier \"**/*.{ts,js,md,json}\"", + "test": "node --import tsx/esm --test --test-reporter=@ignored/hardhat-vnext-node-test-reporter \"test/*.ts\" \"test/!(fixture-projects|helpers)/**/*.ts\"", + "test:only": "node --import tsx/esm --test --test-only --test-reporter=@ignored/hardhat-vnext-node-test-reporter \"test/*.ts\" \"test/!(fixture-projects|helpers)/**/*.ts\"", + "test:coverage": "c8 --reporter html --reporter text --all --exclude test --exclude src/internal/types.ts --exclude src/internal/ui/direct-user-interruption-manager.ts --src src node --import tsx/esm --test --test-reporter=@ignored/hardhat-vnext-node-test-reporter \"test/!(fixture-projects|helpers)/**/*.ts\"", + "pretest": "pnpm build", + "pretest:only": "pnpm build", + "build": "tsc --build .", + "prepublishOnly": "pnpm build", + "clean": "rimraf dist" + }, + "files": [ + "dist/src/", + "src/", + "CHANGELOG.md", + "LICENSE", + "README.md" + ], + "devDependencies": { + "@eslint-community/eslint-plugin-eslint-comments": "^4.3.0", + "@ignored/hardhat-vnext-node-test-reporter": "workspace:^3.0.0-next.2", + "@nomicfoundation/hardhat-test-utils": "workspace:^", + "@types/debug": "^4.1.4", + "@types/node": "^20.14.9", + "@typescript-eslint/eslint-plugin": "^7.7.1", + "@typescript-eslint/parser": "^7.7.1", + "c8": "^9.1.0", + "eslint": "8.57.0", + "eslint-config-prettier": "9.1.0", + "eslint-import-resolver-typescript": "^3.6.1", + "eslint-plugin-import": "2.29.1", + "eslint-plugin-no-only-tests": "3.1.0", + "expect-type": "^0.19.0", + "prettier": "3.2.5", + "rimraf": "^5.0.5", + "tsx": "^4.11.0", + "typescript": "~5.5.0", + "typescript-eslint": "7.7.1" + }, + "dependencies": { + "@ignored/hardhat-vnext-errors": "workspace:^3.0.0-next.2", + "@ignored/hardhat-vnext-utils": "workspace:^3.0.0-next.2", + "@ignored/hardhat-vnext-zod-utils": "workspace:^3.0.0-next.2", + "chalk": "^5.3.0", + "debug": "^4.1.1", + "zod": "^3.23.8" + }, + "peerDependencies": { + "@ignored/hardhat-vnext": "workspace:^3.0.0-next.2" + } +} diff --git a/v-next/hardhat-keystore/src/index.ts b/v-next/hardhat-keystore/src/index.ts new file mode 100644 index 0000000000..c824f158bc --- /dev/null +++ b/v-next/hardhat-keystore/src/index.ts @@ -0,0 +1,68 @@ +import type { HardhatPlugin } from "@ignored/hardhat-vnext/types/plugins"; + +import "./internal/type-extensions.js"; + +import { task } from "@ignored/hardhat-vnext/config"; +import { ArgumentType } from "@ignored/hardhat-vnext/types/arguments"; + +import { PLUGIN_ID } from "./internal/constants.js"; + +const hardhatKeystorePlugin: HardhatPlugin = { + id: PLUGIN_ID, + hookHandlers: { + config: import.meta.resolve("./internal/hook-handlers/config.js"), + configurationVariables: import.meta.resolve( + "./internal/hook-handlers/configuration-variables.js", + ), + }, + tasks: [ + task("keystore", "Store your keys in a secure way") + .setAction(async () => {}) + .build(), + + task( + ["keystore", "set"], + "Sets a new value in the keystore associated with the specified key", + ) + .addPositionalArgument({ + name: "key", + type: ArgumentType.STRING, + description: "Specifies the key to set in the keystore", + }) + .addFlag({ + name: "force", + description: "Forces overwrite if the key already exists.", + }) + .setAction(import.meta.resolve("./internal/tasks/set.js")) + .build(), + + task(["keystore", "get"], "Get a value given a key") + .addPositionalArgument({ + name: "key", + type: ArgumentType.STRING, + description: "Specifies the key to retrieve the value for", + }) + .setAction(import.meta.resolve("./internal/tasks/get.js")) + .build(), + + task(["keystore", "list"], "List all keys in the keystore") + .setAction(import.meta.resolve("./internal/tasks/list.js")) + .build(), + + task(["keystore", "delete"], "Delete a key from the keystore") + .addPositionalArgument({ + name: "key", + type: ArgumentType.STRING, + description: "Specifies the key to delete from the keystore", + }) + .addFlag({ + name: "force", + description: + "Forces to not throw an error if the key does not exist during deletion.", + }) + .setAction(import.meta.resolve("./internal/tasks/delete.js")) + .build(), + ], +}; + +export default hardhatKeystorePlugin; diff --git a/v-next/hardhat-keystore/src/internal/constants.ts b/v-next/hardhat-keystore/src/internal/constants.ts new file mode 100644 index 0000000000..8c5aabe8ea --- /dev/null +++ b/v-next/hardhat-keystore/src/internal/constants.ts @@ -0,0 +1 @@ +export const PLUGIN_ID = "hardhat-keystore"; diff --git a/v-next/hardhat-keystore/src/internal/hook-handlers/config.ts b/v-next/hardhat-keystore/src/internal/hook-handlers/config.ts new file mode 100644 index 0000000000..62215467b1 --- /dev/null +++ b/v-next/hardhat-keystore/src/internal/hook-handlers/config.ts @@ -0,0 +1,35 @@ +import type { ConfigHooks } from "@ignored/hardhat-vnext/types/hooks"; + +import debug from "debug"; + +import { getKeystoreFilePath } from "../utils/get-keystore-file-path.js"; + +const log = debug("hardhat:keystore:hooks:config"); + +export default async (): Promise> => { + const handlers: Partial = { + resolveUserConfig: async ( + userConfig, + resolveConfigurationVariable, + next, + ) => { + const resolvedConfig = await next( + userConfig, + resolveConfigurationVariable, + ); + + const defaultKeystoreFilePath = await getKeystoreFilePath(); + + log(`path to keystore file: ${defaultKeystoreFilePath}`); + + return { + ...resolvedConfig, + keystore: { + filePath: defaultKeystoreFilePath, + }, + }; + }, + }; + + return handlers; +}; diff --git a/v-next/hardhat-keystore/src/internal/hook-handlers/configuration-variables.ts b/v-next/hardhat-keystore/src/internal/hook-handlers/configuration-variables.ts new file mode 100644 index 0000000000..1a28155efc --- /dev/null +++ b/v-next/hardhat-keystore/src/internal/hook-handlers/configuration-variables.ts @@ -0,0 +1,47 @@ +import type { KeystoreLoader } from "../types.js"; +import type { ConfigurationVariable } from "@ignored/hardhat-vnext/types/config"; +import type { + ConfigurationVariableHooks, + HookContext, +} from "@ignored/hardhat-vnext/types/hooks"; + +import { isCi } from "@ignored/hardhat-vnext-utils/ci"; + +import { setupKeystoreLoaderFrom } from "../utils/setup-keystore-loader-from.js"; + +export default async (): Promise> => { + // Use a cache with hooks since they may be called multiple times consecutively. + let keystoreLoader: KeystoreLoader | undefined; + + const handlers: Partial = { + fetchValue: async ( + context: HookContext, + variable: ConfigurationVariable, + next, + ) => { + // If we are in CI, the keystore should not be used + // or even initialized + if (isCi()) { + return next(context, variable); + } + + if (keystoreLoader === undefined) { + keystoreLoader = setupKeystoreLoaderFrom(context); + } + + if (!(await keystoreLoader.isKeystoreInitialized())) { + return next(context, variable); + } + + const keystore = await keystoreLoader.loadKeystore(); + + if (!(await keystore.hasKey(variable.name))) { + return next(context, variable); + } + + return keystore.readValue(variable.name); + }, + }; + + return handlers; +}; diff --git a/v-next/hardhat-keystore/src/internal/keystores/unencrypted-keystore.ts b/v-next/hardhat-keystore/src/internal/keystores/unencrypted-keystore.ts new file mode 100644 index 0000000000..3c5c3fc148 --- /dev/null +++ b/v-next/hardhat-keystore/src/internal/keystores/unencrypted-keystore.ts @@ -0,0 +1,55 @@ +import type { Keystore, UnencryptedKeystoreFile } from "../types.js"; + +import { assertHardhatInvariant } from "@ignored/hardhat-vnext-errors"; + +export class UnencryptedKeystore implements Keystore { + readonly #keystoreData: UnencryptedKeystoreFile; + + constructor(keystoreData: UnencryptedKeystoreFile) { + this.#keystoreData = keystoreData; + } + + public static createEmptyUnencryptedKeystoreFile(): UnencryptedKeystoreFile { + return { + _format: "hh-unencrypted-keystore", + version: 1, + keys: {}, + }; + } + + public toJSON(): UnencryptedKeystoreFile { + return this.#keystoreData; + } + + public async listKeys(): Promise { + return Object.keys(this.#keystoreData.keys); + } + + public async hasKey(key: string): Promise { + return Object.keys(this.#keystoreData.keys).includes(key); + } + + public async readValue(key: string): Promise { + const value = this.#keystoreData.keys[key]; + + assertHardhatInvariant( + value !== undefined, + "Unknown key should never be read", + ); + + return value; + } + + public async removeKey(key: string): Promise { + assertHardhatInvariant( + key in this.#keystoreData.keys, + "Unknown key should never be removed", + ); + + delete this.#keystoreData.keys[key]; + } + + public async addNewValue(key: string, value: string): Promise { + this.#keystoreData.keys[key] = value; + } +} diff --git a/v-next/hardhat-keystore/src/internal/loaders/file-manager.ts b/v-next/hardhat-keystore/src/internal/loaders/file-manager.ts new file mode 100644 index 0000000000..b7d34119f2 --- /dev/null +++ b/v-next/hardhat-keystore/src/internal/loaders/file-manager.ts @@ -0,0 +1,26 @@ +import type { FileManager, UnencryptedKeystoreFile } from "../types.js"; + +import { + exists, + writeJsonFile, + readJsonFile, +} from "@ignored/hardhat-vnext-utils/fs"; + +export class FileManagerImpl implements FileManager { + public fileExists(absolutePath: string): Promise { + return exists(absolutePath); + } + + public writeJsonFile( + absolutePathToFile: string, + keystoreFile: UnencryptedKeystoreFile, + ): Promise { + return writeJsonFile(absolutePathToFile, keystoreFile); + } + + public readJsonFile( + absolutePathToFile: string, + ): Promise { + return readJsonFile(absolutePathToFile); + } +} diff --git a/v-next/hardhat-keystore/src/internal/loaders/keystore-file-loader.ts b/v-next/hardhat-keystore/src/internal/loaders/keystore-file-loader.ts new file mode 100644 index 0000000000..6fb975c0a6 --- /dev/null +++ b/v-next/hardhat-keystore/src/internal/loaders/keystore-file-loader.ts @@ -0,0 +1,91 @@ +import type { + FileManager, + Keystore, + KeystoreLoader, + UnencryptedKeystoreFile, +} from "../types.js"; + +import { + assertHardhatInvariant, + HardhatError, +} from "@ignored/hardhat-vnext-errors"; +import { ensureError } from "@ignored/hardhat-vnext-utils/error"; + +import { UnencryptedKeystore } from "../keystores/unencrypted-keystore.js"; +import { unencryptedKeystoreFileSchema } from "../types-validation.js"; + +export class KeystoreFileLoader implements KeystoreLoader { + readonly #keystoreFilePath: string; + readonly #fileManager: FileManager; + #keystoreCache: UnencryptedKeystore | null; + + constructor(keystoreFilePath: string, fileManger: FileManager) { + this.#keystoreFilePath = keystoreFilePath; + this.#fileManager = fileManger; + + this.#keystoreCache = null; + } + + public async isKeystoreInitialized(): Promise { + if (this.#keystoreCache !== null) { + return true; + } + + return this.#fileManager.fileExists(this.#keystoreFilePath); + } + + public async loadKeystore(): Promise { + if (this.#keystoreCache !== null) { + return this.#keystoreCache; + } + + const keystoreFile = await this.#fileManager.readJsonFile( + this.#keystoreFilePath, + ); + + this.#throwIfInvalidKeystoreFormat(keystoreFile); + + const keystore = new UnencryptedKeystore(keystoreFile); + this.#keystoreCache = keystore; + + return keystore; + } + + public async createUnsavedKeystore(): Promise { + assertHardhatInvariant( + this.#keystoreCache === null, + "Cannot create a new Keystore when one is already loaded", + ); + + const keystore = new UnencryptedKeystore( + UnencryptedKeystore.createEmptyUnencryptedKeystoreFile(), + ); + this.#keystoreCache = keystore; + + return keystore; + } + + public async saveKeystoreToFile(): Promise { + assertHardhatInvariant( + this.#keystoreCache !== null, + "Cannot save a keystore that has not been loaded or created", + ); + + const keystoreFile = this.#keystoreCache.toJSON(); + + await this.#fileManager.writeJsonFile(this.#keystoreFilePath, keystoreFile); + } + + #throwIfInvalidKeystoreFormat(keystore: UnencryptedKeystoreFile): void { + try { + unencryptedKeystoreFileSchema.parse(keystore); + } catch (error) { + ensureError(error); + + throw new HardhatError( + HardhatError.ERRORS.KEYSTORE.INVALID_KEYSTORE_FILE_FORMAT, + error, + ); + } + } +} diff --git a/v-next/hardhat-keystore/src/internal/tasks/delete.ts b/v-next/hardhat-keystore/src/internal/tasks/delete.ts new file mode 100644 index 0000000000..4c2de2fae7 --- /dev/null +++ b/v-next/hardhat-keystore/src/internal/tasks/delete.ts @@ -0,0 +1,54 @@ +import type { KeystoreLoader } from "../types.js"; +import type { HardhatRuntimeEnvironment } from "@ignored/hardhat-vnext/types/hre"; +import type { NewTaskActionFunction } from "@ignored/hardhat-vnext/types/tasks"; + +import { UserDisplayMessages } from "../ui/user-display-messages.js"; +import { setupKeystoreLoaderFrom } from "../utils/setup-keystore-loader-from.js"; + +interface TaskDeleteArguments { + key: string; + force: boolean; +} + +const taskDelete: NewTaskActionFunction = async ( + setArgs, + hre: HardhatRuntimeEnvironment, +): Promise => { + const keystoreLoader = setupKeystoreLoaderFrom(hre); + + await remove(setArgs, keystoreLoader); +}; + +export const remove = async ( + { key, force }: TaskDeleteArguments, + keystoreLoader: KeystoreLoader, + consoleLog: (text: string) => void = console.log, +): Promise => { + if (!(await keystoreLoader.isKeystoreInitialized())) { + consoleLog(UserDisplayMessages.displayNoKeystoreSetErrorMessage()); + process.exitCode = 1; + return; + } + + const keystore = await keystoreLoader.loadKeystore(); + + const keys = await keystore.listKeys(); + + if (!keys.includes(key)) { + if (force) { + return; + } + + consoleLog(UserDisplayMessages.displayKeyNotFoundErrorMessage(key)); + process.exitCode = 1; + return; + } + + await keystore.removeKey(key); + + await keystoreLoader.saveKeystoreToFile(); + + consoleLog(UserDisplayMessages.displayKeyRemovedInfoMessage(key)); +}; + +export default taskDelete; diff --git a/v-next/hardhat-keystore/src/internal/tasks/get.ts b/v-next/hardhat-keystore/src/internal/tasks/get.ts new file mode 100644 index 0000000000..0a7cfc270f --- /dev/null +++ b/v-next/hardhat-keystore/src/internal/tasks/get.ts @@ -0,0 +1,45 @@ +import type { KeystoreLoader } from "../types.js"; +import type { HardhatRuntimeEnvironment } from "@ignored/hardhat-vnext/types/hre"; +import type { NewTaskActionFunction } from "@ignored/hardhat-vnext/types/tasks"; + +import { UserDisplayMessages } from "../ui/user-display-messages.js"; +import { setupKeystoreLoaderFrom } from "../utils/setup-keystore-loader-from.js"; + +interface TaskGetArguments { + key: string; +} + +const taskGet: NewTaskActionFunction = async ( + { key }, + hre: HardhatRuntimeEnvironment, +): Promise => { + const keystoreLoader = setupKeystoreLoaderFrom(hre); + + await get({ key }, keystoreLoader); +}; + +export const get = async ( + { key }: TaskGetArguments, + keystoreLoader: KeystoreLoader, + consoleLog: (text: string) => void = console.log, +): Promise => { + if (!(await keystoreLoader.isKeystoreInitialized())) { + consoleLog(UserDisplayMessages.displayNoKeystoreSetErrorMessage()); + process.exitCode = 1; + return; + } + + const keystore = await keystoreLoader.loadKeystore(); + + if (!(await keystore.hasKey(key))) { + consoleLog(UserDisplayMessages.displayKeyNotFoundErrorMessage(key)); + process.exitCode = 1; + return; + } + + const value = await keystore.readValue(key); + + consoleLog(UserDisplayMessages.displayValueInfoMessage(value)); +}; + +export default taskGet; diff --git a/v-next/hardhat-keystore/src/internal/tasks/list.ts b/v-next/hardhat-keystore/src/internal/tasks/list.ts new file mode 100644 index 0000000000..e4f8c20944 --- /dev/null +++ b/v-next/hardhat-keystore/src/internal/tasks/list.ts @@ -0,0 +1,39 @@ +import type { KeystoreLoader } from "../types.js"; +import type { HardhatRuntimeEnvironment } from "@ignored/hardhat-vnext/types/hre"; +import type { NewTaskActionFunction } from "@ignored/hardhat-vnext/types/tasks"; + +import { UserDisplayMessages } from "../ui/user-display-messages.js"; +import { setupKeystoreLoaderFrom } from "../utils/setup-keystore-loader-from.js"; + +const taskList: NewTaskActionFunction = async ( + _taskArguments, + hre: HardhatRuntimeEnvironment, +): Promise => { + const keystoreLoader = setupKeystoreLoaderFrom(hre); + + await list(keystoreLoader); +}; + +export const list = async ( + keystoreLoader: KeystoreLoader, + consoleLog: (text: string) => void = console.log, +): Promise => { + if (!(await keystoreLoader.isKeystoreInitialized())) { + consoleLog(UserDisplayMessages.displayNoKeystoreSetErrorMessage()); + process.exitCode = 1; + return; + } + + const keystore = await keystoreLoader.loadKeystore(); + + const keys = await keystore.listKeys(); + + if (keys.length === 0) { + consoleLog(UserDisplayMessages.displayNoKeysInfoMessage()); + return; + } + + consoleLog(UserDisplayMessages.displayKeyListInfoMessage(keys)); +}; + +export default taskList; diff --git a/v-next/hardhat-keystore/src/internal/tasks/set.ts b/v-next/hardhat-keystore/src/internal/tasks/set.ts new file mode 100644 index 0000000000..20c8bbf397 --- /dev/null +++ b/v-next/hardhat-keystore/src/internal/tasks/set.ts @@ -0,0 +1,65 @@ +import type { KeystoreLoader } from "../types.js"; +import type { HardhatRuntimeEnvironment } from "@ignored/hardhat-vnext/types/hre"; +import type { NewTaskActionFunction } from "@ignored/hardhat-vnext/types/tasks"; + +import { requestSecretInput } from "../ui/request-secret-input.js"; +import { UserDisplayMessages } from "../ui/user-display-messages.js"; +import { setupKeystoreLoaderFrom } from "../utils/setup-keystore-loader-from.js"; +import { validateKey } from "../utils/validate-key.js"; + +interface TaskGetArguments { + key: string; + force: boolean; +} + +const taskSet: NewTaskActionFunction = async ( + setArgs, + hre: HardhatRuntimeEnvironment, +): Promise => { + const keystoreLoader = setupKeystoreLoaderFrom(hre); + + await set(setArgs, keystoreLoader); +}; + +export const set = async ( + { key, force }: TaskGetArguments, + keystoreLoader: KeystoreLoader, + consoleLog: (text: string) => void = console.log, + requestSecretFromUser: ( + requestText: string, + ) => Promise = requestSecretInput, +): Promise => { + if (!(await validateKey(key))) { + consoleLog(UserDisplayMessages.displayInvalidKeyErrorMessage(key)); + process.exitCode = 1; + return; + } + + const keystore = (await keystoreLoader.isKeystoreInitialized()) + ? await keystoreLoader.loadKeystore() + : await keystoreLoader.createUnsavedKeystore(); + + if (!force && (await keystore.hasKey(key))) { + consoleLog(UserDisplayMessages.displayKeyAlreadyExistsWarning(key)); + process.exitCode = 1; + return; + } + + const secret = await requestSecretFromUser( + UserDisplayMessages.enterSecretMessage(), + ); + + if (secret.length === 0) { + consoleLog(UserDisplayMessages.displaySecretCannotBeEmptyErrorMessage()); + process.exitCode = 1; + return; + } + + await keystore.addNewValue(key, secret); + + await keystoreLoader.saveKeystoreToFile(); + + consoleLog(UserDisplayMessages.displayKeySetInfoMessage(key)); +}; + +export default taskSet; diff --git a/v-next/hardhat-keystore/src/internal/type-extensions.ts b/v-next/hardhat-keystore/src/internal/type-extensions.ts new file mode 100644 index 0000000000..34c9c1c8de --- /dev/null +++ b/v-next/hardhat-keystore/src/internal/type-extensions.ts @@ -0,0 +1,9 @@ +import "@ignored/hardhat-vnext/types/config"; + +declare module "@ignored/hardhat-vnext/types/config" { + export interface HardhatConfig { + keystore: { + filePath: string; + }; + } +} diff --git a/v-next/hardhat-keystore/src/internal/types-validation.ts b/v-next/hardhat-keystore/src/internal/types-validation.ts new file mode 100644 index 0000000000..b10667af28 --- /dev/null +++ b/v-next/hardhat-keystore/src/internal/types-validation.ts @@ -0,0 +1,11 @@ +import type { UnencryptedKeystoreFile } from "./types.js"; +import type { ZodSchema } from "zod"; + +import { z } from "zod"; + +export const unencryptedKeystoreFileSchema: ZodSchema = + z.object({ + _format: z.literal("hh-unencrypted-keystore"), + version: z.number(), + keys: z.record(z.string()), + }); diff --git a/v-next/hardhat-keystore/src/internal/types.ts b/v-next/hardhat-keystore/src/internal/types.ts new file mode 100644 index 0000000000..3a3239d928 --- /dev/null +++ b/v-next/hardhat-keystore/src/internal/types.ts @@ -0,0 +1,41 @@ +export interface UnencryptedKeystoreFile { + _format: "hh-unencrypted-keystore"; + version: number; + keys: { + [key: string]: string; + }; +} + +export interface Keystore { + listKeys(): Promise; + hasKey(key: string): Promise; + addNewValue(key: string, value: string): Promise; + removeKey(key: string): Promise; + readValue(key: string): Promise; + toJSON(): UnencryptedKeystoreFile; +} + +/** + * The KeystoreLoader is responsible for loading and saving the in-memory + * keystore from and to the on-disk keystore file. + * + * As part of those tasks, it has responsilibty for: + * - validating that the on-disk keystore file meets the expected structure + * during loading + * - caching the in-memory keystore to reduce IO during loads + */ +export interface KeystoreLoader { + isKeystoreInitialized: () => Promise; + createUnsavedKeystore: () => Promise; + loadKeystore: () => Promise; + saveKeystoreToFile: () => Promise; +} + +export interface FileManager { + fileExists(absolutePath: string): Promise; + writeJsonFile( + absolutePathToFile: string, + keystoreFile: UnencryptedKeystoreFile, + ): Promise; + readJsonFile(absolutePathToFile: string): Promise; +} diff --git a/v-next/hardhat-keystore/src/internal/ui/request-secret-input.ts b/v-next/hardhat-keystore/src/internal/ui/request-secret-input.ts new file mode 100644 index 0000000000..909d8850f7 --- /dev/null +++ b/v-next/hardhat-keystore/src/internal/ui/request-secret-input.ts @@ -0,0 +1,53 @@ +import { HardhatError } from "@ignored/hardhat-vnext-errors"; + +export async function requestSecretInput( + inputDescription: string, +): Promise { + const { createInterface } = await import("node:readline"); + + const rl = createInterface({ + input: process.stdin, + output: process.stdout, + }); + + /* eslint-disable-next-line @typescript-eslint/consistent-type-assertions -- + We need to access a private property of the readline interface. */ + const rlAsAny = rl as any; + + let initialMessage: string | undefined; + + rlAsAny._writeToOutput = (out: string) => { + if (initialMessage === undefined || out.length !== 1) { + if (initialMessage === undefined) { + initialMessage = out; + } + + if (rlAsAny.output === undefined) { + throw new HardhatError( + HardhatError.ERRORS.KEYSTORE.INVALID_READLINE_OUTPUT, + ); + } + + // We show the initial message as is + if (out.startsWith(initialMessage)) { + rlAsAny.output.write(initialMessage); + out = out.slice(initialMessage.length); + } else if (out.trim() === "") { + rlAsAny.output.write(out); + out = ""; + } + } + + // We show the rest of the chars as "*" + for (const _ of out) { + rlAsAny.output.write("*"); + } + }; + + return new Promise((resolve) => { + rl.question(inputDescription, (answer) => { + resolve(answer); + rl.close(); + }); + }); +} diff --git a/v-next/hardhat-keystore/src/internal/ui/user-display-messages.ts b/v-next/hardhat-keystore/src/internal/ui/user-display-messages.ts new file mode 100644 index 0000000000..90440f0a46 --- /dev/null +++ b/v-next/hardhat-keystore/src/internal/ui/user-display-messages.ts @@ -0,0 +1,57 @@ +import chalk from "chalk"; + +export class UserDisplayMessages { + public static displayInvalidKeyErrorMessage(key: string): string { + return chalk.red( + `Invalid value for key: "${key}". Keys can only have alphanumeric characters and underscores, and they cannot start with a number.`, + ); + } + + public static displayKeyAlreadyExistsWarning(key: string): string { + return chalk.yellow( + `The key "${key}" already exists. Use the ${chalk.blue.italic("--force")} flag to overwrite it.`, + ); + } + + public static displayKeyListInfoMessage(keys: string[]): string { + let output = "Keys:"; + + for (const key of keys) { + output += `\n${key}`; + } + + return output + "\n"; + } + + public static displayKeyNotFoundErrorMessage(key: string): string { + return chalk.red(`Key "${key}" not found`); + } + + public static displayKeyRemovedInfoMessage(key: string): string { + return `Key "${key}" deleted`; + } + + public static displayKeySetInfoMessage(key: string): string { + return `Key "${key}" set`; + } + + public static displayNoKeysInfoMessage(): string { + return "The keystore does not contain any keys."; + } + + public static displayNoKeystoreSetErrorMessage(): string { + return `No keystore found. Please set one up using ${chalk.blue.italic("npx hardhat keystore set {key}")} `; + } + + public static displaySecretCannotBeEmptyErrorMessage(): string { + return chalk.red("The value cannot be empty."); + } + + public static displayValueInfoMessage(value: string): string { + return `${value}`; + } + + public static enterSecretMessage(): string { + return "Enter secret to store: "; + } +} diff --git a/v-next/hardhat-keystore/src/internal/utils/get-keystore-file-path.ts b/v-next/hardhat-keystore/src/internal/utils/get-keystore-file-path.ts new file mode 100644 index 0000000000..50dc41e111 --- /dev/null +++ b/v-next/hardhat-keystore/src/internal/utils/get-keystore-file-path.ts @@ -0,0 +1,11 @@ +import path from "node:path"; + +import { getConfigDir } from "@ignored/hardhat-vnext-utils/global-dir"; + +/** + * Get the path for the keystore in the Hardhat global config directory. + */ +export async function getKeystoreFilePath(): Promise { + const configDirPath = await getConfigDir(); + return path.join(configDirPath, "keystore.json"); +} diff --git a/v-next/hardhat-keystore/src/internal/utils/setup-keystore-loader-from.ts b/v-next/hardhat-keystore/src/internal/utils/setup-keystore-loader-from.ts new file mode 100644 index 0000000000..0d1cf7ea63 --- /dev/null +++ b/v-next/hardhat-keystore/src/internal/utils/setup-keystore-loader-from.ts @@ -0,0 +1,20 @@ +import type { KeystoreLoader } from "../types.js"; +import type { HardhatConfig } from "@ignored/hardhat-vnext/types/config"; + +import { FileManagerImpl } from "../loaders/file-manager.js"; +import { KeystoreFileLoader } from "../loaders/keystore-file-loader.js"; + +/** + * Factory for setting up the keyloader based on the + * keystore file path from the hre config. + */ +export function setupKeystoreLoaderFrom({ + config, +}: { + config: HardhatConfig; +}): KeystoreLoader { + const keystoreFilePath = config.keystore.filePath; + const fileManager = new FileManagerImpl(); + + return new KeystoreFileLoader(keystoreFilePath, fileManager); +} diff --git a/v-next/hardhat-keystore/src/internal/utils/validate-key.ts b/v-next/hardhat-keystore/src/internal/utils/validate-key.ts new file mode 100644 index 0000000000..42c371573d --- /dev/null +++ b/v-next/hardhat-keystore/src/internal/utils/validate-key.ts @@ -0,0 +1,9 @@ +export async function validateKey(key: string): Promise { + const KEY_REGEX = /^[a-zA-Z_]+[a-zA-Z0-9_]*$/; + + if (KEY_REGEX.test(key)) { + return true; + } + + return false; +} diff --git a/v-next/hardhat-keystore/test/fixture-projects/unencrypted-keystore/.gitignore b/v-next/hardhat-keystore/test/fixture-projects/unencrypted-keystore/.gitignore new file mode 100644 index 0000000000..2e261d4af3 --- /dev/null +++ b/v-next/hardhat-keystore/test/fixture-projects/unencrypted-keystore/.gitignore @@ -0,0 +1,3 @@ +keystore.json +# This is a temp file created by the config variables tests +config-variables-keystore.json diff --git a/v-next/hardhat-keystore/test/fixture-projects/unencrypted-keystore/existing-keystore.json b/v-next/hardhat-keystore/test/fixture-projects/unencrypted-keystore/existing-keystore.json new file mode 100644 index 0000000000..4f169934e4 --- /dev/null +++ b/v-next/hardhat-keystore/test/fixture-projects/unencrypted-keystore/existing-keystore.json @@ -0,0 +1,9 @@ +{ + "_format": "hh-unencrypted-keystore", + "version": 1, + "keys": { + "key1": "value1", + "key2": "value2", + "key3": "value3" + } +} diff --git a/v-next/hardhat-keystore/test/helpers/assert-output-includes.ts b/v-next/hardhat-keystore/test/helpers/assert-output-includes.ts new file mode 100644 index 0000000000..0011d7c41c --- /dev/null +++ b/v-next/hardhat-keystore/test/helpers/assert-output-includes.ts @@ -0,0 +1,21 @@ +import type { Mock } from "node:test"; + +import assert from "node:assert/strict"; + +/** + * Assert against a mocked console log as if you where dealing with + * the full output. + */ +export function assertOutputIncludes( + mockConsoleLog: Mock<(text: string) => void>, + expectedText: string, +): void { + const output = mockConsoleLog.mock.calls + .map((call) => call.arguments[0]) + .join("\n"); + + assert.ok( + output.includes(expectedText), + `Output should include "${expectedText}", but it was:\n${output}`, + ); +} diff --git a/v-next/hardhat-keystore/test/helpers/mock-file-manager.ts b/v-next/hardhat-keystore/test/helpers/mock-file-manager.ts new file mode 100644 index 0000000000..7cfe0e2df3 --- /dev/null +++ b/v-next/hardhat-keystore/test/helpers/mock-file-manager.ts @@ -0,0 +1,75 @@ +import type { + FileManager, + UnencryptedKeystoreFile, +} from "../../src/internal/types.js"; +import type { Mock } from "node:test"; + +import { mock } from "node:test"; + +import { assertHardhatInvariant } from "@ignored/hardhat-vnext-errors"; + +import { UnencryptedKeystore } from "../../src/internal/keystores/unencrypted-keystore.js"; + +export class MockFileManager implements FileManager { + #keystoreFile: UnencryptedKeystoreFile | null; + + constructor() { + this.#keystoreFile = null; + } + + /** + * Only used in tests to ensure there is no current keystore + * file at the path. + */ + public setupNoKeystoreFile(): void { + this.#keystoreFile = null; + } + + public setupExistingKeystoreFile(keys: { + [key: string]: string; + }): UnencryptedKeystoreFile { + const keystoreFile = + UnencryptedKeystore.createEmptyUnencryptedKeystoreFile(); + + keystoreFile.keys = keys; + + this.#keystoreFile = keystoreFile; + this.writeJsonFile.mock.resetCalls(); + + return keystoreFile; + } + + public setKeystoreFile(keystoreFile: UnencryptedKeystoreFile): void { + this.#keystoreFile = keystoreFile; + } + + public fileExists: Mock<(_absolutePath: string) => Promise> = + mock.fn(async (_absolutePath: string): Promise => { + return this.#keystoreFile !== null; + }); + + public writeJsonFile: Mock< + ( + _absolutePathToFile: string, + keystoreFile: UnencryptedKeystoreFile, + ) => Promise + > = mock.fn( + async ( + _absolutePathToFile: string, + keystoreFile: UnencryptedKeystoreFile, + ): Promise => { + this.#keystoreFile = keystoreFile; + }, + ); + + public async readJsonFile( + _absolutePathToFile: string, + ): Promise { + assertHardhatInvariant( + this.#keystoreFile !== null, + "Keystore file not set for mock file manager", + ); + + return this.#keystoreFile; + } +} diff --git a/v-next/hardhat-keystore/test/helpers/setup-keystore-file-location-override-at.ts b/v-next/hardhat-keystore/test/helpers/setup-keystore-file-location-override-at.ts new file mode 100644 index 0000000000..2a257d0455 --- /dev/null +++ b/v-next/hardhat-keystore/test/helpers/setup-keystore-file-location-override-at.ts @@ -0,0 +1,34 @@ +import type { HardhatPlugin } from "@ignored/hardhat-vnext/types/plugins"; + +export const setupKeystoreFileLocationOverrideAt = ( + keystoreFilePath: string, +): HardhatPlugin => { + const hardhatKeystoreFileLocationOverridePlugin: HardhatPlugin = { + id: "hardhat-keystore-file-location-override", + hookHandlers: { + config: async () => { + return { + resolveUserConfig: async ( + userConfig, + resolveConfigurationVariable, + next, + ) => { + const resolvedConfig = await next( + userConfig, + resolveConfigurationVariable, + ); + + return { + ...resolvedConfig, + keystore: { + filePath: keystoreFilePath, + }, + }; + }, + }; + }, + }, + }; + + return hardhatKeystoreFileLocationOverridePlugin; +}; diff --git a/v-next/hardhat-keystore/test/hook-handlers/configuration-variables.ts b/v-next/hardhat-keystore/test/hook-handlers/configuration-variables.ts new file mode 100644 index 0000000000..3362611e9e --- /dev/null +++ b/v-next/hardhat-keystore/test/hook-handlers/configuration-variables.ts @@ -0,0 +1,203 @@ +import type { UnencryptedKeystoreFile } from "../../src/internal/types.js"; +import type { ConfigurationVariable } from "@ignored/hardhat-vnext/types/config"; +import type { HardhatRuntimeEnvironment } from "@ignored/hardhat-vnext/types/hre"; + +import assert from "node:assert/strict"; +import path from "node:path"; +import { after, afterEach, before, beforeEach, describe, it } from "node:test"; +import { fileURLToPath } from "node:url"; + +import { createHardhatRuntimeEnvironment } from "@ignored/hardhat-vnext/hre"; +import { isCi } from "@ignored/hardhat-vnext-utils/ci"; +import { remove, writeJsonFile } from "@ignored/hardhat-vnext-utils/fs"; + +import hardhatKeystorePlugin from "../../src/index.js"; +import { UnencryptedKeystore } from "../../src/internal/keystores/unencrypted-keystore.js"; +import { setupKeystoreFileLocationOverrideAt } from "../helpers/setup-keystore-file-location-override-at.js"; + +const configurationVariableKeystoreFilePath = path.join( + fileURLToPath(import.meta.url), + "..", + "..", + "fixture-projects", + "unencrypted-keystore", + "config-variables-keystore.json", +); + +const nonExistingKeystoreFilePath = path.join( + fileURLToPath(import.meta.url), + "..", + "..", + "fixture-projects", + "unencrypted-keystore", + "nonexistent-keystore.json", +); + +const exampleConfigurationVariable: ConfigurationVariable = { + _type: "ConfigurationVariable", + name: "key1", +}; + +describe("hook-handlers - configuration variables - fetchValue", () => { + let hre: HardhatRuntimeEnvironment; + let runningInCi: boolean; + + // The config variables hook handler short circuits if running in CI + // intentionally. In this integration test we check whether we are running + // in _our_ CI - Github Actions, and turn off `process.env.GITHUB_ACTIONS` + // for the duration of this test suite, then turn it back on again at the end. + before(async () => { + if (isCi()) { + runningInCi = true; + } + + if (runningInCi) { + delete process.env.GITHUB_ACTIONS; + delete process.env.CI; + } + }); + + after(() => { + if (runningInCi) { + process.env.GITHUB_ACTIONS = "true"; + process.env.CI = "true"; + } + }); + + describe("when there is an existing valid keystore file", () => { + beforeEach(async () => { + await remove(configurationVariableKeystoreFilePath); + + const keystoreFile: UnencryptedKeystoreFile = + UnencryptedKeystore.createEmptyUnencryptedKeystoreFile(); + + keystoreFile.keys.key1 = "value1"; + keystoreFile.keys.key2 = "value2"; + + await writeJsonFile(configurationVariableKeystoreFilePath, keystoreFile); + + hre = await createHardhatRuntimeEnvironment({ + plugins: [ + hardhatKeystorePlugin, + setupKeystoreFileLocationOverrideAt( + configurationVariableKeystoreFilePath, + ), + ], + }); + }); + + afterEach(async () => { + await remove(configurationVariableKeystoreFilePath); + }); + + describe("successful get on a key in the keystore", () => { + let resultValue: string; + + beforeEach(async () => { + resultValue = await hre.hooks.runHandlerChain( + "configurationVariables", + "fetchValue", + [exampleConfigurationVariable], + async (_context, _configVar) => { + return "unexpected-default-value"; + }, + ); + }); + + it("should the value for the key in the keystore", async () => { + assert.equal(resultValue, "value1"); + }); + }); + + describe("where the key is not in the keystore", () => { + let resultValue: string; + + beforeEach(async () => { + resultValue = await hre.hooks.runHandlerChain( + "configurationVariables", + "fetchValue", + [ + { + ...exampleConfigurationVariable, + name: "non-existent-key-in-keystore", + }, + ], + async (_context, _configVar) => { + return "value-from-hardhat-package-not-keystore"; + }, + ); + }); + + it("should invoke the next function because the keystore is found but the key is not present", async () => { + assert.equal(resultValue, "value-from-hardhat-package-not-keystore"); + }); + }); + + describe("caching", () => { + describe("on a second get against the same hre", () => { + let resultValue2: string; + + beforeEach(async () => { + const resultValue = await hre.hooks.runHandlerChain( + "configurationVariables", + "fetchValue", + [{ ...exampleConfigurationVariable, name: "key1" }], + async (_context, _configVar) => { + return "unexpected-default-value"; + }, + ); + + assert.equal(resultValue, "value1"); + + // After the initial read, overwrite the keystore file with + // empty keys to ensure the cache is being used + await writeJsonFile( + configurationVariableKeystoreFilePath, + UnencryptedKeystore.createEmptyUnencryptedKeystoreFile(), + ); + + resultValue2 = await hre.hooks.runHandlerChain( + "configurationVariables", + "fetchValue", + [{ ...exampleConfigurationVariable, name: "key2" }], + async (_context, _configVar) => { + return "unexpected-default-value"; + }, + ); + }); + + it("should successfully get a key on", async () => { + assert.equal(resultValue2, "value2"); + }); + }); + }); + }); + + describe("when the keystore file has not been setup", () => { + describe("when trying to get a value", () => { + let resultValue: string; + + beforeEach(async () => { + hre = await createHardhatRuntimeEnvironment({ + plugins: [ + hardhatKeystorePlugin, + setupKeystoreFileLocationOverrideAt(nonExistingKeystoreFilePath), + ], + }); + + resultValue = await hre.hooks.runHandlerChain( + "configurationVariables", + "fetchValue", + [exampleConfigurationVariable], + async (_context, _configVar) => { + return "value-from-hardhat-package"; + }, + ); + }); + + it("should invoke the next function and return its value because no keystore is found", async () => { + assert.equal(resultValue, "value-from-hardhat-package"); + }); + }); + }); +}); diff --git a/v-next/hardhat-keystore/test/integration/tasks.ts b/v-next/hardhat-keystore/test/integration/tasks.ts new file mode 100644 index 0000000000..5d6342e55d --- /dev/null +++ b/v-next/hardhat-keystore/test/integration/tasks.ts @@ -0,0 +1,143 @@ +import type { UnencryptedKeystoreFile } from "../../src/internal/types.js"; +import type { HardhatRuntimeEnvironment } from "@ignored/hardhat-vnext/types/hre"; + +import assert from "node:assert/strict"; +import path from "node:path"; +import { Readable } from "node:stream"; +import { afterEach, beforeEach, describe, it } from "node:test"; +import { fileURLToPath } from "node:url"; + +import { createHardhatRuntimeEnvironment } from "@ignored/hardhat-vnext/hre"; +import { remove, writeJsonFile } from "@ignored/hardhat-vnext-utils/fs"; + +import hardhatKeystorePlugin from "../../src/index.js"; +import { UnencryptedKeystore } from "../../src/internal/keystores/unencrypted-keystore.js"; +import { setupKeystoreFileLocationOverrideAt } from "../helpers/setup-keystore-file-location-override-at.js"; + +const keystoreFilePath = path.join( + fileURLToPath(import.meta.url), + "..", + "..", + "fixture-projects", + "unencrypted-keystore", + "keystore.json", +); + +/** + * These tests are writing to the filesystem within `./test/fixture-projects/unencrypted-keystore`. + * + * They test the end to end keystore task runs by monkey patching `process.stdin` and `process.stdout`. + */ +describe("integration tests for the keystore tasks", () => { + let hre: HardhatRuntimeEnvironment; + + beforeEach(async () => { + const keystoreFile: UnencryptedKeystoreFile = + UnencryptedKeystore.createEmptyUnencryptedKeystoreFile(); + + keystoreFile.keys.myKey1 = "myValue1"; + keystoreFile.keys.myKey2 = "myValue2"; + + await _overwriteKeystoreFileWith(keystoreFilePath, keystoreFile); + + hre = await createHardhatRuntimeEnvironment({ + plugins: [ + hardhatKeystorePlugin, + setupKeystoreFileLocationOverrideAt(keystoreFilePath), + ], + }); + }); + + afterEach(async () => { + await remove(keystoreFilePath); + }); + + it("should display the value on a `npx hardhat keystore get`", async () => { + await _assertConsoleOutputMatchesFor( + () => hre.tasks.getTask(["keystore", "get"]).run({ key: "myKey1" }), + "myValue1\n", + ); + }); + + it("should display the list of keys on `npx hardhat keystore list`", async () => { + await _assertConsoleOutputMatchesFor( + () => hre.tasks.getTask(["keystore", "list"]).run({}), + "Keys:\nmyKey1\nmyKey2\n\n", + ); + }); + + it("should display the delete the key on `npx hardhat keystore delete myKey1`", async () => { + await _assertConsoleOutputMatchesFor( + () => hre.tasks.getTask(["keystore", "delete"]).run({ key: "myKey1" }), + 'Key "myKey1" deleted\n', + ); + }); + + it("should display the setting of the key on `npx hardhat keystore set myNewKey`", async () => { + await _assertConsoleOutputMatchesFor( + () => hre.tasks.getTask(["keystore", "set"]).run({ key: "myNewKey" }), + "Enter secret to store: " + 'Key "myNewKey" set\n', + ["myNewValue\n"], + ); + }); +}); + +async function _overwriteKeystoreFileWith( + filePath: string, + keystoreFile: UnencryptedKeystoreFile, +) { + await remove(filePath); + + await writeJsonFile(filePath, keystoreFile); +} + +/** + * This is a helper function that mocks out `process.stdin`'s read and `process.stdout`'s write + * to allow for crude integration testing. + * + * This is obviously brittle, however the tasks intentionally don't go through the Hook + * User Interruption system, hence we can't just mock `hre.interruptions` to provide inputs + * and assert against outputs. + * + * @param action the action to run in the scope of monkey patched stdin and stdout + * @param expectedOutput the expected stdout output as a string + * @param inputs optional inputs to be provided to stdin + */ +async function _assertConsoleOutputMatchesFor( + action: () => Promise, + expectedOutput: string, + inputs?: string[], +): Promise { + let output = ""; + + const originalWrite = process.stdout.write; + process.stdout.write = (chunk: string): boolean => { + output += chunk.toString(); + + return true; + }; + + const originalRead = process.stdin.read; + if (inputs !== undefined) { + const mockStream = new Readable({ + read() { + for (const input of inputs) { + this.push(input); + } + + this.push(null); + }, + }); + + Object.assign(process.stdin, mockStream); + } + + try { + await action(); + + assert.equal(output, expectedOutput); + } finally { + process.stdout.write = originalWrite; + process.stdin.read = originalRead; + } +} diff --git a/v-next/hardhat-keystore/test/integration/turn-off-keystore-in-ci.ts b/v-next/hardhat-keystore/test/integration/turn-off-keystore-in-ci.ts new file mode 100644 index 0000000000..ff0f1fd60b --- /dev/null +++ b/v-next/hardhat-keystore/test/integration/turn-off-keystore-in-ci.ts @@ -0,0 +1,73 @@ +import type { ConfigurationVariable } from "@ignored/hardhat-vnext/types/config"; +import type { HardhatRuntimeEnvironment } from "@ignored/hardhat-vnext/types/hre"; + +import assert from "node:assert/strict"; +import path from "node:path"; +import { beforeEach, describe, it } from "node:test"; +import { fileURLToPath } from "node:url"; + +import { createHardhatRuntimeEnvironment } from "@ignored/hardhat-vnext/hre"; +import { isCi } from "@ignored/hardhat-vnext-utils/ci"; + +// NOTE: we are importing using the default export, running the CI determination +// code. On CI this will be the reduced plugin, in local development this will +// be the full plugin. +import hardhatKeystorePlugin from "../../src/index.js"; +import { setupKeystoreFileLocationOverrideAt } from "../helpers/setup-keystore-file-location-override-at.js"; + +const existingKeystoreFilePath = path.join( + fileURLToPath(import.meta.url), + "..", + "..", + "fixture-projects", + "unencrypted-keystore", + "existing-keystore.json", +); + +/** + * This test checks that the Keystore plugin is "disabled" when running in a CI environment. + * + * This of course gets complicated because we are running the test in our CI to check + * that the plugin is disabled in CI. + * + * The approach taken is to import the plugin directly from `./src/index.ts` loading via + * the CI choosing logic of the default export. Then the test does a Hook lookup for a + * configuration variable. We switch the asserted expected value depending on whether + * we are in CI or not. This test works both in CI and locally and tests the CI detection + * logic. + */ +describe("turn off keystore plugin when running in CI", function () { + let hre: HardhatRuntimeEnvironment; + let resultValue: string; + + beforeEach(async () => { + hre = await createHardhatRuntimeEnvironment({ + plugins: [ + hardhatKeystorePlugin, + setupKeystoreFileLocationOverrideAt(existingKeystoreFilePath), + ], + }); + + const exampleConfigurationVariable: ConfigurationVariable = { + _type: "ConfigurationVariable", + name: "key1", + }; + + resultValue = await hre.hooks.runHandlerChain( + "configurationVariables", + "fetchValue", + [exampleConfigurationVariable], + async (_context, _configVar) => { + return "expected-default-value-in-ci"; + }, + ); + }); + + it("return read from the keystore in development and return the default value in CI", async function () { + if (isCi()) { + assert.equal(resultValue, "expected-default-value-in-ci"); + } else { + assert.equal(resultValue, "value1"); + } + }); +}); diff --git a/v-next/hardhat-keystore/test/keystores/unencrypted-keystore.ts b/v-next/hardhat-keystore/test/keystores/unencrypted-keystore.ts new file mode 100644 index 0000000000..397719b479 --- /dev/null +++ b/v-next/hardhat-keystore/test/keystores/unencrypted-keystore.ts @@ -0,0 +1,55 @@ +import type { Keystore } from "../../src/internal/types.js"; + +import assert from "node:assert/strict"; +import { beforeEach, describe, it } from "node:test"; + +import { UnencryptedKeystore } from "../../src/internal/keystores/unencrypted-keystore.js"; + +describe("UnencryptedKeystore", () => { + describe("when the keystore is valid", () => { + let keystore: Keystore; + + beforeEach(() => { + const keystoreFile = + UnencryptedKeystore.createEmptyUnencryptedKeystoreFile(); + + keystoreFile.keys = { + key1: "value1", + key2: "value2", + }; + + keystore = new UnencryptedKeystore(keystoreFile); + }); + + it("should list the keys", async () => { + assert.deepEqual(await keystore.listKeys(), ["key1", "key2"]); + }); + + it("should read a value", async () => { + assert.equal(await keystore.readValue("key1"), "value1"); + }); + + it("should remove a key", async () => { + // Be sure that the key exists + assert.equal(await keystore.readValue("key1"), "value1"); + + await keystore.removeKey("key1"); + + // Be sure the key has been deleted + assert.ok(!(await keystore.hasKey("key1")), "The key should not exist"); + }); + + it("should add a new value", async () => { + // Be sure that the key does not exist + assert.ok( + !(await keystore.hasKey("new-key")), + "The key should not exist", + ); + + await keystore.addNewValue("new-key", "new-value"); + + // Be sure the key has been added + assert.equal(await keystore.readValue("new-key"), "new-value"); + }); + }); +}); diff --git a/v-next/hardhat-keystore/test/loaders/keystore-file-loader.ts b/v-next/hardhat-keystore/test/loaders/keystore-file-loader.ts new file mode 100644 index 0000000000..0b59ac8258 --- /dev/null +++ b/v-next/hardhat-keystore/test/loaders/keystore-file-loader.ts @@ -0,0 +1,144 @@ +import assert from "node:assert/strict"; +import { beforeEach, describe, it } from "node:test"; + +import { HardhatError } from "@ignored/hardhat-vnext-errors"; +import { assertRejectsWithHardhatError } from "@nomicfoundation/hardhat-test-utils"; + +import { UnencryptedKeystore } from "../../src/internal/keystores/unencrypted-keystore.js"; +import { KeystoreFileLoader } from "../../src/internal/loaders/keystore-file-loader.js"; +import { MockFileManager } from "../helpers/mock-file-manager.js"; + +const fakeKeystoreFilePath = "./fake-keystore-path.json"; + +describe("KeystoreFileLoader", () => { + describe("keystore file validation", () => { + describe("when the keystore file is valid on disk", () => { + let keystoreLoader: KeystoreFileLoader; + + beforeEach(async () => { + const mockFileManager = new MockFileManager(); + + mockFileManager.setupExistingKeystoreFile({ myKey: "myValue" }); + + keystoreLoader = new KeystoreFileLoader( + fakeKeystoreFilePath, + mockFileManager, + ); + }); + + it("should load the keystore", async () => { + const keystore = await keystoreLoader.loadKeystore(); + + const value = await keystore.readValue("myKey"); + + assert.equal(value, "myValue"); + }); + }); + + describe("when the keystore file is invalid on disk", () => { + let keystoreLoader: KeystoreFileLoader; + + beforeEach(async () => { + const mockFileManager = new MockFileManager(); + + const invalidKeystore = + UnencryptedKeystore.createEmptyUnencryptedKeystoreFile(); + invalidKeystore._format = + // eslint-disable-next-line @typescript-eslint/consistent-type-assertions -- testing invalid format + "invalid" as unknown as "hh-unencrypted-keystore"; + + mockFileManager.setKeystoreFile(invalidKeystore); + + keystoreLoader = new KeystoreFileLoader( + fakeKeystoreFilePath, + mockFileManager, + ); + }); + + it("should throw on attempted load", async () => { + await assertRejectsWithHardhatError( + async () => keystoreLoader.loadKeystore(), + HardhatError.ERRORS.KEYSTORE.INVALID_KEYSTORE_FILE_FORMAT, + {}, + ); + }); + }); + }); + + describe("keystore caching", () => { + describe("when the keystore has not been loaded", () => { + let keystoreLoader: KeystoreFileLoader; + let mockFileManager: MockFileManager; + + beforeEach(async () => { + mockFileManager = new MockFileManager(); + + mockFileManager.setupExistingKeystoreFile({ myKey: "myValue" }); + + keystoreLoader = new KeystoreFileLoader( + fakeKeystoreFilePath, + mockFileManager, + ); + }); + + it("should determine if the keystore exists based on the file system", async () => { + assert.ok( + await keystoreLoader.isKeystoreInitialized(), + "keystore should exist", + ); + + assert.equal(mockFileManager.fileExists.mock.callCount(), 1); + }); + }); + + describe("when the keystore has been loaded from file", () => { + let keystoreLoader: KeystoreFileLoader; + let mockFileManager: MockFileManager; + + beforeEach(async () => { + mockFileManager = new MockFileManager(); + + mockFileManager.setupExistingKeystoreFile({ myKey: "myValue" }); + + keystoreLoader = new KeystoreFileLoader( + fakeKeystoreFilePath, + mockFileManager, + ); + }); + + it("should return the same keystore no matter how many loads", async () => { + const load1 = await keystoreLoader.loadKeystore(); + const load2 = await keystoreLoader.loadKeystore(); + + assert.equal(load1, load2, "keystores should be the same instance"); + }); + }); + + describe("when the keystore is initialized in memory", () => { + let keystoreLoader: KeystoreFileLoader; + let mockFileManager: MockFileManager; + + beforeEach(async () => { + mockFileManager = new MockFileManager(); + + mockFileManager.setupNoKeystoreFile(); + + keystoreLoader = new KeystoreFileLoader( + fakeKeystoreFilePath, + mockFileManager, + ); + }); + + it("should return the same keystore for subsequent loads", async () => { + const createdVersion = await keystoreLoader.createUnsavedKeystore(); + const loadedVersion = await keystoreLoader.loadKeystore(); + + assert.equal( + createdVersion, + loadedVersion, + "keystores should be the same instance", + ); + }); + }); + }); +}); diff --git a/v-next/hardhat-keystore/test/tasks/delete.ts b/v-next/hardhat-keystore/test/tasks/delete.ts new file mode 100644 index 0000000000..61bbb95a7b --- /dev/null +++ b/v-next/hardhat-keystore/test/tasks/delete.ts @@ -0,0 +1,169 @@ +import type { KeystoreLoader } from "../../src/internal/types.js"; +import type { Mock } from "node:test"; + +import assert from "node:assert/strict"; +import { beforeEach, describe, it, mock } from "node:test"; + +import chalk from "chalk"; + +import { KeystoreFileLoader } from "../../src/internal/loaders/keystore-file-loader.js"; +import { remove } from "../../src/internal/tasks/delete.js"; +import { assertOutputIncludes } from "../helpers/assert-output-includes.js"; +import { MockFileManager } from "../helpers/mock-file-manager.js"; + +const fakeKeystoreFilePath = "./fake-keystore-path.json"; + +describe("tasks - delete", () => { + let mockFileManager: MockFileManager; + let mockConsoleLog: Mock<(text: string) => void>; + + let keystoreLoader: KeystoreLoader; + + beforeEach(() => { + mockFileManager = new MockFileManager(); + mockConsoleLog = mock.fn(); + + keystoreLoader = new KeystoreFileLoader( + "./fake-keystore-path.json", + mockFileManager, + ); + }); + + describe("a successful `delete` with a known key", () => { + beforeEach(async () => { + mockFileManager.setupExistingKeystoreFile({ + myKey: "myValue", + myOtherKey: "myOtherValue", + }); + + await remove( + { + key: "myKey", + force: false, + }, + keystoreLoader, + mockConsoleLog, + ); + }); + + it("should display the key deleted message", async () => { + assertOutputIncludes(mockConsoleLog, `Key "myKey" deleted`); + }); + + it("should save the updated keystore with the deleted key to file", async () => { + const keystoreFile = + await mockFileManager.readJsonFile(fakeKeystoreFilePath); + + assert.deepEqual( + keystoreFile.keys, + { myOtherKey: "myOtherValue" }, + "keystore should have been saved with update", + ); + }); + }); + + describe("a `delete` when the keystore file does not exist", () => { + beforeEach(async () => { + mockFileManager.setupNoKeystoreFile(); + + await remove( + { + key: "key", + force: false, + }, + keystoreLoader, + mockConsoleLog, + ); + + assert.equal(process.exitCode, 1); + process.exitCode = undefined; + }); + + it("should display a message that the keystore is not set", async () => { + assertOutputIncludes( + mockConsoleLog, + `No keystore found. Please set one up using ${chalk.blue.italic("npx hardhat keystore set {key}")} `, + ); + }); + + it("should not attempt to save the keystore", async () => { + assert.ok( + !(await mockFileManager.fileExists(fakeKeystoreFilePath)), + "keystore should not have been saved", + ); + }); + }); + + describe("a `delete` with a key that is not in the keystore and the force flag is not set", () => { + beforeEach(async () => { + mockFileManager.setupExistingKeystoreFile({ key: "value" }); + + await remove( + { + key: "unknown", + force: false, + }, + keystoreLoader, + mockConsoleLog, + ); + + assert.equal(process.exitCode, 1); + process.exitCode = undefined; + }); + + it("should display a message that the key is not found", async () => { + assertOutputIncludes( + mockConsoleLog, + chalk.red(`Key "unknown" not found`), + ); + }); + + it("should not attempt to save the keystore", async () => { + const keystoreFile = + await mockFileManager.readJsonFile(fakeKeystoreFilePath); + + assert.deepEqual( + keystoreFile.keys, + { key: "value" }, + "keystore should not have been saved", + ); + }); + }); + + describe("a `delete` with a key that is not in the keystore and the force flag is set", () => { + beforeEach(async () => { + mockFileManager.setupExistingKeystoreFile({ key: "value" }); + + await remove( + { + key: "unknown", + force: true, + }, + keystoreLoader, + mockConsoleLog, + ); + }); + + it("should not display a message that the key is not found", async () => { + const output = mockConsoleLog.mock.calls + .map((call) => call.arguments[0]) + .join("\n"); + + assert.ok( + !output.includes(`Key "unknown" not found`), + "should not display a message that the key is not found", + ); + }); + + it("should not attempt to save the keystore", async () => { + const keystoreFile = + await mockFileManager.readJsonFile(fakeKeystoreFilePath); + + assert.deepEqual( + keystoreFile.keys, + { key: "value" }, + "keystore should not have been saved", + ); + }); + }); +}); diff --git a/v-next/hardhat-keystore/test/tasks/get.ts b/v-next/hardhat-keystore/test/tasks/get.ts new file mode 100644 index 0000000000..ffe13a0437 --- /dev/null +++ b/v-next/hardhat-keystore/test/tasks/get.ts @@ -0,0 +1,122 @@ +import type { KeystoreLoader } from "../../src/internal/types.js"; +import type { Mock } from "node:test"; + +import assert from "node:assert/strict"; +import { beforeEach, describe, it, mock } from "node:test"; + +import chalk from "chalk"; + +import { KeystoreFileLoader } from "../../src/internal/loaders/keystore-file-loader.js"; +import { get } from "../../src/internal/tasks/get.js"; +import { assertOutputIncludes } from "../helpers/assert-output-includes.js"; +import { MockFileManager } from "../helpers/mock-file-manager.js"; + +const fakeKeystoreFilePath = "./fake-keystore-path.json"; + +describe("tasks - get", () => { + let mockFileManager: MockFileManager; + let mockConsoleLog: Mock<(text: string) => void>; + + let keystoreLoader: KeystoreLoader; + + beforeEach(() => { + mockFileManager = new MockFileManager(); + mockConsoleLog = mock.fn(); + + keystoreLoader = new KeystoreFileLoader( + fakeKeystoreFilePath, + mockFileManager, + ); + }); + + describe("a successful `get` with a known key", () => { + beforeEach(async () => { + mockFileManager.setupExistingKeystoreFile({ + myKey: "myValue", + }); + + await get( + { + key: "myKey", + }, + keystoreLoader, + mockConsoleLog, + ); + }); + + it("should display the gotten value", async () => { + assertOutputIncludes(mockConsoleLog, "myValue"); + }); + + it("should not save the keystore to file", async () => { + assert.equal( + mockFileManager.writeJsonFile.mock.calls.length, + 0, + "keystore should not have been saved", + ); + }); + }); + + describe("a `get` when the keystore file does not exist", () => { + beforeEach(async () => { + mockFileManager.setupNoKeystoreFile(); + + await get( + { + key: "key", + }, + keystoreLoader, + mockConsoleLog, + ); + + assert.equal(process.exitCode, 1); + process.exitCode = undefined; + }); + + it("should display a message that the keystore is not set", async () => { + assertOutputIncludes( + mockConsoleLog, + `No keystore found. Please set one up using ${chalk.blue.italic("npx hardhat keystore set {key}")} `, + ); + }); + + it("should not attempt to save the keystore", async () => { + assert.equal( + mockFileManager.writeJsonFile.mock.calls.length, + 0, + "keystore should not have been saved", + ); + }); + }); + + describe("a `get` with a key that is not in the keystore", () => { + beforeEach(async () => { + mockFileManager.setupExistingKeystoreFile({ + known: "value", + }); + + await get( + { + key: "unknown", + }, + keystoreLoader, + mockConsoleLog, + ); + + assert.equal(process.exitCode, 1); + process.exitCode = undefined; + }); + + it("should display a message that the key is not found", async () => { + assertOutputIncludes(mockConsoleLog, 'Key "unknown" not found'); + }); + + it("should not attempt to save the keystore", async () => { + assert.equal( + mockFileManager.writeJsonFile.mock.calls.length, + 0, + "keystore should not have been saved", + ); + }); + }); +}); diff --git a/v-next/hardhat-keystore/test/tasks/list.ts b/v-next/hardhat-keystore/test/tasks/list.ts new file mode 100644 index 0000000000..dea6b51892 --- /dev/null +++ b/v-next/hardhat-keystore/test/tasks/list.ts @@ -0,0 +1,101 @@ +import type { KeystoreLoader } from "../../src/internal/types.js"; +import type { Mock } from "node:test"; + +import assert from "node:assert/strict"; +import { beforeEach, describe, it, mock } from "node:test"; + +import chalk from "chalk"; + +import { KeystoreFileLoader } from "../../src/internal/loaders/keystore-file-loader.js"; +import { list } from "../../src/internal/tasks/list.js"; +import { assertOutputIncludes } from "../helpers/assert-output-includes.js"; +import { MockFileManager } from "../helpers/mock-file-manager.js"; + +const fakeKeystoreFilePath = "./fake-keystore-path.json"; + +describe("tasks - list", () => { + let mockFileManager: MockFileManager; + let mockConsoleLog: Mock<(text: string) => void>; + + let keystoreLoader: KeystoreLoader; + + beforeEach(() => { + mockFileManager = new MockFileManager(); + mockConsoleLog = mock.fn(); + + keystoreLoader = new KeystoreFileLoader( + fakeKeystoreFilePath, + mockFileManager, + ); + }); + + describe("a successful `list`", () => { + beforeEach(async () => { + mockFileManager.setupExistingKeystoreFile({ + key: "value", + key2: "value2", + }); + + await list(keystoreLoader, mockConsoleLog); + }); + + it("should display the keys as a message", async () => { + assertOutputIncludes( + mockConsoleLog, + `Keys: +key +key2 +`, + ); + }); + + it("should not attempt to save the keystore", async () => { + assert.equal( + mockFileManager.writeJsonFile.mock.calls.length, + 0, + "keystore should not have been saved", + ); + }); + }); + + describe("a `list` when the keystore file does not exist", () => { + beforeEach(async () => { + mockFileManager.setupNoKeystoreFile(); + + await list(keystoreLoader, mockConsoleLog); + + assert.equal(process.exitCode, 1); + process.exitCode = undefined; + }); + + it("should display a message that the keystore is not set", async () => { + assertOutputIncludes( + mockConsoleLog, + `No keystore found. Please set one up using ${chalk.blue.italic("npx hardhat keystore set {key}")}`, + ); + }); + + it("should not attempt to save the keystore", async () => { + assert.equal( + mockFileManager.writeJsonFile.mock.calls.length, + 0, + "keystore should not have been saved", + ); + }); + }); + + describe("a `list` when the keystore has no keys", () => { + beforeEach(async () => { + mockFileManager.setupExistingKeystoreFile({}); + + await list(keystoreLoader, mockConsoleLog); + }); + + it("should display a message that the keystore has no keys", async () => { + assertOutputIncludes( + mockConsoleLog, + "The keystore does not contain any keys.", + ); + }); + }); +}); diff --git a/v-next/hardhat-keystore/test/tasks/set.ts b/v-next/hardhat-keystore/test/tasks/set.ts new file mode 100644 index 0000000000..413ea8c9d7 --- /dev/null +++ b/v-next/hardhat-keystore/test/tasks/set.ts @@ -0,0 +1,214 @@ +import type { KeystoreLoader } from "../../src/internal/types.js"; +import type { Mock } from "node:test"; + +import assert from "node:assert/strict"; +import { beforeEach, describe, it, mock } from "node:test"; + +import chalk from "chalk"; + +import { KeystoreFileLoader } from "../../src/internal/loaders/keystore-file-loader.js"; +import { set } from "../../src/internal/tasks/set.js"; +import { assertOutputIncludes } from "../helpers/assert-output-includes.js"; +import { MockFileManager } from "../helpers/mock-file-manager.js"; + +const fakeKeystoreFilePath = "./fake-keystore-path.json"; + +describe("tasks - set", () => { + let mockFileManager: MockFileManager; + let mockConsoleLog: Mock<(text: string) => void>; + let mockRequestSecret: Mock<(text: string) => Promise>; + + let keystoreLoader: KeystoreLoader; + + beforeEach(() => { + mockFileManager = new MockFileManager(); + mockConsoleLog = mock.fn(); + + keystoreLoader = new KeystoreFileLoader( + fakeKeystoreFilePath, + mockFileManager, + ); + }); + + describe("a successful `set`", () => { + beforeEach(async () => { + mockRequestSecret = mock.fn(async () => "myValue2"); + + await set( + { + key: "myKey", + force: false, + }, + keystoreLoader, + mockConsoleLog, + mockRequestSecret, + ); + }); + + it("should display a message that the key was set", async () => { + assertOutputIncludes(mockConsoleLog, `Key "myKey" set`); + }); + + it("should save the updated keystore to file", async () => { + const keystoreFile = + await mockFileManager.readJsonFile(fakeKeystoreFilePath); + + assert.deepEqual( + keystoreFile.keys, + { myKey: "myValue2" }, + "keystore should have been saved with update", + ); + }); + }); + + describe("an unforced `set` on an existing key", async () => { + beforeEach(async () => { + mockFileManager.setupExistingKeystoreFile({ key: "oldValue" }); + + mockRequestSecret = mock.fn(async () => "newValue"); + + await set( + { key: "key", force: false }, + keystoreLoader, + mockConsoleLog, + mockRequestSecret, + ); + + assert.equal(process.exitCode, 1); + process.exitCode = undefined; + }); + + it("should warn that the key already exists", async () => { + assertOutputIncludes( + mockConsoleLog, + chalk.yellow( + `The key "key" already exists. Use the ${chalk.blue.italic("--force")} flag to overwrite it.`, + ), + ); + }); + + it("should not update the value in the keystore", async () => { + const keystoreFile = + await mockFileManager.readJsonFile(fakeKeystoreFilePath); + + assert.deepEqual( + keystoreFile.keys, + { key: "oldValue" }, + "keystore should not have been updated with the new value", + ); + }); + }); + + describe("a forced `set` with a new value", async () => { + beforeEach(async () => { + mockFileManager.setupExistingKeystoreFile({ key: "oldValue" }); + mockRequestSecret = mock.fn(async () => "newValue"); + + await set( + { key: "key", force: true }, + keystoreLoader, + mockConsoleLog, + mockRequestSecret, + ); + }); + + it("should display a message that the key was updated", async () => { + assertOutputIncludes(mockConsoleLog, 'Key "key" set'); + }); + + it("should modify an existing value because the flag --force is passed", async () => { + const keystoreFile = + await mockFileManager.readJsonFile(fakeKeystoreFilePath); + + assert.deepEqual( + keystoreFile.keys, + { key: "newValue" }, + "keystore should have been updated with the new value", + ); + }); + }); + + describe("`set` with an invalid key", async () => { + beforeEach(async () => { + mockFileManager.setupExistingKeystoreFile({ key: "value" }); + mockRequestSecret = mock.fn(async () => "value"); + + await set( + { key: "1key", force: false }, + keystoreLoader, + mockConsoleLog, + mockRequestSecret, + ); + + assert.equal(process.exitCode, 1); + process.exitCode = undefined; + }); + + it("should display a message that the key is not valid", async () => { + assertOutputIncludes( + mockConsoleLog, + chalk.red( + `Invalid value for key: "1key". Keys can only have alphanumeric characters and underscores, and they cannot start with a number.`, + ), + ); + }); + }); + + describe("the user entering an empty value", async () => { + beforeEach(async () => { + mockFileManager.setupExistingKeystoreFile({ key: "oldValue" }); + + mockRequestSecret = mock.fn(async () => ""); + + await set( + { key: "key", force: true }, + keystoreLoader, + mockConsoleLog, + mockRequestSecret, + ); + + assert.equal(process.exitCode, 1); + process.exitCode = undefined; + }); + + it("should display a message that a value cannot be empty", async () => { + assertOutputIncludes( + mockConsoleLog, + chalk.red("The value cannot be empty."), + ); + }); + + it("should not save the keystore to file", async () => { + assert.equal( + mockFileManager.writeJsonFile.mock.calls.length, + 0, + "keystore should not be saved", + ); + }); + }); + + describe("a `set` when the keystore file does not exist", () => { + beforeEach(async () => { + mockFileManager.setupNoKeystoreFile(); + mockRequestSecret = mock.fn(async () => "myValue2"); + + await set( + { key: "myKey", force: false }, + keystoreLoader, + mockConsoleLog, + mockRequestSecret, + ); + }); + + it("should create a new keystore file with the appropriate value", async () => { + const keystoreFile = + await mockFileManager.readJsonFile(fakeKeystoreFilePath); + + assert.deepEqual( + keystoreFile.keys, + { myKey: "myValue2" }, + "keystore should have been saved with update", + ); + }); + }); +}); diff --git a/v-next/hardhat-keystore/tsconfig.json b/v-next/hardhat-keystore/tsconfig.json new file mode 100644 index 0000000000..47b339df71 --- /dev/null +++ b/v-next/hardhat-keystore/tsconfig.json @@ -0,0 +1,20 @@ +{ + "extends": "../../config-v-next/tsconfig.json", + "references": [ + { + "path": "../hardhat" + }, + { + "path": "../hardhat-errors" + }, + { + "path": "../hardhat-node-test-reporter" + }, + { + "path": "../hardhat-test-utils" + }, + { + "path": "../hardhat-utils" + } + ] +}